From 0ed2f3fceb3cc4cc06319d199109b7647e5c9af4 Mon Sep 17 00:00:00 2001 From: ldolse Date: Fri, 1 Oct 2010 17:45:47 +0800 Subject: [PATCH 001/375] partial/potential fix for mobi problem --- src/calibre/ebooks/mobi/mobiml.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/ebooks/mobi/mobiml.py b/src/calibre/ebooks/mobi/mobiml.py index 231ad51eee..31b1ac5834 100644 --- a/src/calibre/ebooks/mobi/mobiml.py +++ b/src/calibre/ebooks/mobi/mobiml.py @@ -188,7 +188,7 @@ class MobiMLizer(object): para = wrapper emleft = int(round(left / self.profile.fbase)) - 1 emleft = min((emleft, 10)) - while emleft > 0: + while emleft > 1: para = etree.SubElement(para, XHTML('blockquote')) emleft -= 1 else: From 3900216da0896ff1d372714f074ea71e39885054 Mon Sep 17 00:00:00 2001 From: ldolse Date: Fri, 1 Oct 2010 19:17:32 +0800 Subject: [PATCH 002/375] revert mobi change --- src/calibre/ebooks/mobi/mobiml.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/ebooks/mobi/mobiml.py b/src/calibre/ebooks/mobi/mobiml.py index 31b1ac5834..231ad51eee 100644 --- a/src/calibre/ebooks/mobi/mobiml.py +++ b/src/calibre/ebooks/mobi/mobiml.py @@ -188,7 +188,7 @@ class MobiMLizer(object): para = wrapper emleft = int(round(left / self.profile.fbase)) - 1 emleft = min((emleft, 10)) - while emleft > 1: + while emleft > 0: para = etree.SubElement(para, XHTML('blockquote')) emleft -= 1 else: From 4a044b8e9d6b5f0168ef4e65d6a3e9aa47f182b4 Mon Sep 17 00:00:00 2001 From: ldolse Date: Mon, 4 Oct 2010 16:16:33 +0800 Subject: [PATCH 003/375] small tweak --- src/calibre/ebooks/conversion/utils.py | 8 +++++--- src/calibre/ebooks/mobi/mobiml.py | 4 ++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/calibre/ebooks/conversion/utils.py b/src/calibre/ebooks/conversion/utils.py index 2faec27b68..976ed6a8f4 100644 --- a/src/calibre/ebooks/conversion/utils.py +++ b/src/calibre/ebooks/conversion/utils.py @@ -146,7 +146,7 @@ class PreProcessor(object): #print "blanks between paragraphs is marked True" else: blanks_between_paragraphs = False - #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") + 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") # detect chapters/sections to match xpath or splitting logic # # Build the Regular Expressions in pieces @@ -166,13 +166,13 @@ class PreProcessor(object): title_line_close = "()?\s*()?\s*(]*>)?\s*" opt_title_close = ")?" - default_title = r"(\s*[\w\'\"-]+){1,5}(?!<)" + default_title = r"(\s*[\w\'\"-]+){1,5}?(?=<)" typical_chapters = r".?(Introduction|Synopsis|Acknowledgements|Chapter|Kapitel|Epilogue|Volume\s|Prologue|Book\s|Part\s|Dedication)\s*([\d\w-]+\:?\s*){0,4}" numeric_chapters = r".?(\d+\.?|(CHAPTER\s*([\dA-Z\-\'\"\?\.!#,]+\s*){1,10}))\s*" uppercase_chapters = r"\s*.?([A-Z#]+(\s|-){0,3}){1,5}\s*" chapter_marker = lookahead+chapter_line_open+chapter_header_open+typical_chapters+chapter_header_close+chapter_line_close+blank_lines+opt_title_open+title_line_open+title_header_open+default_title+title_header_close+title_line_close+opt_title_close - #print chapter_marker + print chapter_marker heading = re.compile(']*>', re.IGNORECASE) self.html_preprocess_sections = len(heading.findall(html)) self.log("found " + unicode(self.html_preprocess_sections) + " pre-existing headings") @@ -184,12 +184,14 @@ class PreProcessor(object): if self.html_preprocess_sections < 10: self.log("not enough chapters, only " + unicode(self.html_preprocess_sections) + ", trying numeric chapters") chapter_marker = lookahead+chapter_line_open+chapter_header_open+numeric_chapters+chapter_header_close+chapter_line_close+blank_lines+opt_title_open+title_line_open+title_header_open+default_title+title_header_close+title_line_close+opt_title_close + print chapter_marker chapdetect2 = re.compile(r'%s' % chapter_marker, re.IGNORECASE) html = chapdetect2.sub(self.chapter_head, html) if self.html_preprocess_sections < 10: self.log("not enough chapters, only " + unicode(self.html_preprocess_sections) + ", trying with uppercase words") chapter_marker = lookahead+chapter_line_open+chapter_header_open+uppercase_chapters+chapter_header_close+chapter_line_close+blank_lines+opt_title_open+title_line_open+title_header_open+default_title+title_header_close+title_line_close+opt_title_close + print chapter_marker chapdetect2 = re.compile(r'%s' % chapter_marker, re.UNICODE) html = chapdetect2.sub(self.chapter_head, html) ###### Unwrap lines ###### diff --git a/src/calibre/ebooks/mobi/mobiml.py b/src/calibre/ebooks/mobi/mobiml.py index 231ad51eee..d4801e637e 100644 --- a/src/calibre/ebooks/mobi/mobiml.py +++ b/src/calibre/ebooks/mobi/mobiml.py @@ -184,12 +184,12 @@ class MobiMLizer(object): elif tag in NESTABLE_TAGS and istate.rendered: para = wrapper = bstate.nested[-1] elif left > 0 and indent >= 0: - para = wrapper = etree.SubElement(parent, XHTML('blockquote')) + para = wrapper = etree.SubElement(parent, XHTML('div')) para = wrapper emleft = int(round(left / self.profile.fbase)) - 1 emleft = min((emleft, 10)) while emleft > 0: - para = etree.SubElement(para, XHTML('blockquote')) + para = etree.SubElement(para, XHTML('div')) emleft -= 1 else: para = wrapper = etree.SubElement(parent, XHTML('p')) From b45dc837830b0e4f61b9cc19dfcc5f214589eb83 Mon Sep 17 00:00:00 2001 From: ldolse Date: Mon, 11 Oct 2010 00:14:00 +1000 Subject: [PATCH 004/375] preprocessing tweaks, fixed division by zero error in line_histogram --- src/calibre/ebooks/conversion/preprocess.py | 2 ++ src/calibre/ebooks/conversion/utils.py | 6 +++++- src/calibre/ebooks/pdb/input.py | 6 ++++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/calibre/ebooks/conversion/preprocess.py b/src/calibre/ebooks/conversion/preprocess.py index c5ebae4bba..de01188829 100644 --- a/src/calibre/ebooks/conversion/preprocess.py +++ b/src/calibre/ebooks/conversion/preprocess.py @@ -144,6 +144,8 @@ class DocAnalysis(object): # Normalize the histogram into percents totalLines = len(self.lines) + if totalLines == 0: + return False h = [ float(count)/totalLines for count in hRaw ] #print "\nhRaw histogram lengths are: "+str(hRaw) #print " percents are: "+str(h)+"\n" diff --git a/src/calibre/ebooks/conversion/utils.py b/src/calibre/ebooks/conversion/utils.py index 976ed6a8f4..a01c29f2fb 100644 --- a/src/calibre/ebooks/conversion/utils.py +++ b/src/calibre/ebooks/conversion/utils.py @@ -146,7 +146,7 @@ class PreProcessor(object): #print "blanks between paragraphs is marked True" else: blanks_between_paragraphs = False - 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") + #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") # detect chapters/sections to match xpath or splitting logic # # Build the Regular Expressions in pieces @@ -230,6 +230,7 @@ class PreProcessor(object): html = dehyphenator(html,'html', length) self.log("Done dehyphenating") # Unwrap lines using punctation and line length + unwrap_quotes = re.compile(u"(?<=.{%i}\"')\s*\s*()?\s*(?P<(p|span|div)[^>]*>\s*(<(p|span|div)[^>]*>\s*\s*)\s*){0,3}\s*<(span|div|p)[^>]*>\s*(<(span|div|p)[^>]*>)?\s*(?=[a-z])" % length, re.UNICODE) unwrap = re.compile(u"(?<=.{%i}([a-z,:)\IA\u00DF]|(?\s*()?\s*(?P<(p|span|div)[^>]*>\s*(<(p|span|div)[^>]*>\s*\s*)\s*){0,3}\s*<(span|div|p)[^>]*>\s*(<(span|div|p)[^>]*>)?\s*" % length, re.UNICODE) html = unwrap.sub(' ', html) #check any remaining hyphens, but only unwrap if there is a match @@ -259,5 +260,8 @@ class PreProcessor(object): # put back non-breaking spaces in empty paragraphs to preserve original formatting html = blankreg.sub('\n'+r'\g'+u'\u00a0'+r'\g', html) + + # Center separator lines + html = re.sub(u'

\s*(?P([*#•]+\s*)+)\s*

', '

' + '\g' + '

', html) return html diff --git a/src/calibre/ebooks/pdb/input.py b/src/calibre/ebooks/pdb/input.py index dfe5b653dd..6850c48b16 100644 --- a/src/calibre/ebooks/pdb/input.py +++ b/src/calibre/ebooks/pdb/input.py @@ -9,6 +9,7 @@ import os from calibre.customize.conversion import InputFormatPlugin, OptionRecommendation from calibre.ebooks.pdb.header import PdbHeaderReader from calibre.ebooks.pdb import PDBError, IDENTITY_TO_NAME, get_reader +from calibre.ebooks.conversion.utils import PreProcessor class PDBInput(InputFormatPlugin): @@ -44,3 +45,8 @@ class PDBInput(InputFormatPlugin): opf = reader.extract_content(os.getcwd()) return opf + + def preprocess_html(self, options, html): + self.options = options + preprocessor = PreProcessor(self.options, log=getattr(self, 'log', None)) + return preprocessor(html) \ No newline at end of file From 87b615f81f694f2dffa23a07afe6e87d6e90497f Mon Sep 17 00:00:00 2001 From: ldolse Date: Mon, 18 Oct 2010 04:55:53 +0800 Subject: [PATCH 005/375] added new chapter heading type --- src/calibre/ebooks/conversion/utils.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/calibre/ebooks/conversion/utils.py b/src/calibre/ebooks/conversion/utils.py index a01c29f2fb..6002509013 100644 --- a/src/calibre/ebooks/conversion/utils.py +++ b/src/calibre/ebooks/conversion/utils.py @@ -154,7 +154,7 @@ class PreProcessor(object): chapter_line_open = "<(?Pp|div)[^>]*>\s*(<(?Pfont|span|[ibu])[^>]*>)?\s*(<(?Pfont|span|[ibu])[^>]*>)?\s*(<(?Pfont|span|[ibu])[^>]*>)?\s*" chapter_header_open = r"(?P" chapter_header_close = ")\s*" - chapter_line_close = "()?\s*()?\s*(]*>)?\s*\s*" + chapter_line_close = "()?\s*()?\s*()?\s*\s*" if blanks_between_paragraphs: blank_lines = "(\s*]*>\s*

){0,2}\s*" else: @@ -170,6 +170,7 @@ class PreProcessor(object): typical_chapters = r".?(Introduction|Synopsis|Acknowledgements|Chapter|Kapitel|Epilogue|Volume\s|Prologue|Book\s|Part\s|Dedication)\s*([\d\w-]+\:?\s*){0,4}" numeric_chapters = r".?(\d+\.?|(CHAPTER\s*([\dA-Z\-\'\"\?\.!#,]+\s*){1,10}))\s*" uppercase_chapters = r"\s*.?([A-Z#]+(\s|-){0,3}){1,5}\s*" + numeric_titles = r".?(\d+\.?\s+([\d\w-]+\:?\'?-?\s?){0,5})\s*" chapter_marker = lookahead+chapter_line_open+chapter_header_open+typical_chapters+chapter_header_close+chapter_line_close+blank_lines+opt_title_open+title_line_open+title_header_open+default_title+title_header_close+title_line_close+opt_title_close print chapter_marker @@ -194,6 +195,14 @@ class PreProcessor(object): print chapter_marker chapdetect2 = re.compile(r'%s' % chapter_marker, re.UNICODE) html = chapdetect2.sub(self.chapter_head, html) + + if self.html_preprocess_sections < 10: + self.log("not enough chapters, only " + unicode(self.html_preprocess_sections) + ", trying numeric chapters with titles") + chapter_marker = lookahead+chapter_line_open+chapter_header_open+numeric_titles+chapter_header_close+chapter_line_close+blank_lines+opt_title_open+title_line_open+title_header_open+default_title+title_header_close+title_line_close+opt_title_close + print chapter_marker + chapdetect2 = re.compile(r'%s' % chapter_marker, re.IGNORECASE) + html = chapdetect2.sub(self.chapter_head, html) + ###### Unwrap lines ###### # # Some OCR sourced files have line breaks in the html using a combination of span & p tags From ccb683ef09ded0d708f8eeda5269c2be6a1b3ba7 Mon Sep 17 00:00:00 2001 From: ldolse Date: Mon, 18 Oct 2010 09:02:07 +0800 Subject: [PATCH 006/375] added unicode hyphens to dehyphenation function --- src/calibre/ebooks/conversion/preprocess.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/calibre/ebooks/conversion/preprocess.py b/src/calibre/ebooks/conversion/preprocess.py index de01188829..4a77f58df4 100644 --- a/src/calibre/ebooks/conversion/preprocess.py +++ b/src/calibre/ebooks/conversion/preprocess.py @@ -219,13 +219,13 @@ class Dehyphenator(object): self.html = html self.format = format if format == 'html': - intextmatch = re.compile(u'(?<=.{%i})(?P[^\[\]\\\^\$\.\|\?\*\+\(\)“"\s>]+)-\s*(?=<)(?P\s*(\s*<[iubp][^>]*>\s*)?]*>|\s*<[iubp][^>]*>)?\s*(?P[\w\d]+)' % length) + intextmatch = re.compile(u'(?<=.{%i})(?P[^\[\]\\\^\$\.\|\?\*\+\(\)“"\s>]+)(-|‐)\s*(?=<)(?P\s*(\s*<[iubp][^>]*>\s*)?]*>|\s*<[iubp][^>]*>)?\s*(?P[\w\d]+)' % length) elif format == 'pdf': - intextmatch = re.compile(u'(?<=.{%i})(?P[^\[\]\\\^\$\.\|\?\*\+\(\)“"\s>]+)-\s*(?P

|\s*

\s*<[iub]>)\s*(?P[\w\d]+)'% length) + intextmatch = re.compile(u'(?<=.{%i})(?P[^\[\]\\\^\$\.\|\?\*\+\(\)“"\s>]+)(-|‐)\s*(?P

|\s*

\s*<[iub]>)\s*(?P[\w\d]+)'% length) elif format == 'individual_words': - intextmatch = re.compile(u'>[^<]*\b(?P[^\[\]\\\^\$\.\|\?\*\+\(\)"\s>]+)-(?P[^<]*\b(?P[^\[\]\\\^\$\.\|\?\*\+\(\)"\s>]+)(-|‐)(?P[^\[\]\\\^\$\.\|\?\*\+\(\)“"\s>]+)-\s*(?=<)(?P\s*(\s*<[iubp][^>]*>\s*)?]*>|\s*<[iubp][^>]*>)?\s*(?P[\w\d]+)') + intextmatch = re.compile(u'(?P[^\[\]\\\^\$\.\|\?\*\+\(\)“"\s>]+)(-|‐)\s*(?=<)(?P\s*(\s*<[iubp][^>]*>\s*)?]*>|\s*<[iubp][^>]*>)?\s*(?P[\w\d]+)') html = intextmatch.sub(self.dehyphenate, html) return html From 940d3fd6a6a3fd9dcb957753541606c6da08aa20 Mon Sep 17 00:00:00 2001 From: Hiroshi Miura Date: Sun, 7 Nov 2010 08:43:56 +0900 Subject: [PATCH 007/375] Introduce several news recipes - nikkei * free subscribe version works * subscriber version need more work - CNet/Japan - The H --- resources/recipes/cnet.recipe | 30 +++++++++ resources/recipes/nikkei_free.recipe | 48 +++++++++++++++ resources/recipes/nikkei_sports_sub.recipe | 48 +++++++++++++++ resources/recipes/nikkei_sub.recipe | 71 ++++++++++++++++++++++ resources/recipes/the_h.recipe | 23 +++++++ 5 files changed, 220 insertions(+) create mode 100644 resources/recipes/cnet.recipe create mode 100644 resources/recipes/nikkei_free.recipe create mode 100644 resources/recipes/nikkei_sports_sub.recipe create mode 100644 resources/recipes/nikkei_sub.recipe create mode 100644 resources/recipes/the_h.recipe diff --git a/resources/recipes/cnet.recipe b/resources/recipes/cnet.recipe new file mode 100644 index 0000000000..8f81630762 --- /dev/null +++ b/resources/recipes/cnet.recipe @@ -0,0 +1,30 @@ +import re; + +class AdvancedUserRecipe1287588358(BasicNewsRecipe): + title = u'CNET Japan' + oldest_article = 3 + max_articles_per_feed = 30 + + feeds = [(u'cnet rss', u'http://feeds.japan.cnet.com/cnet/rss')] + language = 'ja' + encoding = 'Shift_JIS' + remove_javascript = True + + preprocess_regexps = [ + (re.compile(ur'.*', re.DOTALL|re.IGNORECASE|re.UNICODE), + lambda match: ''), + (re.compile(r'.*', re.DOTALL|re.IGNORECASE), + lambda match: ''), + (re.compile(ur'.*', re.UNICODE), + lambda match: ''), + ] + + remove_tags_before = dict(name="h2") + remove_tags = [ + {'class':"social_bkm_share"}, + {'class':"social_bkm_print"}, + {'class':"block20 clearfix"}, + dict(name="div",attrs={'id':'bookreview'}), + ] + remove_tags_after = {'class':"block20"} + diff --git a/resources/recipes/nikkei_free.recipe b/resources/recipes/nikkei_free.recipe new file mode 100644 index 0000000000..f3a51e2fd6 --- /dev/null +++ b/resources/recipes/nikkei_free.recipe @@ -0,0 +1,48 @@ +class AdvancedUserRecipe1287958571(BasicNewsRecipe): + title = u'\u65e5\u7d4c\u65b0\u805e\u96fb\u5b50\u7248(Free)' + __author__ = 'Hiroshi Miura' + description = 'News and current market affairs from Japan' + oldest_article = 2 + max_articles_per_feed = 20 + language = 'ja' + + feeds = [ (u'\u65e5\u7d4c\u4f01\u696d', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=sangyo'), + (u'\u65e5\u7d4c\u88fd\u54c1', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=newpro'), + (u'internet', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=internet'), + (u'\u653f\u6cbb', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=seiji'), + (u'\u8ca1\u52d9', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=zaimu'), + (u'\u7d4c\u6e08', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=keizai'), + (u'\u56fd\u969b', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=kaigai'), + (u'\u79d1\u5b66', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=kagaku'), + (u'\u30de\u30fc\u30b1\u30c3\u30c8', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=market'), + (u'\u304f\u3089\u3057', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=kurashi'), + (u'\u30b9\u30dd\u30fc\u30c4', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=sports'), + (u'\u793e\u4f1a', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=shakai'), + (u'\u30a8\u30b3', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=eco'), + (u'\u5065\u5eb7', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=kenkou'), + (u'\u96c7\u7528', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=koyou'), + (u'\u6559\u80b2', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=kyouiku'), + (u'\u304a\u304f\u3084\u307f', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=okuyami'), + (u'\u4eba\u4e8b', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=zinzi'), + (u'\u7279\u96c6', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=special'), + (u'\u5730\u57df\u30cb\u30e5\u30fc\u30b9', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=local'), + (u'\u7d71\u8a08\u30fb\u767d\u66f8', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=report'), + (u'\u30e9\u30f3\u30ad\u30f3\u30b0', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=ranking'), + (u'\u4f1a\u898b', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=interview'), + (u'\u793e\u8aac\u30fb\u6625\u79cb', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=shasetsu'), + (u'\u30b9\u30dd\u30fc\u30c4\uff1a\u30d7\u30ed\u91ce\u7403', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=baseball'), + (u'\u30b9\u30dd\u30fc\u30c4\uff1a\u5927\u30ea\u30fc\u30b0', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=mlb'), + (u'\u30b9\u30dd\u30fc\u30c4\uff1a\u30b5\u30c3\u30ab\u30fc', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=soccer'), + (u'\u30b9\u30dd\u30fc\u30c4\uff1a\u30b4\u30eb\u30d5', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=golf'), + (u'\u30b9\u30dd\u30fc\u30c4\uff1a\u76f8\u64b2', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=sumou'), + (u'\u30b9\u30dd\u30fc\u30c4\uff1a\u7af6\u99ac', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=keiba'), + (u'\u8abf\u67fb\u30fb\u30a2\u30f3\u30b1\u30fc\u30c8', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=research') + ] + + remove_tags_before = dict(id="CONTENTS") + remove_tags = [ + dict(name="form"), + {'class':"cmn-hide"}, + ] + remove_tags_after = {'class':"cmn-pr_list"} + diff --git a/resources/recipes/nikkei_sports_sub.recipe b/resources/recipes/nikkei_sports_sub.recipe new file mode 100644 index 0000000000..350a749dc6 --- /dev/null +++ b/resources/recipes/nikkei_sports_sub.recipe @@ -0,0 +1,48 @@ +import string, re, sys +from calibre import strftime +from calibre.web.feeds.recipes import BasicNewsRecipe + +class NikkeiNet_subscription(BasicNewsRecipe): + title = u'\u65e5\u7d4c\u65b0\u805e\u96fb\u5b50\u7248' + __author__ = 'Hiroshi Miura' + description = 'News and current market affairs from Japan' + needs_subscription = True + oldest_article = 3 + max_articles_per_feed = 20 + language = 'ja' + + feeds = [ + (u'\u30b9\u30dd\u30fc\u30c4\uff1a\u30d7\u30ed\u91ce\u7403', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=baseball'), + (u'\u30b9\u30dd\u30fc\u30c4\uff1a\u5927\u30ea\u30fc\u30b0', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=mlb'), + (u'\u30b9\u30dd\u30fc\u30c4\uff1a\u30b5\u30c3\u30ab\u30fc', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=soccer'), + (u'\u30b9\u30dd\u30fc\u30c4\uff1a\u30b4\u30eb\u30d5', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=golf'), + (u'\u30b9\u30dd\u30fc\u30c4\uff1a\u76f8\u64b2', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=sumou'), + (u'\u30b9\u30dd\u30fc\u30c4\uff1a\u7af6\u99ac', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=keiba') + ] + + remove_tags_before = dict(id="CONTENTS") + remove_tags = [ + dict(name="form"), + {'class':"cmn-hide"}, + ] + remove_tags_after = {'class':"cmn-pr_list"} + recursions = 4 + + def get_browser(self): + br = BasicNewsRecipe.get_browser() + if self.username is not None and self.password is not None: + br.open('https://id.nikkei.com/lounge/nl/base/LA0010.seam?cid=123456&flashId=654321') + assert br.viewing_html() + print br.title() + response = br.response() + response.set_data(response.get_data().replace("", " -->")) + br.set_response(response) + br.select_form(name='LA0010Form01') + br['LA0010Form01:LA0010Email'] = self.username + br['LA0010Form01:LA0010Password'] = self.password + res = br.submit() + raw = res.read() + if '日経IDのサービス一覧へ' not in raw: + raise ValueError('Failed to log in to nikkei.net, check your username(email address) and password') + return br diff --git a/resources/recipes/nikkei_sub.recipe b/resources/recipes/nikkei_sub.recipe new file mode 100644 index 0000000000..8eab6ec328 --- /dev/null +++ b/resources/recipes/nikkei_sub.recipe @@ -0,0 +1,71 @@ +import string, re, sys +from calibre import strftime +from calibre.web.feeds.recipes import BasicNewsRecipe + +class NikkeiNet_subscription(BasicNewsRecipe): + title = u'\u65e5\u7d4c\u65b0\u805e\u96fb\u5b50\u7248' + __author__ = 'Hiroshi Miura' + description = 'News and current market affairs from Japan' + needs_subscription = True + oldest_article = 2 + max_articles_per_feed = 20 + language = 'ja' + recursions = 3 + remove_javascript = False + + feeds = [ (u'\u65e5\u7d4c\u4f01\u696d', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=sangyo'), + (u'\u65e5\u7d4c\u88fd\u54c1', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=newpro'), + (u'internet', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=internet'), + (u'\u653f\u6cbb', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=seiji'), + (u'\u8ca1\u52d9', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=zaimu'), + (u'\u7d4c\u6e08', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=keizai'), + (u'\u56fd\u969b', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=kaigai'), + (u'\u79d1\u5b66', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=kagaku'), + (u'\u30de\u30fc\u30b1\u30c3\u30c8', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=market'), + (u'\u304f\u3089\u3057', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=kurashi'), + (u'\u30b9\u30dd\u30fc\u30c4', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=sports'), + (u'\u793e\u4f1a', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=shakai'), + (u'\u30a8\u30b3', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=eco'), + (u'\u5065\u5eb7', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=kenkou'), + (u'\u96c7\u7528', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=koyou'), + (u'\u6559\u80b2', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=kyouiku'), + (u'\u304a\u304f\u3084\u307f', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=okuyami'), + (u'\u4eba\u4e8b', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=zinzi'), + (u'\u7279\u96c6', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=special'), + (u'\u5730\u57df\u30cb\u30e5\u30fc\u30b9', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=local'), + (u'\u7d71\u8a08\u30fb\u767d\u66f8', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=report'), + (u'\u30e9\u30f3\u30ad\u30f3\u30b0', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=ranking'), + (u'\u4f1a\u898b', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=interview'), + (u'\u793e\u8aac\u30fb\u6625\u79cb', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=shasetsu'), + (u'\u30b9\u30dd\u30fc\u30c4\uff1a\u30d7\u30ed\u91ce\u7403', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=baseball'), + (u'\u30b9\u30dd\u30fc\u30c4\uff1a\u5927\u30ea\u30fc\u30b0', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=mlb'), + (u'\u30b9\u30dd\u30fc\u30c4\uff1a\u30b5\u30c3\u30ab\u30fc', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=soccer'), + (u'\u30b9\u30dd\u30fc\u30c4\uff1a\u30b4\u30eb\u30d5', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=golf'), + (u'\u30b9\u30dd\u30fc\u30c4\uff1a\u76f8\u64b2', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=sumou'), + (u'\u30b9\u30dd\u30fc\u30c4\uff1a\u7af6\u99ac', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=keiba'), + (u'\u8abf\u67fb\u30fb\u30a2\u30f3\u30b1\u30fc\u30c8', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=research') + ] + + def get_browser(self): + br = BasicNewsRecipe.get_browser() + if self.username is not None and self.password is not None: + br.open('https://id.nikkei.com/lounge/nl/base/LA0010.seam') + response = br.response() + response.set_data(response.get_data().replace("", " -->")) + br.set_response(response) + br.select_form(name='LA0010Form01') + br['LA0010Form01:LA0010Email'] = self.username + br['LA0010Form01:LA0010Password'] = self.password + res = br.submit() + raw = res.read() + if '日経IDのサービス一覧へ' not in raw: + raise ValueError('Failed to log in to nikkei.net, check your username(email address) and password') + br.open('http://www.nikkei.com/') + br.select_form(nr=0) + res = br.submit() + print res.read() + return br + + + diff --git a/resources/recipes/the_h.recipe b/resources/recipes/the_h.recipe new file mode 100644 index 0000000000..c25a39ca99 --- /dev/null +++ b/resources/recipes/the_h.recipe @@ -0,0 +1,23 @@ +class AdvancedUserRecipe1289003166(BasicNewsRecipe): + title = u'The H' + __author__ = 'Hiroshi Miura' + oldest_article = 3 + description = 'In association with Heise Online' + publisher = 'Heise Media UK Ltd.' + category = 'news, technology, security' + max_articles_per_feed = 100 + language = 'en' + encoding = 'utf-8' + conversion_options = { + 'comment' : description + ,'tags' : category + ,'publisher': publisher + ,'language' : language + } + feeds = [ + (u'The H News Feed', u'http://www.h-online.com/news/atom.xml') + ] + + def print_version(self, url): + return url + '?view=print' + From e9dec414a78d5d5c7a383130ce6d183953877075 Mon Sep 17 00:00:00 2001 From: Hiroshi Miura Date: Tue, 9 Nov 2010 07:48:06 +0900 Subject: [PATCH 008/375] introduce mainichi news paper and cnet japan renames --- .../recipes/{cnet.recipe => cnetjapan.recipe} | 2 +- resources/recipes/mainichi.recipe | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) rename resources/recipes/{cnet.recipe => cnetjapan.recipe} (95%) create mode 100644 resources/recipes/mainichi.recipe diff --git a/resources/recipes/cnet.recipe b/resources/recipes/cnetjapan.recipe similarity index 95% rename from resources/recipes/cnet.recipe rename to resources/recipes/cnetjapan.recipe index 8f81630762..03a4c2ce2d 100644 --- a/resources/recipes/cnet.recipe +++ b/resources/recipes/cnetjapan.recipe @@ -1,6 +1,6 @@ import re; -class AdvancedUserRecipe1287588358(BasicNewsRecipe): +class CNetJapan(BasicNewsRecipe): title = u'CNET Japan' oldest_article = 3 max_articles_per_feed = 30 diff --git a/resources/recipes/mainichi.recipe b/resources/recipes/mainichi.recipe new file mode 100644 index 0000000000..3653c2e252 --- /dev/null +++ b/resources/recipes/mainichi.recipe @@ -0,0 +1,16 @@ +class MainichiDailyNews(BasicNewsRecipe): + title = u'Mainichi News' + __author__ = 'Hiroshi Miura' + oldest_article = 2 + max_articles_per_feed = 100 + description = 'Japanese traditional newspaper Mainichi Daily News' + publisher = 'Mainichi Daily News' + category = 'news, japan' + language = 'ja' + + feeds = [(u'mainichi IT', u'http://mainichi.pheedo.jp/f/mainichijp_electronics')] + + remove_tags_before = {'class':"NewsTitle"} + remove_tags = [{'class':"RelatedArticle"}] + remove_tags_after = {'class':"ArticleLower"} + From 798d97a41f20b29f6b6c6105a1b8311d6c8a9fc1 Mon Sep 17 00:00:00 2001 From: Translators <> Date: Sat, 13 Nov 2010 04:55:08 +0000 Subject: [PATCH 009/375] Launchpad automatic translations update. --- src/calibre/translations/ca.po | 360 ++++++++++--------- src/calibre/translations/cs.po | 342 +++++++++--------- src/calibre/translations/da.po | 354 +++++++++--------- src/calibre/translations/de.po | 362 ++++++++++--------- src/calibre/translations/en_GB.po | 354 +++++++++--------- src/calibre/translations/es.po | 356 +++++++++--------- src/calibre/translations/eu.po | 362 ++++++++++--------- src/calibre/translations/fr.po | 579 +++++++++++++++++------------- src/calibre/translations/it.po | 386 +++++++++++--------- src/calibre/translations/nl.po | 573 ++++++++++++++++------------- src/calibre/translations/pl.po | 548 ++++++++++++++++------------ src/calibre/translations/ru.po | 532 +++++++++++++++------------ src/calibre/translations/sl.po | 530 +++++++++++++++------------ src/calibre/translations/sr.po | 352 +++++++++--------- src/calibre/translations/sv.po | 354 +++++++++--------- src/calibre/translations/th.po | 542 ++++++++++++++++------------ 16 files changed, 3763 insertions(+), 3123 deletions(-) diff --git a/src/calibre/translations/ca.po b/src/calibre/translations/ca.po index c96f18d7d9..7dc7075706 100644 --- a/src/calibre/translations/ca.po +++ b/src/calibre/translations/ca.po @@ -10,14 +10,14 @@ msgid "" msgstr "" "Project-Id-Version: ca\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-11-10 14:27+0000\n" -"PO-Revision-Date: 2010-11-10 19:55+0000\n" +"POT-Creation-Date: 2010-11-12 23:11+0000\n" +"PO-Revision-Date: 2010-11-12 20:28+0000\n" "Last-Translator: FerranRius \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-11 04:40+0000\n" +"X-Launchpad-Export-Date: 2010-11-13 04:52+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -34,7 +34,7 @@ msgstr "No fa absolutament res" #: /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:643 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:650 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:401 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 @@ -77,14 +77,14 @@ msgstr "No fa absolutament res" #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:78 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:119 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:153 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:616 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:822 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:824 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:620 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:826 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:828 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:911 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:916 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:913 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:918 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:984 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:143 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:150 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:64 @@ -126,8 +126,8 @@ msgstr "No fa absolutament res" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:141 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:927 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:936 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1243 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1246 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1249 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1252 #: /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 @@ -195,7 +195,7 @@ msgstr "Acció d'interfície d'usuari" msgid "Preferences" msgstr "Preferències" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:17 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:15 msgid "" "Follow all local links in an HTML file and create a ZIP file containing all " "linked files. This plugin is run every time you add an HTML file to the " @@ -205,7 +205,7 @@ msgstr "" "contingui els fitxers enllaçats. Aquest connector s'executa cada vegada que " "s'afegeix un fitxer HTML a la biblioteca." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:53 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:51 msgid "" "Character encoding for the input HTML files. Common choices include: cp1252, " "latin1, iso-8859-1 and utf-8." @@ -213,7 +213,7 @@ msgstr "" "Joc de caràcters dels fitxers HTML d'entrada. Les opcions comunes inclouen: " "cp1252, latin1, iso-8859-1 i utf-8." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:60 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:58 msgid "" "Create a PMLZ archive containing the PML file and all images in the " "directory pmlname_img or images. This plugin is run every time you add a PML " @@ -223,7 +223,7 @@ msgstr "" "carpetes pmlname_ing o images. Aquest connector s'executa cada vegada que " "afegiu un fitxer PML a la biblioteca." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:94 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:92 msgid "Extract cover from comic files" msgstr "Extreu la portada dels fitxers de còmic" @@ -270,46 +270,46 @@ msgstr "Estableix les metadades als fitxers %s" msgid "Set metadata from %s files" msgstr "Estableix les metadades des dels fitxers %s" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:711 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:712 msgid "Look and Feel" msgstr "Aspecte i comportament" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:725 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:714 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:726 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:737 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:748 msgid "Interface" msgstr "Interfície" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:717 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:718 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 del calibre adaptar-lo " "al vostre gust" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:723 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 msgid "Behavior" msgstr "Comportament" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:729 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:730 msgid "Change the way calibre behaves" msgstr "Canvia el comportament del calibre" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:734 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:208 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:735 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:209 msgid "Add your own columns" msgstr "Afegeix les teves columnes" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:740 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:741 msgid "Add/remove your own columns to the calibre book list" msgstr "" "Afegeix/elimina les teves columnes a la llista de llibres del calibre" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:745 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:746 msgid "Customize the toolbar" msgstr "Personalitza la barra d'eines" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:751 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:752 msgid "" "Customize the toolbars and context menus, changing which actions are " "available in each" @@ -317,60 +317,60 @@ 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:757 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 msgid "Input Options" msgstr "Opcions d'entrada" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:759 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:770 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:760 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:771 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:782 msgid "Conversion" msgstr "Conversió" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:763 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:764 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:768 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 msgid "Common Options" msgstr "Opcions comunes" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:774 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:775 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:779 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:780 msgid "Output Options" msgstr "Opcions de sortida" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:785 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:786 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:790 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:791 msgid "Adding books" msgstr "Afegint llibres" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:792 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:804 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:816 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:828 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:817 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:829 msgid "Import/Export" msgstr "Importa/exporta" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:796 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:797 msgid "Control how calibre reads metadata from files when adding books" msgstr "" "Controla com el calibre llegeix les metadades dels arxius quan s'afegeixen " "llibres" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:802 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:803 msgid "Saving books to disk" msgstr "Desant els llibres al disc" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:808 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:809 msgid "" "Control how calibre exports files from its database to disk when using Save " "to disk" @@ -378,32 +378,32 @@ msgstr "" "Controla com el calibre exporta fitxers de la seva base de dades al disc en " "utilitzar «Desa al disc»" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:814 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:815 msgid "Sending books to devices" msgstr "S'està enviant llibres als dispositius" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:820 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:821 msgid "Control how calibre transfers files to your ebook reader" msgstr "Controla com el calibre envia fitxers al lector de llibres" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:826 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:827 msgid "Metadata plugboards" msgstr "Metadades dels quadres de connexions" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:832 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:833 msgid "Change metadata fields before saving/sending" msgstr "Canvia els camps de les metadades abans de desar/enviar" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:837 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:838 msgid "Sharing books by email" msgstr "Compartint llibres via correu electrònic" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:839 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:851 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:840 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:852 msgid "Sharing" msgstr "Compartint" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:843 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:844 msgid "" "Setup sharing of books via email. Can be used for automatic sending of " "downloaded news to your devices" @@ -411,11 +411,11 @@ msgstr "" "Configura la compartició de llibres per correu electrònic. Es pot utilitzar " "per enviar notícies descarregades als vostres dispositius" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:849 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:850 msgid "Sharing over the net" msgstr "Compartint en xarxa" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:855 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:856 msgid "" "Setup the calibre Content Server which will give you access to your calibre " "library from anywhere, on any device, over the internet" @@ -423,35 +423,35 @@ msgstr "" "Configura el Servidor de Continguts donarà accés a la biblioteca des de " "qualsevol lloc i dispositiu, a través d'internet" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:862 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:863 msgid "Plugins" msgstr "Plugins" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:864 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:876 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:887 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:865 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:877 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:888 msgid "Advanced" msgstr "Avançat" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:868 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:869 msgid "Add/remove/customize various bits of calibre functionality" msgstr "" "Afegeix/suprimeix/personalitza diversos bits de la funcionalitat del calibre" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:874 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:875 msgid "Tweaks" msgstr "Ajustos" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:880 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:881 msgid "Fine tune how calibre behaves in various contexts" msgstr "" "Configura en detall el comportament del calibre en diversos contextos" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:885 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:886 msgid "Miscellaneous" msgstr "Miscel·lània" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:891 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:892 msgid "Miscellaneous advanced configuration" msgstr "Configuració avançada" @@ -497,7 +497,7 @@ msgstr "" "sabeu res del document d'entrada." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:59 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:436 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:444 msgid "" "This profile is intended for the SONY PRS line. The 500/505/600/700 etc." msgstr "" @@ -508,62 +508,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:80 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:476 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:484 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:88 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:506 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:513 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:99 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:517 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:524 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:112 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:530 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:537 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:124 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:542 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:549 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:134 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:550 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:557 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:147 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:563 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:570 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:159 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:576 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:583 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:171 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:617 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:631 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:183 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:630 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:644 msgid "This profile is intended for the IRex Digital Reader 1000." msgstr "Aquest perfil és adient per a l'IRex Digital Reader 1000." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:196 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:644 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:658 msgid "This profile is intended for the IRex Digital Reader 800." msgstr "Aquest perfil és adient per a l'IRex Digital Reader 800." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:208 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:658 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:672 msgid "This profile is intended for the B&N Nook." msgstr "Aquest perfil és adient per al B&N Nook." @@ -581,30 +581,30 @@ 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:273 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:276 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:435 msgid "Intended for generic tablet devices, does no resizing of images" msgstr "" "Pensat per a dispositius «tablet PC» genèrics, no redimensiona imatges" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:454 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:462 msgid "This profile is intended for the Kobo Reader." msgstr "Aquest perfil és adient per al Kobo Reader." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:467 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:475 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:485 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:493 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:494 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:502 msgid "" "This profile is intended for the SONY PRS line. The 500/505/700 etc, in " "landscape mode. Mainly useful for comics." @@ -612,11 +612,11 @@ msgstr "" "Aquest perfil és adient per a la línia PRS de SONY. Models 500/505/700... en " "mode apaïsat. Sobretot és útil per als còmics." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:597 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:609 msgid "This profile is intended for the Amazon Kindle DX." msgstr "Aquest perfil és adient per a l'Amazon Kindle DX." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:672 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:686 msgid "This profile is intended for the Sanda Bambook." msgstr "Aquest perfil és adient per al Sanda Bambook." @@ -695,7 +695,7 @@ msgstr "Inhabilita el connector anomenat" msgid "Communicate with Android phones." msgstr "Comunica't amb telèfons Android" -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:53 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:56 msgid "" "Comma separated list of directories to send e-books to on the device. The " "first one that exists will be used" @@ -703,7 +703,7 @@ msgstr "" "Llista de carpetes del dispositiu separades per comes on s'enviaran els " "llibres. Es farà servir la primera que ja existeixi al dispositiu." -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:95 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:98 msgid "Communicate with S60 phones." msgstr "Comunica't amb telèfons S60." @@ -1061,6 +1061,14 @@ msgstr "El Nook" msgid "Communicate with the Nook eBook reader." msgstr "Comunica't amb un lector Nook." +#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:85 +msgid "Nook Color" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:86 +msgid "Communicate with the Nook Color eBook reader." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:17 msgid "Communicate with the Nuut2 eBook reader." msgstr "Comunica't amb un lector Nuut2" @@ -2838,7 +2846,7 @@ msgstr "" "identificat amb ISBN des de LibraryThing.com\n" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1308 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1399 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 msgid "Cover" msgstr "Portada" @@ -2882,70 +2890,70 @@ msgstr "Tots els articles" msgid "This is an Amazon Topaz book. It cannot be processed." msgstr "Aquest és un llibre Amazon Topaz. No es pot processar" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1400 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 msgid "Title Page" 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/base.py:1403 #: /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:199 msgid "Table of Contents" msgstr "Índex" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 msgid "Index" msgstr "Índex" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 msgid "Glossary" msgstr "Glossari" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 msgid "Acknowledgements" msgstr "Reconeixements" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 msgid "Bibliography" msgstr "Bibliografia" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 msgid "Colophon" msgstr "Colofó" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 msgid "Copyright" msgstr "Drets d'autor" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 msgid "Dedication" msgstr "Dedicatòria" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 msgid "Epigraph" msgstr "Epígraf" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 msgid "Foreword" msgstr "Prefaci" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 msgid "List of Illustrations" msgstr "Índex d'il·lustracions" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 msgid "List of Tables" msgstr "Índex de taules" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 msgid "Notes" msgstr "Anotacions" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1416 msgid "Preface" msgstr "Pròleg" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1417 msgid "Main Text" msgstr "Text principal" @@ -4021,7 +4029,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:391 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:741 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:742 msgid "Not allowed" msgstr "No està permès" @@ -5138,11 +5146,11 @@ msgstr "" "valors desats d'una conversió prèvia (si existeix) en comptes de fer servir " "els valors per defecte que s'indiquen a les Preferències" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:70 msgid "Bulk Convert" msgstr "Convertir en massa" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:83 #: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:185 msgid "Options specific to the output format." msgstr "Opcions específiques per al format de sortida" @@ -6356,10 +6364,10 @@ msgstr "S'està enviant correu electrònic a" #: /home/kovid/work/calibre/src/calibre/gui2/device.py:982 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:990 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1083 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1168 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1287 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1295 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1089 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1174 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1293 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1301 msgid "No suitable formats" msgstr "No hi ha formats adequats" @@ -6388,39 +6396,39 @@ msgstr "Error en enviar els següents llibres per email:" msgid "Sent by email:" msgstr "S'ha enviat per correu electrònic:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1042 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1048 msgid "News:" msgstr "Notícies:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1043 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1049 msgid "Attached is the" msgstr "S'adjunta el" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1054 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1060 msgid "Sent news to" msgstr "S'ha enviat notícies a" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1084 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1169 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1288 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1090 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1175 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1294 msgid "Auto convert the following books before uploading to the device?" msgstr "" "S'ha de convertir automàticament aquests llibres abans de carregar-los al " "dispositiu?" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1114 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1120 msgid "Sending catalogs to device." msgstr "S'estan enviant els catàlegs al dispositiu." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1201 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1207 msgid "Sending news to device." msgstr "S'estan enviant les notícies al dispositiu." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1254 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1260 msgid "Sending books to device." msgstr "S'estan enviant els llibres al dispositiu." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1296 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1302 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." @@ -6429,11 +6437,11 @@ msgstr "" "un format adequat. Convertiu primer el(s) llibre(s) a un format compatible " "amb el vostre dispositiu." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1360 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1366 msgid "No space on device" msgstr "No hi ha espai al dispositiu" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1361 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1367 msgid "" "

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

No es pot desar llibres al dispositiu perquè no hi ha prou espai " @@ -7511,7 +7519,7 @@ msgstr "Pu&blicació:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:402 msgid "dd MMM yyyy" -msgstr "dd MMM aaaa" +msgstr "dd MMM yyyy" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:403 msgid "&Date:" @@ -7838,49 +7846,45 @@ msgid "Advanced Search" msgstr "Cerca avançada" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:199 -msgid "Find entries that have..." -msgstr "Troba les entrades que tenen..." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:200 -msgid "&All these words:" -msgstr "Totes &aquestes paraules:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:201 -msgid "This exact &phrase:" -msgstr "Aquesta &frase exacta:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:202 -msgid "&One or more of these words:" -msgstr "Una &o més d'aquestes paraules:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:203 -msgid "But dont show entries that have..." -msgstr "Però no mostris les entrades que tenen..." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:204 -msgid "Any of these &unwanted words:" -msgstr "Qualsevol d'aquestes para&ules no desitjades:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:205 msgid "What kind of match to use:" msgstr "Tipus de coincidència que s'ha de fer servir:" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:200 +msgid "Contains: the word or phrase matches anywhere in the metadata field" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:201 +msgid "Equals: the word or phrase must match the entire metadata field" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:202 +msgid "" +"Regular expression: the expression must match anywhere in the metadata field" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:203 +msgid "Find entries that have..." +msgstr "Troba les entrades que tenen..." + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:204 +msgid "&All these words:" +msgstr "Totes &aquestes paraules:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:205 +msgid "This exact &phrase:" +msgstr "Aquesta &frase exacta:" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:206 -msgid "Contains: the word or phrase matches anywhere in the metadata" -msgstr "Conté: la paraula o frase està a qualsevol lloc de les metadades" +msgid "&One or more of these words:" +msgstr "Una &o més d'aquestes paraules:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:207 -msgid "Equals: the word or phrase must match an entire metadata field" -msgstr "" -"Coincideix: la paraula o frase ha de coincidir amb el camp de metadades " -"sencer" +msgid "But dont show entries that have..." +msgstr "Però no mostris les entrades que tenen..." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:208 -msgid "" -"Regular expression: the expression must match anywhere in the metadata" -msgstr "" -"Expressió regular: l'expressió ha de coincidir en qualsevol posició de les " -"metadades" +msgid "Any of these &unwanted words:" +msgstr "Qualsevol d'aquestes para&ules no desitjades:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:209 msgid "" @@ -8726,47 +8730,47 @@ msgstr "S'ha marcat per suprimir" msgid "Double click to edit me

" msgstr "Feu doble clic per a edittar>/b>
-me" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:146 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:147 msgid "Hide column %s" msgstr "Amaga la columna %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:152 msgid "Sort on %s" msgstr "Ordena per %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:152 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:153 msgid "Ascending" msgstr "Ascendent" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:156 msgid "Descending" msgstr "Descendent" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:168 msgid "Change text alignment for %s" msgstr "Canvia l'alineació del text de %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 msgid "Left" msgstr "Esquerra" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 msgid "Right" msgstr "Dreta" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:171 msgid "Center" msgstr "Centrat" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:190 msgid "Show column" msgstr "Mostra la columna" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:201 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:202 msgid "Restore default layout" msgstr "Restaura la disposició per defecte" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:742 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:743 msgid "" "Dropping onto a device is not supported. First add the book to the calibre " "library." @@ -13876,6 +13880,20 @@ msgstr "No descarreguis els fulls d'estil CSS" #~ msgstr "" #~ "No es pot fer servir l'editor d'etiquetes si heu modificat les etiquetes" +#~ msgid "Contains: the word or phrase matches anywhere in the metadata" +#~ msgstr "Conté: la paraula o frase està a qualsevol lloc de les metadades" + +#~ msgid "" +#~ "Regular expression: the expression must match anywhere in the metadata" +#~ msgstr "" +#~ "Expressió regular: l'expressió ha de coincidir en qualsevol posició de les " +#~ "metadades" + +#~ msgid "Equals: the word or phrase must match an entire metadata field" +#~ msgstr "" +#~ "Coincideix: la paraula o frase ha de coincidir amb el camp de metadades " +#~ "sencer" + #~ msgid "" #~ "Book formats and metadata from the selected books will be merged into the " #~ "first selected book. ISBN will not be merged.

After " diff --git a/src/calibre/translations/cs.po b/src/calibre/translations/cs.po index 8fe3135949..88f90c8704 100644 --- a/src/calibre/translations/cs.po +++ b/src/calibre/translations/cs.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2010-11-10 14:27+0000\n" -"PO-Revision-Date: 2010-11-10 21:04+0000\n" -"Last-Translator: Marek Sušický \n" +"POT-Creation-Date: 2010-11-12 23:11+0000\n" +"PO-Revision-Date: 2010-11-12 22:54+0000\n" +"Last-Translator: Kovid Goyal \n" "Language-Team: Czech \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-11 04:40+0000\n" +"X-Launchpad-Export-Date: 2010-11-13 04:52+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -31,7 +31,7 @@ msgstr "Nedělá vůbec nic" #: /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:643 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:650 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:401 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 @@ -74,14 +74,14 @@ msgstr "Nedělá vůbec nic" #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:78 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:119 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:153 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:616 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:822 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:824 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:620 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:826 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:828 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:911 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:916 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:913 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:918 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:984 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:143 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:150 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:64 @@ -123,8 +123,8 @@ msgstr "Nedělá vůbec nic" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:141 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:927 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:936 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1243 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1246 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1249 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1252 #: /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 @@ -192,7 +192,7 @@ msgstr "Akce Uživatelského rozhraní" msgid "Preferences" msgstr "Možnosti" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:17 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:15 msgid "" "Follow all local links in an HTML file and create a ZIP file containing all " "linked files. This plugin is run every time you add an HTML file to the " @@ -202,7 +202,7 @@ msgstr "" "všechny soubory na které odkazy směrují. Tento modul je spušten pokaždé, " "když je do knihovny přidán HTML soubor." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:53 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:51 msgid "" "Character encoding for the input HTML files. Common choices include: cp1252, " "latin1, iso-8859-1 and utf-8." @@ -210,7 +210,7 @@ msgstr "" "Kódování vstupních HTML souborů. Bežně používané kódování jsou např. cp1252, " "latin1 iso-8859-1 nebo UTF-8." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:60 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:58 msgid "" "Create a PMLZ archive containing the PML file and all images in the " "directory pmlname_img or images. This plugin is run every time you add a PML " @@ -220,7 +220,7 @@ msgstr "" "pmlname_img nebo images. Tento plugin je spuštěn pokaždé když přidáte PML " "soubor do knihovny." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:94 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:92 msgid "Extract cover from comic files" msgstr "Vyjmout obálky ze souborů s komixy" @@ -267,98 +267,98 @@ msgstr "Nastavuje metadata do souborů %s" msgid "Set metadata from %s files" msgstr "Nastavuje metadata ze souborů %s" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:711 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:712 msgid "Look and Feel" msgstr "Vzhled" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:725 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:714 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:726 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:737 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:748 msgid "Interface" msgstr "Rozhraní" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:717 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:718 msgid "Adjust the look and feel of the calibre interface to suit your tastes" msgstr "Přizpůsobení vzhledu uživatelského rozhraní calibre" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:723 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 msgid "Behavior" msgstr "Chování" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:729 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:730 msgid "Change the way calibre behaves" msgstr "Mění způsob chování calibre" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:734 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:208 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:735 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:209 msgid "Add your own columns" msgstr "Přidejte své vlastní sloupce" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:740 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:741 msgid "Add/remove your own columns to the calibre book list" msgstr "Přidejte/odeberte své vlastní sloupce z calibre seznamu knih" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:745 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:746 msgid "Customize the toolbar" msgstr "Upravit lištu nástrojů" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:751 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:752 msgid "" "Customize the toolbars and context menus, changing which actions are " "available in each" msgstr "Přizpůsobení panelu nástrojů a kontextových menu." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:757 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 msgid "Input Options" msgstr "Volby vstupu" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:759 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:770 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:760 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:771 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:782 msgid "Conversion" msgstr "Převod" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:763 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:764 msgid "Set conversion options specific to each input format" msgstr "Nastavení převodu specifické pro jednotlivé formáty" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:768 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 msgid "Common Options" msgstr "Obecné nastavení" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:774 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:775 msgid "Set conversion options common to all formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:779 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:780 msgid "Output Options" msgstr "Nastavení výstupu" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:785 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:786 msgid "Set conversion options specific to each output format" msgstr "Nastavení převodu specifické pro jednotlivé formáty" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:790 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:791 msgid "Adding books" msgstr "Přidávání knih" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:792 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:804 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:816 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:828 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:817 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:829 msgid "Import/Export" msgstr "Import/Export" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:796 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:797 msgid "Control how calibre reads metadata from files when adding books" msgstr "Nastavuje jak calibre čte metadata ze souborů při přidávání knih" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:802 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:803 msgid "Saving books to disk" msgstr "Ukládání knih na disk" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:808 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:809 msgid "" "Control how calibre exports files from its database to disk when using Save " "to disk" @@ -366,32 +366,32 @@ msgstr "" "Nastavuje jak calibre exportuje soubory z jeho databáze na disk při použití " "Ulož na disk" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:814 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:815 msgid "Sending books to devices" msgstr "Posílání knih do zařízení" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:820 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:821 msgid "Control how calibre transfers files to your ebook reader" msgstr "Nastavuje jak calibre přesouvá soubory do vaší čtečky" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:826 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:827 msgid "Metadata plugboards" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:832 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:833 msgid "Change metadata fields before saving/sending" msgstr "Změň metadata před uložením/odesláním" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:837 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:838 msgid "Sharing books by email" msgstr "Sdílení knih pomocí emailu" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:839 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:851 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:840 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:852 msgid "Sharing" msgstr "Sdílení" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:843 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:844 msgid "" "Setup sharing of books via email. Can be used for automatic sending of " "downloaded news to your devices" @@ -399,11 +399,11 @@ msgstr "" "Natavení sdílení knih pomocí emailu. Může být použito pro automatické " "odesílání stažených zpráv do vašeho zařízení." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:849 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:850 msgid "Sharing over the net" msgstr "Sdílení po síti" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:855 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:856 msgid "" "Setup the calibre Content Server which will give you access to your calibre " "library from anywhere, on any device, over the internet" @@ -411,33 +411,33 @@ msgstr "" "Natavení calibre Obsahového Serveru, který vám umožní přistupovat k vaší " "knihovně calibre odkudkoliv, na jakémkoli zařízení, přes internet." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:862 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:863 msgid "Plugins" msgstr "Moduly" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:864 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:876 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:887 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:865 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:877 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:888 msgid "Advanced" msgstr "Rozšířené" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:868 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:869 msgid "Add/remove/customize various bits of calibre functionality" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:874 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:875 msgid "Tweaks" msgstr "Vylepšení" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:880 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:881 msgid "Fine tune how calibre behaves in various contexts" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:885 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:886 msgid "Miscellaneous" msgstr "Různé" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:891 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:892 msgid "Miscellaneous advanced configuration" msgstr "Pokročilá konfigurace" @@ -482,7 +482,7 @@ msgstr "" "nevíte nic o vstupním dokumentu" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:59 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:436 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:444 msgid "" "This profile is intended for the SONY PRS line. The 500/505/600/700 etc." msgstr "Tento profil je určen pro řadu SONY PSR. modely 500/505/600/700 atd." @@ -492,62 +492,62 @@ msgid "This profile is intended for the SONY PRS 300." msgstr "Tento profil je určen pro SONY PSR 300." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:80 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:476 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:484 msgid "This profile is intended for the SONY PRS-900." msgstr "Tento profil je určen pro SONY PSR 900." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:88 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:506 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:513 msgid "This profile is intended for the Microsoft Reader." msgstr "Tento profil je určený pro Microsoft Reader." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:99 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:517 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:524 msgid "This profile is intended for the Mobipocket books." msgstr "Tento profil je určený pro knihy Mobipocket." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:112 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:530 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:537 msgid "This profile is intended for the Hanlin V3 and its clones." msgstr "Tento profil je určený pro Hanlin V3 a jeho klony." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:124 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:542 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:549 msgid "This profile is intended for the Hanlin V5 and its clones." msgstr "Tento profil je určen pro Hanlin V5 a jeho klony." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:134 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:550 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:557 msgid "This profile is intended for the Cybook G3." msgstr "Tento profil je určený pro Cybook G3." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:147 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:563 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:570 msgid "This profile is intended for the Cybook Opus." msgstr "Tento profil je určen pro Cybook Opus." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:159 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:576 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:583 msgid "This profile is intended for the Amazon Kindle." msgstr "Tento profil je určený pro Amazon Kindle." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:171 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:617 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:631 msgid "This profile is intended for the Irex Illiad." msgstr "Tento profil je určen pro Irex Illiad." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:183 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:630 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:644 msgid "This profile is intended for the IRex Digital Reader 1000." msgstr "Tento profil je určen pro Irex Digital Reader 1000." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:196 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:644 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:658 msgid "This profile is intended for the IRex Digital Reader 800." msgstr "Tento profil je určený pro IRex Digital Reader 800." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:208 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:658 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:672 msgid "This profile is intended for the B&N Nook." msgstr "Tento profil je určen pro B&N Nook." @@ -565,28 +565,28 @@ msgstr "" "chcete vytvořit dokument určený ke čtení na počítači nebo na vetším rozpětí " "zařízení." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:273 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:276 msgid "" "Intended for the iPad and similar devices with a resolution of 768x1024" msgstr "Připraveno pro iPad a podobná zařízení s rozlišením 768x1024" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:427 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:435 msgid "Intended for generic tablet devices, does no resizing of images" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:454 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:462 msgid "This profile is intended for the Kobo Reader." msgstr "Tento profil je připraven pro Kobo Reader." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:467 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:475 msgid "This profile is intended for the SONY PRS-300." msgstr "Tento profil je určen pro SONY PSR 300." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:485 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:493 msgid "This profile is intended for the 5-inch JetBook." msgstr "Tento profil je určen pro 5\" Jetbook" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:494 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:502 msgid "" "This profile is intended for the SONY PRS line. The 500/505/700 etc, in " "landscape mode. Mainly useful for comics." @@ -594,11 +594,11 @@ msgstr "" "Tento profil je určený pro zařízení SONY PRS. 500/505/700 atd. pro čtení na " "šířku. Nejvíce užitečné pro čtení komiksu." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:597 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:609 msgid "This profile is intended for the Amazon Kindle DX." msgstr "Tento profil je určený pro Amazon Kindle DX." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:672 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:686 msgid "This profile is intended for the Sanda Bambook." msgstr "Tento profil je určený pro Sanda Bambook." @@ -673,7 +673,7 @@ msgstr "Deaktivovat modul podle jména" msgid "Communicate with Android phones." msgstr "Komunikace s telefony Android." -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:53 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:56 msgid "" "Comma separated list of directories to send e-books to on the device. The " "first one that exists will be used" @@ -681,7 +681,7 @@ msgstr "" "seznam adresářů oddělený čárkami k odeslání knih na zařízení. První který " "existuje pude použit." -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:95 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:98 msgid "Communicate with S60 phones." msgstr "Komunikovat s telefony serie S60." @@ -1029,6 +1029,14 @@ msgstr "Nook" msgid "Communicate with the Nook eBook reader." msgstr "Komunikuje se čtečkou Nook." +#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:85 +msgid "Nook Color" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:86 +msgid "Communicate with the Nook Color eBook reader." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:17 msgid "Communicate with the Nuut2 eBook reader." msgstr "Komunikuje se čtečkou Nuut2." @@ -2668,7 +2676,7 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1308 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1399 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 msgid "Cover" msgstr "Obálka" @@ -2708,70 +2716,70 @@ msgstr "Všechny články" msgid "This is an Amazon Topaz book. It cannot be processed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1400 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 msgid "Title Page" msgstr "Titulní stránka" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 #: /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:199 msgid "Table of Contents" msgstr "Obsah" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 msgid "Index" msgstr "Rejstřík" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 msgid "Glossary" msgstr "Slovník pojmů" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 msgid "Acknowledgements" msgstr "Pděkování" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 msgid "Bibliography" msgstr "Bibliografie" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 msgid "Colophon" msgstr "Tiráž" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 msgid "Copyright" msgstr "Autorská práva" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 msgid "Dedication" msgstr "Věnování" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 msgid "Epigraph" msgstr "Doslov" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 msgid "Foreword" msgstr "Předmluva" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 msgid "List of Illustrations" msgstr "Seznam Ilustrací" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 msgid "List of Tables" msgstr "Seznam tabulek" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 msgid "Notes" msgstr "Poznámky" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1416 msgid "Preface" msgstr "Úvod" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1417 msgid "Main Text" msgstr "Hlavní text" @@ -3727,7 +3735,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:391 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:741 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:742 msgid "Not allowed" msgstr "Nedovolené" @@ -4794,11 +4802,11 @@ msgid "" "specified in the Preferences" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:70 msgid "Bulk Convert" msgstr "Hromadné Převedení" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:83 #: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:185 msgid "Options specific to the output format." msgstr "Možnosti specifické pro výstupní formát." @@ -5971,10 +5979,10 @@ msgstr "Odeslat email" #: /home/kovid/work/calibre/src/calibre/gui2/device.py:982 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:990 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1083 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1168 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1287 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1295 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1089 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1174 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1293 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1301 msgid "No suitable formats" msgstr "Žádné vhodné formáty" @@ -5999,48 +6007,48 @@ msgstr "Poslání následujících knih selhalo:" msgid "Sent by email:" msgstr "Odesláno emailem:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1042 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1048 msgid "News:" msgstr "Zprávy:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1043 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1049 msgid "Attached is the" msgstr "Přiloženo je" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1054 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1060 msgid "Sent news to" msgstr "Odeslat zprávy do" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1084 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1169 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1288 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1090 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1175 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1294 msgid "Auto convert the following books before uploading to the device?" msgstr "" "Automaticky zkonvertovat následující knihy, než se nahrají do zařízení?" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1114 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1120 msgid "Sending catalogs to device." msgstr "Odeslat katalog do zařízení" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1201 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1207 msgid "Sending news to device." msgstr "Odesílám zprávy do zařízení" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1254 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1260 msgid "Sending books to device." msgstr "Odesílám knihy do zařízení" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1296 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1302 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:1360 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1366 msgid "No space on device" msgstr "Na zařízení není volné místo" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1361 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1367 msgid "" "

Cannot upload books to device there is no more free space available " msgstr "" @@ -7336,45 +7344,45 @@ msgid "Advanced Search" msgstr "Rozšířené vyhledávání" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:199 -msgid "Find entries that have..." -msgstr "Najít položky, které obsahují ....." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:200 -msgid "&All these words:" -msgstr "Všechn&a tato slova" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:201 -msgid "This exact &phrase:" -msgstr "Tuto frázi" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:202 -msgid "&One or more of these words:" -msgstr "Kterékoliv z těchto slov" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:203 -msgid "But dont show entries that have..." -msgstr "Ale nezobrazovat položky, které mají...." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:204 -msgid "Any of these &unwanted words:" -msgstr "Některé z těchto slov:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:205 msgid "What kind of match to use:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:206 -msgid "Contains: the word or phrase matches anywhere in the metadata" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:200 +msgid "Contains: the word or phrase matches anywhere in the metadata field" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:201 +msgid "Equals: the word or phrase must match the entire metadata field" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:202 +msgid "" +"Regular expression: the expression must match anywhere in the metadata field" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:203 +msgid "Find entries that have..." +msgstr "Najít položky, které obsahují ....." + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:204 +msgid "&All these words:" +msgstr "Všechn&a tato slova" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:205 +msgid "This exact &phrase:" +msgstr "Tuto frázi" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:206 +msgid "&One or more of these words:" +msgstr "Kterékoliv z těchto slov" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:207 -msgid "Equals: the word or phrase must match an entire metadata field" -msgstr "" +msgid "But dont show entries that have..." +msgstr "Ale nezobrazovat položky, které mají...." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:208 -msgid "" -"Regular expression: the expression must match anywhere in the metadata" -msgstr "" +msgid "Any of these &unwanted words:" +msgstr "Některé z těchto slov:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:209 msgid "" @@ -8171,47 +8179,47 @@ msgstr "" msgid "Double click to edit me

" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:146 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:147 msgid "Hide column %s" msgstr "Skryj sloupce %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:152 msgid "Sort on %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:152 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:153 msgid "Ascending" msgstr "Vzestupně" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:156 msgid "Descending" msgstr "Sestupně" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:168 msgid "Change text alignment for %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 msgid "Left" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 msgid "Right" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:171 msgid "Center" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:190 msgid "Show column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:201 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:202 msgid "Restore default layout" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:742 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:743 msgid "" "Dropping onto a device is not supported. First add the book to the calibre " "library." diff --git a/src/calibre/translations/da.po b/src/calibre/translations/da.po index e6488b0664..dd93151e79 100644 --- a/src/calibre/translations/da.po +++ b/src/calibre/translations/da.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2010-11-10 14:27+0000\n" -"PO-Revision-Date: 2010-11-10 17:03+0000\n" -"Last-Translator: Glenn \n" +"POT-Creation-Date: 2010-11-12 23:11+0000\n" +"PO-Revision-Date: 2010-11-12 22:04+0000\n" +"Last-Translator: Kovid Goyal \n" "Language-Team: Danish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-11 04:41+0000\n" +"X-Launchpad-Export-Date: 2010-11-13 04:52+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -31,7 +31,7 @@ msgstr "Gør absolut ingenting" #: /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:643 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:650 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:401 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 @@ -74,14 +74,14 @@ msgstr "Gør absolut ingenting" #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:78 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:119 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:153 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:616 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:822 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:824 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:620 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:826 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:828 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:911 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:916 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:913 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:918 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:984 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:143 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:150 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:64 @@ -123,8 +123,8 @@ msgstr "Gør absolut ingenting" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:141 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:927 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:936 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1243 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1246 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1249 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1252 #: /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 @@ -192,7 +192,7 @@ msgstr "Brugergrænseflade aktion" msgid "Preferences" msgstr "Indstillinger" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:17 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:15 msgid "" "Follow all local links in an HTML file and create a ZIP file containing all " "linked files. This plugin is run every time you add an HTML file to the " @@ -202,7 +202,7 @@ msgstr "" "fil. Dette udvidelsesmodul bliver kørt hver gang du tilføjer en HTML-fil til " "biblioteket." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:53 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:51 msgid "" "Character encoding for the input HTML files. Common choices include: cp1252, " "latin1, iso-8859-1 and utf-8." @@ -210,7 +210,7 @@ msgstr "" "Tegnsæt for kilde HTML-filerne. Typiske valg inkluderer: cp1252, latin1, iso-" "8859-1 og utf-8." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:60 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:58 msgid "" "Create a PMLZ archive containing the PML file and all images in the " "directory pmlname_img or images. This plugin is run every time you add a PML " @@ -220,7 +220,7 @@ msgstr "" "pmlname_img eller billeder. Dette udvidelsesmodul kører hver gang du " "tilføjer en PML-fil til biblioteket." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:94 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:92 msgid "Extract cover from comic files" msgstr "Udtræk omslag fra tegneserie-filer" @@ -267,43 +267,43 @@ msgstr "Gemmer metadata i %s filerne" msgid "Set metadata from %s files" msgstr "Sæt metadata fra %s filer" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:711 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:712 msgid "Look and Feel" msgstr "Fremtoning" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:725 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:714 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:726 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:737 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:748 msgid "Interface" msgstr "Brugergrænseflade" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:717 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:718 msgid "Adjust the look and feel of the calibre interface to suit your tastes" msgstr "Tilpas calibres grænseflades fremtoning til din smag" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:723 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 msgid "Behavior" msgstr "Opførsel" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:729 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:730 msgid "Change the way calibre behaves" msgstr "Ændr måden calibre opfører sig på" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:734 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:208 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:735 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:209 msgid "Add your own columns" msgstr "Tilføj dine egne søjler" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:740 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:741 msgid "Add/remove your own columns to the calibre book list" msgstr "Tilføj/fjern dine egne søjler til calibre boglisten" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:745 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:746 msgid "Customize the toolbar" msgstr "Tilpas værktøjslinjen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:751 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:752 msgid "" "Customize the toolbars and context menus, changing which actions are " "available in each" @@ -311,56 +311,56 @@ msgstr "" "Tilpas værktøjslinjen og kontekstmenuen, ændre hvilke aktioner som er " "tilgængelige i hver" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:757 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 msgid "Input Options" msgstr "Input tilvalg" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:759 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:770 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:760 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:771 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:782 msgid "Conversion" msgstr "Konvertering" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:763 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:764 msgid "Set conversion options specific to each input format" msgstr "Vælg konverteringsvalgmuligheder specifikke for hvert input-format" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:768 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 msgid "Common Options" msgstr "Fælles tilvalg" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:774 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:775 msgid "Set conversion options common to all formats" msgstr "Vælg konverteringsvalgmuligheder fælles for alle formater" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:779 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:780 msgid "Output Options" msgstr "Output valgmuligheder" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:785 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:786 msgid "Set conversion options specific to each output format" msgstr "Vælg konverteringsvalgmuligheder specifikke for hvert output-format" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:790 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:791 msgid "Adding books" msgstr "Tilføjer boger" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:792 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:804 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:816 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:828 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:817 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:829 msgid "Import/Export" msgstr "Import/eksport" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:796 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:797 msgid "Control how calibre reads metadata from files when adding books" msgstr "Styre hvordan calibre læser metadata fra filer, når bøger tilføjes" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:802 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:803 msgid "Saving books to disk" msgstr "Gemmer bøger til disk" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:808 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:809 msgid "" "Control how calibre exports files from its database to disk when using Save " "to disk" @@ -368,32 +368,32 @@ msgstr "" "Styre hvordan calibre eksporterer filer fra dens database til disk, når gem-" "til-disk anvendes" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:814 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:815 msgid "Sending books to devices" msgstr "Sender bøger til enheder" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:820 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:821 msgid "Control how calibre transfers files to your ebook reader" msgstr "Styre hvordan calibre overfører filer til din e-bogslæser" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:826 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:827 msgid "Metadata plugboards" msgstr "Metadata plugboards" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:832 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:833 msgid "Change metadata fields before saving/sending" msgstr "Ændre metadata felter før gem/send" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:837 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:838 msgid "Sharing books by email" msgstr "Deler bøger via email" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:839 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:851 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:840 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:852 msgid "Sharing" msgstr "Deler" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:843 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:844 msgid "" "Setup sharing of books via email. Can be used for automatic sending of " "downloaded news to your devices" @@ -401,11 +401,11 @@ msgstr "" "Opsætning som deler bøger via email. Kan anvendes til automatisk sending af " "downloadede nyheder til dine enheder" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:849 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:850 msgid "Sharing over the net" msgstr "Deler over internettet" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:855 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:856 msgid "" "Setup the calibre Content Server which will give you access to your calibre " "library from anywhere, on any device, over the internet" @@ -413,33 +413,33 @@ msgstr "" "Opsætning af calibre indholdsserveren, hvilket vil give dig adgang til dit " "calibre-bibliotek fra overalt, på enhver enhed, over internettet" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:862 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:863 msgid "Plugins" msgstr "Udvidelsesmoduler" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:864 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:876 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:887 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:865 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:877 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:888 msgid "Advanced" msgstr "Avanceret" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:868 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:869 msgid "Add/remove/customize various bits of calibre functionality" msgstr "Tilføj/fjern/tilpas forskellige dele af calibres funktionalitet" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:874 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:875 msgid "Tweaks" msgstr "Tweaks" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:880 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:881 msgid "Fine tune how calibre behaves in various contexts" msgstr "Finjustér hvordan calibre opfører sig i forskellige sammenhænge" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:885 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:886 msgid "Miscellaneous" msgstr "Diverse" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:891 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:892 msgid "Miscellaneous advanced configuration" msgstr "Diverse avanceret opsætning" @@ -484,7 +484,7 @@ msgstr "" "du intet aner om kildedokumentet." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:59 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:436 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:444 msgid "" "This profile is intended for the SONY PRS line. The 500/505/600/700 etc." msgstr "" @@ -496,62 +496,62 @@ msgid "This profile is intended for the SONY PRS 300." msgstr "Denne profil er forbeholdt SONY's PRS-300." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:80 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:476 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:484 msgid "This profile is intended for the SONY PRS-900." msgstr "Denne profil er forbeholdt SONY's PRS-900." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:88 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:506 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:513 msgid "This profile is intended for the Microsoft Reader." msgstr "Denne profil er beregnet for Microsoft Reader" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:99 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:517 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:524 msgid "This profile is intended for the Mobipocket books." msgstr "Denne profil er beregnet til Mobipocket-bøgerne" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:112 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:530 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:537 msgid "This profile is intended for the Hanlin V3 and its clones." msgstr "Denne profil er beregnet til Hanlin V3 og kloner." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:124 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:542 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:549 msgid "This profile is intended for the Hanlin V5 and its clones." msgstr "Denne profil er forbeholdt Harlin V5 og kloner." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:134 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:550 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:557 msgid "This profile is intended for the Cybook G3." msgstr "Denne profil er beregnet til Cybook G3." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:147 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:563 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:570 msgid "This profile is intended for the Cybook Opus." msgstr "Denne profil er beregnet til Cybook Opus." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:159 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:576 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:583 msgid "This profile is intended for the Amazon Kindle." msgstr "Denne profil er beregnet til Amazon Kindle." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:171 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:617 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:631 msgid "This profile is intended for the Irex Illiad." msgstr "Denne profil er beregnet til Irex Illiad." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:183 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:630 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:644 msgid "This profile is intended for the IRex Digital Reader 1000." msgstr "Denne profil er beregnet til IRex Digital Reader 1000." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:196 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:644 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:658 msgid "This profile is intended for the IRex Digital Reader 800." msgstr "Denne profil er beregnet til IRex Digital Reader 800" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:208 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:658 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:672 msgid "This profile is intended for the B&N Nook." msgstr "Denne profil er forbeholdt B&N's Nook." @@ -569,29 +569,29 @@ msgstr "" "hvis du vil generere et dokument beregnet til at blive læst på computere " "eller flere enhedstyper." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:273 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:276 msgid "" "Intended for the iPad and similar devices with a resolution of 768x1024" msgstr "Beregnet til iPad og lignende enheder med en opløsning på 768x1024" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:427 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:435 msgid "Intended for generic tablet devices, does no resizing of images" msgstr "" "Forbeholdt til generiske tavle-pc enheder, ændrer ikke billedstørrelser" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:454 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:462 msgid "This profile is intended for the Kobo Reader." msgstr "Denne profil er beregnet til Kobo Reader." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:467 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:475 msgid "This profile is intended for the SONY PRS-300." msgstr "Denne profil er beregnet til SONY's PRS-300." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:485 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:493 msgid "This profile is intended for the 5-inch JetBook." msgstr "Denne profil er beregnet til 5\" JetBook." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:494 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:502 msgid "" "This profile is intended for the SONY PRS line. The 500/505/700 etc, in " "landscape mode. Mainly useful for comics." @@ -599,11 +599,11 @@ msgstr "" "Denne profil er beregnet til SONYs PRS serie. PRS 500/505/700 etc. i " "liggende tilstand. Hovedsageligt egnet til tegneserier." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:597 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:609 msgid "This profile is intended for the Amazon Kindle DX." msgstr "Denne profil er beregnet til Amazon Kindle DX." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:672 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:686 msgid "This profile is intended for the Sanda Bambook." msgstr "Denne profil er beregnet til Sanda Bambook." @@ -684,7 +684,7 @@ msgstr "Deaktivér det angivne udvidelsesmodul" msgid "Communicate with Android phones." msgstr "Kommunikér med Android telefoner" -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:53 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:56 msgid "" "Comma separated list of directories to send e-books to on the device. The " "first one that exists will be used" @@ -692,7 +692,7 @@ msgstr "" "Komma separeret liste af mapper til at sende e-bøger til, på enheden. Den " "første som findes, vil blive brugt." -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:95 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:98 msgid "Communicate with S60 phones." msgstr "Kommunikér med S60 telefoner." @@ -1048,6 +1048,14 @@ msgstr "Nook e-bogen" msgid "Communicate with the Nook eBook reader." msgstr "Kommunikér med Nook e-bogslæser." +#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:85 +msgid "Nook Color" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:86 +msgid "Communicate with the Nook Color eBook reader." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:17 msgid "Communicate with the Nuut2 eBook reader." msgstr "Kommunikér med Nuut2 e-bogslæser." @@ -2790,7 +2798,7 @@ msgstr "" "fra LibraryThing.com\n" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1308 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1399 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 msgid "Cover" msgstr "Omslag" @@ -2835,70 +2843,70 @@ msgstr "" "E-bogen er i det proprietære Amazon Topaz format. Den kan derfor ikke " "behandles." -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1400 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 msgid "Title Page" msgstr "Titelside" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 #: /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:199 msgid "Table of Contents" msgstr "Indholdsfortegnelse" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 msgid "Index" msgstr "Indeks" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 msgid "Glossary" msgstr "Ordliste" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 msgid "Acknowledgements" msgstr "Anerkendelser" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 msgid "Bibliography" msgstr "Litteraturliste" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 msgid "Colophon" msgstr "Kolofon" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 msgid "Copyright" msgstr "Ophavsret" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 msgid "Dedication" msgstr "Dedikation" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 msgid "Epigraph" msgstr "Epigraf" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 msgid "Foreword" msgstr "Forord" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 msgid "List of Illustrations" msgstr "Illustrationsliste" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 msgid "List of Tables" msgstr "Tabelliste" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 msgid "Notes" msgstr "Bemærkninger" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1416 msgid "Preface" msgstr "Forord" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1417 msgid "Main Text" msgstr "Hovedtekst" @@ -3951,7 +3959,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:391 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:741 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:742 msgid "Not allowed" msgstr "Ikke tilladt" @@ -5063,11 +5071,11 @@ msgstr "" "tidligere konverteringer (hvis de eksisterer) istedet for at anvende de " "standard givne indstillinger" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:70 msgid "Bulk Convert" msgstr "Klynge konvertering" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:83 #: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:185 msgid "Options specific to the output format." msgstr "Muligheder specifikt for output-formatet." @@ -6277,10 +6285,10 @@ msgstr "Sender e-mail til" #: /home/kovid/work/calibre/src/calibre/gui2/device.py:982 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:990 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1083 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1168 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1287 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1295 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1089 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1174 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1293 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1301 msgid "No suitable formats" msgstr "Ingen egnede formater" @@ -6306,37 +6314,37 @@ msgstr "Fejlede med at e-maile følgende bøger:" msgid "Sent by email:" msgstr "Sendt via e-mail:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1042 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1048 msgid "News:" msgstr "Nyheder:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1043 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1049 msgid "Attached is the" msgstr "Forbundet er" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1054 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1060 msgid "Sent news to" msgstr "Send nyheder til" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1084 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1169 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1288 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1090 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1175 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1294 msgid "Auto convert the following books before uploading to the device?" msgstr "Auto konvertér følgende bøger før upload til enheden?" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1114 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1120 msgid "Sending catalogs to device." msgstr "Sender kataloger til enheden." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1201 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1207 msgid "Sending news to device." msgstr "Sender nyheder til enheden." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1254 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1260 msgid "Sending books to device." msgstr "Sender bøger til enheden." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1296 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1302 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." @@ -6344,11 +6352,11 @@ msgstr "" "Kunne ikke uploade følgende bøger til enheden, da ingen egnede formater blev " "fundet. Konvertér bog/bøgerne til et format understøttet af din enhed først." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1360 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1366 msgid "No space on device" msgstr "Ingen plads på enheden" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1361 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1367 msgid "" "

Cannot upload books to device there is no more free space available " msgstr "" @@ -7739,46 +7747,45 @@ msgid "Advanced Search" msgstr "Avanceret søgning" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:199 -msgid "Find entries that have..." -msgstr "Find indgange der har..." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:200 -msgid "&All these words:" -msgstr "&alle disse ord:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:201 -msgid "This exact &phrase:" -msgstr "Den eksakte &frase:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:202 -msgid "&One or more of these words:" -msgstr "&En eller flere af disse ord:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:203 -msgid "But dont show entries that have..." -msgstr "men vis ikke indgange der har..." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:204 -msgid "Any of these &unwanted words:" -msgstr "nogen af disse &uønskede ord:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:205 msgid "What kind of match to use:" msgstr "Hvilken slags match skal anvendes:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:206 -msgid "Contains: the word or phrase matches anywhere in the metadata" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:200 +msgid "Contains: the word or phrase matches anywhere in the metadata field" msgstr "" -"Indeholder: Ordet eller frasen vil forsøges matchet overalt i metadataene" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:201 +msgid "Equals: the word or phrase must match the entire metadata field" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:202 +msgid "" +"Regular expression: the expression must match anywhere in the metadata field" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:203 +msgid "Find entries that have..." +msgstr "Find indgange der har..." + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:204 +msgid "&All these words:" +msgstr "&alle disse ord:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:205 +msgid "This exact &phrase:" +msgstr "Den eksakte &frase:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:206 +msgid "&One or more of these words:" +msgstr "&En eller flere af disse ord:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:207 -msgid "Equals: the word or phrase must match an entire metadata field" -msgstr "Lig: Ordet eller frasen skal matche et helt metadata felt" +msgid "But dont show entries that have..." +msgstr "men vis ikke indgange der har..." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:208 -msgid "" -"Regular expression: the expression must match anywhere in the metadata" -msgstr "Regulært udtryk: Udtrykket forsøges matchet overalt i metadataene" +msgid "Any of these &unwanted words:" +msgstr "nogen af disse &uønskede ord:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:209 msgid "" @@ -8618,47 +8625,47 @@ msgstr "Markeret til sletning" msgid "Double click to edit me

" msgstr "Dobbeltklik for at redigere mig

" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:146 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:147 msgid "Hide column %s" msgstr "Gem kolonne %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:152 msgid "Sort on %s" msgstr "Sortér efter %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:152 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:153 msgid "Ascending" msgstr "Stigende" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:156 msgid "Descending" msgstr "Faldende" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:168 msgid "Change text alignment for %s" msgstr "Ændre tekstjustering for %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 msgid "Left" msgstr "Venstre" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 msgid "Right" msgstr "Højre" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:171 msgid "Center" msgstr "Centrér" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:190 msgid "Show column" msgstr "Vis kolonne" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:201 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:202 msgid "Restore default layout" msgstr "Gendan standard layout" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:742 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:743 msgid "" "Dropping onto a device is not supported. First add the book to the calibre " "library." @@ -14673,6 +14680,17 @@ msgstr "Download ikke CSS-stilark" #~ "Automatisk opret forfattersorteringsindgang baseret på den aktuelle " #~ "forfatterindgang" +#~ msgid "Equals: the word or phrase must match an entire metadata field" +#~ msgstr "Lig: Ordet eller frasen skal matche et helt metadata felt" + +#~ msgid "" +#~ "Regular expression: the expression must match anywhere in the metadata" +#~ msgstr "Regulært udtryk: Udtrykket forsøges matchet overalt i metadataene" + +#~ msgid "Contains: the word or phrase matches anywhere in the metadata" +#~ msgstr "" +#~ "Indeholder: Ordet eller frasen vil forsøges matchet overalt i metadataene" + #~ msgid "" #~ "For help with writing advanced news recipes, please visit User Recipes" diff --git a/src/calibre/translations/de.po b/src/calibre/translations/de.po index 64f0940be3..4d16a386fa 100644 --- a/src/calibre/translations/de.po +++ b/src/calibre/translations/de.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: de\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-11-10 14:27+0000\n" -"PO-Revision-Date: 2010-11-10 15:34+0000\n" -"Last-Translator: Manichean \n" +"POT-Creation-Date: 2010-11-12 23:11+0000\n" +"PO-Revision-Date: 2010-11-12 22:46+0000\n" +"Last-Translator: Kovid Goyal \n" "Language-Team: American English \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-11 04:41+0000\n" +"X-Launchpad-Export-Date: 2010-11-13 04:53+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Generated-By: pygettext.py 1.5\n" @@ -32,7 +32,7 @@ msgstr "Macht absolut gar nichts" #: /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:643 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:650 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:401 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 @@ -75,14 +75,14 @@ msgstr "Macht absolut gar nichts" #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:78 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:119 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:153 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:616 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:822 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:824 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:620 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:826 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:828 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:911 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:916 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:913 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:918 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:984 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:143 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:150 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:64 @@ -124,8 +124,8 @@ msgstr "Macht absolut gar nichts" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:141 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:927 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:936 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1243 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1246 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1249 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1252 #: /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 @@ -193,7 +193,7 @@ msgstr "Benutzeroberflächenaktion" msgid "Preferences" msgstr "Einstellungen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:17 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:15 msgid "" "Follow all local links in an HTML file and create a ZIP file containing all " "linked files. This plugin is run every time you add an HTML file to the " @@ -203,7 +203,7 @@ msgstr "" "allen verlinkten Dateien erstellen. Dieses Plugin läuft immer, wenn sie eine " "HTML-Datei zur Bibliothek hinzufügen." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:53 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:51 msgid "" "Character encoding for the input HTML files. Common choices include: cp1252, " "latin1, iso-8859-1 and utf-8." @@ -211,7 +211,7 @@ msgstr "" "Zeichenkodierung der Eingabe-HTML-Dateien. Üblicherweise ist das: cp1252, " "latin1, iso-8859-1 und utf-8." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:60 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:58 msgid "" "Create a PMLZ archive containing the PML file and all images in the " "directory pmlname_img or images. This plugin is run every time you add a PML " @@ -221,7 +221,7 @@ msgstr "" "pmlname_img oder images. Dieses Plugin wird immer dann ausgeführt, wenn Sie " "eine PML-Datei zur Bibliothek hinzufügen." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:94 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:92 msgid "Extract cover from comic files" msgstr "Umschlagbild aus Comic-Dateien extrahieren" @@ -268,101 +268,101 @@ msgstr "Geben Sie die Metadaten in %s-Dateien an" msgid "Set metadata from %s files" msgstr "Geben Sie die Metadaten von %s-Dateien an" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:711 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:712 msgid "Look and Feel" msgstr "Erscheinungsbild" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:725 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:714 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:726 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:737 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:748 msgid "Interface" msgstr "Bedienungsoberfläche" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:717 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:718 msgid "Adjust the look and feel of the calibre interface to suit your tastes" msgstr "Passen Sie das Erscheinungsbild von Calibre ihren Bedürfnissen an." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:723 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 msgid "Behavior" msgstr "Verhalten" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:729 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:730 msgid "Change the way calibre behaves" msgstr "Ändern Sie das Verhalten von Calibre." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:734 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:208 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:735 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:209 msgid "Add your own columns" msgstr "Eigene Spalten hinzufügen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:740 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:741 msgid "Add/remove your own columns to the calibre book list" msgstr "Hinzufügen/Entfernen eigener Spalten in der Calibre Buchliste" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:745 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:746 msgid "Customize the toolbar" msgstr "Werkzeugleiste anpassen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:751 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:752 msgid "" "Customize the toolbars and context menus, changing which actions are " "available in each" msgstr "Passt individuell Werkzeugleiste und Kontextmenus an." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:757 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 msgid "Input Options" msgstr "Eingabeoptionen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:759 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:770 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:760 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:771 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:782 msgid "Conversion" msgstr "Konvertierung" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:763 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:764 msgid "Set conversion options specific to each input format" msgstr "Stellt Eingabeoptionen für jedes einzelne Eingabeformat ein." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:768 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 msgid "Common Options" msgstr "Allgemeine Einstellungen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:774 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:775 msgid "Set conversion options common to all formats" msgstr "Gemeinsame Konvertierungsoptionen für alle Formate einstellen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:779 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:780 msgid "Output Options" msgstr "Ausgabeoptionen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:785 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:786 msgid "Set conversion options specific to each output format" msgstr "" "Konvertierungsoptionen für jedes Ausgabeformat individuell einstellen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:790 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:791 msgid "Adding books" msgstr "Bücher hinzufügen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:792 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:804 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:816 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:828 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:817 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:829 msgid "Import/Export" msgstr "Import/Export" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:796 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:797 msgid "Control how calibre reads metadata from files when adding books" msgstr "" "Stellt ein, wie Calibre mit den Metadaten aus den Dateien beim Einlesen von " "Büchern verfährt." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:802 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:803 msgid "Saving books to disk" msgstr "Bücher auf Datenträger speichern" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:808 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:809 msgid "" "Control how calibre exports files from its database to disk when using Save " "to disk" @@ -370,32 +370,32 @@ msgstr "" "Stellt ein, wie Calibre Dateien aus der Datenbank exportiert, wenn \"Bücher " "auf Datenträger speichern\" gewählt wird." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:814 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:815 msgid "Sending books to devices" msgstr "Übertragen der Bücher an Geräte" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:820 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:821 msgid "Control how calibre transfers files to your ebook reader" msgstr "Stellt ein, wie Calibre die Dateien an den eBook-Reader sendet." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:826 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:827 msgid "Metadata plugboards" msgstr "Metadaten- Schalttafel" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:832 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:833 msgid "Change metadata fields before saving/sending" msgstr "Ändere Metadaten-Felder vor dem Speichern/Senden" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:837 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:838 msgid "Sharing books by email" msgstr "Bücherversand per Email" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:839 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:851 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:840 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:852 msgid "Sharing" msgstr "Versand" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:843 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:844 msgid "" "Setup sharing of books via email. Can be used for automatic sending of " "downloaded news to your devices" @@ -403,11 +403,11 @@ msgstr "" "Setup für Bücherversand per Email. Kann für den automatischen Versand von " "heruntergeladenen Nachrichten an Ihr Gerät genutzt werden." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:849 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:850 msgid "Sharing over the net" msgstr "Versand über Netzwerk" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:855 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:856 msgid "" "Setup the calibre Content Server which will give you access to your calibre " "library from anywhere, on any device, over the internet" @@ -415,34 +415,34 @@ msgstr "" "Einrichten des Calibre Servers, der Zugriff auf die Bibliothek von überall, " "mit jedem Gerät, via Internet ermöglicht." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:862 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:863 msgid "Plugins" msgstr "Plugins" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:864 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:876 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:887 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:865 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:877 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:888 msgid "Advanced" msgstr "Erweitert" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:868 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:869 msgid "Add/remove/customize various bits of calibre functionality" msgstr "Hinzufügen/Entfernen/Einstellen von verschiedenen Calibre-Funktionen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:874 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:875 msgid "Tweaks" msgstr "Kniffe" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:880 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:881 msgid "Fine tune how calibre behaves in various contexts" msgstr "" "Feineinstellungen für das Verhalten von Calibre in verschiedenen Situationen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:885 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:886 msgid "Miscellaneous" msgstr "Verschiedenes" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:891 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:892 msgid "Miscellaneous advanced configuration" msgstr "Konfiguration verschiedener fortgeschrittener Parameter" @@ -487,7 +487,7 @@ msgstr "" "hilfreich, wenn Sie nichts über das Eingabe-Dokument wissen." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:59 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:436 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:444 msgid "" "This profile is intended for the SONY PRS line. The 500/505/600/700 etc." msgstr "" @@ -499,62 +499,62 @@ msgid "This profile is intended for the SONY PRS 300." msgstr "Dieses Profil ist geeignet für das SONY PRS 300." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:80 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:476 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:484 msgid "This profile is intended for the SONY PRS-900." msgstr "Dieses Profil ist geeignet für das SONY PRS-900." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:88 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:506 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:513 msgid "This profile is intended for the Microsoft Reader." msgstr "Dieses Profil ist geeignet für den Microsoft Reader." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:99 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:517 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:524 msgid "This profile is intended for the Mobipocket books." msgstr "Dieses Profil ist geeignet für Mobipocket-Bücher." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:112 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:530 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:537 msgid "This profile is intended for the Hanlin V3 and its clones." msgstr "Dieses Profil ist geeignet für den Hanlin V3 und dessen Klone." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:124 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:542 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:549 msgid "This profile is intended for the Hanlin V5 and its clones." msgstr "Dieses Profil ist geeignet für den Hanlin V5 und dessen Klone." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:134 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:550 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:557 msgid "This profile is intended for the Cybook G3." msgstr "Dieses Profil ist geeignet für das Cybook G3." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:147 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:563 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:570 msgid "This profile is intended for the Cybook Opus." msgstr "Dieses Profil ist geeignet für den Cybook Opus." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:159 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:576 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:583 msgid "This profile is intended for the Amazon Kindle." msgstr "Dieses Profil ist geeignet für den Amazon Kindle." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:171 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:617 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:631 msgid "This profile is intended for the Irex Illiad." msgstr "Dieses Profil ist geeignet für den Irex Illiad." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:183 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:630 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:644 msgid "This profile is intended for the IRex Digital Reader 1000." msgstr "Dieses Profil ist geeignet für den IRex Digital Reader 1000." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:196 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:644 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:658 msgid "This profile is intended for the IRex Digital Reader 800." msgstr "Dieses Profil ist geeignet für den IRex Digital Reader 800." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:208 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:658 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:672 msgid "This profile is intended for the B&N Nook." msgstr "Dieses Profil ist geeignet für den B&N Nook." @@ -572,31 +572,31 @@ msgstr "" "hilfreich, wenn Sie ein Dokument zum Lesen an einem Computer oder auf einer " "Reihe von verschiedenen Geräten erstellen wollen." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:273 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:276 msgid "" "Intended for the iPad and similar devices with a resolution of 768x1024" msgstr "" "Geeignet für das iPad und ähnliche Geräte mit einer Auflösung von 768 x1024" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:427 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:435 msgid "Intended for generic tablet devices, does no resizing of images" msgstr "" "Gedacht für allgemeine Tablet- PCs, führt keine Größenänderung bei Bildern " "durch" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:454 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:462 msgid "This profile is intended for the Kobo Reader." msgstr "Dieses Profil ist geeignet für den Kobo Reader." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:467 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:475 msgid "This profile is intended for the SONY PRS-300." msgstr "Dieses Profil ist geeignet für das SONY PRS-300." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:485 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:493 msgid "This profile is intended for the 5-inch JetBook." msgstr "Dieses Profil ist geeignet für das 5-Zoll JetBook." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:494 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:502 msgid "" "This profile is intended for the SONY PRS line. The 500/505/700 etc, in " "landscape mode. Mainly useful for comics." @@ -604,11 +604,11 @@ msgstr "" "Dieses Profil ist geeignet für die SONY PRS-Reihe. PRS 500/505/700 etc. in " "horizontaler Darstellung. Vor allem für Comics hilfreich." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:597 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:609 msgid "This profile is intended for the Amazon Kindle DX." msgstr "Dieses Profil ist geeignet für den Amazon Kindle DX." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:672 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:686 msgid "This profile is intended for the Sanda Bambook." msgstr "Dieses Profil ist geeignet für den Sanda Bambook" @@ -688,7 +688,7 @@ msgstr "Gewähltes Plugin ausschalten" msgid "Communicate with Android phones." msgstr "Kommunikation mit Android-Telefonen." -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:53 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:56 msgid "" "Comma separated list of directories to send e-books to on the device. The " "first one that exists will be used" @@ -696,7 +696,7 @@ msgstr "" "Durch Kommata getrennte Liste von Verzeichnissen an die eBooks auf das Gerät " "gesendet werden. Das erste vorhandene wird benutzt" -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:95 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:98 msgid "Communicate with S60 phones." msgstr "Kommunikation mit S60-Telefonen." @@ -1053,6 +1053,14 @@ msgstr "Der Nook" msgid "Communicate with the Nook eBook reader." msgstr "Kommunikation mit dem Nook eBook Reader." +#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:85 +msgid "Nook Color" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:86 +msgid "Communicate with the Nook Color eBook reader." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:17 msgid "Communicate with the Nuut2 eBook reader." msgstr "Kommunikation mit dem Nuut2 eBook Reader." @@ -2853,7 +2861,7 @@ msgstr "" "LibraryThing.com laden.\n" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1308 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1399 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 msgid "Cover" msgstr "Umschlagbild" @@ -2894,70 +2902,70 @@ msgstr "Alle Artikel" msgid "This is an Amazon Topaz book. It cannot be processed." msgstr "Dies ist ein Amazon Topaz-Buch. Es kann nicht verarbeitet werden." -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1400 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 msgid "Title Page" msgstr "Titelseite" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 #: /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:199 msgid "Table of Contents" msgstr "Inhaltsverzeichnis" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 msgid "Index" msgstr "Index" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 msgid "Glossary" msgstr "Glossar" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 msgid "Acknowledgements" msgstr "Danksagung" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 msgid "Bibliography" msgstr "Literaturverzeichnis" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 msgid "Colophon" msgstr "Schlussschrift" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 msgid "Copyright" msgstr "Copyright" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 msgid "Dedication" msgstr "Widmung" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 msgid "Epigraph" msgstr "Epigraph" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 msgid "Foreword" msgstr "Vorwort" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 msgid "List of Illustrations" msgstr "Abbildungsverzeichnis" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 msgid "List of Tables" msgstr "Tabellenverzeichnis" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 msgid "Notes" msgstr "Anmerkungen" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1416 msgid "Preface" msgstr "Vorwort" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1417 msgid "Main Text" msgstr "Haupttext" @@ -4043,7 +4051,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:391 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:741 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:742 msgid "Not allowed" msgstr "Das ist nicht gestattet" @@ -5166,11 +5174,11 @@ msgstr "" "verwenden, anstelle der in den Einstellungen angegebenen voreingestellten " "Werte" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:70 msgid "Bulk Convert" msgstr "Auf einmal konvertieren" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:83 #: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:185 msgid "Options specific to the output format." msgstr "Einstellungen für das Ausgabe-Format." @@ -6393,10 +6401,10 @@ msgstr "Sende eMail an" #: /home/kovid/work/calibre/src/calibre/gui2/device.py:982 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:990 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1083 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1168 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1287 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1295 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1089 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1174 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1293 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1301 msgid "No suitable formats" msgstr "Keine geeigneten Formate" @@ -6423,38 +6431,38 @@ msgstr "Senden der folgenden Bücher schlug fehl:" msgid "Sent by email:" msgstr "Per eMail versendet:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1042 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1048 msgid "News:" msgstr "Nachrichten:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1043 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1049 msgid "Attached is the" msgstr "Im Anhang ist" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1054 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1060 msgid "Sent news to" msgstr "Nachrichten senden an" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1084 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1169 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1288 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1090 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1175 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1294 msgid "Auto convert the following books before uploading to the device?" msgstr "" "Die folgenden Bücher vor dem Laden auf das Gerät automatisch konvertieren?" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1114 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1120 msgid "Sending catalogs to device." msgstr "Sende Kataloge ans Gerät." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1201 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1207 msgid "Sending news to device." msgstr "Sende Nachrichten an das Gerät." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1254 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1260 msgid "Sending books to device." msgstr "Sende Bücher an das Gerät." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1296 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1302 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." @@ -6463,11 +6471,11 @@ msgstr "" "fehlen. Konvertieren Sie die Bücher zuerst in ein von Ihrem Gerät " "unterstütztes Format." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1360 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1366 msgid "No space on device" msgstr "Gerätespeicher voll" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1361 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1367 msgid "" "

Cannot upload books to device there is no more free space available " msgstr "" @@ -7883,50 +7891,45 @@ msgid "Advanced Search" msgstr "Erweiterte Suche" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:199 -msgid "Find entries that have..." -msgstr "Finde Einträge, die das Folgende enthalten..." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:200 -msgid "&All these words:" -msgstr "&Alle diese Worte:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:201 -msgid "This exact &phrase:" -msgstr "&Exakt diesen Ausdruck:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:202 -msgid "&One or more of these words:" -msgstr "Ein &oder mehrere dieser Worte:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:203 -msgid "But dont show entries that have..." -msgstr "Aber zeige nicht Einträge, die das Folgende enthalten..." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:204 -msgid "Any of these &unwanted words:" -msgstr "Alle diese &unerwünschten Worte:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:205 msgid "What kind of match to use:" msgstr "Folgende Übereinstimmung verwenden:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:206 -msgid "Contains: the word or phrase matches anywhere in the metadata" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:200 +msgid "Contains: the word or phrase matches anywhere in the metadata field" msgstr "" -"Enthalten: Word oder Ausdruck stimmt irgendwo in den Metadaten überein" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:201 +msgid "Equals: the word or phrase must match the entire metadata field" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:202 +msgid "" +"Regular expression: the expression must match anywhere in the metadata field" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:203 +msgid "Find entries that have..." +msgstr "Finde Einträge, die das Folgende enthalten..." + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:204 +msgid "&All these words:" +msgstr "&Alle diese Worte:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:205 +msgid "This exact &phrase:" +msgstr "&Exakt diesen Ausdruck:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:206 +msgid "&One or more of these words:" +msgstr "Ein &oder mehrere dieser Worte:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:207 -msgid "Equals: the word or phrase must match an entire metadata field" -msgstr "" -"Übereinstimmend: Word oder Ausdruck muss mit einem ganzen Metadatenfeld " -"übereinstimmen" +msgid "But dont show entries that have..." +msgstr "Aber zeige nicht Einträge, die das Folgende enthalten..." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:208 -msgid "" -"Regular expression: the expression must match anywhere in the metadata" -msgstr "" -"Regulärer Ausdruck: der Reguläre Ausdruck muss irgendwo in den Metadaten " -"übereinstimmen" +msgid "Any of these &unwanted words:" +msgstr "Alle diese &unerwünschten Worte:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:209 msgid "" @@ -8778,47 +8781,47 @@ msgstr "Zum Löschen ausgewählt" msgid "Double click to edit me

" msgstr "Doppelklick ermöglicht Bearbeitung

" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:146 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:147 msgid "Hide column %s" msgstr "Spalte %s ausblenden" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:152 msgid "Sort on %s" msgstr "Sortieren nach %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:152 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:153 msgid "Ascending" msgstr "aufsteigend" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:156 msgid "Descending" msgstr "absteigend" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:168 msgid "Change text alignment for %s" msgstr "Textausrichtung ändern für %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 msgid "Left" msgstr "Links" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 msgid "Right" msgstr "Rechts" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:171 msgid "Center" msgstr "Zentriert" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:190 msgid "Show column" msgstr "Spalte anzeigen" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:201 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:202 msgid "Restore default layout" msgstr "Voreingestelltes Layout wiederherstellen" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:742 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:743 msgid "" "Dropping onto a device is not supported. First add the book to the calibre " "library." @@ -16139,6 +16142,21 @@ msgstr "CSS-Stylesheets nicht herunterladen." #~ msgid " " #~ msgstr " " +#~ msgid "" +#~ "Regular expression: the expression must match anywhere in the metadata" +#~ msgstr "" +#~ "Regulärer Ausdruck: der Reguläre Ausdruck muss irgendwo in den Metadaten " +#~ "übereinstimmen" + +#~ msgid "Contains: the word or phrase matches anywhere in the metadata" +#~ msgstr "" +#~ "Enthalten: Word oder Ausdruck stimmt irgendwo in den Metadaten überein" + +#~ msgid "Equals: the word or phrase must match an entire metadata field" +#~ msgstr "" +#~ "Übereinstimmend: Word oder Ausdruck muss mit einem ganzen Metadatenfeld " +#~ "übereinstimmen" + #~ msgid "Masthead font:" #~ msgstr "Impressumsschrift:" diff --git a/src/calibre/translations/en_GB.po b/src/calibre/translations/en_GB.po index cdef318587..de8c211c01 100644 --- a/src/calibre/translations/en_GB.po +++ b/src/calibre/translations/en_GB.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2010-11-10 14:27+0000\n" -"PO-Revision-Date: 2010-11-10 20:32+0000\n" -"Last-Translator: Vladimir Oka \n" +"POT-Creation-Date: 2010-11-12 23:11+0000\n" +"PO-Revision-Date: 2010-11-12 22:58+0000\n" +"Last-Translator: Kovid Goyal \n" "Language-Team: English (United Kingdom) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-11 04:42+0000\n" +"X-Launchpad-Export-Date: 2010-11-13 04:55+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -31,7 +31,7 @@ msgstr "Does absolutely nothing" #: /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:643 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:650 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:401 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 @@ -74,14 +74,14 @@ msgstr "Does absolutely nothing" #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:78 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:119 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:153 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:616 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:822 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:824 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:620 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:826 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:828 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:911 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:916 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:913 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:918 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:984 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:143 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:150 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:64 @@ -123,8 +123,8 @@ msgstr "Does absolutely nothing" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:141 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:927 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:936 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1243 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1246 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1249 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1252 #: /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 @@ -192,7 +192,7 @@ msgstr "User Interface Action" msgid "Preferences" msgstr "Preferences" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:17 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:15 msgid "" "Follow all local links in an HTML file and create a ZIP file containing all " "linked files. This plugin is run every time you add an HTML file to the " @@ -202,7 +202,7 @@ msgstr "" "linked files. This plugin is run every time you add an HTML file to the " "library." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:53 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:51 msgid "" "Character encoding for the input HTML files. Common choices include: cp1252, " "latin1, iso-8859-1 and utf-8." @@ -210,7 +210,7 @@ msgstr "" "Character encoding for the input HTML files. Common choices include: cp1252, " "latin1, iso-8859-1 and utf-8." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:60 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:58 msgid "" "Create a PMLZ archive containing the PML file and all images in the " "directory pmlname_img or images. This plugin is run every time you add a PML " @@ -220,7 +220,7 @@ msgstr "" "directory pmlname_img or images. This plugin is run every time you add a PML " "file to the library." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:94 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:92 msgid "Extract cover from comic files" msgstr "Extract cover from comic files" @@ -267,44 +267,44 @@ msgstr "Set metadata in %s files" msgid "Set metadata from %s files" msgstr "Set metadata from %s files" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:711 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:712 msgid "Look and Feel" msgstr "Look and Feel" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:725 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:714 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:726 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:737 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:748 msgid "Interface" msgstr "Interface" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:717 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:718 msgid "Adjust the look and feel of the calibre interface to suit your tastes" msgstr "" "Adjust the look and feel of the calibre interface to suit your tastes" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:723 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 msgid "Behavior" msgstr "Behaviour" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:729 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:730 msgid "Change the way calibre behaves" msgstr "Change the way calibre behaves" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:734 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:208 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:735 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:209 msgid "Add your own columns" msgstr "Add your own columns" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:740 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:741 msgid "Add/remove your own columns to the calibre book list" msgstr "Add/remove your own columns to the calibre book list" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:745 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:746 msgid "Customize the toolbar" msgstr "Customise the toolbar" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:751 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:752 msgid "" "Customize the toolbars and context menus, changing which actions are " "available in each" @@ -312,56 +312,56 @@ msgstr "" "Customise the toolbars and context menus, changing which actions are " "available in each" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:757 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 msgid "Input Options" msgstr "Input Options" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:759 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:770 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:760 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:771 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:782 msgid "Conversion" msgstr "Conversion" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:763 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:764 msgid "Set conversion options specific to each input format" msgstr "Set conversion options specific to each input format" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:768 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 msgid "Common Options" msgstr "Common Options" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:774 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:775 msgid "Set conversion options common to all formats" msgstr "Set conversion options common to all formats" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:779 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:780 msgid "Output Options" msgstr "Output Options" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:785 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:786 msgid "Set conversion options specific to each output format" msgstr "Set conversion options specific to each output format" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:790 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:791 msgid "Adding books" msgstr "Adding books" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:792 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:804 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:816 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:828 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:817 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:829 msgid "Import/Export" msgstr "Import/Export" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:796 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:797 msgid "Control how calibre reads metadata from files when adding books" msgstr "Control how calibre reads metadata from files when adding books" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:802 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:803 msgid "Saving books to disk" msgstr "Saving books to disc" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:808 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:809 msgid "" "Control how calibre exports files from its database to disk when using Save " "to disk" @@ -369,32 +369,32 @@ msgstr "" "Control how calibre exports files from its database to disc when using Save " "to disc" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:814 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:815 msgid "Sending books to devices" msgstr "Sending books to devices" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:820 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:821 msgid "Control how calibre transfers files to your ebook reader" msgstr "Control how calibre transfers files to your ebook reader" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:826 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:827 msgid "Metadata plugboards" msgstr "Metadata plugboards" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:832 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:833 msgid "Change metadata fields before saving/sending" msgstr "Change metadata fields before saving/sending" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:837 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:838 msgid "Sharing books by email" msgstr "Sharing books by email" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:839 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:851 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:840 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:852 msgid "Sharing" msgstr "Sharing" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:843 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:844 msgid "" "Setup sharing of books via email. Can be used for automatic sending of " "downloaded news to your devices" @@ -402,11 +402,11 @@ msgstr "" "Setup sharing of books via email. Can be used for automatic sending of " "downloaded news to your devices" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:849 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:850 msgid "Sharing over the net" msgstr "Sharing over the net" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:855 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:856 msgid "" "Setup the calibre Content Server which will give you access to your calibre " "library from anywhere, on any device, over the internet" @@ -414,33 +414,33 @@ msgstr "" "Setup the calibre Content Server which will give you access to your calibre " "library from anywhere, on any device, over the internet" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:862 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:863 msgid "Plugins" msgstr "Plugins" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:864 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:876 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:887 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:865 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:877 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:888 msgid "Advanced" msgstr "Advanced" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:868 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:869 msgid "Add/remove/customize various bits of calibre functionality" msgstr "Add/remove/customise various bits of calibre functionality" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:874 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:875 msgid "Tweaks" msgstr "Tweaks" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:880 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:881 msgid "Fine tune how calibre behaves in various contexts" msgstr "Fine tune how calibre behaves in various contexts" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:885 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:886 msgid "Miscellaneous" msgstr "Miscellaneous" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:891 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:892 msgid "Miscellaneous advanced configuration" msgstr "Miscellaneous advanced configuration" @@ -485,7 +485,7 @@ msgstr "" "no information about the input document." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:59 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:436 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:444 msgid "" "This profile is intended for the SONY PRS line. The 500/505/600/700 etc." msgstr "" @@ -496,62 +496,62 @@ msgid "This profile is intended for the SONY PRS 300." msgstr "This profile is intended for the SONY PRS 300." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:80 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:476 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:484 msgid "This profile is intended for the SONY PRS-900." msgstr "This profile is intended for the SONY PRS-900." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:88 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:506 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:513 msgid "This profile is intended for the Microsoft Reader." msgstr "This profile is intended for Microsoft's Reader format." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:99 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:517 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:524 msgid "This profile is intended for the Mobipocket books." msgstr "This profile is intended for the Mobipocket books." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:112 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:530 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:537 msgid "This profile is intended for the Hanlin V3 and its clones." msgstr "This profile is intended for the Hanlin V3 and its clones." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:124 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:542 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:549 msgid "This profile is intended for the Hanlin V5 and its clones." msgstr "This profile is intended for the Hanlin V5 and its clones." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:134 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:550 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:557 msgid "This profile is intended for the Cybook G3." msgstr "This profile is intended for the Cybook G3." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:147 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:563 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:570 msgid "This profile is intended for the Cybook Opus." msgstr "This profile is intended for the Cybook Opus." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:159 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:576 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:583 msgid "This profile is intended for the Amazon Kindle." msgstr "This profile is intended for the Amazon Kindle." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:171 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:617 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:631 msgid "This profile is intended for the Irex Illiad." msgstr "This profile is intended for the Irex Illiad." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:183 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:630 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:644 msgid "This profile is intended for the IRex Digital Reader 1000." msgstr "This profile is intended for the IRex Digital Reader 1000." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:196 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:644 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:658 msgid "This profile is intended for the IRex Digital Reader 800." msgstr "This profile is intended for the IRex Digital Reader 800." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:208 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:658 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:672 msgid "This profile is intended for the B&N Nook." msgstr "This profile is intended for the B&N Nook." @@ -569,29 +569,29 @@ msgstr "" "you want to produce a document intended to be read on a computer, or on a " "range of different devices." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:273 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:276 msgid "" "Intended for the iPad and similar devices with a resolution of 768x1024" msgstr "" "Intended for the iPad and similar devices with a resolution of 768x1024" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:427 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:435 msgid "Intended for generic tablet devices, does no resizing of images" msgstr "Intended for generic tablet devices, does no resizing of images" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:454 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:462 msgid "This profile is intended for the Kobo Reader." msgstr "This profile is intended for the Kobo Reader." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:467 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:475 msgid "This profile is intended for the SONY PRS-300." msgstr "This profile is intended for the SONY PRS-300." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:485 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:493 msgid "This profile is intended for the 5-inch JetBook." msgstr "This profile is intended for the 5-inch JetBook." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:494 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:502 msgid "" "This profile is intended for the SONY PRS line. The 500/505/700 etc, in " "landscape mode. Mainly useful for comics." @@ -599,11 +599,11 @@ msgstr "" "This profile is intended for the SONY PRS line. The 500, 505, 700 e.t.c., in " "landscape mode. Mainly useful for reading comics and similar print layouts." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:597 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:609 msgid "This profile is intended for the Amazon Kindle DX." msgstr "This profile is intended for the Amazon Kindle DX." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:672 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:686 msgid "This profile is intended for the Sanda Bambook." msgstr "This profile is intended for the Sanda Bambook." @@ -679,7 +679,7 @@ msgstr "Disable the named plugin" msgid "Communicate with Android phones." msgstr "Communicate with Android devices." -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:53 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:56 msgid "" "Comma separated list of directories to send e-books to on the device. The " "first one that exists will be used" @@ -687,7 +687,7 @@ msgstr "" "Comma separated list of directories to send e-books to on the device. The " "first one that exists will be used" -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:95 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:98 msgid "Communicate with S60 phones." msgstr "Communicate with S60 phones." @@ -1043,6 +1043,14 @@ msgstr "The Nook" msgid "Communicate with the Nook eBook reader." msgstr "Communicate with the Nook eBook reader." +#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:85 +msgid "Nook Color" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:86 +msgid "Communicate with the Nook Color eBook reader." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:17 msgid "Communicate with the Nuut2 eBook reader." msgstr "Communicate with the Nuut2 eBook reader." @@ -2779,7 +2787,7 @@ msgstr "" "LibraryThing.com\n" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1308 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1399 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 msgid "Cover" msgstr "Cover" @@ -2820,70 +2828,70 @@ msgstr "All articles" msgid "This is an Amazon Topaz book. It cannot be processed." msgstr "This is an Amazon Topaz book. It cannot be processed." -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1400 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 msgid "Title Page" msgstr "Title Page" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 #: /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:199 msgid "Table of Contents" msgstr "Table of Contents" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 msgid "Index" msgstr "Index" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 msgid "Glossary" msgstr "Glossary" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 msgid "Acknowledgements" msgstr "Acknowledgements" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 msgid "Bibliography" msgstr "Bibliography" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 msgid "Colophon" msgstr "Colophon" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 msgid "Copyright" msgstr "Copyright" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 msgid "Dedication" msgstr "Dedication" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 msgid "Epigraph" msgstr "Epigraph" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 msgid "Foreword" msgstr "Foreword" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 msgid "List of Illustrations" msgstr "List of Illustrations" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 msgid "List of Tables" msgstr "List of Tables" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 msgid "Notes" msgstr "Notes" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1416 msgid "Preface" msgstr "Preface" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1417 msgid "Main Text" msgstr "Main Text" @@ -3933,7 +3941,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:391 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:741 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:742 msgid "Not allowed" msgstr "Not allowed" @@ -5045,11 +5053,11 @@ msgstr "" "in a previous conversion (if they exist) instead of using the defaults " "specified in the Preferences" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:70 msgid "Bulk Convert" msgstr "Bulk Convert" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:83 #: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:185 msgid "Options specific to the output format." msgstr "Options specific to the output format." @@ -6255,10 +6263,10 @@ msgstr "Sending email to" #: /home/kovid/work/calibre/src/calibre/gui2/device.py:982 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:990 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1083 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1168 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1287 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1295 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1089 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1174 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1293 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1301 msgid "No suitable formats" msgstr "No suitable formats" @@ -6284,37 +6292,37 @@ msgstr "Failed to email the following books:" msgid "Sent by email:" msgstr "Sent by email:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1042 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1048 msgid "News:" msgstr "News:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1043 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1049 msgid "Attached is the" msgstr "Attached is the" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1054 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1060 msgid "Sent news to" msgstr "Sent news to" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1084 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1169 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1288 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1090 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1175 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1294 msgid "Auto convert the following books before uploading to the device?" msgstr "Auto convert the following books before uploading to the device?" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1114 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1120 msgid "Sending catalogs to device." msgstr "Sending catalogues to device." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1201 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1207 msgid "Sending news to device." msgstr "Sending news to device." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1254 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1260 msgid "Sending books to device." msgstr "Sending books to device." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1296 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1302 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." @@ -6322,11 +6330,11 @@ msgstr "" "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." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1360 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1366 msgid "No space on device" msgstr "No space on device" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1361 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1367 msgid "" "

Cannot upload books to device there is no more free space available " msgstr "" @@ -7709,46 +7717,45 @@ msgid "Advanced Search" msgstr "Advanced Search" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:199 -msgid "Find entries that have..." -msgstr "Find entries that have..." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:200 -msgid "&All these words:" -msgstr "&All these words:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:201 -msgid "This exact &phrase:" -msgstr "This exact &phrase:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:202 -msgid "&One or more of these words:" -msgstr "&One or more of these words:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:203 -msgid "But dont show entries that have..." -msgstr "But dont show entries that have..." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:204 -msgid "Any of these &unwanted words:" -msgstr "Any of these &unwanted words:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:205 msgid "What kind of match to use:" msgstr "What kind of match to use:" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:200 +msgid "Contains: the word or phrase matches anywhere in the metadata field" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:201 +msgid "Equals: the word or phrase must match the entire metadata field" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:202 +msgid "" +"Regular expression: the expression must match anywhere in the metadata field" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:203 +msgid "Find entries that have..." +msgstr "Find entries that have..." + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:204 +msgid "&All these words:" +msgstr "&All these words:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:205 +msgid "This exact &phrase:" +msgstr "This exact &phrase:" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:206 -msgid "Contains: the word or phrase matches anywhere in the metadata" -msgstr "Contains: the word or phrase matches anywhere in the metadata" +msgid "&One or more of these words:" +msgstr "&One or more of these words:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:207 -msgid "Equals: the word or phrase must match an entire metadata field" -msgstr "Equals: the word or phrase must match an entire metadata field" +msgid "But dont show entries that have..." +msgstr "But dont show entries that have..." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:208 -msgid "" -"Regular expression: the expression must match anywhere in the metadata" -msgstr "" -"Regular expression: the expression must match anywhere in the metadata" +msgid "Any of these &unwanted words:" +msgstr "Any of these &unwanted words:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:209 msgid "" @@ -8585,47 +8592,47 @@ msgstr "Marked for deletion" msgid "Double click to edit me

" msgstr "Double click to edit me

" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:146 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:147 msgid "Hide column %s" msgstr "Hide column %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:152 msgid "Sort on %s" msgstr "Sort on %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:152 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:153 msgid "Ascending" msgstr "Ascending" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:156 msgid "Descending" msgstr "Descending" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:168 msgid "Change text alignment for %s" msgstr "Change text alignment for %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 msgid "Left" msgstr "Left" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 msgid "Right" msgstr "Right" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:171 msgid "Center" msgstr "Centre" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:190 msgid "Show column" msgstr "Show column" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:201 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:202 msgid "Restore default layout" msgstr "Restore default layout" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:742 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:743 msgid "" "Dropping onto a device is not supported. First add the book to the calibre " "library." @@ -13500,3 +13507,14 @@ msgstr "Do not download CSS stylesheets." #~ msgid " " #~ msgstr " " + +#~ msgid "" +#~ "Regular expression: the expression must match anywhere in the metadata" +#~ msgstr "" +#~ "Regular expression: the expression must match anywhere in the metadata" + +#~ msgid "Contains: the word or phrase matches anywhere in the metadata" +#~ msgstr "Contains: the word or phrase matches anywhere in the metadata" + +#~ msgid "Equals: the word or phrase must match an entire metadata field" +#~ msgstr "Equals: the word or phrase must match an entire metadata field" diff --git a/src/calibre/translations/es.po b/src/calibre/translations/es.po index 890f092200..0059e6370a 100644 --- a/src/calibre/translations/es.po +++ b/src/calibre/translations/es.po @@ -10,17 +10,17 @@ msgid "" msgstr "" "Project-Id-Version: es\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-11-10 14:27+0000\n" -"PO-Revision-Date: 2010-11-10 21:13+0000\n" +"POT-Creation-Date: 2010-11-12 23:11+0000\n" +"PO-Revision-Date: 2010-11-12 22:52+0000\n" "Last-Translator: DiegoJ \n" "Language-Team: Spanish\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-11 04:42+0000\n" +"X-Launchpad-Export-Date: 2010-11-13 04:54+0000\n" "X-Generator: Launchpad (build Unknown)\n" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:494 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:502 msgid "" "This profile is intended for the SONY PRS line. The 500/505/700 etc, in " "landscape mode. Mainly useful for comics." @@ -28,7 +28,7 @@ msgstr "" "Este perfil está pensado para la línea PRS de SONY. Los 500/505/700, etc., " "en modo apaisado. Útil principalmente para cómics." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:597 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:609 msgid "This profile is intended for the Amazon Kindle DX." msgstr "Este perfil está pensado para el Kindle DX de Amazon." @@ -50,7 +50,7 @@ msgstr "No hace absolutamente nada" #: /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:643 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:650 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:401 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 @@ -93,14 +93,14 @@ msgstr "No hace absolutamente nada" #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:78 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:119 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:153 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:616 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:822 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:824 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:620 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:826 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:828 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:911 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:916 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:913 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:918 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:984 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:143 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:150 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:64 @@ -142,8 +142,8 @@ msgstr "No hace absolutamente nada" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:141 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:927 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:936 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1243 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1246 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1249 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1252 #: /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 @@ -211,7 +211,7 @@ msgstr "Acción de interfaz de usuario" msgid "Preferences" msgstr "Preferencias" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:17 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:15 msgid "" "Follow all local links in an HTML file and create a ZIP file containing all " "linked files. This plugin is run every time you add an HTML file to the " @@ -221,7 +221,7 @@ msgstr "" "con los archivos enlazados. Este complemento se ejecuta cada vez que se " "añade un archivo HTML a la biblioteca." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:53 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:51 msgid "" "Character encoding for the input HTML files. Common choices include: cp1252, " "latin1, iso-8859-1 and utf-8." @@ -229,7 +229,7 @@ msgstr "" "Codificación de los archivos HTML de entrada. Las opciones comunes incluyen: " "cp1252, latin1, iso-8859-1 y utf-8." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:60 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:58 msgid "" "Create a PMLZ archive containing the PML file and all images in the " "directory pmlname_img or images. This plugin is run every time you add a PML " @@ -239,7 +239,7 @@ msgstr "" "los directorios pmlname_img o imágenes. Este complemento se ejecutará cada " "vez que añada un archivo PML a la biblioteca" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:94 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:92 msgid "Extract cover from comic files" msgstr "Extraer la portada de los archivos de cómic" @@ -286,45 +286,45 @@ msgstr "Asignar metadatos a los archivos %s" msgid "Set metadata from %s files" msgstr "Establecer metadatos desde archivos %s" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:711 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:712 msgid "Look and Feel" msgstr "Aspecto Visual y Apariencia" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:725 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:714 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:726 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:737 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:748 msgid "Interface" msgstr "Interfaz" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:717 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:718 msgid "Adjust the look and feel of the calibre interface to suit your tastes" msgstr "" "Ajuste la apariencia y sensación de la interfaz de calibre para que se " "adapte a sus gustos" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:723 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 msgid "Behavior" msgstr "Comportamiento" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:729 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:730 msgid "Change the way calibre behaves" msgstr "Cambiar el comportamiento de calibre" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:734 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:208 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:735 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:209 msgid "Add your own columns" msgstr "Añadir sus propias columnas" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:740 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:741 msgid "Add/remove your own columns to the calibre book list" msgstr "Añada/elimine sus propias columnas en la lista de libros de calibre" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:745 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:746 msgid "Customize the toolbar" msgstr "Personalizar la barra de herramientas" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:751 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:752 msgid "" "Customize the toolbars and context menus, changing which actions are " "available in each" @@ -332,60 +332,60 @@ msgstr "" "Personaliza las barras de herramientas y los menús de contexto, cambiando " "las acciones que estarán disponible en cada uno" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:757 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 msgid "Input Options" msgstr "Opciones de entrada" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:759 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:770 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:760 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:771 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:782 msgid "Conversion" msgstr "Conversión" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:763 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:764 msgid "Set conversion options specific to each input format" msgstr "" "Establecer las opciones de conversión específicas de cada formato de entrada" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:768 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 msgid "Common Options" msgstr "Opciones comunes" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:774 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:775 msgid "Set conversion options common to all formats" msgstr "" "Establecer las opciones de conversión comunes para todos los formatos" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:779 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:780 msgid "Output Options" msgstr "Opciones de salida" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:785 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:786 msgid "Set conversion options specific to each output format" msgstr "" "Establece las opciones específicas de conversión para cada formato de salida" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:790 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:791 msgid "Adding books" msgstr "Añadir libros" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:792 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:804 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:816 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:828 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:817 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:829 msgid "Import/Export" msgstr "Importar/Exportar" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:796 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:797 msgid "Control how calibre reads metadata from files when adding books" msgstr "" "Controla cuándo calibre lee los metadatos de los archivos al añadir libros" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:802 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:803 msgid "Saving books to disk" msgstr "Guardar libros en disco" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:808 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:809 msgid "" "Control how calibre exports files from its database to disk when using Save " "to disk" @@ -393,33 +393,33 @@ msgstr "" "Controla cuándo calibre exporta archivos de su base de datos al dicos al " "usar Guardar al disco" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:814 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:815 msgid "Sending books to devices" msgstr "Enviar libros a dispositivos" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:820 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:821 msgid "Control how calibre transfers files to your ebook reader" msgstr "" "Controla cuándo calibre transfiere los archivos a su lector de libros" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:826 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:827 msgid "Metadata plugboards" msgstr "Control de metadatos" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:832 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:833 msgid "Change metadata fields before saving/sending" msgstr "Cambiar los cambpos de metadatos antes de guardar/enviar" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:837 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:838 msgid "Sharing books by email" msgstr "Compartir de libros por correo" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:839 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:851 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:840 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:852 msgid "Sharing" msgstr "Compartir" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:843 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:844 msgid "" "Setup sharing of books via email. Can be used for automatic sending of " "downloaded news to your devices" @@ -427,11 +427,11 @@ msgstr "" "Configurar la compartición de libros por correo electrónico. Puede usarse " "para enviar automáticamente las noticias descargadas a sus dispositivos" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:849 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:850 msgid "Sharing over the net" msgstr "Compartir por red" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:855 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:856 msgid "" "Setup the calibre Content Server which will give you access to your calibre " "library from anywhere, on any device, over the internet" @@ -440,33 +440,33 @@ msgstr "" "biblioteca de calibre en cualquier lugar, con cualquier dispositivo, a " "través de Internet." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:862 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:863 msgid "Plugins" msgstr "Complementos" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:864 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:876 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:887 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:865 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:877 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:888 msgid "Advanced" msgstr "Avanzada" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:868 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:869 msgid "Add/remove/customize various bits of calibre functionality" msgstr "Añadir/eliminar/configurar diversas funciones de calibre" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:874 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:875 msgid "Tweaks" msgstr "Ajustes" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:880 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:881 msgid "Fine tune how calibre behaves in various contexts" msgstr "Ajuste como se comporta calibre en diversos contextos" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:885 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:886 msgid "Miscellaneous" msgstr "Miscelánea" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:891 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:892 msgid "Miscellaneous advanced configuration" msgstr "Configuración miscelánea avanzada" @@ -512,7 +512,7 @@ msgstr "" "útil si no sabe nada del documento de entrada." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:59 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:436 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:444 msgid "" "This profile is intended for the SONY PRS line. The 500/505/600/700 etc." msgstr "" @@ -524,62 +524,62 @@ msgid "This profile is intended for the SONY PRS 300." msgstr "Este perfil está pensado para el SONY PRS-300." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:80 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:476 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:484 msgid "This profile is intended for the SONY PRS-900." msgstr "Este perfil está pensado para el SONY PRS-900" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:88 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:506 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:513 msgid "This profile is intended for the Microsoft Reader." msgstr "Este perfil está pensado para el Microsoft Reader." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:99 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:517 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:524 msgid "This profile is intended for the Mobipocket books." msgstr "Este perfil está pensado para los libros Mobipocket." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:112 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:530 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:537 msgid "This profile is intended for the Hanlin V3 and its clones." msgstr "Este perfil está pensado para el Hanlin V3 y sus clones." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:124 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:542 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:549 msgid "This profile is intended for the Hanlin V5 and its clones." msgstr "Este perfil está pensado para el Hanlin V5 y sus clones." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:134 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:550 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:557 msgid "This profile is intended for the Cybook G3." msgstr "Este perfil está pensado para el Cybook Gen3." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:147 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:563 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:570 msgid "This profile is intended for the Cybook Opus." msgstr "Este perfil está pensado para el Cybook Opus." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:159 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:576 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:583 msgid "This profile is intended for the Amazon Kindle." msgstr "Este perfil está pensado para el Kindle de Amazon" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:171 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:617 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:631 msgid "This profile is intended for the Irex Illiad." msgstr "Este perfil está pensado para el Irex Illiad." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:183 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:630 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:644 msgid "This profile is intended for the IRex Digital Reader 1000." msgstr "Este perfil está pensado para el IRex Digital Reader 1000." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:196 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:644 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:658 msgid "This profile is intended for the IRex Digital Reader 800." msgstr "Este perfil está pensado para el IRex Digital Reader 800." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:208 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:658 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:672 msgid "This profile is intended for the B&N Nook." msgstr "Este perfile está pensado para el Nook de B&N." @@ -597,30 +597,30 @@ msgstr "" "útil si quiere generar un documento que pueda ser leido en el PC o en varios " "dispositivos diferentes." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:273 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:276 msgid "" "Intended for the iPad and similar devices with a resolution of 768x1024" msgstr "" "Pensado para el Ipad y dispositivos similares con una resolución de 768x1024" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:427 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:435 msgid "Intended for generic tablet devices, does no resizing of images" msgstr "" "Orientado para dispositivos de tableta genéricos, sin redimensión de imágenes" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:454 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:462 msgid "This profile is intended for the Kobo Reader." msgstr "Este perfil está pensado para el lector Kobo" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:467 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:475 msgid "This profile is intended for the SONY PRS-300." msgstr "Este perfil está pensado para el SONY PRS-300." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:485 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:493 msgid "This profile is intended for the 5-inch JetBook." msgstr "Este perfil está pensado para el JetBook de 5 pulgadas." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:672 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:686 msgid "This profile is intended for the Sanda Bambook." msgstr "Este perfil está pensado para el Sandra Bambook." @@ -696,7 +696,7 @@ msgstr "Desactivar el complemento nombrado" msgid "Communicate with Android phones." msgstr "Comunicar con teléfonos Android." -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:53 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:56 msgid "" "Comma separated list of directories to send e-books to on the device. The " "first one that exists will be used" @@ -704,7 +704,7 @@ msgstr "" "Lista de directorios, separados por comas, donde almacenar los libros en el " "dispositivo. Se usará el primero que exista" -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:95 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:98 msgid "Communicate with S60 phones." msgstr "Comunicar con teléfonos S60." @@ -1063,6 +1063,14 @@ msgstr "El Nook" msgid "Communicate with the Nook eBook reader." msgstr "Comunicarse con el lector Nook." +#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:85 +msgid "Nook Color" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:86 +msgid "Communicate with the Nook Color eBook reader." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:17 msgid "Communicate with the Nuut2 eBook reader." msgstr "Comunicar con el lector Nuut2." @@ -2837,7 +2845,7 @@ msgstr "" "libro identificado por el ISBN.\n" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1308 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1399 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 msgid "Cover" msgstr "Portada" @@ -2881,70 +2889,70 @@ msgstr "Todos los artículos" msgid "This is an Amazon Topaz book. It cannot be processed." msgstr "Este es un libro Topaz de Amazon. No se puede procesar." -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1400 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 msgid "Title Page" msgstr "Página de título" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 #: /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:199 msgid "Table of Contents" msgstr "Índice" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 msgid "Index" msgstr "Índice analítico" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 msgid "Glossary" msgstr "Glosario" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 msgid "Acknowledgements" msgstr "Agradecimientos" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 msgid "Bibliography" msgstr "Bibliografía" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 msgid "Colophon" msgstr "Colofón" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 msgid "Copyright" msgstr "Copyright" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 msgid "Dedication" msgstr "Dedicatoria" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 msgid "Epigraph" msgstr "Epígrafe" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 msgid "Foreword" msgstr "Prólogo" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 msgid "List of Illustrations" msgstr "Lista de ilustraciones" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 msgid "List of Tables" msgstr "Lista de tablas" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 msgid "Notes" msgstr "Notas" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1416 msgid "Preface" msgstr "Prefacio" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1417 msgid "Main Text" msgstr "Texto principal" @@ -4022,7 +4030,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:391 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:741 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:742 msgid "Not allowed" msgstr "No permitido" @@ -5138,11 +5146,11 @@ msgstr "" "valores guardados en una conversión anterior (si existe) en vez de usar los " "predeterminados especificados en las Preferencias" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:70 msgid "Bulk Convert" msgstr "Convertir en bloque" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:83 #: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:185 msgid "Options specific to the output format." msgstr "Opciones específicas del formato de salida." @@ -6358,10 +6366,10 @@ msgstr "Enviando correo electrónico a" #: /home/kovid/work/calibre/src/calibre/gui2/device.py:982 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:990 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1083 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1168 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1287 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1295 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1089 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1174 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1293 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1301 msgid "No suitable formats" msgstr "No hay formatos adecuados" @@ -6390,39 +6398,39 @@ msgstr "Fallo al enviar por correo electrónico los siguientes libros:" msgid "Sent by email:" msgstr "Enviado por correo electrónico:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1042 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1048 msgid "News:" msgstr "Noticias:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1043 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1049 msgid "Attached is the" msgstr "Adjunto está el" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1054 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1060 msgid "Sent news to" msgstr "Enviar noticias a" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1084 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1169 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1288 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1090 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1175 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1294 msgid "Auto convert the following books before uploading to the device?" msgstr "" "¿Convertir automáticamente los siguientes libros antes de pasarlos al " "dispositivo?" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1114 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1120 msgid "Sending catalogs to device." msgstr "Enviando catálogos al dispositivo." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1201 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1207 msgid "Sending news to device." msgstr "Enviando noticias al dispositivo." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1254 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1260 msgid "Sending books to device." msgstr "Enviando libros al dispositivo." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1296 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1302 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." @@ -6431,11 +6439,11 @@ msgstr "" "encontraron formatos adecuados. Convierta el(los) libro(s) a un formato " "soportado por su dispositivo antes de volver a intentarlo." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1360 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1366 msgid "No space on device" msgstr "No hay espacio en el dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1361 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1367 msgid "" "

Cannot upload books to device there is no more free space available " msgstr "" @@ -7852,48 +7860,45 @@ msgid "Advanced Search" msgstr "Búsqueda avanzada" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:199 -msgid "Find entries that have..." -msgstr "Encuentra entradas que tengan..." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:200 -msgid "&All these words:" -msgstr "&Todas estas palabras:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:201 -msgid "This exact &phrase:" -msgstr "Esta &frase exacta:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:202 -msgid "&One or more of these words:" -msgstr "&Una o más de estas palabras:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:203 -msgid "But dont show entries that have..." -msgstr "Pero no mostrar las entradas que tengan..." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:204 -msgid "Any of these &unwanted words:" -msgstr "Cualquiera de estas palabras &no deseadas:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:205 msgid "What kind of match to use:" msgstr "Tipo de coincidencias:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:206 -msgid "Contains: the word or phrase matches anywhere in the metadata" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:200 +msgid "Contains: the word or phrase matches anywhere in the metadata field" msgstr "" -"Contiene: se busca la palabra o frase en cualquier posición de los metadatos" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:201 +msgid "Equals: the word or phrase must match the entire metadata field" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:202 +msgid "" +"Regular expression: the expression must match anywhere in the metadata field" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:203 +msgid "Find entries that have..." +msgstr "Encuentra entradas que tengan..." + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:204 +msgid "&All these words:" +msgstr "&Todas estas palabras:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:205 +msgid "This exact &phrase:" +msgstr "Esta &frase exacta:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:206 +msgid "&One or more of these words:" +msgstr "&Una o más de estas palabras:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:207 -msgid "Equals: the word or phrase must match an entire metadata field" -msgstr "" -"Coincide: La palabra o frase debe corresponder al campo de metadatos completo" +msgid "But dont show entries that have..." +msgstr "Pero no mostrar las entradas que tengan..." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:208 -msgid "" -"Regular expression: the expression must match anywhere in the metadata" -msgstr "" -"Expresión regular: se busca la expresión en cualquier lugar de los metadatos" +msgid "Any of these &unwanted words:" +msgstr "Cualquiera de estas palabras &no deseadas:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:209 msgid "" @@ -8741,47 +8746,47 @@ msgstr "Marcado para borrarlo" msgid "Double click to edit me

" msgstr "Doble clic para editarme

" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:146 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:147 msgid "Hide column %s" msgstr "Ocultar columna %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:152 msgid "Sort on %s" msgstr "Ordenar según %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:152 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:153 msgid "Ascending" msgstr "Ascendente" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:156 msgid "Descending" msgstr "Descendente" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:168 msgid "Change text alignment for %s" msgstr "Cambiar la alineación del texto para %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 msgid "Left" msgstr "Izquierda" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 msgid "Right" msgstr "Derecha" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:171 msgid "Center" msgstr "Centro" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:190 msgid "Show column" msgstr "Mostrar columna" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:201 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:202 msgid "Restore default layout" msgstr "Restaurar formato por defecto" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:742 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:743 msgid "" "Dropping onto a device is not supported. First add the book to the calibre " "library." @@ -15853,6 +15858,19 @@ msgstr "No descargar estilos CSS." #~ msgid " " #~ msgstr " " +#~ msgid "" +#~ "Regular expression: the expression must match anywhere in the metadata" +#~ msgstr "" +#~ "Expresión regular: se busca la expresión en cualquier lugar de los metadatos" + +#~ msgid "Contains: the word or phrase matches anywhere in the metadata" +#~ msgstr "" +#~ "Contiene: se busca la palabra o frase en cualquier posición de los metadatos" + +#~ msgid "Equals: the word or phrase must match an entire metadata field" +#~ msgstr "" +#~ "Coincide: La palabra o frase debe corresponder al campo de metadatos completo" + #~ msgid "Masthead font:" #~ msgstr "Tipo de letra para el rótulo:" diff --git a/src/calibre/translations/eu.po b/src/calibre/translations/eu.po index 96257c2e70..39c6d3ad4c 100644 --- a/src/calibre/translations/eu.po +++ b/src/calibre/translations/eu.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2010-11-10 14:27+0000\n" -"PO-Revision-Date: 2010-11-10 17:34+0000\n" -"Last-Translator: Bingen Markes \n" +"POT-Creation-Date: 2010-11-12 23:11+0000\n" +"PO-Revision-Date: 2010-11-12 22:57+0000\n" +"Last-Translator: Kovid Goyal \n" "Language-Team: Basque \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-11 04:40+0000\n" +"X-Launchpad-Export-Date: 2010-11-13 04:51+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -31,7 +31,7 @@ msgstr "Ez du ezer egiten" #: /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:643 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:650 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:401 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 @@ -74,14 +74,14 @@ msgstr "Ez du ezer egiten" #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:78 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:119 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:153 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:616 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:822 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:824 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:620 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:826 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:828 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:911 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:916 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:913 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:918 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:984 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:143 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:150 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:64 @@ -123,8 +123,8 @@ msgstr "Ez du ezer egiten" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:141 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:927 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:936 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1243 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1246 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1249 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1252 #: /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 @@ -192,7 +192,7 @@ msgstr "Erabiltzailearen interfaze ekintza" msgid "Preferences" msgstr "Hobespenak" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:17 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:15 msgid "" "Follow all local links in an HTML file and create a ZIP file containing all " "linked files. This plugin is run every time you add an HTML file to the " @@ -202,7 +202,7 @@ msgstr "" "estekatutako fitxategi guztiak barne dituelarik. Gehigarri hau, liburutegira " "HTML fitxategi bat gehitzen duzun bakoitzean exekutatuko da." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:53 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:51 msgid "" "Character encoding for the input HTML files. Common choices include: cp1252, " "latin1, iso-8859-1 and utf-8." @@ -210,7 +210,7 @@ msgstr "" "HTML sorburu fitxategientzako karaktere kodeketa. Aukeraketa arruntak " "barnean ditu: cp1252, latin1, iso-8859-1 and utf-8." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:60 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:58 msgid "" "Create a PMLZ archive containing the PML file and all images in the " "directory pmlname_img or images. This plugin is run every time you add a PML " @@ -220,7 +220,7 @@ msgstr "" "pmlname_img direktorioan dauden irudi guztiekin. Gehigarri hau, liburutegira " "PML fitxategi bat gehitzen duzun bakoitzean exekutatuko da." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:94 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:92 msgid "Extract cover from comic files" msgstr "Erauzi ezazu liburu-azala komiki fitxategietatik" @@ -267,45 +267,45 @@ msgstr "Ezarri metadatuak %s fitxategietan" msgid "Set metadata from %s files" msgstr "Ezarri metadatuak %s fitxategietatik" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:711 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:712 msgid "Look and Feel" msgstr "Itxura eta izaera" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:725 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:714 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:726 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:737 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:748 msgid "Interface" msgstr "Interfazea" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:717 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:718 msgid "Adjust the look and feel of the calibre interface to suit your tastes" msgstr "Doi ezazu calibreren interfazearen itxura zure gustuen arabera" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:723 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 msgid "Behavior" msgstr "Jokabidea" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:729 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:730 msgid "Change the way calibre behaves" msgstr "Alda ezazu calibreren jokatzeko era" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:734 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:208 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:735 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:209 msgid "Add your own columns" msgstr "Gehi itzazu zureak diren zutabeak" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:740 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:741 msgid "Add/remove your own columns to the calibre book list" msgstr "" "Gehitu/ezabatu itzazu zuk egindako zure zutabeak calibreren liburu " "zerrendara/zerrendatik" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:745 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:746 msgid "Customize the toolbar" msgstr "Pertsonalizatu tresna-barra" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:751 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:752 msgid "" "Customize the toolbars and context menus, changing which actions are " "available in each" @@ -313,58 +313,58 @@ msgstr "" "Pertsonalizatu tresna-barra eta testuinguruaren araberako menuak, bakoitzean " "eskuragarri agertuko diren ekintzekin aldatuz." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:757 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 msgid "Input Options" msgstr "Sorburu aukerak" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:759 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:770 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:760 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:771 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:782 msgid "Conversion" msgstr "Bihurketa" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:763 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:764 msgid "Set conversion options specific to each input format" msgstr "Ezarri itzazu sorburu formatu bakoitzeko bihurketa aukera zehatzak" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:768 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 msgid "Common Options" msgstr "Aukera komunak" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:774 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:775 msgid "Set conversion options common to all formats" msgstr "Ezarri itzazu formatu guztietarako komunak diren bihurketa aukerak" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:779 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:780 msgid "Output Options" msgstr "Helburu aukerak" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:785 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:786 msgid "Set conversion options specific to each output format" msgstr "Ezarri itzazu helburu formatu bakoitzeko bihurketa aukera zehatzak" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:790 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:791 msgid "Adding books" msgstr "Liburuak gehitzen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:792 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:804 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:816 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:828 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:817 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:829 msgid "Import/Export" msgstr "Inportatu/Esportatu" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:796 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:797 msgid "Control how calibre reads metadata from files when adding books" msgstr "" "Kontrola ezazu calibrek nola irakurtzen dituen metadatuak fitxategietatik " "liburuak gehitzerakoan" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:802 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:803 msgid "Saving books to disk" msgstr "Liburuak diskan gordetzen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:808 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:809 msgid "" "Control how calibre exports files from its database to disk when using Save " "to disk" @@ -372,34 +372,34 @@ msgstr "" "Kontrola ezazu calibrek nola esportatzen dituen fitxategiak bere datu " "basetik diskora \"Diskoan gorde\" aukera erabiltzen denean." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:814 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:815 msgid "Sending books to devices" msgstr "Bidaltzen liburuak gailuetara" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:820 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:821 msgid "Control how calibre transfers files to your ebook reader" msgstr "" "Kontrola ezazu ea calibrek nola bidaltzen dituen fitxategiak zure liburu " "elektronikoetara" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:826 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:827 msgid "Metadata plugboards" msgstr "Metadatuen konektore-txartela" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:832 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:833 msgid "Change metadata fields before saving/sending" msgstr "Aldatu metadatu eremuak gorde/igorri baino lehenago" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:837 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:838 msgid "Sharing books by email" msgstr "Liburuak e-posta bidez partekatzen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:839 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:851 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:840 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:852 msgid "Sharing" msgstr "Partekatzen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:843 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:844 msgid "" "Setup sharing of books via email. Can be used for automatic sending of " "downloaded news to your devices" @@ -407,11 +407,11 @@ msgstr "" "Antolatu liburuen elkarbanatzea e-postaren bidez. Saretik deskargatutako " "albisteak norbere gailuetara automatikoki bidaltzeko erabil daiteke" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:849 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:850 msgid "Sharing over the net" msgstr "Sarean zehar elkarbanatzen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:855 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:856 msgid "" "Setup the calibre Content Server which will give you access to your calibre " "library from anywhere, on any device, over the internet" @@ -420,35 +420,35 @@ msgstr "" "interneten bidezko sarbidea emango dizun edozein lekutan eta edozein " "gailuren bidez" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:862 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:863 msgid "Plugins" msgstr "Pluginak" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:864 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:876 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:887 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:865 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:877 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:888 msgid "Advanced" msgstr "Aurreratua" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:868 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:869 msgid "Add/remove/customize various bits of calibre functionality" msgstr "Gehitu/ezabatu/pertsonalizatu calibreren zenbait aukera" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:874 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:875 msgid "Tweaks" msgstr "Doikuntzak" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:880 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:881 msgid "Fine tune how calibre behaves in various contexts" msgstr "" "Afina ezazu zehaztasun handiz nola jokatuko duen calibrek hainbat " "testuingurutan" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:885 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:886 msgid "Miscellaneous" msgstr "Denetarik" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:891 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:892 msgid "Miscellaneous advanced configuration" msgstr "Hainbat gauzetarako ezarpen aurreratuak" @@ -494,7 +494,7 @@ msgstr "" "da sarrerako dokumentuari buruz ezer ez dakizunean." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:59 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:436 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:444 msgid "" "This profile is intended for the SONY PRS line. The 500/505/600/700 etc." msgstr "" @@ -506,62 +506,62 @@ msgid "This profile is intended for the SONY PRS 300." msgstr "Profil hau \"SONY PRS 300\" horretara zuzendurik dago." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:80 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:476 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:484 msgid "This profile is intended for the SONY PRS-900." msgstr "Profil hau \"SONY PRS 900\" horretara zuzendurik dago." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:88 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:506 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:513 msgid "This profile is intended for the Microsoft Reader." msgstr "Profil hau Microsoft Reader-arentzat zuzendua dago." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:99 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:517 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:524 msgid "This profile is intended for the Mobipocket books." msgstr "Profil hau Mobipocket liburuentzat zuzendua dago." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:112 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:530 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:537 msgid "This profile is intended for the Hanlin V3 and its clones." msgstr "Profil hau Hanlin V3 eta bere klonentzat zuzendua dago." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:124 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:542 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:549 msgid "This profile is intended for the Hanlin V5 and its clones." msgstr "Profil hau \"Hanlin V5\" eta bere klonetara zuzendurik dago." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:134 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:550 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:557 msgid "This profile is intended for the Cybook G3." msgstr "Profil hau Cybook G3-arentzat zuzendua dago." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:147 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:563 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:570 msgid "This profile is intended for the Cybook Opus." msgstr "Profil hau Cybook Opus-arentzat zuzendua dago." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:159 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:576 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:583 msgid "This profile is intended for the Amazon Kindle." msgstr "Profil hau Amazon Kindle gailuarentzat dago prestaturik." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:171 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:617 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:631 msgid "This profile is intended for the Irex Illiad." msgstr "Profil hau Irex Illiad-arentzat zuzendua dago." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:183 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:630 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:644 msgid "This profile is intended for the IRex Digital Reader 1000." msgstr "Profil hau IRex Digital Reader 1000-rentzat zuzendua dago." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:196 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:644 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:658 msgid "This profile is intended for the IRex Digital Reader 800." msgstr "Profil hau \"IRex Digital Reader 800\" horrentzat dago prestaturik." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:208 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:658 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:672 msgid "This profile is intended for the B&N Nook." msgstr "Profil hau \"B&N Nook\" horrentzat dago prestaturik." @@ -579,32 +579,32 @@ msgstr "" "da ordenagailu edota gailu ezberdinentzat zuzenduta dagoen dokumentu bat " "egin nahi baduzu." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:273 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:276 msgid "" "Intended for the iPad and similar devices with a resolution of 768x1024" msgstr "" "iPad eta antzeko trepetetarako zuzendurik, 768x1024 bereizmena duten " "trepetetarako." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:427 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:435 msgid "Intended for generic tablet devices, does no resizing of images" msgstr "" "Edozein tablet gailutan erabiltzeko asmoz, ez ditu irudien neurriak modu " "automatikoan aldatuko" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:454 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:462 msgid "This profile is intended for the Kobo Reader." msgstr "Profil hau \"Kobo Reader\" horietara zuzendurik dago." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:467 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:475 msgid "This profile is intended for the SONY PRS-300." msgstr "Profil hau \"SONY PRS 300\" horretara zuzendurik dago." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:485 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:493 msgid "This profile is intended for the 5-inch JetBook." msgstr "Profil hau 5 hazbeteko JetBook gailuarentzat dago prestaturik." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:494 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:502 msgid "" "This profile is intended for the SONY PRS line. The 500/505/700 etc, in " "landscape mode. Mainly useful for comics." @@ -613,11 +613,11 @@ msgstr "" "500/505/600/700 eta abar orrialdea horizontal moduan erakutsita. Batez ere " "komikietan erabilgarria." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:597 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:609 msgid "This profile is intended for the Amazon Kindle DX." msgstr "Profil hau Amazon Kindle DX-arentzat zuzendua dago." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:672 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:686 msgid "This profile is intended for the Sanda Bambook." msgstr "Sanda Bambook horrentzat egindako profila." @@ -697,7 +697,7 @@ msgstr "Desgaitu izendaturiko gehigarria." msgid "Communicate with Android phones." msgstr "Adroid telefonoekin komunikatu." -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:53 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:56 msgid "" "Comma separated list of directories to send e-books to on the device. The " "first one that exists will be used" @@ -705,7 +705,7 @@ msgstr "" "Gailuan dagoen komen bitartez bereizitako direktorioen zerrenda, liburu " "elektronikoak hara igortzeko. Existitzen den lehena erabiliko da." -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:95 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:98 msgid "Communicate with S60 phones." msgstr "S60 telefonoekin komunikatu." @@ -1067,6 +1067,14 @@ msgstr "Nook-a" msgid "Communicate with the Nook eBook reader." msgstr "Komunikatu Nook eBook irakurgailuarekin." +#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:85 +msgid "Nook Color" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:86 +msgid "Communicate with the Nook Color eBook reader." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:17 msgid "Communicate with the Nuut2 eBook reader." msgstr "Komunikatu Nuut2 eBook irakurgailuarekin." @@ -2931,7 +2939,7 @@ msgstr "" "hemendik: LibraryThing.com\n" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1308 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1399 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 msgid "Cover" msgstr "Liburu-azala" @@ -2977,70 +2985,70 @@ msgstr "Artikulu guztiak" msgid "This is an Amazon Topaz book. It cannot be processed." msgstr "Hauxe Amazon Topaz liburua da. Ezin da prozesatu." -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1400 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 msgid "Title Page" msgstr "Orriaren Izenburua" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 #: /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:199 msgid "Table of Contents" msgstr "Aurkibidea" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 msgid "Index" msgstr "Indizea" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 msgid "Glossary" msgstr "Glosarioa" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 msgid "Acknowledgements" msgstr "Aipamenak" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 msgid "Bibliography" msgstr "Bibliografia" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 msgid "Colophon" msgstr "Azken oharra" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 msgid "Copyright" msgstr "Copyright-a" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 msgid "Dedication" msgstr "Eskaintza" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 msgid "Epigraph" msgstr "Epigrafea" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 msgid "Foreword" msgstr "Sarrera" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 msgid "List of Illustrations" msgstr "Irudien zerrenda" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 msgid "List of Tables" msgstr "Taulen zerrenda" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 msgid "Notes" msgstr "Oharrak" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1416 msgid "Preface" msgstr "Aitzinsolasa" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1417 msgid "Main Text" msgstr "Testu nagusia" @@ -4121,7 +4129,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:391 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:741 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:742 msgid "Not allowed" msgstr "Not allowed" @@ -5246,11 +5254,11 @@ msgstr "" "gordetako bihurketen balioak (horrelakorik balego), erabili beharrean " "Lehentasunetan zehaztutako balio lehenetsiak." -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:70 msgid "Bulk Convert" msgstr "Karga handiko bihurketa" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:83 #: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:185 msgid "Options specific to the output format." msgstr "Helburu formatuarentzako berariazko aukerak." @@ -6472,10 +6480,10 @@ msgstr "E-posta igortzen honi:" #: /home/kovid/work/calibre/src/calibre/gui2/device.py:982 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:990 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1083 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1168 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1287 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1295 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1089 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1174 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1293 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1301 msgid "No suitable formats" msgstr "Ez dago formatu egokirik" @@ -6504,38 +6512,38 @@ msgstr "Huts egin du e-postaz hurrengo liburuak bidaltzerakoan:" msgid "Sent by email:" msgstr "E-postaz igorria:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1042 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1048 msgid "News:" msgstr "Albisteak:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1043 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1049 msgid "Attached is the" msgstr "Erantsita doana hau da" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1054 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1060 msgid "Sent news to" msgstr "Bidali albisteak honi:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1084 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1169 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1288 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1090 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1175 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1294 msgid "Auto convert the following books before uploading to the device?" msgstr "" "Bihurtu modu automatikoan hurrengo liburuak irakurgailuan kargatu aurretik?" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1114 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1120 msgid "Sending catalogs to device." msgstr "Katalogoak irakurgailura bidaltzen." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1201 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1207 msgid "Sending news to device." msgstr "Albisteak irakurgailura bidaltzen." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1254 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1260 msgid "Sending books to device." msgstr "Liburuak irakurgailura bidaltzen." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1296 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1302 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." @@ -6544,11 +6552,11 @@ msgstr "" "topatu egin ez delako. Lehenengo eta behin, bihurtu liburua(k) zure " "irakurgailuak onartzen duen formaturen batean." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1360 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1366 msgid "No space on device" msgstr "Lekurik ez irakurgailuan" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1361 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1367 msgid "" "

Cannot upload books to device there is no more free space available " msgstr "" @@ -7967,50 +7975,45 @@ msgid "Advanced Search" msgstr "Bilaketa aurreratua" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:199 -msgid "Find entries that have..." -msgstr "Bilatu hauxe duten sarrerak..." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:200 -msgid "&All these words:" -msgstr "Hitz &hauek guztiak:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:201 -msgid "This exact &phrase:" -msgstr "Zehatz eta mehatz &esaldi hau:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:202 -msgid "&One or more of these words:" -msgstr "&Bat edo gehiago hitz hauetatik:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:203 -msgid "But dont show entries that have..." -msgstr "Baina ez erakutsi honako hauxe daukaten sarrerak..." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:204 -msgid "Any of these &unwanted words:" -msgstr "&nahi-ez-den hitz hauetako bat:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:205 msgid "What kind of match to use:" msgstr "Zein motatako bat etortze erabili:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:206 -msgid "Contains: the word or phrase matches anywhere in the metadata" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:200 +msgid "Contains: the word or phrase matches anywhere in the metadata field" msgstr "" -"Bere baitan: metadatuetan edonon bat egiten duten hitzak edo esaldiak" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:201 +msgid "Equals: the word or phrase must match the entire metadata field" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:202 +msgid "" +"Regular expression: the expression must match anywhere in the metadata field" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:203 +msgid "Find entries that have..." +msgstr "Bilatu hauxe duten sarrerak..." + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:204 +msgid "&All these words:" +msgstr "Hitz &hauek guztiak:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:205 +msgid "This exact &phrase:" +msgstr "Zehatz eta mehatz &esaldi hau:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:206 +msgid "&One or more of these words:" +msgstr "&Bat edo gehiago hitz hauetatik:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:207 -msgid "Equals: the word or phrase must match an entire metadata field" -msgstr "" -"Berdinak: hitzak edo esaldiak metadatu baten eremu osoarekin egin beharko du " -"bat" +msgid "But dont show entries that have..." +msgstr "Baina ez erakutsi honako hauxe daukaten sarrerak..." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:208 -msgid "" -"Regular expression: the expression must match anywhere in the metadata" -msgstr "" -"Ohiko adierazpena: adierazpenak bat egin beharko du metadatuen edozein " -"tokitan" +msgid "Any of these &unwanted words:" +msgstr "&nahi-ez-den hitz hauetako bat:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:209 msgid "" @@ -8859,47 +8862,47 @@ msgstr "Ezabatzeko markatuta" msgid "Double click to edit me

" msgstr "Egin ezazu klik birritan editatzeko

" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:146 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:147 msgid "Hide column %s" msgstr "Ezkutatu %s zutabea" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:152 msgid "Sort on %s" msgstr "%s -en arabera sailkatu" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:152 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:153 msgid "Ascending" msgstr "Gorantz" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:156 msgid "Descending" msgstr "Beherantz" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:168 msgid "Change text alignment for %s" msgstr "Alda ezazu testuaren lerrokatzea %s horretarako" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 msgid "Left" msgstr "Ezkerretara" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 msgid "Right" msgstr "Eskuinetara" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:171 msgid "Center" msgstr "Erdian" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:190 msgid "Show column" msgstr "Erakutsi zutabea" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:201 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:202 msgid "Restore default layout" msgstr "Berrezarri lehenetsitako diseinua" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:742 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:743 msgid "" "Dropping onto a device is not supported. First add the book to the calibre " "library." @@ -13797,6 +13800,15 @@ msgstr "Ez deskargatu CSS (Cascading Style Sheets) estilo orririk." #~ msgid "Download &cover" #~ msgstr "Deskargatu &liburu-azala" +#~ msgid "Contains: the word or phrase matches anywhere in the metadata" +#~ msgstr "" +#~ "Bere baitan: metadatuetan edonon bat egiten duten hitzak edo esaldiak" + +#~ msgid "Equals: the word or phrase must match an entire metadata field" +#~ msgstr "" +#~ "Berdinak: hitzak edo esaldiak metadatu baten eremu osoarekin egin beharko du " +#~ "bat" + #~ msgid "" #~ "[options]\n" #~ "\n" @@ -13871,6 +13883,12 @@ msgstr "Ez deskargatu CSS (Cascading Style Sheets) estilo orririk." #~ "Sortu modu automatikoan egile-izenaren araberako sailkapena oraingo egile-" #~ "izen honetan oinarriturik" +#~ msgid "" +#~ "Regular expression: the expression must match anywhere in the metadata" +#~ msgstr "" +#~ "Ohiko adierazpena: adierazpenak bat egin beharko du metadatuen edozein " +#~ "tokitan" + #~ msgid "" #~ "Comma separated list of formats to save for each book. By default all " #~ "available books are saved." diff --git a/src/calibre/translations/fr.po b/src/calibre/translations/fr.po index 17542ac491..a93dc4d4b4 100644 --- a/src/calibre/translations/fr.po +++ b/src/calibre/translations/fr.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre 0.4.22\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-11-06 15:45+0000\n" -"PO-Revision-Date: 2010-11-08 22:51+0000\n" -"Last-Translator: sengian \n" +"POT-Creation-Date: 2010-11-12 23:11+0000\n" +"PO-Revision-Date: 2010-11-12 22:36+0000\n" +"Last-Translator: Kovid Goyal \n" "Language-Team: Français \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-10 05:01+0000\n" +"X-Launchpad-Export-Date: 2010-11-13 04:52+0000\n" "X-Generator: Launchpad (build Unknown)\n" "X-Poedit-Bookmarks: 1177,1104,-1,-1,-1,-1,-1,-1,-1,-1\n" "Generated-By: pygettext.py 1.5\n" @@ -33,7 +33,7 @@ msgstr "Ne fait strictement rien" #: /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:643 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:650 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:401 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 @@ -76,14 +76,14 @@ msgstr "Ne fait strictement rien" #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:78 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:119 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:153 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:611 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:817 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:819 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:620 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:826 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:828 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:911 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:916 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:913 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:918 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:984 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:143 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:150 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:64 @@ -125,8 +125,8 @@ msgstr "Ne fait strictement rien" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:141 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:927 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:936 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1243 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1246 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1249 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1252 #: /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 @@ -194,7 +194,7 @@ msgstr "Action d'interface utilisateur" msgid "Preferences" msgstr "Préférences" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:17 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:15 msgid "" "Follow all local links in an HTML file and create a ZIP file containing all " "linked files. This plugin is run every time you add an HTML file to the " @@ -204,7 +204,7 @@ msgstr "" "contenant tous les fichiers liés. Ce plug-in est lancé chaque fois que vous " "ajoutez un fichier HTML à la bibliothèque." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:53 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:51 msgid "" "Character encoding for the input HTML files. Common choices include: cp1252, " "latin1, iso-8859-1 and utf-8." @@ -212,7 +212,7 @@ msgstr "" "Encodage des caractères pour les fichiers HTML en entrée. Les choix les plus " "communs incluent : cp1252, latin1, iso-8859-1 et utf-8." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:60 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:58 msgid "" "Create a PMLZ archive containing the PML file and all images in the " "directory pmlname_img or images. This plugin is run every time you add a PML " @@ -222,7 +222,7 @@ msgstr "" "le répertoire pmlname_img ou images. Ce plugin est lancé à chaque ajout d'un " "fichier PML dans la bibliothèque." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:94 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:92 msgid "Extract cover from comic files" msgstr "Extraction de la couverture depuis des fichiers de bandes dessinées" @@ -269,44 +269,44 @@ msgstr "Définir les métadonnées des fichiers %s" msgid "Set metadata from %s files" msgstr "Définir les métadonnées à partir des fichiers %s" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:711 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:712 msgid "Look and Feel" msgstr "Apparence" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:725 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:714 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:726 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:737 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:748 msgid "Interface" msgstr "Interface" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:717 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:718 msgid "Adjust the look and feel of the calibre interface to suit your tastes" msgstr "" "Ajuster l'aspect et l'ergonomie de l'interface de Calibre à votre convenance" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:723 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 msgid "Behavior" msgstr "Comportement" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:729 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:730 msgid "Change the way calibre behaves" msgstr "Changer le comportement de calibre" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:734 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:206 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:735 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:209 msgid "Add your own columns" msgstr "Ajouter vos colonnes personnalisées" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:740 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:741 msgid "Add/remove your own columns to the calibre book list" msgstr "Ajouter/retirer vos propres colonnes dans la liste des livres" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:745 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:746 msgid "Customize the toolbar" msgstr "Personnaliser la barre d'outils" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:751 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:752 msgid "" "Customize the toolbars and context menus, changing which actions are " "available in each" @@ -314,60 +314,60 @@ msgstr "" "Personnaliser les barres d'outils et les menus contextuels, en changeant les " "actions disponibles dans ceux-ci" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:757 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 msgid "Input Options" msgstr "Options de saisie" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:759 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:770 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:760 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:771 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:782 msgid "Conversion" msgstr "Conversion" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:763 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:764 msgid "Set conversion options specific to each input format" msgstr "" "Définissez les options de conversion spécfiques pour chaque format d'entrée" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:768 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 msgid "Common Options" msgstr "Options communes" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:774 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:775 msgid "Set conversion options common to all formats" msgstr "" "Définisser les options de conversion communes à tous les formats d'entrée" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:779 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:780 msgid "Output Options" msgstr "Formats de sortie" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:785 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:786 msgid "Set conversion options specific to each output format" msgstr "Définissez des options spécifiques pour chaque format de sortie" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:790 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:791 msgid "Adding books" msgstr "Ajouter des livres" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:792 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:804 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:816 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:828 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:817 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:829 msgid "Import/Export" msgstr "Import/Export" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:796 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:797 msgid "Control how calibre reads metadata from files when adding books" msgstr "" "Définir comment les métadonnées sont lues par Calibre lors de l'ajout de " "livres" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:802 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:803 msgid "Saving books to disk" msgstr "Sauvegarder les livres sur le disque" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:808 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:809 msgid "" "Control how calibre exports files from its database to disk when using Save " "to disk" @@ -375,34 +375,34 @@ msgstr "" "Contrôle la manière dont Calibre exporte les fichiers de sa base de données " "sur le disque lors des sauvegardes sur disque" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:814 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:815 msgid "Sending books to devices" msgstr "Envoyer les livres aux appareils" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:820 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:821 msgid "Control how calibre transfers files to your ebook reader" msgstr "" "Contrôler la façon dont Calibre exporte les fichiers vers votre lecteur " "d'eBook" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:826 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:827 msgid "Metadata plugboards" msgstr "Tableau de connexions de métadonnées" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:832 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:833 msgid "Change metadata fields before saving/sending" msgstr "Modifier les champs de métadonnées avant de sauvegarder/envoyer" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:837 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:838 msgid "Sharing books by email" msgstr "Partager des livres par courriel" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:839 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:851 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:840 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:852 msgid "Sharing" msgstr "Partage" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:843 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:844 msgid "" "Setup sharing of books via email. Can be used for automatic sending of " "downloaded news to your devices" @@ -410,11 +410,11 @@ msgstr "" "Mise en place du partage de livre par courriel. Peu aussi être utilisé pour " "envoyer automatiquement les dernières nouvelles téléchargées à votre appareil" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:849 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:850 msgid "Sharing over the net" msgstr "Partager à travers le réseau" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:855 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:856 msgid "" "Setup the calibre Content Server which will give you access to your calibre " "library from anywhere, on any device, over the internet" @@ -422,34 +422,34 @@ msgstr "" "Installer le serveur de contenu de Calibre qui vous permet d'accéder à votre " "bibliothèque Calibre n'importe où, sur tous vos appareils, via Internet" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:862 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:863 msgid "Plugins" msgstr "Plugins" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:864 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:876 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:887 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:865 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:877 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:888 msgid "Advanced" msgstr "Avancé" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:868 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:869 msgid "Add/remove/customize various bits of calibre functionality" msgstr "Ajouter/Retirer/Modifier diverses fonctionalités de Calibre" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:874 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:875 msgid "Tweaks" msgstr "Ajustements" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:880 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:881 msgid "Fine tune how calibre behaves in various contexts" msgstr "" "Affiner la manière dont Calibre se comporte dans différents contextes" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:885 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:886 msgid "Miscellaneous" msgstr "Divers" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:891 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:892 msgid "Miscellaneous advanced configuration" msgstr "Diverses configurations avancées" @@ -495,7 +495,7 @@ msgstr "" "vous ne savez rien à propos du document d'entrée." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:59 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:436 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:444 msgid "" "This profile is intended for the SONY PRS line. The 500/505/600/700 etc." msgstr "" @@ -506,62 +506,62 @@ msgid "This profile is intended for the SONY PRS 300." msgstr "Ce profil est prévu pour le SONY PRS 300." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:80 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:476 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:484 msgid "This profile is intended for the SONY PRS-900." msgstr "Ce profil est prévu pour le SONY PRS-900." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:88 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:506 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:513 msgid "This profile is intended for the Microsoft Reader." msgstr "Ce profil est prévu pour le lecteur Microsoft." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:99 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:517 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:524 msgid "This profile is intended for the Mobipocket books." msgstr "Ce profil est prévu pour les livres Mobipocket." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:112 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:530 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:537 msgid "This profile is intended for the Hanlin V3 and its clones." msgstr "Ce profil est prévu pour le Handlin V3 et ses clones." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:124 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:542 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:549 msgid "This profile is intended for the Hanlin V5 and its clones." msgstr "Ce profil est prévu pour le Hanlin V5 et ses clones." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:134 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:550 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:557 msgid "This profile is intended for the Cybook G3." msgstr "Ce profil est prévu pour le Cybook G3." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:147 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:563 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:570 msgid "This profile is intended for the Cybook Opus." msgstr "Ce profil est prévu pour le Cybook Opus." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:159 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:576 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:583 msgid "This profile is intended for the Amazon Kindle." msgstr "Ce profil est prévu pour le Kindle d'Amazon." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:171 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:617 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:631 msgid "This profile is intended for the Irex Illiad." msgstr "Ce profil est prévu pour l'Iliad Irex." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:183 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:630 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:644 msgid "This profile is intended for the IRex Digital Reader 1000." msgstr "Ce profil est prévu pour l'IRex Digital Reader 1000." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:196 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:644 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:658 msgid "This profile is intended for the IRex Digital Reader 800." msgstr "Ce profil est prévu pour le lecteur IRex Digital 800." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:208 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:658 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:672 msgid "This profile is intended for the B&N Nook." msgstr "Ce profil est prévu pour le Nook B&N." @@ -579,29 +579,29 @@ msgstr "" "souhaitez générer un document que vous avez l'intention de lire sur un " "ordinateur ou sur une gamme d'appareils." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:273 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:276 msgid "" "Intended for the iPad and similar devices with a resolution of 768x1024" msgstr "" "Prévu pour l'iPad ou des appareils semblables avec une résolution de 768x1024" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:427 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:435 msgid "Intended for generic tablet devices, does no resizing of images" msgstr "Prévu pour les tablettes génériques, ne redimensionne pas les images" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:454 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:462 msgid "This profile is intended for the Kobo Reader." msgstr "Ce profil est prévu pour le lecteur Kobo" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:467 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:475 msgid "This profile is intended for the SONY PRS-300." msgstr "Ce profil est prévu pour le SONY PRS-300." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:485 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:493 msgid "This profile is intended for the 5-inch JetBook." msgstr "Ce profil est prévu pour le JetBook de 5 pouces." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:494 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:502 msgid "" "This profile is intended for the SONY PRS line. The 500/505/700 etc, in " "landscape mode. Mainly useful for comics." @@ -609,11 +609,11 @@ msgstr "" "Ce profil est prévu pour la gamme des SONY PRS (500, 505, 700, etc.) en mode " "paysage. Utile principalement pour les bandes dessinées." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:597 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:609 msgid "This profile is intended for the Amazon Kindle DX." msgstr "Ce profil est prévu pour le Kindle DX d'Amazon." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:672 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:686 msgid "This profile is intended for the Sanda Bambook." msgstr "Ce profil est prévu pour le Sanda Bambook." @@ -692,7 +692,7 @@ msgstr "Désactive le plugin nommé" msgid "Communicate with Android phones." msgstr "Communiquer avec les téléphones Android" -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:53 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:56 msgid "" "Comma separated list of directories to send e-books to on the device. The " "first one that exists will be used" @@ -700,7 +700,7 @@ msgstr "" "Liste de répertoires séparés par des virgules utilisée pour envoyer les " "ebooks vers l'appareil. Le premier existant sera utilisé." -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:95 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:98 msgid "Communicate with S60 phones." msgstr "Communiquer avec les téléphones S60" @@ -1058,6 +1058,14 @@ msgstr "Le Nook" msgid "Communicate with the Nook eBook reader." msgstr "Communiquer avec le lecteur d'ebook Nook." +#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:85 +msgid "Nook Color" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:86 +msgid "Communicate with the Nook Color eBook reader." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:17 msgid "Communicate with the Nuut2 eBook reader." msgstr "Communiquer avec le lecteur d'ebook Nuut2." @@ -2502,8 +2510,8 @@ msgstr "Oui" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:605 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:45 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:102 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:109 #: /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 @@ -2537,8 +2545,8 @@ msgstr "Producteur" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:39 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:206 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:189 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:104 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:79 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:325 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1131 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:178 @@ -2869,7 +2877,7 @@ msgstr "" "à partir de LibraryThing.com\n" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1308 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1399 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 msgid "Cover" msgstr "Couverture" @@ -2910,74 +2918,74 @@ msgstr "" msgid "All articles" msgstr "Tous les articles" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:259 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:262 msgid "This is an Amazon Topaz book. It cannot be processed." msgstr "C'est un livre Amazon Topaz. Il ne peut pas être traité." -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1400 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 msgid "Title Page" msgstr "Page de titre" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 #: /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:199 msgid "Table of Contents" msgstr "Table des matières" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 msgid "Index" msgstr "Index" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 msgid "Glossary" msgstr "Glossaire" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 msgid "Acknowledgements" msgstr "Remerciements" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 msgid "Bibliography" msgstr "Bibliographie" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 msgid "Colophon" msgstr "Marque de l'imprimeur" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 msgid "Copyright" msgstr "Copyright" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 msgid "Dedication" msgstr "Dédicace" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 msgid "Epigraph" msgstr "Epigraphe" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 msgid "Foreword" msgstr "Avant-propos" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 msgid "List of Illustrations" msgstr "Liste d'illustrations" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 msgid "List of Tables" msgstr "Liste des tables" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 msgid "Notes" msgstr "Notes" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1416 msgid "Preface" msgstr "Préface" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1417 msgid "Main Text" msgstr "Texte principal" @@ -4064,7 +4072,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:391 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:739 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:742 msgid "Not allowed" msgstr "Interdit" @@ -4133,7 +4141,7 @@ msgstr "Impossible de copier les livres : " #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:147 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:720 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:683 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:685 #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:189 msgid "Failed" msgstr "Echec" @@ -4892,11 +4900,11 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:25 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:49 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:58 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:403 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:119 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:120 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:121 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:131 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:405 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:137 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:320 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1117 @@ -4905,10 +4913,10 @@ msgstr "Chemin" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:52 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:122 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:123 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:124 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:133 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:319 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/emailp.py:24 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:117 @@ -4939,7 +4947,7 @@ msgstr "Cliquer pour ouvrir" msgid "None" msgstr "Aucun" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:404 msgid "Double-click to open Book Details window" msgstr "Double-cliquer pour ouvrir la fenêtre de détails du livre" @@ -5165,6 +5173,19 @@ msgstr "Inclure la section 'Series'" msgid "Tab template for catalog.ui" msgstr "Gabarit d'étiquette pour catalog.ui" +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:25 +msgid "Bold" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:26 +msgid "Italic" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:28 +msgid "Underline" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:36 msgid "" "For settings that cannot be specified in this dialog, use the values saved " @@ -5176,11 +5197,11 @@ msgstr "" "(s'ils existent) à la place des valeurs par défaut spécifiées dans les " "préférences." -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:70 msgid "Bulk Convert" msgstr "Conversion de masse" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:83 #: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:185 msgid "Options specific to the output format." msgstr "Options spécifiques pour le format de sortie." @@ -5695,6 +5716,7 @@ 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:353 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:214 msgid "&Series:" msgstr "&Séries :" @@ -5882,7 +5904,7 @@ msgid "Options specific to the input format." msgstr "Options spécifiques au format d'entrée." #: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:76 #: /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" @@ -6084,8 +6106,8 @@ msgid "Force maximum line length" msgstr "Forcer la longueur de ligne maximale" #: /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:72 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:78 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:46 #: /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 @@ -6399,10 +6421,10 @@ msgstr "Envoi d'un email à" #: /home/kovid/work/calibre/src/calibre/gui2/device.py:982 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:990 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1083 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1168 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1287 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1295 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1089 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1174 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1293 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1301 msgid "No suitable formats" msgstr "Pas de format convenable" @@ -6431,39 +6453,39 @@ msgstr "L'envoi par email des livres suivants a échoué :" msgid "Sent by email:" msgstr "Envoyer par email :" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1042 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1048 msgid "News:" msgstr "News :" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1043 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1049 msgid "Attached is the" msgstr "Le fichier attaché est" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1054 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1060 msgid "Sent news to" msgstr "Envoi des News vers" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1084 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1169 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1288 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1090 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1175 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1294 msgid "Auto convert the following books before uploading to the device?" msgstr "" "Convertir automatiquement les livres suivants avant de les télécharger dans " "l'appareil ?" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1114 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1120 msgid "Sending catalogs to device." msgstr "Envoie les catalogues vers l'appareil." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1201 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1207 msgid "Sending news to device." msgstr "Envoi les News vers l'appareil." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1254 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1260 msgid "Sending books to device." msgstr "Envoie les livres dans l'appareil." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1296 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1302 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." @@ -6472,11 +6494,11 @@ msgstr "" "convenable n'a été trouvé. Convertissez avant le(s) livre(s) vers un format " "supporté par votre appareil." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1360 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1366 msgid "No space on device" msgstr "Le lecteur électronique n'a plus d'espace mémoire disponible" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1361 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1367 msgid "" "

Cannot upload books to device there is no more free space available " msgstr "" @@ -6534,15 +6556,15 @@ msgstr "" msgid "&Paste from clipboard" msgstr "Co&ller à partir du bloc-notes" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:80 msgid "Fit &cover within view" msgstr "Adapte la &couverture à l'emplacement" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:81 msgid "&Previous" msgstr "&Précédent" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:82 msgid "&Next" msgstr "Suiva&nt" @@ -6712,6 +6734,7 @@ msgid "Set options for converting %s" msgstr "Indiquer les options pour la conversion de %s" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:211 msgid "&Title:" msgstr "&Titre :" @@ -6982,19 +7005,12 @@ msgstr "Livre %d :" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:274 msgid "" "You can destroy your library using this feature. Changes are " -"permanent. There is no undo function. This feature is experimental, and " -"there may be bugs. You are strongly encouraged to back up your library " -"before proceeding.

Search and replace in text fields using character " -"matching or regular expressions. " +"permanent. There is no undo function. You are strongly encouraged to back up " +"your library before proceeding.

Search and replace in text fields using " +"character matching or regular expressions. " msgstr "" -"Vous pouvez détruire votre bibliothèque en utilisant cette option. " -"Les changements sont permanents. Il n'y a pas de fonction pour revenir en " -"arrière. Cette fonction est experimentale, et il peut y avoir des bugs. Vous " -"êtes fortement encouragé à sauvegarder votre bibliothèque avant de " -"continuer.

REchercher et remplacer dans les champs de texte en utilisant " -"une correspondance de caractères ou une expression régulière. " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:282 msgid "" "In character mode, the field is searched for the entered search text. The " "text is replaced by the specified replacement text everywhere it is found in " @@ -7011,7 +7027,7 @@ msgstr "" "n'est pas cochée, le texte correspondra à la fois aux majuscules et aux " "minuscules" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:293 msgid "" "In regular expression mode, the search text is an arbitrary python-" "compatible regular expression. The replacement text can contain " @@ -7038,35 +7054,35 @@ msgstr "" "plus d'informations sur les expressions régulières en python, et en " "particulier la fonction 'sub'." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:436 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:438 msgid "You must specify a destination when source is a composite field" msgstr "" "Vous devez préciser uen destination quand la source est un champ mixte" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:528 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:536 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:631 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:538 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:633 msgid "Search/replace invalid" msgstr "Recherche/Remplacement erroné" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:529 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:531 msgid "" "Authors cannot be set to the empty string. Book title %s not processed" msgstr "" "La clé auteur ne peut être une chaine vide. Le livre dont le titre est %s " "n'a pas été traité" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:537 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:539 msgid "Title cannot be set to the empty string. Book title %s not processed" msgstr "" "Le titre ne peut être une chaîne vide. Le livre dont le titre est %s n'a pas " "été traité" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:632 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:634 msgid "Search pattern is invalid: %s" msgstr "Motif de recherche erroné : %s" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:671 msgid "" "Applying changes to %d books.\n" "Phase {0} {1}%%." @@ -7350,8 +7366,8 @@ msgid "Your test:" msgstr "Votre test :" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:401 -msgid "&Search and replace (experimental)" -msgstr "&Rechercher et remplacer (experimental)" +msgid "&Search and replace" +msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:91 msgid "Last modified: %s" @@ -7899,62 +7915,52 @@ msgstr "" msgid "Negate" msgstr "Exclut" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:198 msgid "Advanced Search" msgstr "Recherche avancée" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:119 -msgid "Find entries that have..." -msgstr "Trouver les entrées qui ont..." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:120 -msgid "&All these words:" -msgstr "&Tous ces mots :" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:121 -msgid "This exact &phrase:" -msgstr "Cette &phrase exacte :" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:122 -msgid "&One or more of these words:" -msgstr "&Un ou plus de ces mots :" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:123 -msgid "But dont show entries that have..." -msgstr "Mais ne montre pas les entrées qui ont..." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:124 -msgid "Any of these &unwanted words:" -msgstr "A&ucun de ces mots non souhaités :" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:199 msgid "What kind of match to use:" msgstr "Type de correspondance à utiliser" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:126 -msgid "Contains: the word or phrase matches anywhere in the metadata" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:200 +msgid "Contains: the word or phrase matches anywhere in the metadata field" msgstr "" -"Contient : le mot ou la phrase peuvent correspondre à n'importe quel élément " -"des métadonnées" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:127 -msgid "Equals: the word or phrase must match an entire metadata field" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:201 +msgid "Equals: the word or phrase must match the entire metadata field" msgstr "" -"Egal : le mot ou la phrase doivent correspondrent à un champ entier de " -"métadonnée" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:202 msgid "" -"Regular expression: the expression must match anywhere in the metadata" +"Regular expression: the expression must match anywhere in the metadata field" msgstr "" -"Expression régulière : l'expression doit correspondre quelque part dans les " -"métadonnées" -#: /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:203 +msgid "Find entries that have..." +msgstr "Trouver les entrées qui ont..." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:204 +msgid "&All these words:" +msgstr "&Tous ces mots :" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:205 +msgid "This exact &phrase:" +msgstr "Cette &phrase exacte :" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:206 +msgid "&One or more of these words:" +msgstr "&Un ou plus de ces mots :" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:207 +msgid "But dont show entries that have..." +msgstr "Mais ne montre pas les entrées qui ont..." + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:208 +msgid "Any of these &unwanted words:" +msgstr "A&ucun de ces mots non souhaités :" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:209 msgid "" "See the User Manual for more help" @@ -7962,6 +7968,47 @@ msgstr "" "Consulter le manuel utilisateur pour avoir plus d'informations." +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:210 +msgid "A&dvanced Search" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:212 +msgid "Enter the title." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:213 +msgid "&Author:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:215 +msgid "Ta&gs:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:216 +msgid "Enter an author's name. Only one author can be used." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:217 +msgid "" +"Enter a series name, without an index. Only one series name can be used." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:218 +msgid "Enter tags separated by spaces" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:219 +msgid "&Clear" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:220 +msgid "Search only in specific fields:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:221 +msgid "Titl&e/Author/Series ..." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/select_formats.py:45 msgid "Choose formats" msgstr "Choisir les formats" @@ -8669,11 +8716,15 @@ msgstr "" "Les livres affichés seront limités à ceux correspondant à la recherche " "sauvegardée sélectionnée" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:170 +msgid "Shift+Ctrl+F" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:173 msgid "Advanced search" msgstr "Recherche avancée" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:177 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:178 msgid "" "

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

Words separated by spaces are ANDed" @@ -8682,28 +8733,28 @@ msgstr "" "commentaires, etc...

Les mots séparés par des espaces sont traités " "avec des AND" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:181 msgid "&Go!" msgstr "&Go!" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:187 msgid "Do Quick Search (you can also press the Enter key)" msgstr "Lancer une recherche rapide (vous pouvez aussi appuyer sur Enter)" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:192 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:193 msgid "Reset Quick Search" msgstr "Réinitialisation de la recherche rapide" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:204 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:205 msgid "Copy current search text (instead of search name)" msgstr "" "Copier le texte de recherche courant (au lieu du nom de la recherche)" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:210 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:211 msgid "Save current search under the name shown in the box" msgstr "Sauvegarder la recherche courante avec le nom indiqué dans la boite" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:217 msgid "Delete current saved search" msgstr "Supprimer la recherche sauvegardée actuelle" @@ -8760,47 +8811,47 @@ msgstr "Marqué pour suppression" msgid "Double click to edit me

" msgstr "Double clic pour m' éditer

" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:144 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:147 msgid "Hide column %s" msgstr "Cacher la colonne %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:152 msgid "Sort on %s" msgstr "Trier par %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:150 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:153 msgid "Ascending" msgstr "Ascendant" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:153 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:156 msgid "Descending" msgstr "Descendant" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:168 msgid "Change text alignment for %s" msgstr "Changer l'alignement du texte pour %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 msgid "Left" msgstr "Gauche" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 msgid "Right" msgstr "Droite" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:171 msgid "Center" msgstr "Centre" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:190 msgid "Show column" msgstr "Afficher la colonne" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:199 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:202 msgid "Restore default layout" msgstr "Restorer l'affichage par défaut" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:740 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:743 msgid "" "Dropping onto a device is not supported. First add the book to the calibre " "library." @@ -10759,7 +10810,7 @@ msgid "Options to customize the ebook viewer" msgstr "Options pour personnalier l'afficheur d'ebook" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:42 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:704 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:708 msgid "Remember last used window size" msgstr "Se souvenir de la dernière taille de fenêtre utilisée" @@ -10937,70 +10988,70 @@ msgstr "Ebooks" msgid "No matches found for: %s" msgstr "Pas de correspondance trouvée pour : %s" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:481 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:485 msgid "Loading flow..." msgstr "Chargement du flux..." -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:517 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:521 msgid "Laying out %s" msgstr "Aménagement de %s" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:548 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:552 msgid "Bookmark #%d" msgstr "Marque-page #%d" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:552 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:556 msgid "Add bookmark" msgstr "Ajouter un signet" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:553 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:557 msgid "Enter title for bookmark:" msgstr "Entrer un titre pour le signet :" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:563 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:567 msgid "Manage Bookmarks" msgstr "Gérer les Signets" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:600 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:604 msgid "Loading ebook..." msgstr "Charge l'ebook..." -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:608 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:612 msgid "DRM Error" msgstr "Erreur de DRM" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:609 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:613 msgid "

This book is protected by DRM" msgstr "

Ce livre est protégé par DRM" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:613 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:617 msgid "Could not open ebook" msgstr "Impossible d'ouvrir l'ebook" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:691 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:695 msgid "Options to control the ebook viewer" msgstr "Options pour contrôler l'afficheur d'ebook" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:698 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:702 msgid "" "If specified, viewer window will try to come to the front when started." msgstr "" "Si spécifié, la fenêtre de l'afficheur essaiera d'apparaitre au premier plan " "au lancement." -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:701 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:705 msgid "" "If specified, viewer window will try to open full screen when started." msgstr "" "Si précisé, la fenêtre de l'afficheur essaiera de s'ouvrir en plein écran au " "démarrage." -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:706 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:710 msgid "Print javascript alert and console messages to the console" msgstr "" "Afficher les alertes javascript et les messages console dans la console" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:712 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:716 msgid "" "%prog [options] file\n" "\n" @@ -15923,6 +15974,9 @@ msgstr "Ne pas télécharger les feuilles de style CSS." #~ "- L'expression '.' ignore tout les tags; ne générant ainsi aucun genre de " #~ "catégories dans le catalogue" +#~ msgid " " +#~ msgstr " " + #~ msgid "Output directory. Defaults to current directory" #~ msgstr "Répertoire de sortie. Par défaut : répertoire courant" @@ -15940,6 +15994,12 @@ msgstr "Ne pas télécharger les feuilles de style CSS." #~ msgstr "" #~ "

Pour l'aide, consulter le Manuel Utilisateur
" +#~ msgid "" +#~ "Regular expression: the expression must match anywhere in the metadata" +#~ msgstr "" +#~ "Expression régulière : l'expression doit correspondre quelque part dans les " +#~ "métadonnées" + #~ 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" @@ -16439,6 +16499,9 @@ msgstr "Ne pas télécharger les feuilles de style CSS." #~ msgid "Apply function &after replace:" #~ msgstr "Appliquer la fonction &après remplacement:" +#~ msgid "&Search and replace (experimental)" +#~ msgstr "&Rechercher et remplacer (experimental)" + #~ msgid "Path to a txt file containing a comment." #~ msgstr "Chemin vers un fichier txt contenant un commentaire." @@ -16479,6 +16542,20 @@ msgstr "Ne pas télécharger les feuilles de style CSS." #~ msgid "Run the check" #~ msgstr "Executer la vérification" +#~ msgid "" +#~ "You can destroy your library using this feature. Changes are " +#~ "permanent. There is no undo function. This feature is experimental, and " +#~ "there may be bugs. You are strongly encouraged to back up your library " +#~ "before proceeding.

Search and replace in text fields using character " +#~ "matching or regular expressions. " +#~ msgstr "" +#~ "Vous pouvez détruire votre bibliothèque en utilisant cette option. " +#~ "Les changements sont permanents. Il n'y a pas de fonction pour revenir en " +#~ "arrière. Cette fonction est experimentale, et il peut y avoir des bugs. Vous " +#~ "êtes fortement encouragé à sauvegarder votre bibliothèque avant de " +#~ "continuer.

REchercher et remplacer dans les champs de texte en utilisant " +#~ "une correspondance de caractères ou une expression régulière. " + #~ msgid "Check the library folders for potential problems" #~ msgstr "" #~ "Vérifie les dossiers de la bibliothèque à la recherche de problèmes " @@ -16532,6 +16609,16 @@ msgstr "Ne pas télécharger les feuilles de style CSS." #~ "do to force it to use the ';' that the kindle requires. A third would be to " #~ "specify the language." +#~ msgid "Contains: the word or phrase matches anywhere in the metadata" +#~ msgstr "" +#~ "Contient : le mot ou la phrase peuvent correspondre à n'importe quel élément " +#~ "des métadonnées" + +#~ msgid "Equals: the word or phrase must match an entire metadata field" +#~ msgstr "" +#~ "Egal : le mot ou la phrase doivent correspondrent à un champ entier de " +#~ "métadonnée" + #~ msgid "" #~ "\n" #~ " %prog restore_database [options]\n" diff --git a/src/calibre/translations/it.po b/src/calibre/translations/it.po index 4ca54fc6ac..ed6e43bc88 100644 --- a/src/calibre/translations/it.po +++ b/src/calibre/translations/it.po @@ -8,14 +8,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre_calibre-it\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-11-10 14:27+0000\n" -"PO-Revision-Date: 2010-11-11 10:09+0000\n" -"Last-Translator: MeltingShell \n" +"POT-Creation-Date: 2010-11-12 23:11+0000\n" +"PO-Revision-Date: 2010-11-12 23:09+0000\n" +"Last-Translator: Kovid Goyal \n" "Language-Team: italiano\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-12 04:44+0000\n" +"X-Launchpad-Export-Date: 2010-11-13 04:53+0000\n" "X-Generator: Launchpad (build Unknown)\n" "X-Poedit-Bookmarks: -1,-1,-1,-1,-1,1105,-1,1312,-1,-1\n" "Generated-By: pygettext.py 1.5\n" @@ -34,7 +34,7 @@ msgstr "Non fa assolutamente niente" #: /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:643 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:650 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:401 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 @@ -77,14 +77,14 @@ msgstr "Non fa assolutamente niente" #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:78 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:119 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:153 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:616 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:822 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:824 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:620 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:826 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:828 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:911 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:916 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:913 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:918 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:984 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:143 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:150 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:64 @@ -126,8 +126,8 @@ msgstr "Non fa assolutamente niente" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:141 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:927 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:936 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1243 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1246 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1249 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1252 #: /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 @@ -195,7 +195,7 @@ msgstr "Azioni interfaccia utente" msgid "Preferences" msgstr "Preferenze" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:17 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:15 msgid "" "Follow all local links in an HTML file and create a ZIP file containing all " "linked files. This plugin is run every time you add an HTML file to the " @@ -205,7 +205,7 @@ msgstr "" "tutti i file collegati. Questo plug-in viene eseguito ogni volta che si " "aggiunge un file HTML alla biblioteca." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:53 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:51 msgid "" "Character encoding for the input HTML files. Common choices include: cp1252, " "latin1, iso-8859-1 and utf-8." @@ -213,7 +213,7 @@ msgstr "" "Codifica dei caratteri nei file HTML in ingresso. Scelte comuni includono: " "cp1252, latin1, iso-8859-1 e utf-8." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:60 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:58 msgid "" "Create a PMLZ archive containing the PML file and all images in the " "directory pmlname_img or images. This plugin is run every time you add a PML " @@ -223,7 +223,7 @@ msgstr "" "nella cartella pmlname_img o in images. Questo plug-in eseguito ogni volta " "che si aggiunge un documento PML alla biblioteca." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:94 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:92 msgid "Extract cover from comic files" msgstr "Estrae le copertine dai file dei fumetti" @@ -270,45 +270,45 @@ msgstr "Imposta i metadati nei file %s" msgid "Set metadata from %s files" msgstr "imposta metadati da %s file" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:711 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:712 msgid "Look and Feel" msgstr "Aspetto" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:725 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:714 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:726 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:737 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:748 msgid "Interface" msgstr "Interfaccia" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:717 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:718 msgid "Adjust the look and feel of the calibre interface to suit your tastes" msgstr "" "Modifica l'aspetto dell'interfaccia di calibre secondo i propri gusti" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:723 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 msgid "Behavior" msgstr "Comportamento" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:729 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:730 msgid "Change the way calibre behaves" msgstr "Cambia il comportamento di calibre" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:734 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:208 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:735 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:209 msgid "Add your own columns" msgstr "Aggiungi colonne personalizzate" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:740 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:741 msgid "Add/remove your own columns to the calibre book list" msgstr "" "Aggiunge/Rimuove colonne personalizzate dalla lista dei libri di calibre" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:745 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:746 msgid "Customize the toolbar" msgstr "Personalizza la barra degli strumenti" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:751 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:752 msgid "" "Customize the toolbars and context menus, changing which actions are " "available in each" @@ -316,59 +316,59 @@ msgstr "" "Personalizza la barra degli strumenti e i menu contestuali, cambiando le " "azioni disponibili in ognuno" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:757 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 msgid "Input Options" msgstr "Opzioni di digitazione" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:759 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:770 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:760 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:771 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:782 msgid "Conversion" msgstr "Conversione" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:763 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:764 msgid "Set conversion options specific to each input format" msgstr "" "Imposta le opzioni di conversione specifiche per ogni formato di input" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:768 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 msgid "Common Options" msgstr "Opzioni comuni" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:774 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:775 msgid "Set conversion options common to all formats" msgstr "Imposta le opzioni di conversione comuni a tutti i formati" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:779 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:780 msgid "Output Options" msgstr "Opzioni di output" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:785 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:786 msgid "Set conversion options specific to each output format" msgstr "" "Imposta le opzioni di conversione specifiche per ogni formato di output" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:790 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:791 msgid "Adding books" msgstr "Aggiunta libri" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:792 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:804 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:816 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:828 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:817 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:829 msgid "Import/Export" msgstr "Importa/Esporta" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:796 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:797 msgid "Control how calibre reads metadata from files when adding books" msgstr "" "Controlla come calibre legge i metadati dai libri quando vengono aggiunti" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:802 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:803 msgid "Saving books to disk" msgstr "Salvataggio libri su disco" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:808 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:809 msgid "" "Control how calibre exports files from its database to disk when using Save " "to disk" @@ -376,32 +376,32 @@ msgstr "" "Controlla come calibre esporta i file dal suo database al disco quando si " "usa «Salva su disco»" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:814 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:815 msgid "Sending books to devices" msgstr "Invio libri ai dispositivi" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:820 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:821 msgid "Control how calibre transfers files to your ebook reader" msgstr "Controlla come calibre trasferisce i file al lettore di ebook" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:826 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:827 msgid "Metadata plugboards" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:832 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:833 msgid "Change metadata fields before saving/sending" msgstr "Cambiare i campi dei metadati prima di salvare/inviare" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:837 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:838 msgid "Sharing books by email" msgstr "Condivisione libri via email" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:839 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:851 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:840 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:852 msgid "Sharing" msgstr "Condivisione" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:843 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:844 msgid "" "Setup sharing of books via email. Can be used for automatic sending of " "downloaded news to your devices" @@ -409,11 +409,11 @@ msgstr "" "Imposta la condivisione dei libri via email. Può essere usato per inviare " "automaticamente le news scaricate ai dispositivi." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:849 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:850 msgid "Sharing over the net" msgstr "Condividi sulla rete" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:855 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:856 msgid "" "Setup the calibre Content Server which will give you access to your calibre " "library from anywhere, on any device, over the internet" @@ -421,34 +421,34 @@ msgstr "" "Imposta il Server di Contenuti calibre che da accesso alla biblioteca di " "calibre da ogni luogo, su ogni dispositivo, su internet" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:862 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:863 msgid "Plugins" msgstr "Plugins" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:864 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:876 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:887 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:865 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:877 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:888 msgid "Advanced" msgstr "Avanzate" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:868 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:869 msgid "Add/remove/customize various bits of calibre functionality" msgstr "" "Aggiungi/rimuovi/personalizza varie opzioni delle funzionalità di calibre" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:874 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:875 msgid "Tweaks" msgstr "Ottimizzazioni" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:880 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:881 msgid "Fine tune how calibre behaves in various contexts" msgstr "Modifica in dettaglio come si comporta calibre in vari contesti" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:885 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:886 msgid "Miscellaneous" msgstr "Varie" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:891 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:892 msgid "Miscellaneous advanced configuration" msgstr "Configurazione avanzata varia" @@ -493,7 +493,7 @@ msgstr "" "sa nulla sul documento di origine." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:59 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:436 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:444 msgid "" "This profile is intended for the SONY PRS line. The 500/505/600/700 etc." msgstr "" @@ -505,62 +505,62 @@ msgid "This profile is intended for the SONY PRS 300." msgstr "Questo profilo è adatto per il Sony PRS 300." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:80 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:476 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:484 msgid "This profile is intended for the SONY PRS-900." msgstr "Questo profilo è adatto per il Sony PRS-900." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:88 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:506 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:513 msgid "This profile is intended for the Microsoft Reader." msgstr "Questo profilo è adatto per il Microsoft Reader." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:99 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:517 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:524 msgid "This profile is intended for the Mobipocket books." msgstr "Questo profilo è adatto per i libri in formato Mobipocket." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:112 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:530 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:537 msgid "This profile is intended for the Hanlin V3 and its clones." msgstr "Questo profilo è adatto per l'Hanlin V3 ed i suoi cloni." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:124 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:542 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:549 msgid "This profile is intended for the Hanlin V5 and its clones." msgstr "Questo profilo è adatto per Hanlin V5 e i suoi cloni." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:134 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:550 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:557 msgid "This profile is intended for the Cybook G3." msgstr "Questo profilo è adatto per il Cybook G3." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:147 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:563 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:570 msgid "This profile is intended for the Cybook Opus." msgstr "Questo profilo è adatto per il Cybook Opus." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:159 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:576 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:583 msgid "This profile is intended for the Amazon Kindle." msgstr "Questo profilo è adatto per il Kindle di Amazon." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:171 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:617 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:631 msgid "This profile is intended for the Irex Illiad." msgstr "Questo profilo è adatto per l'Irex di Illiad." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:183 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:630 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:644 msgid "This profile is intended for the IRex Digital Reader 1000." msgstr "Questo profilo è adatto per l'IRex Digital Reader 1000." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:196 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:644 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:658 msgid "This profile is intended for the IRex Digital Reader 800." msgstr "Questo profilo adatto per l'IRex Digital Reader 800." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:208 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:658 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:672 msgid "This profile is intended for the B&N Nook." msgstr "Questo profilo è adatto per il Nook B&N." @@ -578,31 +578,31 @@ msgstr "" "produrre un documento da poter leggere tramite computer o su vari " "dispositivi." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:273 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:276 msgid "" "Intended for the iPad and similar devices with a resolution of 768x1024" msgstr "" "Questo profilo è adatto per l'iPad e dispositivi simili con una risoluzione " "di 768x1024" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:427 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:435 msgid "Intended for generic tablet devices, does no resizing of images" msgstr "" "Pensato per dispositivi tablet generici, non ridimensiona le immagini" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:454 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:462 msgid "This profile is intended for the Kobo Reader." msgstr "Questo profilo è adatto per il Kobo Reader." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:467 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:475 msgid "This profile is intended for the SONY PRS-300." msgstr "Questo profilo è adatto per il Sony PRS-300." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:485 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:493 msgid "This profile is intended for the 5-inch JetBook." msgstr "Questo profilo è adatto per il JetBook da 5 pollici." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:494 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:502 msgid "" "This profile is intended for the SONY PRS line. The 500/505/700 etc, in " "landscape mode. Mainly useful for comics." @@ -610,11 +610,11 @@ msgstr "" "Questo profilo è adatto per la linea SONY PRS. Il 500/505/700 ecc, in " "modalità panoramica. Utile principalmente per i fumetti." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:597 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:609 msgid "This profile is intended for the Amazon Kindle DX." msgstr "Questo profilo è adatto per il Kindle DX di Amazon." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:672 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:686 msgid "This profile is intended for the Sanda Bambook." msgstr "Questo profilo è riservato a Sanda Bambook." @@ -692,7 +692,7 @@ msgstr "Disabilita il plugin nominato" msgid "Communicate with Android phones." msgstr "Comunica con i telefoni Android." -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:53 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:56 msgid "" "Comma separated list of directories to send e-books to on the device. The " "first one that exists will be used" @@ -700,7 +700,7 @@ msgstr "" "Lista delle cartelle separate da virgole dei libri da inviare al " "dispositivo. Verrà usata la prima cartella esistente." -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:95 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:98 msgid "Communicate with S60 phones." msgstr "Comunica con i telefoni S60." @@ -1058,6 +1058,14 @@ msgstr "Il lettore Nook" msgid "Communicate with the Nook eBook reader." msgstr "Comunica con il lettore Nook." +#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:85 +msgid "Nook Color" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:86 +msgid "Communicate with the Nook Color eBook reader." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:17 msgid "Communicate with the Nuut2 eBook reader." msgstr "Comunica con il lettore Nuut2." @@ -2839,7 +2847,7 @@ msgstr "" "con da ISBN da LibraryThing.com\n" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1308 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1399 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 msgid "Cover" msgstr "Copertina" @@ -2881,70 +2889,70 @@ msgstr "Tutti gli articoli" msgid "This is an Amazon Topaz book. It cannot be processed." msgstr "Questo è un libro Amazon Topaz. Non può essere elaborato." -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1400 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 msgid "Title Page" msgstr "Pagina iniziale" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 #: /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:199 msgid "Table of Contents" msgstr "Indice" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 msgid "Index" msgstr "Indice analitico" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 msgid "Glossary" msgstr "Glossario" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 msgid "Acknowledgements" msgstr "Ringraziamenti" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 msgid "Bibliography" msgstr "Bibliografia" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 msgid "Colophon" msgstr "Colophon" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 msgid "Copyright" msgstr "Diritti d'autore" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 msgid "Dedication" msgstr "Dedica" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 msgid "Epigraph" msgstr "Epigrafe" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 msgid "Foreword" msgstr "Premessa" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 msgid "List of Illustrations" msgstr "Indice delle figure" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 msgid "List of Tables" msgstr "Indice delle tabelle" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 msgid "Notes" msgstr "Note" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1416 msgid "Preface" msgstr "Prefazione" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1417 msgid "Main Text" msgstr "Corpo del testo" @@ -4026,7 +4034,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:391 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:741 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:742 msgid "Not allowed" msgstr "Non permesso" @@ -4337,6 +4345,10 @@ msgid "" "second and subsequently selected books will not be deleted or " "changed.

Please confirm you want to proceed." msgstr "" +"I diversi formati del libro e i metadata dei libri selezionati saranno " +"aggiunti al primo libro selezionato (%s). Il codice ISBN non " +"sarà modificato.

I libri successivi non saranno cancellati o " +"modificati.

Conferma per procedere." #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:209 msgid "" @@ -5110,7 +5122,7 @@ msgstr "Grassetto" #: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:26 msgid "Italic" -msgstr "" +msgstr "Corsivo" #: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:28 @@ -5127,11 +5139,11 @@ msgstr "" "salvati in una conversione precedente (se esistente) invece di usare i " "valori predefiniti nelle Preferenze" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:70 msgid "Bulk Convert" msgstr "Conversione in gruppo" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:83 #: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:185 msgid "Options specific to the output format." msgstr "Opzioni specifiche per i formati di output" @@ -6347,10 +6359,10 @@ msgstr "Spedizione di un messaggio elettronico a" #: /home/kovid/work/calibre/src/calibre/gui2/device.py:982 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:990 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1083 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1168 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1287 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1295 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1089 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1174 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1293 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1301 msgid "No suitable formats" msgstr "Nessun formato adatto" @@ -6379,38 +6391,38 @@ msgstr "Impossibile inviare via email i seguenti libri:" msgid "Sent by email:" msgstr "Inviato per posta elettronica" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1042 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1048 msgid "News:" msgstr "Notizie:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1043 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1049 msgid "Attached is the" msgstr "Allegato c'é" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1054 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1060 msgid "Sent news to" msgstr "Notizie inviate a" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1084 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1169 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1288 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1090 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1175 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1294 msgid "Auto convert the following books before uploading to the device?" msgstr "" "Convertire automaticamente i libri seguenti prima di inviarli al dispositivo?" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1114 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1120 msgid "Sending catalogs to device." msgstr "Inviando i cataloghi al dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1201 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1207 msgid "Sending news to device." msgstr "Invio delle notizie al dispositivo." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1254 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1260 msgid "Sending books to device." msgstr "Invio dei libri al dispositivo." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1296 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1302 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." @@ -6419,11 +6431,11 @@ msgstr "" "trovato un formato adeguato. È prima necessario convertire i libri in un " "formato supportato dal dispositivo." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1360 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1366 msgid "No space on device" msgstr "Spazio sul dispositivo insufficiente" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1361 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1367 msgid "" "

Cannot upload books to device there is no more free space available " msgstr "" @@ -7081,6 +7093,11 @@ msgid "" "for that series. Checking this box will tell calibre to start numbering\n" "from the value in the box" msgstr "" +"Le serie saranno normalmente renumerate partendo dal numero più alto del " +"database\n" +"per quella serie. Selezionando questa casella permetterai a calibre di " +"iniziare la numerazione\n" +"partendo dal valore presente nel box." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:367 msgid "Remove &format:" @@ -7143,6 +7160,8 @@ msgid "" "Choose whether to use basic text matching or advanced regular expression " "matching" msgstr "" +"Scegli se utilizzare una corrispondenza di testo semplice o una " +"corrispondenza di testo avanzata." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:382 msgid "&Search for:" @@ -7159,6 +7178,9 @@ msgid "" "Check this box if the search string must match exactly upper and lower case. " "Uncheck it if case is to be ignored" msgstr "" +"Seleziona questa casella se la stringa di ricerca deve far corrispondere " +"esattamente i caratteri maiuscoli e minuscoli. De-seleziona per ignorare la " +"corrispondenza." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:385 msgid "Case sensitive" @@ -7231,7 +7253,7 @@ msgstr "Il test:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:401 msgid "&Search and replace" -msgstr "" +msgstr "&Cerca e sostituisce" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:91 msgid "Last modified: %s" @@ -7778,48 +7800,45 @@ msgid "Advanced Search" msgstr "Ricerca avanzata" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:199 -msgid "Find entries that have..." -msgstr "Trova elementi che hanno..." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:200 -msgid "&All these words:" -msgstr "&Tutte queste parole:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:201 -msgid "This exact &phrase:" -msgstr "&Questa frase esatta:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:202 -msgid "&One or more of these words:" -msgstr "&Una o più di queste parole:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:203 -msgid "But dont show entries that have..." -msgstr "Ma non visualizzare elementi che hanno..." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:204 -msgid "Any of these &unwanted words:" -msgstr "Una di queste parole non richie&ste:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:205 msgid "What kind of match to use:" msgstr "Tipo di corrispondenza da usare:" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:200 +msgid "Contains: the word or phrase matches anywhere in the metadata field" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:201 +msgid "Equals: the word or phrase must match the entire metadata field" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:202 +msgid "" +"Regular expression: the expression must match anywhere in the metadata field" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:203 +msgid "Find entries that have..." +msgstr "Trova elementi che hanno..." + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:204 +msgid "&All these words:" +msgstr "&Tutte queste parole:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:205 +msgid "This exact &phrase:" +msgstr "&Questa frase esatta:" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:206 -msgid "Contains: the word or phrase matches anywhere in the metadata" -msgstr "Contiene: la parola o frase corrispondenti ovunque nei metadati" +msgid "&One or more of these words:" +msgstr "&Una o più di queste parole:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:207 -msgid "Equals: the word or phrase must match an entire metadata field" -msgstr "" -"Uguale: la parola o frase deve corrispondere esattamente nei metadati" +msgid "But dont show entries that have..." +msgstr "Ma non visualizzare elementi che hanno..." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:208 -msgid "" -"Regular expression: the expression must match anywhere in the metadata" -msgstr "" -"Espressione regolare: l'espressione deve corrispondere in qualunque punto " -"dei metadati" +msgid "Any of these &unwanted words:" +msgstr "Una di queste parole non richie&ste:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:209 msgid "" @@ -7839,7 +7858,7 @@ msgstr "Inserisci il titolo" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:213 msgid "&Author:" -msgstr "" +msgstr "&Autore:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:215 msgid "Ta&gs:" @@ -8577,7 +8596,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:181 msgid "&Go!" -msgstr "" +msgstr "&Vai!" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:187 msgid "Do Quick Search (you can also press the Enter key)" @@ -8619,7 +8638,7 @@ msgstr "Dimensione (MB)" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:331 msgid "Book %s of %s." -msgstr "" +msgstr "Libro %s di %s." #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:693 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1236 @@ -8652,47 +8671,47 @@ msgstr "Marcato per l'eliminazione" msgid "Double click to edit me

" msgstr "Doppio clic per modificarmi

" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:146 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:147 msgid "Hide column %s" msgstr "Nascondi colonna %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:152 msgid "Sort on %s" msgstr "Ordina per %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:152 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:153 msgid "Ascending" msgstr "Ascendente" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:156 msgid "Descending" msgstr "Discendente" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:168 msgid "Change text alignment for %s" msgstr "Cambia allineamento del testo per %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 msgid "Left" msgstr "Sinistra" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 msgid "Right" msgstr "Destra" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:171 msgid "Center" msgstr "Centrato" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:190 msgid "Show column" msgstr "Mostra colonna" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:201 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:202 msgid "Restore default layout" msgstr "Ripristina layout perdefinito" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:742 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:743 msgid "" "Dropping onto a device is not supported. First add the book to the calibre " "library." @@ -10232,11 +10251,15 @@ msgstr "Gestione categorie utente" msgid "" "Changing the authors for several books can take a while. Are you sure?" msgstr "" +"Modificare gli autori di molti libri può durare un tempo abbastanza lungo. " +"Sei sicuro?" #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:456 msgid "" "Changing the metadata for that many books can take a while. Are you sure?" msgstr "" +"Modificare i metadata per tanti libri può durare un tempo abbastanza lungo. " +"Sei sicuro?" #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:512 #: /home/kovid/work/calibre/src/calibre/library/database2.py:320 @@ -15103,6 +15126,13 @@ msgstr "Non scaricare i fogli di stile CSS" #~ "\"una\"), la punteggiatura, maiuscole, ecc. Corrispondenza Autore fa lo " #~ "stesso." +#~ msgid "Contains: the word or phrase matches anywhere in the metadata" +#~ msgstr "Contiene: la parola o frase corrispondenti ovunque nei metadati" + +#~ msgid "Equals: the word or phrase must match an entire metadata field" +#~ msgstr "" +#~ "Uguale: la parola o frase deve corrispondere esattamente nei metadati" + #~ msgid "set in ui.py" #~ msgstr "posta in ui,py" @@ -15303,6 +15333,12 @@ msgstr "Non scaricare i fogli di stile CSS" #~ msgid "Failed to download metadata for the following:" #~ msgstr "Impossibile a scaricare i metadati per i seguenti:" +#~ msgid "" +#~ "Regular expression: the expression must match anywhere in the metadata" +#~ msgstr "" +#~ "Espressione regolare: l'espressione deve corrispondere in qualunque punto " +#~ "dei metadati" + #~ msgid "Connect to iTunes (EXPERIMENTAL)" #~ msgstr "Connetti ad iTunes (SPERIMENTALE)" diff --git a/src/calibre/translations/nl.po b/src/calibre/translations/nl.po index 52aa7600c5..ca95ca48c6 100644 --- a/src/calibre/translations/nl.po +++ b/src/calibre/translations/nl.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2010-11-06 15:45+0000\n" -"PO-Revision-Date: 2010-11-07 18:33+0000\n" -"Last-Translator: Mar2zz \n" +"POT-Creation-Date: 2010-11-12 23:11+0000\n" +"PO-Revision-Date: 2010-11-12 22:31+0000\n" +"Last-Translator: Kovid Goyal \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-08 05:09+0000\n" +"X-Launchpad-Export-Date: 2010-11-13 04:52+0000\n" "X-Generator: Launchpad (build Unknown)\n" "X-Poedit-Country: NETHERLANDS\n" "X-Poedit-Language: Dutch\n" @@ -37,7 +37,7 @@ msgstr "Doet helemaal niets" #: /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:643 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:650 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:401 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 @@ -80,14 +80,14 @@ msgstr "Doet helemaal niets" #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:78 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:119 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:153 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:611 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:817 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:819 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:620 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:826 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:828 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:911 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:916 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:913 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:918 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:984 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:143 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:150 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:64 @@ -129,8 +129,8 @@ msgstr "Doet helemaal niets" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:141 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:927 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:936 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1243 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1246 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1249 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1252 #: /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 @@ -198,7 +198,7 @@ msgstr "Actie gebruikers interface" msgid "Preferences" msgstr "Voorkeuren" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:17 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:15 msgid "" "Follow all local links in an HTML file and create a ZIP file containing all " "linked files. This plugin is run every time you add an HTML file to the " @@ -208,7 +208,7 @@ msgstr "" "gelinkte bestanden. Deze plug-in wordt elke keer wanneer u een HTML-bestand " "aan de bibliotheek toevoegt uitgevoerd." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:53 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:51 msgid "" "Character encoding for the input HTML files. Common choices include: cp1252, " "latin1, iso-8859-1 and utf-8." @@ -216,7 +216,7 @@ msgstr "" "Karaktercodering voor de invoer HTML-bestanden. Standaard keuzes zijn: " "cp1252, latin1, iso-8859-1 en utf-8." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:60 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:58 msgid "" "Create a PMLZ archive containing the PML file and all images in the " "directory pmlname_img or images. This plugin is run every time you add a PML " @@ -226,7 +226,7 @@ msgstr "" "of images bevat. Deze plug-in wordt steeds uitgevoerd als een PML-bestand " "aan de bibliotheek wordt toegevoegd." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:94 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:92 msgid "Extract cover from comic files" msgstr "Haal de omslag uit bestanden met stripverhalen" @@ -269,44 +269,44 @@ msgstr "Lees metagegevens van eboeken in ZIP-archieven" msgid "Set metadata in %s files" msgstr "Stel metagegevens van %s bestanden in" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:711 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:712 msgid "Look and Feel" msgstr "Uiterlijk en Vormgeving" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:725 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:714 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:726 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:737 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:748 msgid "Interface" msgstr "Interface" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:717 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:718 msgid "Adjust the look and feel of the calibre interface to suit your tastes" msgstr "" "Pas het uiterlijk en gedrag van de calibre interface aan naar je smaak" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:723 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 msgid "Behavior" msgstr "Gedrag" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:729 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:730 msgid "Change the way calibre behaves" msgstr "Verander de manier waarop calibre zich gedraagt" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:734 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:206 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:735 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:209 msgid "Add your own columns" msgstr "Voeg je eigen kolommen toe" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:740 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:741 msgid "Add/remove your own columns to the calibre book list" msgstr "Voeg/Verwijder je eigen kolommen toe aan de calibre boekenlijst" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:745 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:746 msgid "Customize the toolbar" msgstr "Werkbalk aanpassen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:751 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:752 msgid "" "Customize the toolbars and context menus, changing which actions are " "available in each" @@ -314,58 +314,58 @@ msgstr "" "Pas de werkbalken en contextmenu's aan en verander daarmee de beschikbare " "actie's in beide." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:757 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 msgid "Input Options" msgstr "Invoeropties" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:759 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:770 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:760 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:771 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:782 msgid "Conversion" msgstr "Conversie" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:763 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:764 msgid "Set conversion options specific to each input format" msgstr "" "Configureer de conversie-instellingen specifiek voor ieder invoerformaat" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:768 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 msgid "Common Options" msgstr "Algemene opties" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:774 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:775 msgid "Set conversion options common to all formats" msgstr "Configureer de conversieopties die alle formaten gemeen hebben" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:779 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:780 msgid "Output Options" msgstr "Uitvoeropties" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:785 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:786 msgid "Set conversion options specific to each output format" msgstr "Set de conversieopties specifiek voor ieder uitvoerformaat" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:790 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:791 msgid "Adding books" msgstr "Boeken toevoegen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:792 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:804 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:816 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:828 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:817 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:829 msgid "Import/Export" msgstr "Importeren/Exporteren" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:796 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:797 msgid "Control how calibre reads metadata from files when adding books" msgstr "" "Bepaal hoe calibre metadata uit bestanden leest als boeken worden toegevoegd" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:802 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:803 msgid "Saving books to disk" msgstr "Boeken bewaren op schijf" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:808 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:809 msgid "" "Control how calibre exports files from its database to disk when using Save " "to disk" @@ -373,32 +373,32 @@ msgstr "" "Bepaal hoe calibre bestanden uit zijn database op schijf bewaard als je " "Bewaar op schijf gebruikt" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:814 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:815 msgid "Sending books to devices" msgstr "Stuur boeken naar apparaten" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:820 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:821 msgid "Control how calibre transfers files to your ebook reader" msgstr "Bepaal hoe calibre bestanden naar je ebook reader overplaats" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:826 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:827 msgid "Metadata plugboards" msgstr "Invoegtoepassing voor metagegevens" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:832 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:833 msgid "Change metadata fields before saving/sending" msgstr "Verander de velden met metagegevens voordat het opslaan/versturen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:837 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:838 msgid "Sharing books by email" msgstr "Deel boeken via email" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:839 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:851 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:840 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:852 msgid "Sharing" msgstr "Delen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:843 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:844 msgid "" "Setup sharing of books via email. Can be used for automatic sending of " "downloaded news to your devices" @@ -406,11 +406,11 @@ msgstr "" "Configureer het delen van boeken via email. Dit kan gebruikt worden om " "automatisch gedownload nieuws naar je apparaten te sturen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:849 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:850 msgid "Sharing over the net" msgstr "Delen over het net" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:855 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:856 msgid "" "Setup the calibre Content Server which will give you access to your calibre " "library from anywhere, on any device, over the internet" @@ -418,35 +418,35 @@ msgstr "" "Configureer de calibre Content Server, die je toegang tot je calibre " "bibliotheek geeft van overal, op elk apparaat, via het internet" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:862 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:863 msgid "Plugins" msgstr "Plugins" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:864 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:876 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:887 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:865 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:877 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:888 msgid "Advanced" msgstr "Geavanceerd" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:868 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:869 msgid "Add/remove/customize various bits of calibre functionality" msgstr "" "Voeg toe/verwijder/customize de verschillende delen van de calibre " "functionaliteit" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:874 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:875 msgid "Tweaks" msgstr "Tweaks" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:880 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:881 msgid "Fine tune how calibre behaves in various contexts" msgstr "Stem af hoe calibre zich gedraagt in bepaalde situaties" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:885 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:886 msgid "Miscellaneous" msgstr "Diversen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:891 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:892 msgid "Miscellaneous advanced configuration" msgstr "Diverse geavanceerde instellingen" @@ -492,7 +492,7 @@ msgstr "" "niets over het invoer document weet." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:59 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:436 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:444 msgid "" "This profile is intended for the SONY PRS line. The 500/505/600/700 etc." msgstr "" @@ -503,62 +503,62 @@ msgid "This profile is intended for the SONY PRS 300." msgstr "Dit profiel is bedoeld voor de SONY PRS 300." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:80 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:476 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:484 msgid "This profile is intended for the SONY PRS-900." msgstr "Dit profiel is bedoeld voor de SONY PRS-900." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:88 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:506 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:513 msgid "This profile is intended for the Microsoft Reader." msgstr "Dit profiel is bedoeld voor de Microsoft Reader." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:99 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:517 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:524 msgid "This profile is intended for the Mobipocket books." msgstr "Dit profiel is bedoeld voor de Mobipocket boeken." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:112 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:530 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:537 msgid "This profile is intended for the Hanlin V3 and its clones." msgstr "Dit profiel is bedoeld voor de Hanlin V3 en zijn afgeleiden." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:124 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:542 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:549 msgid "This profile is intended for the Hanlin V5 and its clones." msgstr "Dit profiel is bedoeld voor de Hanlin V5 en zijn afgeleiden." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:134 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:550 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:557 msgid "This profile is intended for the Cybook G3." msgstr "Dit profiel is bedoeld voor de Cybook G3." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:147 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:563 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:570 msgid "This profile is intended for the Cybook Opus." msgstr "Dit profiel is bedoeld voor de Cybook Opus." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:159 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:576 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:583 msgid "This profile is intended for the Amazon Kindle." msgstr "Dit profiel is bedoeld voor de Amazon Kindle." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:171 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:617 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:631 msgid "This profile is intended for the Irex Illiad." msgstr "Dit profiel is bedoeld voor de Irex Illiad." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:183 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:630 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:644 msgid "This profile is intended for the IRex Digital Reader 1000." msgstr "Dit profiel is bedoeld voor de IRex Digital Reader 1000." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:196 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:644 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:658 msgid "This profile is intended for the IRex Digital Reader 800." msgstr "Dit profiel is bestemd voor de IRex Digital Reader 800." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:208 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:658 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:672 msgid "This profile is intended for the B&N Nook." msgstr "Dit profiel is bedoeld voor de B&N Nook." @@ -575,30 +575,30 @@ msgstr "" "Dit profiel probeert zinnige instellingen te gebruiken, en is handig om een " "document te maken dat op een computer of meedere apparaten gelezen wordt." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:273 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:276 msgid "" "Intended for the iPad and similar devices with a resolution of 768x1024" msgstr "" "Bedoeld voor de iPad en soortgelijke apparaten met een resolutie van 768x1024" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:427 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:435 msgid "Intended for generic tablet devices, does no resizing of images" msgstr "" "Bedoeld voor normale tablets, doet geen aanpassingen aan afbeeldingen." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:454 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:462 msgid "This profile is intended for the Kobo Reader." msgstr "Dit profiel is bedoeld voor de Kobo Reader." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:467 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:475 msgid "This profile is intended for the SONY PRS-300." msgstr "Dit profiel is bedoeld voor de SONY PRS-300" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:485 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:493 msgid "This profile is intended for the 5-inch JetBook." msgstr "Dit profiel is bedoeld voor de 5-inch JetBook." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:494 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:502 msgid "" "This profile is intended for the SONY PRS line. The 500/505/700 etc, in " "landscape mode. Mainly useful for comics." @@ -606,11 +606,11 @@ msgstr "" "Dit profiel is bedoeld voor de SONY PRS reeks. De 300/600 etc, in " "horizontale schermmodus. Vooral handig voor stripboeken." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:597 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:609 msgid "This profile is intended for the Amazon Kindle DX." msgstr "Dit profiel is bedoeld voor de Amazon Kindle DX." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:672 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:686 msgid "This profile is intended for the Sanda Bambook." msgstr "Dit profiel is bedoeld voor het Sanda Bamboek." @@ -690,7 +690,7 @@ msgstr "Deactiveer de genoemde plugin" msgid "Communicate with Android phones." msgstr "Communiceer met Android telefoons." -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:53 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:56 msgid "" "Comma separated list of directories to send e-books to on the device. The " "first one that exists will be used" @@ -698,7 +698,7 @@ msgstr "" "Komma-gescheiden lijst van folders om e-boeken naar toe te sturen op het " "apparaat. De eerste die wordt gevonden zal worden gebruikt." -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:95 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:98 msgid "Communicate with S60 phones." msgstr "Communiceert met S60 telefoons" @@ -1055,6 +1055,14 @@ msgstr "De Nook" msgid "Communicate with the Nook eBook reader." msgstr "Communiceer met de Nook eBook lezer." +#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:85 +msgid "Nook Color" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:86 +msgid "Communicate with the Nook Color eBook reader." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:17 msgid "Communicate with the Nuut2 eBook reader." msgstr "Communiceer met de Nuut2 eBook lezer." @@ -2480,8 +2488,8 @@ msgstr "Ja" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:605 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:45 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:102 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:109 #: /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 @@ -2515,8 +2523,8 @@ msgstr "Producent" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:39 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:206 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:189 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:104 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:79 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:325 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1131 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:178 @@ -2842,7 +2850,7 @@ msgstr "" "voor het boek aangeduid met ISBN van LibraryThing.com\n" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1308 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1399 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 msgid "Cover" msgstr "Omslag" @@ -2881,74 +2889,74 @@ msgstr "" msgid "All articles" msgstr "Alle artikelen" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:259 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:262 msgid "This is an Amazon Topaz book. It cannot be processed." msgstr "Dit is een Amazon Topaz boek. Het kan niet worden verwerkt." -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1400 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 msgid "Title Page" msgstr "Titelpagina" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 #: /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:199 msgid "Table of Contents" msgstr "Inhoudsopgave" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 msgid "Index" msgstr "Index" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 msgid "Glossary" msgstr "Verklarende woordenlijst" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 msgid "Acknowledgements" msgstr "Erkenning" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 msgid "Bibliography" msgstr "Bibliografie" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 msgid "Colophon" msgstr "Colofon" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 msgid "Copyright" msgstr "Auteursrecht" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 msgid "Dedication" msgstr "Opgedragen aan" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 msgid "Epigraph" msgstr "Epigraaf" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 msgid "Foreword" msgstr "Voorwoord" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 msgid "List of Illustrations" msgstr "Lijst met afbeeldingen" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 msgid "List of Tables" msgstr "Lijst met tabellen" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 msgid "Notes" msgstr "Aantekeningen" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1416 msgid "Preface" msgstr "Voorwoord" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1417 msgid "Main Text" msgstr "Hoofd Tekst" @@ -4023,7 +4031,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:391 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:739 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:742 msgid "Not allowed" msgstr "Niet toegestaan" @@ -4091,7 +4099,7 @@ msgstr "Kan boeken niet kopieren: " #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:147 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:720 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:683 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:685 #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:189 msgid "Failed" msgstr "Mislukt" @@ -4843,11 +4851,11 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:25 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:49 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:58 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:403 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:119 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:120 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:121 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:131 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:405 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:137 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:320 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1117 @@ -4856,10 +4864,10 @@ msgstr "Pad" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:52 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:122 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:123 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:124 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:133 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:319 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/emailp.py:24 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:117 @@ -4890,7 +4898,7 @@ msgstr "Klik om te openen" msgid "None" msgstr "Geen" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:404 msgid "Double-click to open Book Details window" msgstr "Dubbelklikken om de boekdetails te zien" @@ -5115,6 +5123,19 @@ msgstr "Voeg 'Series\" gedeelte toe" msgid "Tab template for catalog.ui" msgstr "Tab sjabloon voor catalog.ui" +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:25 +msgid "Bold" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:26 +msgid "Italic" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:28 +msgid "Underline" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:36 msgid "" "For settings that cannot be specified in this dialog, use the values saved " @@ -5126,11 +5147,11 @@ msgstr "" "(indien deze bestaan) in plaats van de standaard waarden die zijn opgegeven " "onder de voorkeursinstellingen." -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:70 msgid "Bulk Convert" msgstr "Massa conversie" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:83 #: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:185 msgid "Options specific to the output format." msgstr "Opties specifiek voor het uitvoer formaat." @@ -5645,6 +5666,7 @@ 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:353 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:214 msgid "&Series:" msgstr "&Series:" @@ -5830,7 +5852,7 @@ msgid "Options specific to the input format." msgstr "Op[ties specifiek voor het invoer formaat." #: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:76 #: /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" @@ -6026,8 +6048,8 @@ msgid "Force maximum line length" msgstr "Forceer maximale regellengte" #: /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:72 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:78 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:46 #: /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 @@ -6340,10 +6362,10 @@ msgstr "Versturen van email naar" #: /home/kovid/work/calibre/src/calibre/gui2/device.py:982 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:990 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1083 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1168 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1287 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1295 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1089 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1174 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1293 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1301 msgid "No suitable formats" msgstr "Geen geschikte formaten" @@ -6371,38 +6393,38 @@ msgstr "De volgende boeken konden niet worden ge-emailed:" msgid "Sent by email:" msgstr "Verstuurd via email:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1042 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1048 msgid "News:" msgstr "Nieuws:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1043 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1049 msgid "Attached is the" msgstr "Bijgevoegd is de" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1054 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1060 msgid "Sent news to" msgstr "Nieuws verzonden naar" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1084 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1169 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1288 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1090 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1175 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1294 msgid "Auto convert the following books before uploading to the device?" msgstr "" "Auto-converteer de volgende boeken alvorens ze te uploaden naar het appraat?" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1114 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1120 msgid "Sending catalogs to device." msgstr "Verstuur catalogus naar apparaat." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1201 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1207 msgid "Sending news to device." msgstr "Versturen van nieuws naar apparaat." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1254 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1260 msgid "Sending books to device." msgstr "Boeken worden naar de lezer verzonden." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1296 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1302 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." @@ -6411,11 +6433,11 @@ msgstr "" "er geen geschikte bestandsformaten konden worden gevonden. Converteer " "boek(en) eerst naar een formaat dat word ondersteund door je lezer." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1360 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1366 msgid "No space on device" msgstr "Geen schijfruimte op de lezer." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1361 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1367 msgid "" "

Cannot upload books to device there is no more free space available " msgstr "" @@ -6472,15 +6494,15 @@ msgstr "" msgid "&Paste from clipboard" msgstr "&Plak van klembord" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:80 msgid "Fit &cover within view" msgstr "Pas de &omslag in het overzicht" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:81 msgid "&Previous" msgstr "Vo&rige" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:82 msgid "&Next" msgstr "&Volgende" @@ -6649,6 +6671,7 @@ msgid "Set options for converting %s" msgstr "Zet opties voor conversie %s" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:211 msgid "&Title:" msgstr "&Titel:" @@ -6917,18 +6940,12 @@ msgstr "Boek %d:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:274 msgid "" "You can destroy your library using this feature. Changes are " -"permanent. There is no undo function. This feature is experimental, and " -"there may be bugs. You are strongly encouraged to back up your library " -"before proceeding.

Search and replace in text fields using character " -"matching or regular expressions. " +"permanent. There is no undo function. You are strongly encouraged to back up " +"your library before proceeding.

Search and replace in text fields using " +"character matching or regular expressions. " msgstr "" -"Je kunt je bibliotheek met deze functie kapot maken. Veranderingen " -"zijn permanent. Je kunt niet ongedaan maken. Deze functie is experimenteel " -"en er kunnen fouten optreden. Je wordt sterk aangeraden eerst een backup van " -"je bibliotheek te maken voor je verder gaat.

Zoek en vervang in " -"tekstvelden met karaktercombinaties of reguliere expressies. " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:282 msgid "" "In character mode, the field is searched for the entered search text. The " "text is replaced by the specified replacement text everywhere it is found in " @@ -6945,7 +6962,7 @@ msgstr "" "overeenkomen. Als je deze niet kiest dan zal alle tekst, kleine en grote " "letters, overeenkomen." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:293 msgid "" "In regular expression mode, the search text is an arbitrary python-" "compatible regular expression. The replacement text can contain " @@ -6970,30 +6987,30 @@ msgstr "" "informatie van python's reguliere expressies en dan vooral de 'sub' " "(ingebedde) functie." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:436 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:438 msgid "You must specify a destination when source is a composite field" msgstr "Je moet een doel opgeven als de bron een opgemaakt veld is" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:528 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:536 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:631 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:538 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:633 msgid "Search/replace invalid" msgstr "Zoek/vervang ongeldig" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:529 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:531 msgid "" "Authors cannot be set to the empty string. Book title %s not processed" msgstr "Auteurs kunnen niet opgenomen worden. Boek titel %s niet aangepast." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:537 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:539 msgid "Title cannot be set to the empty string. Book title %s not processed" msgstr "Titel kan niet opgenomen worden. Boek titel %s niet aangepast." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:632 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:634 msgid "Search pattern is invalid: %s" msgstr "Zoekpatroon is ongeldig: %s" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:671 msgid "" "Applying changes to %d books.\n" "Phase {0} {1}%%." @@ -7270,8 +7287,8 @@ msgid "Your test:" msgstr "Jouw test:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:401 -msgid "&Search and replace (experimental)" -msgstr "Zoek tek&st en vervang (experimenteel)" +msgid "&Search and replace" +msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:91 msgid "Last modified: %s" @@ -7819,60 +7836,52 @@ msgstr "" msgid "Negate" msgstr "omdraaien" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:198 msgid "Advanced Search" msgstr "Geavanceerde zoekopdracht" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:119 -msgid "Find entries that have..." -msgstr "Zoek inzendingen die..." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:120 -msgid "&All these words:" -msgstr "&al deze woorden:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:121 -msgid "This exact &phrase:" -msgstr "Deze exacte &uitdrukking:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:122 -msgid "&One or more of these words:" -msgstr "&Een of meer vam deze woorden:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:123 -msgid "But dont show entries that have..." -msgstr "Maar laat geen inzendingen zien die..." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:124 -msgid "Any of these &unwanted words:" -msgstr "Deze &ongewenste woorden bevat:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:199 msgid "What kind of match to use:" msgstr "Welke vergelijking gebruiken:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:126 -msgid "Contains: the word or phrase matches anywhere in the metadata" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:200 +msgid "Contains: the word or phrase matches anywhere in the metadata field" msgstr "" -"Bevat: het woord of de uitdrukking komt ergens in de metagegevens voor" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:127 -msgid "Equals: the word or phrase must match an entire metadata field" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:201 +msgid "Equals: the word or phrase must match the entire metadata field" msgstr "" -"Gelijk aan: het woord of de zin komt overeen met een compleet veld in de " -"metagegevens" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:202 msgid "" -"Regular expression: the expression must match anywhere in the metadata" +"Regular expression: the expression must match anywhere in the metadata field" msgstr "" -"Reguliere expressie: de expressie moet ergens in de metagegevens voorkomen" -#: /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:203 +msgid "Find entries that have..." +msgstr "Zoek inzendingen die..." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:204 +msgid "&All these words:" +msgstr "&al deze woorden:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:205 +msgid "This exact &phrase:" +msgstr "Deze exacte &uitdrukking:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:206 +msgid "&One or more of these words:" +msgstr "&Een of meer vam deze woorden:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:207 +msgid "But dont show entries that have..." +msgstr "Maar laat geen inzendingen zien die..." + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:208 +msgid "Any of these &unwanted words:" +msgstr "Deze &ongewenste woorden bevat:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:209 msgid "" "See the User Manual for more help" @@ -7880,6 +7889,47 @@ msgstr "" "Zie het Gebruikers Handboek voor meer informatie" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:210 +msgid "A&dvanced Search" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:212 +msgid "Enter the title." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:213 +msgid "&Author:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:215 +msgid "Ta&gs:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:216 +msgid "Enter an author's name. Only one author can be used." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:217 +msgid "" +"Enter a series name, without an index. Only one series name can be used." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:218 +msgid "Enter tags separated by spaces" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:219 +msgid "&Clear" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:220 +msgid "Search only in specific fields:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:221 +msgid "Titl&e/Author/Series ..." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/select_formats.py:45 msgid "Choose formats" msgstr "Kies formaten" @@ -8582,11 +8632,15 @@ msgstr "" "De weergave van boeken zal beperkt worden tot de criteria die aan de " "geselecteerde zoekopdracht voldoen" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:170 +msgid "Shift+Ctrl+F" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:173 msgid "Advanced search" msgstr "Geavanceerde Zoekopdracht" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:177 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:178 msgid "" "

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

Words separated by spaces are ANDed" @@ -8594,27 +8648,27 @@ msgstr "" "

Zoek door de boekenlijst gesorteerd op titel, auteur, uitgever, labels, " "commentaar, enz.

Woorden gescheiden door spaties worden samengevoegd" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:181 msgid "&Go!" msgstr "&Ga!" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:187 msgid "Do Quick Search (you can also press the Enter key)" msgstr "Ga snelzoeken (je kunt ook Enter drukken)" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:192 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:193 msgid "Reset Quick Search" msgstr "Snelzoeken wissen" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:204 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:205 msgid "Copy current search text (instead of search name)" msgstr "Kopieer de huidige zoektekst (in plaats van zoeknaam)" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:210 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:211 msgid "Save current search under the name shown in the box" msgstr "Bewaar de huidige zoekopdracht onder de naam getoond in de box" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:217 msgid "Delete current saved search" msgstr "Verwijder de huidige bewaarde zoekopdracht" @@ -8671,47 +8725,47 @@ msgstr "Gemarkeerd voor wissen" msgid "Double click to edit me

" msgstr "Dubbel-klik om me te wijzigen

" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:144 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:147 msgid "Hide column %s" msgstr "Verberg kolom %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:152 msgid "Sort on %s" msgstr "Sorteer op %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:150 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:153 msgid "Ascending" msgstr "Oplopend" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:153 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:156 msgid "Descending" msgstr "Aflopend" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:168 msgid "Change text alignment for %s" msgstr "Verander de uitlijning van de text voor %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 msgid "Left" msgstr "Links" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 msgid "Right" msgstr "Rechts" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:171 msgid "Center" msgstr "Midden" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:190 msgid "Show column" msgstr "Geef kolom weer" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:199 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:202 msgid "Restore default layout" msgstr "Herstel standaard layout" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:740 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:743 msgid "" "Dropping onto a device is not supported. First add the book to the calibre " "library." @@ -10634,7 +10688,7 @@ msgid "Options to customize the ebook viewer" msgstr "Opties om de eboek viewer te verpersoonlijken" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:42 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:704 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:708 msgid "Remember last used window size" msgstr "onthoudt de laatst gebruikte venster grootte" @@ -10810,69 +10864,69 @@ msgstr "Eboeken" msgid "No matches found for: %s" msgstr "Geen zoekterm gevonden voor: %s" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:481 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:485 msgid "Loading flow..." msgstr "Bezig met het laden van de omslagbrowser..." -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:517 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:521 msgid "Laying out %s" msgstr "Opbaren %s" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:548 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:552 msgid "Bookmark #%d" msgstr "Bladwijzer #%d" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:552 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:556 msgid "Add bookmark" msgstr "Bladwijzer toevoegen" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:553 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:557 msgid "Enter title for bookmark:" msgstr "Geef titel voor bladwijzer" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:563 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:567 msgid "Manage Bookmarks" msgstr "Beheer Bladwijzers" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:600 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:604 msgid "Loading ebook..." msgstr "Eboek wordt geladen..." -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:608 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:612 msgid "DRM Error" msgstr "DRM foutmelding" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:609 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:613 msgid "

This book is protected by DRM" msgstr "

Dit boek wordt beschermd door DRM" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:613 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:617 msgid "Could not open ebook" msgstr "EBoek kan niet worden geopend" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:691 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:695 msgid "Options to control the ebook viewer" msgstr "Opties voor de eboek viewer" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:698 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:702 msgid "" "If specified, viewer window will try to come to the front when started." msgstr "" "Indien gespecificeerd, dan zal het viewer venster proberen naar voren te " "komen na het opstarten." -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:701 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:705 msgid "" "If specified, viewer window will try to open full screen when started." msgstr "" "Als dit is opgegeven zal het leesvenster proberen om volledig scherm te " "openen." -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:706 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:710 msgid "Print javascript alert and console messages to the console" msgstr "Print javascript waarschuwingen en console berichten op de console" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:712 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:716 msgid "" "%prog [options] file\n" "\n" @@ -14795,6 +14849,9 @@ msgstr "Download geen CSS stylesheets" #~ msgid "Tags to exclude as genres (regex):" #~ msgstr "Labels te vermeiden als genres (reguliere expressie):" +#~ msgid " " +#~ msgstr " " + #~ msgid "Communicate with the Teclast K3 reader." #~ msgstr "Communicatie met Telecast K3 Reader" @@ -15015,6 +15072,20 @@ msgstr "Download geen CSS stylesheets" #~ "Geen metagegevens gevonden, probeer een andere titel en auteur of een ander " #~ "ISBN nummer." +#~ msgid "Contains: the word or phrase matches anywhere in the metadata" +#~ msgstr "" +#~ "Bevat: het woord of de uitdrukking komt ergens in de metagegevens voor" + +#~ msgid "" +#~ "Regular expression: the expression must match anywhere in the metadata" +#~ msgstr "" +#~ "Reguliere expressie: de expressie moet ergens in de metagegevens voorkomen" + +#~ msgid "Equals: the word or phrase must match an entire metadata field" +#~ msgstr "" +#~ "Gelijk aan: het woord of de zin komt overeen met een compleet veld in de " +#~ "metagegevens" + #~ msgid "Preserve all collections even if not in library metadata." #~ msgstr "" #~ "Onthoud alle collecties zelfs als deze zich niet in de metagegevens van de " @@ -15090,3 +15161,19 @@ msgstr "Download geen CSS stylesheets" #~ msgid "Toolbars/Context menus" #~ msgstr "Knoppenbalken/Context menu's" + +#~ msgid "" +#~ "You can destroy your library using this feature. Changes are " +#~ "permanent. There is no undo function. This feature is experimental, and " +#~ "there may be bugs. You are strongly encouraged to back up your library " +#~ "before proceeding.

Search and replace in text fields using character " +#~ "matching or regular expressions. " +#~ msgstr "" +#~ "Je kunt je bibliotheek met deze functie kapot maken. Veranderingen " +#~ "zijn permanent. Je kunt niet ongedaan maken. Deze functie is experimenteel " +#~ "en er kunnen fouten optreden. Je wordt sterk aangeraden eerst een backup van " +#~ "je bibliotheek te maken voor je verder gaat.

Zoek en vervang in " +#~ "tekstvelden met karaktercombinaties of reguliere expressies. " + +#~ msgid "&Search and replace (experimental)" +#~ msgstr "Zoek tek&st en vervang (experimenteel)" diff --git a/src/calibre/translations/pl.po b/src/calibre/translations/pl.po index ed88f7be29..222c189949 100644 --- a/src/calibre/translations/pl.po +++ b/src/calibre/translations/pl.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2010-11-06 15:45+0000\n" -"PO-Revision-Date: 2010-11-07 14:27+0000\n" +"POT-Creation-Date: 2010-11-12 23:11+0000\n" +"PO-Revision-Date: 2010-11-12 22:43+0000\n" "Last-Translator: B.J. Stobiecki \n" "Language-Team: Polish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-08 05:10+0000\n" +"X-Launchpad-Export-Date: 2010-11-13 04:53+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -31,7 +31,7 @@ msgstr "Ta opcja zupełnie nic nie zmienia" #: /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:643 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:650 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:401 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 @@ -74,14 +74,14 @@ msgstr "Ta opcja zupełnie nic nie zmienia" #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:78 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:119 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:153 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:611 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:817 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:819 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:620 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:826 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:828 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:911 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:916 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:913 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:918 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:984 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:143 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:150 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:64 @@ -123,8 +123,8 @@ msgstr "Ta opcja zupełnie nic nie zmienia" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:141 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:927 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:936 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1243 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1246 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1249 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1252 #: /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 @@ -192,7 +192,7 @@ msgstr "Akcja interfejsu użytkownika." msgid "Preferences" msgstr "Preferencje" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:17 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:15 msgid "" "Follow all local links in an HTML file and create a ZIP file containing all " "linked files. This plugin is run every time you add an HTML file to the " @@ -202,7 +202,7 @@ msgstr "" "zawierający wszystkie podlinkowane pliki. Ta wtyczka jest uruchamiana za " "każdym razem, gdy dodasz plik HTML do biblioteki." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:53 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:51 msgid "" "Character encoding for the input HTML files. Common choices include: cp1252, " "latin1, iso-8859-1 and utf-8." @@ -210,7 +210,7 @@ msgstr "" "Kodowanie znaków dla źródłowych plików HTML. Popularne wybory to: cp1252, " "latin1, iso-8859-1 i utf-8." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:60 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:58 msgid "" "Create a PMLZ archive containing the PML file and all images in the " "directory pmlname_img or images. This plugin is run every time you add a PML " @@ -220,7 +220,7 @@ msgstr "" "pmlname_img lub images. Plugin ten jest uruchamiany przy każdym dodaniu " "pliku PML do biblioteki." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:94 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:92 msgid "Extract cover from comic files" msgstr "Wyodrębnij okładki z plików komiksów" @@ -267,43 +267,43 @@ msgstr "Ustaw metadane w %s plikach" msgid "Set metadata from %s files" msgstr "Pobierz metadane z %s plików" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:711 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:712 msgid "Look and Feel" msgstr "Wygląd" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:725 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:714 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:726 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:737 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:748 msgid "Interface" msgstr "Interfejs" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:717 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:718 msgid "Adjust the look and feel of the calibre interface to suit your tastes" msgstr "Dostosowanie wyglądu interfejsu Calibre do indywidualnych upodobań" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:723 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 msgid "Behavior" msgstr "Działanie" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:729 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:730 msgid "Change the way calibre behaves" msgstr "Zmień zachowanie programu" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:734 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:206 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:735 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:209 msgid "Add your own columns" msgstr "Dodaj własne kolumny" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:740 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:741 msgid "Add/remove your own columns to the calibre book list" msgstr "Dodaj/usuń swoje kolumny do/z listy książek" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:745 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:746 msgid "Customize the toolbar" msgstr "Dopasuj pasek narzędziowy" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:751 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:752 msgid "" "Customize the toolbars and context menus, changing which actions are " "available in each" @@ -311,129 +311,129 @@ msgstr "" "Dopasuj paski narzędzi i menu kontekstowe, zmieniając czynności, jakie są im " "przypisane" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:757 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 msgid "Input Options" msgstr "Opcje wejścia" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:759 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:770 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:760 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:771 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:782 msgid "Conversion" msgstr "Konwersja" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:763 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:764 msgid "Set conversion options specific to each input format" msgstr "Zmień ustawienia konwersji specyficzne dla każdego formatu" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:768 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 msgid "Common Options" msgstr "Opcje wspólne" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:774 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:775 msgid "Set conversion options common to all formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:779 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:780 msgid "Output Options" msgstr "Opce Wyjściowe" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:785 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:786 msgid "Set conversion options specific to each output format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:790 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:791 msgid "Adding books" msgstr "Dodawanie książek" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:792 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:804 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:816 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:828 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:817 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:829 msgid "Import/Export" msgstr "Importuj/Eksportuj" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:796 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:797 msgid "Control how calibre reads metadata from files when adding books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:802 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:803 msgid "Saving books to disk" msgstr "Zapisuje książki na dysku" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:808 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:809 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:814 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:815 msgid "Sending books to devices" msgstr "Przesyłanie książek na urządzenie" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:820 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:821 msgid "Control how calibre transfers files to your ebook reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:826 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:827 msgid "Metadata plugboards" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:832 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:833 msgid "Change metadata fields before saving/sending" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:837 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:838 msgid "Sharing books by email" msgstr "Dzielenie się książkami poprzez email" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:839 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:851 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:840 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:852 msgid "Sharing" msgstr "Udostępnianie" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:843 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:844 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:849 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:850 msgid "Sharing over the net" msgstr "Współdzielenie poprzez sieć" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:855 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:856 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:862 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:863 msgid "Plugins" msgstr "Wtyczki" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:864 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:876 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:887 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:865 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:877 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:888 msgid "Advanced" msgstr "Zaawansowane" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:868 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:869 msgid "Add/remove/customize various bits of calibre functionality" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:874 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:875 msgid "Tweaks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:880 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:881 msgid "Fine tune how calibre behaves in various contexts" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:885 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:886 msgid "Miscellaneous" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:891 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:892 msgid "Miscellaneous advanced configuration" msgstr "" @@ -479,7 +479,7 @@ msgstr "" "jeśli nie wiesz nic o dokumencie wejściowym." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:59 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:436 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:444 msgid "" "This profile is intended for the SONY PRS line. The 500/505/600/700 etc." msgstr "" @@ -491,63 +491,63 @@ msgid "This profile is intended for the SONY PRS 300." msgstr "Ten profil przeznaczony jest dla urządzenia SONY PRS-300." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:80 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:476 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:484 msgid "This profile is intended for the SONY PRS-900." msgstr "Ten profil przeznaczony jest dla urządzenia SONY PRS-900." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:88 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:506 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:513 msgid "This profile is intended for the Microsoft Reader." msgstr "Ten profil przeznaczony jest dla programu Microsoft Reader." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:99 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:517 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:524 msgid "This profile is intended for the Mobipocket books." msgstr "Ten profil przeznaczony jest dla urządzeń Mobipocket." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:112 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:530 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:537 msgid "This profile is intended for the Hanlin V3 and its clones." msgstr "Ten profil przeznaczony jest dla urządzenia Hanlin V3 i jego klonów." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:124 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:542 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:549 msgid "This profile is intended for the Hanlin V5 and its clones." msgstr "Ten profil przeznaczony jest dla urządzenia Hanlin V5 i jego klonów." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:134 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:550 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:557 msgid "This profile is intended for the Cybook G3." msgstr "Ten profil przeznaczony jest dla urządzenia Cybook G3." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:147 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:563 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:570 msgid "This profile is intended for the Cybook Opus." msgstr "Ten profil przeznaczony jest dla urządzenia Cybook Opus." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:159 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:576 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:583 msgid "This profile is intended for the Amazon Kindle." msgstr "Ten profil przeznaczony jest dla urządzenia Amazon Kindle." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:171 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:617 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:631 msgid "This profile is intended for the Irex Illiad." msgstr "Ten profil przeznaczony jest dla urządzenia Irex Illiad." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:183 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:630 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:644 msgid "This profile is intended for the IRex Digital Reader 1000." msgstr "" "Ten profil przeznaczony jest dla urządzenia IRex Digital Reader 1000." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:196 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:644 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:658 msgid "This profile is intended for the IRex Digital Reader 800." msgstr "Ten profil przeznaczony jest dla urządzenia IRex Digital Reader 800." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:208 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:658 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:672 msgid "This profile is intended for the B&N Nook." msgstr "Ten profil przeznaczony jest dla urządzenia B&N Nook." @@ -565,29 +565,29 @@ msgstr "" "jeśli chcesz stworzyć dokument przeznaczony do odczytu na komputerze lub " "większej liczbie urządzeń." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:273 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:276 msgid "" "Intended for the iPad and similar devices with a resolution of 768x1024" msgstr "" "Przeznaczone dla iPada i podobnych urządzeń z rozdzielczością 768x1024" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:427 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:435 msgid "Intended for generic tablet devices, does no resizing of images" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:454 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:462 msgid "This profile is intended for the Kobo Reader." msgstr "Ten profil przeznaczony jest dla urządzenia Kobo Reader." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:467 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:475 msgid "This profile is intended for the SONY PRS-300." msgstr "Ten profil przeznaczony jest dla urządzenia SONY PRS-300." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:485 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:493 msgid "This profile is intended for the 5-inch JetBook." msgstr "Ten profil przeznaczony jest dla 5 calowego urządzenia JetBook." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:494 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:502 msgid "" "This profile is intended for the SONY PRS line. The 500/505/700 etc, in " "landscape mode. Mainly useful for comics." @@ -595,11 +595,11 @@ msgstr "" "Ten profil przeznaczony jest dla urządzeń z linii SONY PRS w trybie " "panoramicznym. Np. 500/505/700 itd. Głównie użyteczny przy komiksach." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:597 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:609 msgid "This profile is intended for the Amazon Kindle DX." msgstr "Ten profil przeznaczony jest dla urządzenia Amazon Kindle DX." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:672 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:686 msgid "This profile is intended for the Sanda Bambook." msgstr "" @@ -676,7 +676,7 @@ msgstr "Wyłącz wtyczkę" msgid "Communicate with Android phones." msgstr "Umożliwia komunikację z telefonami z Androidem." -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:53 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:56 msgid "" "Comma separated list of directories to send e-books to on the device. The " "first one that exists will be used" @@ -684,7 +684,7 @@ msgstr "" "Oddzielona przecinkami lista katalogów na urządzeniu, do których mają być " "wysyłane książki. Zostanie użyty pierwszy istniejący katalog." -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:95 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:98 msgid "Communicate with S60 phones." msgstr "Umożliwia komunikację z telefonami S60." @@ -1034,6 +1034,14 @@ msgstr "Nook" msgid "Communicate with the Nook eBook reader." msgstr "Umożliwia komunikację z czytnikiem książek Nook." +#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:85 +msgid "Nook Color" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:86 +msgid "Communicate with the Nook Color eBook reader." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:17 msgid "Communicate with the Nuut2 eBook reader." msgstr "Umożliwia komunikację z czytnikiem książek Nuut2." @@ -2354,8 +2362,8 @@ msgstr "Tak" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:605 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:45 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:102 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:109 #: /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 @@ -2389,8 +2397,8 @@ msgstr "Producent" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:39 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:206 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:189 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:104 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:79 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:325 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1131 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:178 @@ -2680,7 +2688,7 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1308 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1399 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 msgid "Cover" msgstr "Okładka" @@ -2717,75 +2725,75 @@ msgstr "" msgid "All articles" msgstr "Wszystkie artykuły" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:259 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:262 msgid "This is an Amazon Topaz book. It cannot be processed." msgstr "" "To jest książka z czytnika Amazon Topaz. Nie może ona zostać przetworzona." -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1400 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 msgid "Title Page" msgstr "Strona tytułowa" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 #: /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:199 msgid "Table of Contents" msgstr "Spis treści" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 msgid "Index" msgstr "Spis" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 msgid "Glossary" msgstr "Słowniczek" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 msgid "Acknowledgements" msgstr "Podziękowania" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 msgid "Bibliography" msgstr "Bibliografia" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 msgid "Colophon" msgstr "Kolofon" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 msgid "Copyright" msgstr "Prawa autorskie" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 msgid "Dedication" msgstr "Dedykacja" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 msgid "Epigraph" msgstr "Epigraf" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 msgid "Foreword" msgstr "Przedsłowie" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 msgid "List of Illustrations" msgstr "Lista ilustracji" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 msgid "List of Tables" msgstr "Lista tabel" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 msgid "Notes" msgstr "Notatki" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1416 msgid "Preface" msgstr "Wstęp" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1417 msgid "Main Text" msgstr "Tekst główny" @@ -3755,7 +3763,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:391 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:739 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:742 msgid "Not allowed" msgstr "Niedozwolone" @@ -3822,7 +3830,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:147 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:720 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:683 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:685 #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:189 msgid "Failed" msgstr "Nie udało się" @@ -4541,11 +4549,11 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:25 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:49 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:58 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:403 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:119 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:120 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:121 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:131 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:405 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:137 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:320 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1117 @@ -4554,10 +4562,10 @@ msgstr "Ścieżka" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:52 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:122 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:123 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:124 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:133 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:319 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/emailp.py:24 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:117 @@ -4588,7 +4596,7 @@ msgstr "Kliknij, aby otworzyć" msgid "None" msgstr "Brak" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:404 msgid "Double-click to open Book Details window" msgstr "" @@ -4801,6 +4809,19 @@ msgstr "" msgid "Tab template for catalog.ui" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:25 +msgid "Bold" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:26 +msgid "Italic" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:28 +msgid "Underline" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:36 msgid "" "For settings that cannot be specified in this dialog, use the values saved " @@ -4808,11 +4829,11 @@ msgid "" "specified in the Preferences" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:70 msgid "Bulk Convert" msgstr "Masowa konwersja" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:83 #: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:185 msgid "Options specific to the output format." msgstr "Opcje specyficzne dla formatu wyjściowego." @@ -5299,6 +5320,7 @@ 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:353 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:214 msgid "&Series:" msgstr "&Cykl:" @@ -5485,7 +5507,7 @@ msgid "Options specific to the input format." msgstr "Opcje dotyczące formatu źródłowego." #: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:76 #: /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" @@ -5676,8 +5698,8 @@ msgid "Force maximum line length" msgstr "" #: /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:72 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:78 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:46 #: /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 @@ -5983,10 +6005,10 @@ msgstr "Wysyłanie wiadomości do" #: /home/kovid/work/calibre/src/calibre/gui2/device.py:982 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:990 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1083 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1168 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1287 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1295 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1089 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1174 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1293 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1301 msgid "No suitable formats" msgstr "Brak odpowiednich formatów" @@ -6015,49 +6037,49 @@ msgstr "Przesłanie następujących książek poprzez email nie powiodło się:" msgid "Sent by email:" msgstr "Preślij poprzez email:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1042 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1048 msgid "News:" msgstr "Aktualności:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1043 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1049 msgid "Attached is the" msgstr "Załączony jest" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1054 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1060 msgid "Sent news to" msgstr "Wysyłaj aktualności do" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1084 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1169 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1288 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1090 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1175 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1294 msgid "Auto convert the following books before uploading to the device?" msgstr "" "Dokonać automatycznej konwersji następujących książek przed przesłaniem ich " "na urządzenie?" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1114 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1120 msgid "Sending catalogs to device." msgstr "Trwa wysyłanie katalogów do urządzenia" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1201 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1207 msgid "Sending news to device." msgstr "Przesyłanie aktualności na urządzenie." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1254 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1260 msgid "Sending books to device." msgstr "Wysyłanie książek do urządzenia." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1296 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1302 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:1360 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1366 msgid "No space on device" msgstr "Brak miejsca na urządzeniu" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1361 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1367 msgid "" "

Cannot upload books to device there is no more free space available " msgstr "" @@ -6109,15 +6131,15 @@ msgstr "" msgid "&Paste from clipboard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:80 msgid "Fit &cover within view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:81 msgid "&Previous" msgstr "&Poprzednia" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:82 msgid "&Next" msgstr "&Następna" @@ -6281,6 +6303,7 @@ msgid "Set options for converting %s" msgstr "Ustaw opcje dla konwersji %s" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:211 msgid "&Title:" msgstr "&Tytuł:" @@ -6542,13 +6565,12 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:274 msgid "" "You can destroy your library using this feature. Changes are " -"permanent. There is no undo function. This feature is experimental, and " -"there may be bugs. You are strongly encouraged to back up your library " -"before proceeding.

Search and replace in text fields using character " -"matching or regular expressions. " +"permanent. There is no undo function. You are strongly encouraged to back up " +"your library before proceeding.

Search and replace in text fields using " +"character matching or regular expressions. " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:282 msgid "" "In character mode, the field is searched for the entered search text. The " "text is replaced by the specified replacement text everywhere it is found in " @@ -6558,7 +6580,7 @@ msgid "" "text will match both upper- and lower-case letters" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:293 msgid "" "In regular expression mode, the search text is an arbitrary python-" "compatible regular expression. The replacement text can contain " @@ -6573,30 +6595,30 @@ msgid "" "function." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:436 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:438 msgid "You must specify a destination when source is a composite field" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:528 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:536 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:631 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:538 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:633 msgid "Search/replace invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:529 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:531 msgid "" "Authors cannot be set to the empty string. Book title %s not processed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:537 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:539 msgid "Title cannot be set to the empty string. Book title %s not processed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:632 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:634 msgid "Search pattern is invalid: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:671 msgid "" "Applying changes to %d books.\n" "Phase {0} {1}%%." @@ -6837,7 +6859,7 @@ msgid "Your test:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:401 -msgid "&Search and replace (experimental)" +msgid "&Search and replace" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:91 @@ -7365,58 +7387,52 @@ msgstr "" msgid "Negate" msgstr "Zaneguj" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:198 msgid "Advanced Search" msgstr "Wyszukiwanie zaawansowane" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:119 -msgid "Find entries that have..." -msgstr "Znajdź wpisy zawierające..." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:120 -msgid "&All these words:" -msgstr "&Wszystkie te słowa:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:121 -msgid "This exact &phrase:" -msgstr "Dokładnie tę &frazę:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:122 -msgid "&One or more of these words:" -msgstr "&Jedno lub więcej z tych słów:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:123 -msgid "But dont show entries that have..." -msgstr "Ale nie pokazuj wpisów zawierających..." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:124 -msgid "Any of these &unwanted words:" -msgstr "Którekolwiek z &niechcianych słów:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:199 msgid "What kind of match to use:" msgstr "Jaki rodzaj porównywania ma być używany:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:126 -msgid "Contains: the word or phrase matches anywhere in the metadata" -msgstr "Zawieranie: słowo lub fraza występuje gdziekolwiek w metadanych" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:127 -msgid "Equals: the word or phrase must match an entire metadata field" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:200 +msgid "Contains: the word or phrase matches anywhere in the metadata field" msgstr "" -"Równość: słowo lub fraza musi w całości pasować do wpisu w metadanych" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:201 +msgid "Equals: the word or phrase must match the entire metadata field" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:202 msgid "" -"Regular expression: the expression must match anywhere in the metadata" +"Regular expression: the expression must match anywhere in the metadata field" msgstr "" -"Wyrażenie regularne: wyrażenie musi pasować gdziekolwiek w metadanych" -#: /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:203 +msgid "Find entries that have..." +msgstr "Znajdź wpisy zawierające..." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:204 +msgid "&All these words:" +msgstr "&Wszystkie te słowa:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:205 +msgid "This exact &phrase:" +msgstr "Dokładnie tę &frazę:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:206 +msgid "&One or more of these words:" +msgstr "&Jedno lub więcej z tych słów:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:207 +msgid "But dont show entries that have..." +msgstr "Ale nie pokazuj wpisów zawierających..." + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:208 +msgid "Any of these &unwanted words:" +msgstr "Którekolwiek z &niechcianych słów:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:209 msgid "" "See the User Manual for more help" @@ -7424,6 +7440,47 @@ msgstr "" "Zerknij do Podręcznika Użytkownika, aby uzyskać więcej informacji" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:210 +msgid "A&dvanced Search" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:212 +msgid "Enter the title." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:213 +msgid "&Author:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:215 +msgid "Ta&gs:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:216 +msgid "Enter an author's name. Only one author can be used." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:217 +msgid "" +"Enter a series name, without an index. Only one series name can be used." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:218 +msgid "Enter tags separated by spaces" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:219 +msgid "&Clear" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:220 +msgid "Search only in specific fields:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:221 +msgid "Titl&e/Author/Series ..." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/select_formats.py:45 msgid "Choose formats" msgstr "Wybierz formaty" @@ -8080,37 +8137,41 @@ msgstr "" "Wyświetlane książki będą zawężone do pozycji z wybranego zapisanego " "wyszukania" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:170 +msgid "Shift+Ctrl+F" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:173 msgid "Advanced search" msgstr "Wyszukiwanie zaawansowane" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:177 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:178 msgid "" "

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

Words separated by spaces are ANDed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:181 msgid "&Go!" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:187 msgid "Do Quick Search (you can also press the Enter key)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:192 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:193 msgid "Reset Quick Search" msgstr "Wyczyść pasek wyszukiwania" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:204 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:205 msgid "Copy current search text (instead of search name)" msgstr "Skopiuj aktualny tekst wyszukiwania (zamiast nazwy wyszukiwania)" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:210 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:211 msgid "Save current search under the name shown in the box" msgstr "Zapisz aktualne wyszukanie pod nazwą pokazaną w polu" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:217 msgid "Delete current saved search" msgstr "Usuń aktualne zapisane wyszukanie" @@ -8167,47 +8228,47 @@ msgstr "Oznaczone do usunięcia" msgid "Double click to edit me

" msgstr "Kliknij dwa razy, aby rozpocząć edycję

" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:144 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:147 msgid "Hide column %s" msgstr "Ukryj kolumnę %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:152 msgid "Sort on %s" msgstr "Posortuj po kolumnie %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:150 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:153 msgid "Ascending" msgstr "Rosnąco" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:153 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:156 msgid "Descending" msgstr "Malejąco" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:168 msgid "Change text alignment for %s" msgstr "Zmień wyrównanie tekstu dla %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 msgid "Left" msgstr "Do lewej" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 msgid "Right" msgstr "Do prawej" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:171 msgid "Center" msgstr "Wyśrodkuj" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:190 msgid "Show column" msgstr "Pokaż kolumnę" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:199 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:202 msgid "Restore default layout" msgstr "Przywróć domyślny układ" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:740 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:743 msgid "" "Dropping onto a device is not supported. First add the book to the calibre " "library." @@ -10012,7 +10073,7 @@ msgid "Options to customize the ebook viewer" msgstr "Opcje odpowiedzialne za personalizacje przeglądarki książek" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:42 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:704 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:708 msgid "Remember last used window size" msgstr "Zapamiętaj ostatnio użyty rozmiar okienka" @@ -10188,65 +10249,65 @@ msgstr "E-booki" msgid "No matches found for: %s" msgstr "Nie znalezniono wyników dla: %s" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:481 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:485 msgid "Loading flow..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:517 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:521 msgid "Laying out %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:548 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:552 msgid "Bookmark #%d" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:552 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:556 msgid "Add bookmark" msgstr "Dodaj zakładkę" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:553 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:557 msgid "Enter title for bookmark:" msgstr "Dodaj tytuł zakładki" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:563 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:567 msgid "Manage Bookmarks" msgstr "Zarządzaj zakładkami" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:600 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:604 msgid "Loading ebook..." msgstr "Ładowanie książki..." -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:608 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:612 msgid "DRM Error" msgstr "Błąd DRM" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:609 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:613 msgid "

This book is protected by DRM" msgstr "

Ta książka jest chroniona przez DRM" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:613 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:617 msgid "Could not open ebook" msgstr "Nie można otworzyć książki" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:691 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:695 msgid "Options to control the ebook viewer" msgstr "Opcje odpowiadające za kontolę nad przeglądarką książek" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:698 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:702 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:701 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:705 msgid "" "If specified, viewer window will try to open full screen when started." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:706 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:710 msgid "Print javascript alert and console messages to the console" msgstr "Wyświetlaj uwagi javascript'u i widomości konsolowe w konsoli" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:712 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:716 msgid "" "%prog [options] file\n" "\n" @@ -13382,6 +13443,9 @@ msgstr "Nie pobieraj arkuszy styli CSS." #~ msgid "calibre can send your books to you (or your reader) by email" #~ msgstr "calibre może wysłać książki do Ciebie (lub czytelnika) przez e-mail" +#~ msgid " " +#~ msgstr " " + #~ msgid "

For help see the: User Manual
" #~ msgstr "" #~ "

Aby uzyskać pomoc otwórz: Podręcznik Uzytkownika
" @@ -13423,6 +13487,18 @@ msgstr "Nie pobieraj arkuszy styli CSS." #~ msgid "Sending to &device" #~ msgstr "Przesyłanie na &urządzenie" +#~ msgid "Contains: the word or phrase matches anywhere in the metadata" +#~ msgstr "Zawieranie: słowo lub fraza występuje gdziekolwiek w metadanych" + +#~ msgid "Equals: the word or phrase must match an entire metadata field" +#~ msgstr "" +#~ "Równość: słowo lub fraza musi w całości pasować do wpisu w metadanych" + +#~ msgid "" +#~ "Regular expression: the expression must match anywhere in the metadata" +#~ msgstr "" +#~ "Wyrażenie regularne: wyrażenie musi pasować gdziekolwiek w metadanych" + #~ msgid "Configure calibre" #~ msgstr "Konfiguruj calibre" diff --git a/src/calibre/translations/ru.po b/src/calibre/translations/ru.po index 05bb3c5307..39b69ad874 100644 --- a/src/calibre/translations/ru.po +++ b/src/calibre/translations/ru.po @@ -6,14 +6,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre 0.4.55\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-11-06 15:45+0000\n" -"PO-Revision-Date: 2010-11-08 14:28+0000\n" -"Last-Translator: RedFox \n" +"POT-Creation-Date: 2010-11-12 23:11+0000\n" +"PO-Revision-Date: 2010-11-12 22:07+0000\n" +"Last-Translator: Kovid Goyal \n" "Language-Team: American English \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-09 04:47+0000\n" +"X-Launchpad-Export-Date: 2010-11-13 04:53+0000\n" "X-Generator: Launchpad (build Unknown)\n" "X-Poedit-Country: RUSSIAN FEDERATION\n" "X-Poedit-Language: Russian\n" @@ -35,7 +35,7 @@ msgstr "Ничего не делает" #: /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:643 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:650 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:401 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 @@ -78,14 +78,14 @@ msgstr "Ничего не делает" #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:78 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:119 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:153 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:611 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:817 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:819 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:620 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:826 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:828 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:911 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:916 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:913 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:918 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:984 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:143 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:150 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:64 @@ -127,8 +127,8 @@ msgstr "Ничего не делает" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:141 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:927 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:936 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1243 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1246 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1249 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1252 #: /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 @@ -196,7 +196,7 @@ msgstr "Действие Пользовательского Интерфейса msgid "Preferences" msgstr "Параметры" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:17 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:15 msgid "" "Follow all local links in an HTML file and create a ZIP file containing all " "linked files. This plugin is run every time you add an HTML file to the " @@ -206,7 +206,7 @@ msgstr "" "содержащий все связанные файлы. Этот модуль запускается каждый раз, когда вы " "добавляете HTML файл в библиотеку." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:53 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:51 msgid "" "Character encoding for the input HTML files. Common choices include: cp1252, " "latin1, iso-8859-1 and utf-8." @@ -214,7 +214,7 @@ msgstr "" "Кодировка для входящих HTML файлов. Наиболее популярные: cp1251, latin1, iso-" "8859-1 и utf-8." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:60 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:58 msgid "" "Create a PMLZ archive containing the PML file and all images in the " "directory pmlname_img or images. This plugin is run every time you add a PML " @@ -224,7 +224,7 @@ msgstr "" "pmlname_img либо images. Этот плагин запускается каждый раз когда в " "библиотеку добавляется PML-файл." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:94 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:92 msgid "Extract cover from comic files" msgstr "Извлечь обложку из файлов комикса" @@ -271,43 +271,43 @@ msgstr "Внести метаданные в файлы %s" msgid "Set metadata from %s files" msgstr "Внести метаданные из файлов %s" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:711 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:712 msgid "Look and Feel" msgstr "Оформление" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:725 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:714 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:726 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:737 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:748 msgid "Interface" msgstr "Интерфейс" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:717 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:718 msgid "Adjust the look and feel of the calibre interface to suit your tastes" msgstr "Настройте внешний вид calibre по-своему вкусу" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:723 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 msgid "Behavior" msgstr "Поведение" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:729 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:730 msgid "Change the way calibre behaves" msgstr "Настройка поведения calibre" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:734 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:206 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:735 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:209 msgid "Add your own columns" msgstr "Добавьте свои столбцы" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:740 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:741 msgid "Add/remove your own columns to the calibre book list" msgstr "Добавьте/удалите ваши собственные столбцы в список книг Calibre" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:745 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:746 msgid "Customize the toolbar" msgstr "Настройка панели инструментов" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:751 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:752 msgid "" "Customize the toolbars and context menus, changing which actions are " "available in each" @@ -315,59 +315,59 @@ msgstr "" "Настройте панель инструментов и контекстное меню, выбрав то, какие действия " "будут доступны для того и другого." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:757 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 msgid "Input Options" msgstr "Настройки ввода" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:759 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:770 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:760 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:771 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:782 msgid "Conversion" msgstr "Конвертация" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:763 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:764 msgid "Set conversion options specific to each input format" msgstr "Задайте параметры конвертации, характерные для каждого формата ввода" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:768 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 msgid "Common Options" msgstr "Общие настройки" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:774 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:775 msgid "Set conversion options common to all formats" msgstr "Установка общих для всех форматов параметров конвертации" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:779 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:780 msgid "Output Options" msgstr "Настройки вывода" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:785 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:786 msgid "Set conversion options specific to each output format" msgstr "" "Задайте параметры конвертации, характерные для каждого формата вывода" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:790 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:791 msgid "Adding books" msgstr "Добавление книг" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:792 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:804 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:816 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:828 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:817 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:829 msgid "Import/Export" msgstr "Импорт/Экспорт" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:796 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:797 msgid "Control how calibre reads metadata from files when adding books" msgstr "" "Управление тем, как Calibre считывает метаданные из файлов при добавлении " "книг" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:802 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:803 msgid "Saving books to disk" msgstr "Запись книг на диск" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:808 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:809 msgid "" "Control how calibre exports files from its database to disk when using Save " "to disk" @@ -375,32 +375,32 @@ msgstr "" "Управление тем, как Calibre экспортирует файлы из своей базы данных на диск " "при использовании записи на диск" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:814 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:815 msgid "Sending books to devices" msgstr "Передача книг на устройства" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:820 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:821 msgid "Control how calibre transfers files to your ebook reader" msgstr "Контроль передачи книжек на устройство" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:826 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:827 msgid "Metadata plugboards" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:832 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:833 msgid "Change metadata fields before saving/sending" msgstr "Изменять поля метаданных до сохранения/отправки" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:837 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:838 msgid "Sharing books by email" msgstr "Отправить книжку по e-mail" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:839 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:851 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:840 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:852 msgid "Sharing" msgstr "Общий доступ к файлам" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:843 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:844 msgid "" "Setup sharing of books via email. Can be used for automatic sending of " "downloaded news to your devices" @@ -408,11 +408,11 @@ msgstr "" "Настройка рассылки книг по e-mail. Может быть использована для " "автоматической доставки загруженных новостных лент на устройство" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:849 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:850 msgid "Sharing over the net" msgstr "Сетевой доступ" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:855 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:856 msgid "" "Setup the calibre Content Server which will give you access to your calibre " "library from anywhere, on any device, over the internet" @@ -420,33 +420,33 @@ msgstr "" "Настройка http-сервера calibre, предоставляющего доступ к библиотеке с " "любого устройства, подключенного к сети интернет" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:862 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:863 msgid "Plugins" msgstr "Модули" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:864 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:876 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:887 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:865 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:877 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:888 msgid "Advanced" msgstr "Расширенный" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:868 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:869 msgid "Add/remove/customize various bits of calibre functionality" msgstr "Добавить/удалить/изменить различные части функциональности calibre" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:874 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:875 msgid "Tweaks" msgstr "Расширенные настройки" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:880 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:881 msgid "Fine tune how calibre behaves in various contexts" msgstr "Тонкая настройка поведения calibre при различных контекстах" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:885 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:886 msgid "Miscellaneous" msgstr "Разное" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:891 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:892 msgid "Miscellaneous advanced configuration" msgstr "Различная продвинутая конфигурация" @@ -491,7 +491,7 @@ msgstr "" "полезен, если вы ничего не знаете о входном документе." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:59 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:436 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:444 msgid "" "This profile is intended for the SONY PRS line. The 500/505/600/700 etc." msgstr "Профиль для для линейки моделей SONY PRS. 500/505/600/700 и других" @@ -501,62 +501,62 @@ msgid "This profile is intended for the SONY PRS 300." msgstr "Профиль для SONY PRS 300." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:80 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:476 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:484 msgid "This profile is intended for the SONY PRS-900." msgstr "Профиль для SONY PRS 900." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:88 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:506 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:513 msgid "This profile is intended for the Microsoft Reader." msgstr "Профиль для Microsoft Reader." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:99 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:517 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:524 msgid "This profile is intended for the Mobipocket books." msgstr "Профиль для книг Mobipocket" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:112 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:530 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:537 msgid "This profile is intended for the Hanlin V3 and its clones." msgstr "Профиль для Hanlin V3 и её клонов." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:124 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:542 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:549 msgid "This profile is intended for the Hanlin V5 and its clones." msgstr "Профиль для Hanlin V5 и её клонов." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:134 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:550 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:557 msgid "This profile is intended for the Cybook G3." msgstr "Профиль для Cybook G3." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:147 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:563 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:570 msgid "This profile is intended for the Cybook Opus." msgstr "Профиль для Cybook Opus." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:159 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:576 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:583 msgid "This profile is intended for the Amazon Kindle." msgstr "Профиль для Amazon Kindle." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:171 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:617 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:631 msgid "This profile is intended for the Irex Illiad." msgstr "Профиль для iRex Illiad." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:183 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:630 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:644 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:196 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:644 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:658 msgid "This profile is intended for the IRex Digital Reader 800." msgstr "Профиль для iRex Digital Reader 800." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:208 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:658 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:672 msgid "This profile is intended for the B&N Nook." msgstr "Профиль для B&N Nook." @@ -574,29 +574,29 @@ msgstr "" "полезным, если вы хотите подготовить документ, предназначенный для чтения на " "компьютере или на нескольких различных устройствах." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:273 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:276 msgid "" "Intended for the iPad and similar devices with a resolution of 768x1024" msgstr "" "Предназначено для iPad и аналогичных устройств с разрешением 768x1024" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:427 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:435 msgid "Intended for generic tablet devices, does no resizing of images" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:454 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:462 msgid "This profile is intended for the Kobo Reader." msgstr "Профиль для Kobo Reader." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:467 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:475 msgid "This profile is intended for the SONY PRS-300." msgstr "Профиль для SONY PRS-300" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:485 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:493 msgid "This profile is intended for the 5-inch JetBook." msgstr "Профиль для 5-дюймовой JetBook." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:494 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:502 msgid "" "This profile is intended for the SONY PRS line. The 500/505/700 etc, in " "landscape mode. Mainly useful for comics." @@ -604,11 +604,11 @@ msgstr "" "Профиль для линейки SONY PRS: 500/505/700 - в ландшафтном режиме. Полезен " "для комиксов." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:597 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:609 msgid "This profile is intended for the Amazon Kindle DX." msgstr "Профиль для Amazon Kindle DX." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:672 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:686 msgid "This profile is intended for the Sanda Bambook." msgstr "Этот профиль предназначен для Sanda Bambook." @@ -683,7 +683,7 @@ msgstr "Отключить указанный плагин" msgid "Communicate with Android phones." msgstr "Соединиться с Android." -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:53 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:56 msgid "" "Comma separated list of directories to send e-books to on the device. The " "first one that exists will be used" @@ -691,7 +691,7 @@ msgstr "" "Разделённый запятаями список директории для отправки e-books на это " "устройство. Будет использовано первое в списке устройство" -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:95 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:98 msgid "Communicate with S60 phones." msgstr "Соединиться с телефоном S60" @@ -1044,6 +1044,14 @@ msgstr "The Nook" msgid "Communicate with the Nook eBook reader." msgstr "Соединиться с Nook" +#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:85 +msgid "Nook Color" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:86 +msgid "Communicate with the Nook Color eBook reader." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:17 msgid "Communicate with the Nuut2 eBook reader." msgstr "Соединиться с Nuut2." @@ -2425,8 +2433,8 @@ msgstr "Да" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:605 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:45 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:102 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:109 #: /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 @@ -2460,8 +2468,8 @@ msgstr "Спонсор" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:39 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:206 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:189 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:104 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:79 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:325 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1131 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:178 @@ -2780,7 +2788,7 @@ msgstr "" "LibraryThing.com\n" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1308 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1399 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 msgid "Cover" msgstr "Обложка" @@ -2817,74 +2825,74 @@ msgstr "Тег маркировки книги с личными докумен msgid "All articles" msgstr "Все статьи" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:259 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:262 msgid "This is an Amazon Topaz book. It cannot be processed." msgstr "Это книга Amazon Topaz. Она не может быть прочитана." -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1400 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 msgid "Title Page" msgstr "Титульная страница" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 #: /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:199 msgid "Table of Contents" msgstr "Содержание" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 msgid "Index" msgstr "Индекс" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 msgid "Glossary" msgstr "Глоссарий" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 msgid "Acknowledgements" msgstr "Подтверждения" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 msgid "Bibliography" msgstr "Библиография" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 msgid "Colophon" msgstr "эмблема издательства" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 msgid "Copyright" msgstr "Копирайт" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 msgid "Dedication" msgstr "Посвящение" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 msgid "Epigraph" msgstr "Эпиграф" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 msgid "Foreword" msgstr "Предисловие" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 msgid "List of Illustrations" msgstr "Список иллюстраций" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 msgid "List of Tables" msgstr "Оглавление" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 msgid "Notes" msgstr "Заметки" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1416 msgid "Preface" msgstr "Введение" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1417 msgid "Main Text" msgstr "Основной текст" @@ -3920,7 +3928,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:391 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:739 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:742 msgid "Not allowed" msgstr "Запрещено" @@ -3987,7 +3995,7 @@ msgstr "Невозможно скопировать книги: " #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:147 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:720 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:683 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:685 #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:189 msgid "Failed" msgstr "Неудалось" @@ -4719,11 +4727,11 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:25 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:49 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:58 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:403 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:119 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:120 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:121 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:131 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:405 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:137 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:320 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1117 @@ -4732,10 +4740,10 @@ msgstr "Путь" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:52 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:122 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:123 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:124 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:133 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:319 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/emailp.py:24 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:117 @@ -4766,7 +4774,7 @@ msgstr "Щелкните, чтобы открыть" msgid "None" msgstr "Ничего" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:404 msgid "Double-click to open Book Details window" msgstr "" @@ -4988,6 +4996,19 @@ msgstr "Включая секцию 'Серии'" msgid "Tab template for catalog.ui" msgstr "Шаблон вкладки для catalog.ui" +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:25 +msgid "Bold" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:26 +msgid "Italic" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:28 +msgid "Underline" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:36 msgid "" "For settings that cannot be specified in this dialog, use the values saved " @@ -4998,11 +5019,11 @@ msgstr "" "сохраненные во время предыдущей конвертиции (если таковые есть) вместо " "значений по умолчанию указанных в основном окне настроек." -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:70 msgid "Bulk Convert" msgstr "Массовое конвертирование" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:83 #: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:185 msgid "Options specific to the output format." msgstr "Параметры для определенного формата вывода." @@ -5503,6 +5524,7 @@ 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:353 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:214 msgid "&Series:" msgstr "Серия:" @@ -5690,7 +5712,7 @@ msgid "Options specific to the input format." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:76 #: /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" @@ -5879,8 +5901,8 @@ msgid "Force maximum line length" msgstr "Ограничить максимальную длину строки" #: /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:72 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:78 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:46 #: /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 @@ -6193,10 +6215,10 @@ msgstr "Отправка электронной почты" #: /home/kovid/work/calibre/src/calibre/gui2/device.py:982 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:990 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1083 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1168 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1287 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1295 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1089 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1174 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1293 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1301 msgid "No suitable formats" msgstr "Нет подходящего формата" @@ -6221,37 +6243,37 @@ msgstr "Не отправлена электронная почта со сле msgid "Sent by email:" msgstr "Отправлена электронная почта:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1042 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1048 msgid "News:" msgstr "Новости:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1043 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1049 msgid "Attached is the" msgstr "Прикреплено" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1054 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1060 msgid "Sent news to" msgstr "Отослать новости" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1084 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1169 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1288 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1090 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1175 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1294 msgid "Auto convert the following books before uploading to the device?" msgstr "Автоматически конвертировать книги до загрузки в устройство?" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1114 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1120 msgid "Sending catalogs to device." msgstr "Отправляем каталоги в устройство." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1201 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1207 msgid "Sending news to device." msgstr "Отправляются новости на устройство." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1254 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1260 msgid "Sending books to device." msgstr "Отправка книги в устройство" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1296 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1302 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." @@ -6260,11 +6282,11 @@ msgstr "" "формата. Переконвертируйте книгу(и) в формат поддерживаемый вашим " "устройством." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1360 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1366 msgid "No space on device" msgstr "Нет места на устройстве" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1361 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1367 msgid "" "

Cannot upload books to device there is no more free space available " msgstr "" @@ -6316,15 +6338,15 @@ msgstr "" msgid "&Paste from clipboard" msgstr "Вставить из буфера обмена" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:80 msgid "Fit &cover within view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:81 msgid "&Previous" msgstr "&Предыдущий" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:82 msgid "&Next" msgstr "&Следующий" @@ -6489,6 +6511,7 @@ msgid "Set options for converting %s" msgstr "Установить опции конвертации %s" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:211 msgid "&Title:" msgstr "&Название:" @@ -6743,13 +6766,12 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:274 msgid "" "You can destroy your library using this feature. Changes are " -"permanent. There is no undo function. This feature is experimental, and " -"there may be bugs. You are strongly encouraged to back up your library " -"before proceeding.

Search and replace in text fields using character " -"matching or regular expressions. " +"permanent. There is no undo function. You are strongly encouraged to back up " +"your library before proceeding.

Search and replace in text fields using " +"character matching or regular expressions. " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:282 msgid "" "In character mode, the field is searched for the entered search text. The " "text is replaced by the specified replacement text everywhere it is found in " @@ -6759,7 +6781,7 @@ msgid "" "text will match both upper- and lower-case letters" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:293 msgid "" "In regular expression mode, the search text is an arbitrary python-" "compatible regular expression. The replacement text can contain " @@ -6774,30 +6796,30 @@ msgid "" "function." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:436 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:438 msgid "You must specify a destination when source is a composite field" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:528 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:536 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:631 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:538 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:633 msgid "Search/replace invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:529 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:531 msgid "" "Authors cannot be set to the empty string. Book title %s not processed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:537 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:539 msgid "Title cannot be set to the empty string. Book title %s not processed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:632 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:634 msgid "Search pattern is invalid: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:671 msgid "" "Applying changes to %d books.\n" "Phase {0} {1}%%." @@ -7040,7 +7062,7 @@ msgid "Your test:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:401 -msgid "&Search and replace (experimental)" +msgid "&Search and replace" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:91 @@ -7558,56 +7580,52 @@ msgstr "" msgid "Negate" msgstr "Исключить" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:198 msgid "Advanced Search" msgstr "Расширенный поиск" -#: /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:120 -msgid "&All these words:" -msgstr "Все эти слова:" - -#: /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:122 -msgid "&One or more of these words:" -msgstr "Одно или более из слов:" - -#: /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:124 -msgid "Any of these &unwanted words:" -msgstr "Любые из этих найденных слов:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:199 msgid "What kind of match to use:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:126 -msgid "Contains: the word or phrase matches anywhere in the metadata" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:200 +msgid "Contains: the word or phrase matches anywhere in the metadata field" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:127 -msgid "Equals: the word or phrase must match an entire metadata field" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:201 +msgid "Equals: the word or phrase must match the entire metadata field" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:202 msgid "" -"Regular expression: the expression must match anywhere in the metadata" +"Regular expression: the expression must match anywhere in the metadata field" msgstr "" -#: /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:203 +msgid "Find entries that have..." +msgstr "Ищется введеное значение..." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:204 +msgid "&All these words:" +msgstr "Все эти слова:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:205 +msgid "This exact &phrase:" +msgstr "Требуется фраза:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:206 +msgid "&One or more of these words:" +msgstr "Одно или более из слов:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:207 +msgid "But dont show entries that have..." +msgstr "Но не показывать введеные данные..." + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:208 +msgid "Any of these &unwanted words:" +msgstr "Любые из этих найденных слов:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:209 msgid "" "See the User Manual for more help" @@ -7615,6 +7633,47 @@ msgstr "" "Смотри Пользовательский мануал для помощи" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:210 +msgid "A&dvanced Search" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:212 +msgid "Enter the title." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:213 +msgid "&Author:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:215 +msgid "Ta&gs:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:216 +msgid "Enter an author's name. Only one author can be used." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:217 +msgid "" +"Enter a series name, without an index. Only one series name can be used." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:218 +msgid "Enter tags separated by spaces" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:219 +msgid "&Clear" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:220 +msgid "Search only in specific fields:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:221 +msgid "Titl&e/Author/Series ..." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/select_formats.py:45 msgid "Choose formats" msgstr "Выберите форматы" @@ -8275,37 +8334,41 @@ msgid "" "Books display will be restricted to those matching the selected saved search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:170 +msgid "Shift+Ctrl+F" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:173 msgid "Advanced search" msgstr "Расширенный поиск" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:177 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:178 msgid "" "

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

Words separated by spaces are ANDed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:181 msgid "&Go!" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:187 msgid "Do Quick Search (you can also press the Enter key)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:192 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:193 msgid "Reset Quick Search" msgstr "Сброс быстрого поиска" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:204 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:205 msgid "Copy current search text (instead of search name)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:210 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:211 msgid "Save current search under the name shown in the box" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:217 msgid "Delete current saved search" msgstr "" @@ -8362,47 +8425,47 @@ msgstr "" msgid "Double click to edit me

" msgstr "Дважды кликните по редактировать

" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:144 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:147 msgid "Hide column %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:152 msgid "Sort on %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:150 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:153 msgid "Ascending" msgstr "Возрастание" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:153 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:156 msgid "Descending" msgstr "Убывание" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:168 msgid "Change text alignment for %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 msgid "Left" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 msgid "Right" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:171 msgid "Center" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:190 msgid "Show column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:199 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:202 msgid "Restore default layout" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:740 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:743 msgid "" "Dropping onto a device is not supported. First add the book to the calibre " "library." @@ -10209,7 +10272,7 @@ msgid "Options to customize the ebook viewer" msgstr "Опции настроек ebook вьювера" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:42 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:704 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:708 msgid "Remember last used window size" msgstr "" @@ -10383,66 +10446,66 @@ msgstr "Электронная книга" msgid "No matches found for: %s" msgstr "Нет соответствий для: %s" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:481 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:485 msgid "Loading flow..." msgstr "Загрузить поток..." -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:517 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:521 msgid "Laying out %s" msgstr "Разметка %s" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:548 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:552 msgid "Bookmark #%d" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:552 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:556 msgid "Add bookmark" msgstr "Добавить закладку" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:553 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:557 msgid "Enter title for bookmark:" msgstr "Введите название закладки" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:563 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:567 msgid "Manage Bookmarks" msgstr "Управление закладками" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:600 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:604 msgid "Loading ebook..." msgstr "Загружается электронная книга..." -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:608 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:612 msgid "DRM Error" msgstr "Ошибка DRM" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:609 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:613 msgid "

This book is protected by DRM" msgstr "

Книга защищена DRM" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:613 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:617 msgid "Could not open ebook" msgstr "Не могу открыть электронную книгу" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:691 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:695 msgid "Options to control the ebook viewer" msgstr "Опции управления ebook вьювером" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:698 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:702 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:701 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:705 msgid "" "If specified, viewer window will try to open full screen when started." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:706 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:710 msgid "Print javascript alert and console messages to the console" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:712 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:716 msgid "" "%prog [options] file\n" "\n" @@ -14749,6 +14812,9 @@ msgstr "Не скачивать файлы стилей CSS." #~ msgid "Communicate with the Sony PRS-600/700/900 eBook reader." #~ msgstr "Соединяться с Sony PRS-600/700/900" +#~ msgid " " +#~ msgstr " " + #~ msgid "" #~ "\n" #~ "

The database of books on the reader is corrupted. Try the " diff --git a/src/calibre/translations/sl.po b/src/calibre/translations/sl.po index 5d2ef297d6..0100b5da54 100644 --- a/src/calibre/translations/sl.po +++ b/src/calibre/translations/sl.po @@ -6,14 +6,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre 0.4.17\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-11-06 15:45+0000\n" -"PO-Revision-Date: 2010-11-06 13:35+0000\n" +"POT-Creation-Date: 2010-11-12 23:11+0000\n" +"PO-Revision-Date: 2010-11-12 22:19+0000\n" "Last-Translator: Martin Srebotnjak \n" "Language-Team: sl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-07 04:46+0000\n" +"X-Launchpad-Export-Date: 2010-11-13 04:54+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Generated-By: pygettext.py 1.5\n" @@ -31,7 +31,7 @@ msgstr "Ne stori ničesar" #: /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:643 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:650 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:401 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 @@ -74,14 +74,14 @@ msgstr "Ne stori ničesar" #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:78 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:119 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:153 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:611 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:817 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:819 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:620 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:826 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:828 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:911 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:916 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:913 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:918 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:984 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:143 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:150 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:64 @@ -123,8 +123,8 @@ msgstr "Ne stori ničesar" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:141 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:927 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:936 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1243 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1246 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1249 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1252 #: /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 @@ -192,14 +192,14 @@ msgstr "Dejanje uporabniškega vmesnika" msgid "Preferences" msgstr "Nastavitve" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:17 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:15 msgid "" "Follow all local links in an HTML file and create a ZIP file containing all " "linked files. This plugin is run every time you add an HTML file to the " "library." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:53 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:51 msgid "" "Character encoding for the input HTML files. Common choices include: cp1252, " "latin1, iso-8859-1 and utf-8." @@ -207,14 +207,14 @@ msgstr "" "Kodiranje znakov za vhodne datoteke HTML. Najpogostejše izbire: cp1250, " "latin2, iso-8859-2 in utf-8." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:60 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:58 msgid "" "Create a PMLZ archive containing the PML file and all images in the " "directory pmlname_img or images. This plugin is run every time you add a PML " "file to the library." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:94 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:92 msgid "Extract cover from comic files" msgstr "Pridobi naslovno stran iz stripa" @@ -261,171 +261,171 @@ msgstr "" msgid "Set metadata from %s files" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:711 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:712 msgid "Look and Feel" msgstr "Videz in občutek" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:725 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:714 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:726 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:737 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:748 msgid "Interface" msgstr "Vmesnik" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:717 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:718 msgid "Adjust the look and feel of the calibre interface to suit your tastes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:723 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 msgid "Behavior" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:729 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:730 msgid "Change the way calibre behaves" msgstr "Spremenite odzivanje programa calibre" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:734 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:206 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:735 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:209 msgid "Add your own columns" msgstr "Dodajte lastne stolpce" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:740 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:741 msgid "Add/remove your own columns to the calibre book list" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:745 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:746 msgid "Customize the toolbar" msgstr "Prikroji orodno vrstico" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:751 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:752 msgid "" "Customize the toolbars and context menus, changing which actions are " "available in each" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:757 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 msgid "Input Options" msgstr "Možnosti vnosa" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:759 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:770 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:760 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:771 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:782 msgid "Conversion" msgstr "Pretvorba" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:763 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:764 msgid "Set conversion options specific to each input format" msgstr "Določite možnosti pretvorbe za posamezne zapise" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:768 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 msgid "Common Options" msgstr "Splošne možnosti" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:774 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:775 msgid "Set conversion options common to all formats" msgstr "Določite možnosti pretvorbe, skupne vsem zapisom" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:779 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:780 msgid "Output Options" msgstr "Izhodne možnosti" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:785 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:786 msgid "Set conversion options specific to each output format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:790 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:791 msgid "Adding books" msgstr "Dodajanje knjig" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:792 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:804 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:816 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:828 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:817 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:829 msgid "Import/Export" msgstr "Uvozi/izvozi" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:796 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:797 msgid "Control how calibre reads metadata from files when adding books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:802 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:803 msgid "Saving books to disk" msgstr "Shranjevanje knjig na disk" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:808 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:809 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:814 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:815 msgid "Sending books to devices" msgstr "Pošiljanje knjig na naprave" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:820 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:821 msgid "Control how calibre transfers files to your ebook reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:826 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:827 msgid "Metadata plugboards" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:832 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:833 msgid "Change metadata fields before saving/sending" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:837 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:838 msgid "Sharing books by email" msgstr "Skupna raba knjig prek e-pošte" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:839 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:851 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:840 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:852 msgid "Sharing" msgstr "Skupna raba" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:843 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:844 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:849 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:850 msgid "Sharing over the net" msgstr "Skupna raba prek spleta" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:855 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:856 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:862 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:863 msgid "Plugins" msgstr "Vstavki" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:864 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:876 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:887 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:865 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:877 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:888 msgid "Advanced" msgstr "Napredno" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:868 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:869 msgid "Add/remove/customize various bits of calibre functionality" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:874 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:875 msgid "Tweaks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:880 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:881 msgid "Fine tune how calibre behaves in various contexts" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:885 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:886 msgid "Miscellaneous" msgstr "Razno" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:891 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:892 msgid "Miscellaneous advanced configuration" msgstr "Razne naprednejše nastavitve" @@ -462,7 +462,7 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:59 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:436 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:444 msgid "" "This profile is intended for the SONY PRS line. The 500/505/600/700 etc." msgstr "Ta profil je namenjen izdelkom SONY PRS (500/505/600/700 itn.)." @@ -472,62 +472,62 @@ msgid "This profile is intended for the SONY PRS 300." msgstr "Ta profil je namenjen izdelku SONY PRS 300." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:80 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:476 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:484 msgid "This profile is intended for the SONY PRS-900." msgstr "Ta profil je namenjen izdelku SONY PRS-900." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:88 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:506 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:513 msgid "This profile is intended for the Microsoft Reader." msgstr "Ta profil je namenjen programu Microsoft Reader." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:99 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:517 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:524 msgid "This profile is intended for the Mobipocket books." msgstr "Ta profil je namenjen knjigam Mobipocket." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:112 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:530 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:537 msgid "This profile is intended for the Hanlin V3 and its clones." msgstr "" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:124 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:542 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:549 msgid "This profile is intended for the Hanlin V5 and its clones." msgstr "Ta profil je namenjen izdelku Hanlin V5 in njegovim klonom." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:134 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:550 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:557 msgid "This profile is intended for the Cybook G3." msgstr "Ta profil je namenjen izdelku Cybook G3." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:147 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:563 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:570 msgid "This profile is intended for the Cybook Opus." msgstr "Ta profil je namenjen izdelku Cybook Opus." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:159 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:576 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:583 msgid "This profile is intended for the Amazon Kindle." msgstr "Ta profil je namenjen izdelku Amazon Kindle." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:171 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:617 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:631 msgid "This profile is intended for the Irex Illiad." msgstr "Ta profil je namenjen izdelku Irex Illiad." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:183 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:630 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:644 msgid "This profile is intended for the IRex Digital Reader 1000." msgstr "Ta profil je namenjen izdelku Irex Digital Reader 1000." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:196 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:644 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:658 msgid "This profile is intended for the IRex Digital Reader 800." msgstr "Ta profil je namenjen izdelku Irex Digital Reader 800." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:208 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:658 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:672 msgid "This profile is intended for the B&N Nook." msgstr "Ta profil je namenjen izdelku Barnes&Noble Nook." @@ -542,38 +542,38 @@ msgid "" "devices." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:273 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:276 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:435 msgid "Intended for generic tablet devices, does no resizing of images" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:454 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:462 msgid "This profile is intended for the Kobo Reader." msgstr "Ta profil je namenjen izdelku Kobo Reader." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:467 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:475 msgid "This profile is intended for the SONY PRS-300." msgstr "Ta profil je namenjen izdelku Sony PRS-300." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:485 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:493 msgid "This profile is intended for the 5-inch JetBook." msgstr "Ta profil je namenjen 5-palčnemu bralniku JetBook." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:494 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:502 msgid "" "This profile is intended for the SONY PRS line. The 500/505/700 etc, in " "landscape mode. Mainly useful for comics." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:597 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:609 msgid "This profile is intended for the Amazon Kindle DX." msgstr "Ta profil je namenjen izdelku Amazon Kindle DX." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:672 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:686 msgid "This profile is intended for the Sanda Bambook." msgstr "Ta profil je namenjen izdelku Sanda Bambook." @@ -643,13 +643,13 @@ msgstr "" msgid "Communicate with Android phones." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:53 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:56 msgid "" "Comma separated list of directories to send e-books to on the device. The " "first one that exists will be used" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:95 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:98 msgid "Communicate with S60 phones." msgstr "" @@ -992,6 +992,14 @@ msgstr "Nook" msgid "Communicate with the Nook eBook reader." msgstr "" +#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:85 +msgid "Nook Color" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:86 +msgid "Communicate with the Nook Color eBook reader." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:17 msgid "Communicate with the Nuut2 eBook reader." msgstr "" @@ -2171,8 +2179,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:605 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:45 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:102 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:109 #: /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 @@ -2206,8 +2214,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:39 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:206 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:189 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:104 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:79 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:325 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1131 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:178 @@ -2489,7 +2497,7 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1308 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1399 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 msgid "Cover" msgstr "" @@ -2524,74 +2532,74 @@ msgstr "" msgid "All articles" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:259 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:262 msgid "This is an Amazon Topaz book. It cannot be processed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1400 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 msgid "Title Page" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 #: /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:199 msgid "Table of Contents" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 msgid "Index" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 msgid "Glossary" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 msgid "Acknowledgements" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 msgid "Bibliography" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 msgid "Colophon" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 msgid "Copyright" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 msgid "Dedication" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 msgid "Epigraph" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 msgid "Foreword" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 msgid "List of Illustrations" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 msgid "List of Tables" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 msgid "Notes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1416 msgid "Preface" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1417 msgid "Main Text" msgstr "" @@ -3523,7 +3531,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:391 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:739 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:742 msgid "Not allowed" msgstr "" @@ -3590,7 +3598,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:147 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:720 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:683 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:685 #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:189 msgid "Failed" msgstr "" @@ -4299,11 +4307,11 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:25 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:49 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:58 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:403 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:119 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:120 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:121 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:131 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:405 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:137 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:320 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1117 @@ -4312,10 +4320,10 @@ msgstr "Pot" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:52 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:122 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:123 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:124 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:133 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:319 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/emailp.py:24 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:117 @@ -4346,7 +4354,7 @@ msgstr "" msgid "None" msgstr "Nič" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:404 msgid "Double-click to open Book Details window" msgstr "" @@ -4559,6 +4567,19 @@ msgstr "" msgid "Tab template for catalog.ui" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:25 +msgid "Bold" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:26 +msgid "Italic" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:28 +msgid "Underline" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:36 msgid "" "For settings that cannot be specified in this dialog, use the values saved " @@ -4566,11 +4587,11 @@ msgid "" "specified in the Preferences" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:70 msgid "Bulk Convert" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:83 #: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:185 msgid "Options specific to the output format." msgstr "" @@ -5057,6 +5078,7 @@ 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:353 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:214 msgid "&Series:" msgstr "&Serije:" @@ -5242,7 +5264,7 @@ msgid "Options specific to the input format." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:76 #: /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" @@ -5429,8 +5451,8 @@ msgid "Force maximum line length" msgstr "" #: /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:72 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:78 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:46 #: /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 @@ -5736,10 +5758,10 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/device.py:982 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:990 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1083 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1168 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1287 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1295 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1089 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1174 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1293 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1301 msgid "No suitable formats" msgstr "Ni ustreznih formatov" @@ -5764,47 +5786,47 @@ msgstr "" msgid "Sent by email:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1042 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1048 msgid "News:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1043 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1049 msgid "Attached is the" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1054 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1060 msgid "Sent news to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1084 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1169 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1288 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1090 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1175 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1294 msgid "Auto convert the following books before uploading to the device?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1114 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1120 msgid "Sending catalogs to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1201 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1207 msgid "Sending news to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1254 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1260 msgid "Sending books to device." msgstr "Pošlji knjige v napravo." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1296 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1302 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:1360 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1366 msgid "No space on device" msgstr "Na napravi ni več prostora" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1361 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1367 msgid "" "

Cannot upload books to device there is no more free space available " msgstr "" @@ -5856,15 +5878,15 @@ msgstr "" msgid "&Paste from clipboard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:80 msgid "Fit &cover within view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:81 msgid "&Previous" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:82 msgid "&Next" msgstr "" @@ -6027,6 +6049,7 @@ msgid "Set options for converting %s" msgstr "Nastavi nastavitve za pretvorbo %s" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:211 msgid "&Title:" msgstr "&Naslov:" @@ -6278,13 +6301,12 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:274 msgid "" "You can destroy your library using this feature. Changes are " -"permanent. There is no undo function. This feature is experimental, and " -"there may be bugs. You are strongly encouraged to back up your library " -"before proceeding.

Search and replace in text fields using character " -"matching or regular expressions. " +"permanent. There is no undo function. You are strongly encouraged to back up " +"your library before proceeding.

Search and replace in text fields using " +"character matching or regular expressions. " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:282 msgid "" "In character mode, the field is searched for the entered search text. The " "text is replaced by the specified replacement text everywhere it is found in " @@ -6294,7 +6316,7 @@ msgid "" "text will match both upper- and lower-case letters" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:293 msgid "" "In regular expression mode, the search text is an arbitrary python-" "compatible regular expression. The replacement text can contain " @@ -6309,30 +6331,30 @@ msgid "" "function." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:436 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:438 msgid "You must specify a destination when source is a composite field" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:528 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:536 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:631 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:538 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:633 msgid "Search/replace invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:529 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:531 msgid "" "Authors cannot be set to the empty string. Book title %s not processed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:537 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:539 msgid "Title cannot be set to the empty string. Book title %s not processed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:632 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:634 msgid "Search pattern is invalid: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:671 msgid "" "Applying changes to %d books.\n" "Phase {0} {1}%%." @@ -6575,7 +6597,7 @@ msgid "Your test:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:401 -msgid "&Search and replace (experimental)" +msgid "&Search and replace" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:91 @@ -7087,61 +7109,98 @@ msgstr "" msgid "Negate" msgstr "Negiraj" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:198 msgid "Advanced Search" msgstr "Napredno iskanje" -#: /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:120 -msgid "&All these words:" -msgstr "" - -#: /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:122 -msgid "&One or more of these words:" -msgstr "" - -#: /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:124 -msgid "Any of these &unwanted words:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:199 msgid "What kind of match to use:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:126 -msgid "Contains: the word or phrase matches anywhere in the metadata" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:200 +msgid "Contains: the word or phrase matches anywhere in the metadata field" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:127 -msgid "Equals: the word or phrase must match an entire metadata field" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:201 +msgid "Equals: the word or phrase must match the entire metadata field" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:202 msgid "" -"Regular expression: the expression must match anywhere in the metadata" +"Regular expression: the expression must match anywhere in the metadata field" msgstr "" -#: /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:203 +msgid "Find entries that have..." +msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:204 +msgid "&All these words:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:205 +msgid "This exact &phrase:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:206 +msgid "&One or more of these words:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:207 +msgid "But dont show entries that have..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:208 +msgid "Any of these &unwanted words:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:209 msgid "" "See the User Manual for more help" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:210 +msgid "A&dvanced Search" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:212 +msgid "Enter the title." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:213 +msgid "&Author:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:215 +msgid "Ta&gs:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:216 +msgid "Enter an author's name. Only one author can be used." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:217 +msgid "" +"Enter a series name, without an index. Only one series name can be used." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:218 +msgid "Enter tags separated by spaces" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:219 +msgid "&Clear" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:220 +msgid "Search only in specific fields:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:221 +msgid "Titl&e/Author/Series ..." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/select_formats.py:45 msgid "Choose formats" msgstr "" @@ -7791,37 +7850,41 @@ msgid "" "Books display will be restricted to those matching the selected saved search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:170 +msgid "Shift+Ctrl+F" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:173 msgid "Advanced search" msgstr "Napredno iskanje" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:177 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:178 msgid "" "

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

Words separated by spaces are ANDed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:181 msgid "&Go!" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:187 msgid "Do Quick Search (you can also press the Enter key)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:192 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:193 msgid "Reset Quick Search" msgstr "Resetiraj Hitro Iskanje" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:204 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:205 msgid "Copy current search text (instead of search name)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:210 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:211 msgid "Save current search under the name shown in the box" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:217 msgid "Delete current saved search" msgstr "" @@ -7878,47 +7941,47 @@ msgstr "" msgid "Double click to edit me

" msgstr "Dvoklikni me da me urediš

" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:144 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:147 msgid "Hide column %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:152 msgid "Sort on %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:150 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:153 msgid "Ascending" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:153 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:156 msgid "Descending" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:168 msgid "Change text alignment for %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 msgid "Left" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 msgid "Right" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:171 msgid "Center" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:190 msgid "Show column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:199 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:202 msgid "Restore default layout" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:740 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:743 msgid "" "Dropping onto a device is not supported. First add the book to the calibre " "library." @@ -9668,7 +9731,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:704 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:708 msgid "Remember last used window size" msgstr "" @@ -9840,65 +9903,65 @@ msgstr "" msgid "No matches found for: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:481 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:485 msgid "Loading flow..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:517 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:521 msgid "Laying out %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:548 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:552 msgid "Bookmark #%d" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:552 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:556 msgid "Add bookmark" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:553 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:557 msgid "Enter title for bookmark:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:563 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:567 msgid "Manage Bookmarks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:600 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:604 msgid "Loading ebook..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:608 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:612 msgid "DRM Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:609 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:613 msgid "

This book is protected by DRM" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:613 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:617 msgid "Could not open ebook" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:691 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:695 msgid "Options to control the ebook viewer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:698 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:702 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:701 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:705 msgid "" "If specified, viewer window will try to open full screen when started." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:706 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:710 msgid "Print javascript alert and console messages to the console" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:712 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:716 msgid "" "%prog [options] file\n" "\n" @@ -12984,3 +13047,6 @@ msgstr "Ne prenesi CSS oblikovnih informacij." #~ msgid "Print generated NCX file to stdout" #~ msgstr "Izpiši ustvarjeno NCX datoteko na standardni izhod" + +#~ msgid " " +#~ msgstr " " diff --git a/src/calibre/translations/sr.po b/src/calibre/translations/sr.po index ba212a3a1b..fb0128dd16 100644 --- a/src/calibre/translations/sr.po +++ b/src/calibre/translations/sr.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2010-11-10 14:27+0000\n" -"PO-Revision-Date: 2010-11-10 17:40+0000\n" -"Last-Translator: Vladimir Oka \n" +"POT-Creation-Date: 2010-11-12 23:11+0000\n" +"PO-Revision-Date: 2010-11-12 23:08+0000\n" +"Last-Translator: Kovid Goyal \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-11 04:41+0000\n" +"X-Launchpad-Export-Date: 2010-11-13 04:54+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -31,7 +31,7 @@ msgstr "Ne radi baš ništa" #: /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:643 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:650 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:401 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 @@ -74,14 +74,14 @@ msgstr "Ne radi baš ništa" #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:78 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:119 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:153 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:616 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:822 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:824 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:620 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:826 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:828 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:911 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:916 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:913 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:918 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:984 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:143 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:150 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:64 @@ -123,8 +123,8 @@ msgstr "Ne radi baš ništa" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:141 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:927 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:936 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1243 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1246 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1249 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1252 #: /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 @@ -192,7 +192,7 @@ msgstr "Akcije korisničkog interfejsa" msgid "Preferences" msgstr "Podešavanja" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:17 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:15 msgid "" "Follow all local links in an HTML file and create a ZIP file containing all " "linked files. This plugin is run every time you add an HTML file to the " @@ -202,7 +202,7 @@ msgstr "" "fajlove. Ovaj dodatak se pokreće svaki put kada dodate HTML fajl u " "biblioteku." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:53 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:51 msgid "" "Character encoding for the input HTML files. Common choices include: cp1252, " "latin1, iso-8859-1 and utf-8." @@ -210,7 +210,7 @@ msgstr "" "Kodni raspored za ulazne HTML fajlove. Najčešće korišćeni kodni rasporedi " "su: Windows-1252 (CP1252), Latin-1, ISO-8859 i UTF-8." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:60 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:58 msgid "" "Create a PMLZ archive containing the PML file and all images in the " "directory pmlname_img or images. This plugin is run every time you add a PML " @@ -220,7 +220,7 @@ msgstr "" "plmname_img i images. Ovaj dodatak se pokreće svaki put kada dodate PML fajl " "u biblioteku." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:94 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:92 msgid "Extract cover from comic files" msgstr "Uzmi omot iz fajla sa stripom" @@ -267,43 +267,43 @@ msgstr "Upiši metapodatke u %s fajlova" msgid "Set metadata from %s files" msgstr "Učitaj metapodatke iz %s fajlova" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:711 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:712 msgid "Look and Feel" msgstr "Izgled i ponašanje" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:725 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:714 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:726 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:737 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:748 msgid "Interface" msgstr "Interfejs" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:717 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:718 msgid "Adjust the look and feel of the calibre interface to suit your tastes" msgstr "Prilagodite izgled i ponašanje calibrea da odgovara vašem ukusu" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:723 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 msgid "Behavior" msgstr "Ponašanje" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:729 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:730 msgid "Change the way calibre behaves" msgstr "Promenite način ponašanja calibrea" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:734 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:208 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:735 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:209 msgid "Add your own columns" msgstr "Dodajte sopstvene kolone" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:740 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:741 msgid "Add/remove your own columns to the calibre book list" msgstr "Dodajte/uklonite sopstvene kolone za calibre spisak knjiga" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:745 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:746 msgid "Customize the toolbar" msgstr "Prilagodite traku sa alatima" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:751 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:752 msgid "" "Customize the toolbars and context menus, changing which actions are " "available in each" @@ -311,57 +311,57 @@ msgstr "" "Prilagodite traku sa alatima i kontekstno osetljive menije menjajući akcije " "koje su na raspolaganju u svakom od njih" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:757 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 msgid "Input Options" msgstr "Ulazna podešavanja" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:759 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:770 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:760 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:771 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:782 msgid "Conversion" msgstr "Konverzija" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:763 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:764 msgid "Set conversion options specific to each input format" msgstr "Postavite opcije za konverziju za svaki od ulaznih formata" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:768 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 msgid "Common Options" msgstr "Uobičajene opcije" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:774 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:775 msgid "Set conversion options common to all formats" msgstr "Postavite opcije za konverziju za sve formate" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:779 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:780 msgid "Output Options" msgstr "Izlazne opcije" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:785 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:786 msgid "Set conversion options specific to each output format" msgstr "Postavite opcije za konverziju specifične za svaki izlazni format" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:790 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:791 msgid "Adding books" msgstr "Dodajem knjige" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:792 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:804 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:816 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:828 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:817 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:829 msgid "Import/Export" msgstr "Uvoz/izvoz" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:796 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:797 msgid "Control how calibre reads metadata from files when adding books" msgstr "" "Kontrolišite kako calibre čita metapodatke iz fajlova kada dodaje knjige" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:802 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:803 msgid "Saving books to disk" msgstr "Snimam kjige na disk" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:808 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:809 msgid "" "Control how calibre exports files from its database to disk when using Save " "to disk" @@ -369,32 +369,32 @@ msgstr "" "Kontrolišite kako calibre izvozi fajlove iz baze podataka na disk kada se " "koristi opcija Snimi na disk" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:814 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:815 msgid "Sending books to devices" msgstr "Šaljem knjige na uređaj" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:820 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:821 msgid "Control how calibre transfers files to your ebook reader" msgstr "Kontrolišite kako calibre šalje fajlove na vaš čitač" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:826 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:827 msgid "Metadata plugboards" msgstr "Priključci za metapodatke" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:832 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:833 msgid "Change metadata fields before saving/sending" msgstr "Izmeni metapodatke pre snimanja/slanja" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:837 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:838 msgid "Sharing books by email" msgstr "Šaljem knjige elektronskom poštom" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:839 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:851 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:840 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:852 msgid "Sharing" msgstr "Razmena" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:843 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:844 msgid "" "Setup sharing of books via email. Can be used for automatic sending of " "downloaded news to your devices" @@ -402,11 +402,11 @@ msgstr "" "Podesite razmenu knjiga elektronskom poštom. Ovo se može koristiti i za " "automatsko slanje preuzetih vesti na vaš uređaj" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:849 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:850 msgid "Sharing over the net" msgstr "Razmena preko Interneta" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:855 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:856 msgid "" "Setup the calibre Content Server which will give you access to your calibre " "library from anywhere, on any device, over the internet" @@ -414,33 +414,33 @@ msgstr "" "Podesite calibre server sadržaja koji će omogućiti pristup vašoj calibre " "biblioteci s bilo koje lokacije, bilo kog uređaja, a preko Interneta" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:862 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:863 msgid "Plugins" msgstr "Dodaci" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:864 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:876 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:887 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:865 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:877 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:888 msgid "Advanced" msgstr "Napredno" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:868 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:869 msgid "Add/remove/customize various bits of calibre functionality" msgstr "Dodaj/ukloni/podesi različite elemente ponašanja calibrea" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:874 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:875 msgid "Tweaks" msgstr "Fina podešavanja" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:880 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:881 msgid "Fine tune how calibre behaves in various contexts" msgstr "Fino podesite kako se calibre ponaša u različitim situacijama" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:885 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:886 msgid "Miscellaneous" msgstr "Razno" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:891 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:892 msgid "Miscellaneous advanced configuration" msgstr "Razna napredna podešavanja" @@ -485,7 +485,7 @@ msgstr "" "je ako ne znate ništa o ulaznom dokumentu." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:59 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:436 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:444 msgid "" "This profile is intended for the SONY PRS line. The 500/505/600/700 etc." msgstr "" @@ -496,62 +496,62 @@ msgid "This profile is intended for the SONY PRS 300." msgstr "Ovaj profil je namenjen za SONY PRS 300 čitače." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:80 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:476 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:484 msgid "This profile is intended for the SONY PRS-900." msgstr "Ovaj profil je namenjen za SONY PRS-900 čitače." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:88 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:506 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:513 msgid "This profile is intended for the Microsoft Reader." msgstr "Ovaj profil je namenjen za Microsoft Reader." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:99 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:517 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:524 msgid "This profile is intended for the Mobipocket books." msgstr "Ovaj profil je namenjen za Mobipocket knjige." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:112 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:530 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:537 msgid "This profile is intended for the Hanlin V3 and its clones." msgstr "Ovaj profil je namenjen za Hanlin V3 čitače i klonove." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:124 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:542 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:549 msgid "This profile is intended for the Hanlin V5 and its clones." msgstr "Ovaj profil je namenjen za Hanlin V5 čitače i klonove." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:134 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:550 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:557 msgid "This profile is intended for the Cybook G3." msgstr "Ovaj profil je namenjen za Cybook G3 čitače." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:147 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:563 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:570 msgid "This profile is intended for the Cybook Opus." msgstr "Ovaj profil je namenjen za Cybook Opus čitače." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:159 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:576 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:583 msgid "This profile is intended for the Amazon Kindle." msgstr "Ovaj profil je namenjen za Amazon Kindle čitače." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:171 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:617 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:631 msgid "This profile is intended for the Irex Illiad." msgstr "Ovaj profil je namenjen za Irex Illiad čitače." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:183 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:630 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:644 msgid "This profile is intended for the IRex Digital Reader 1000." msgstr "Ovaj profil je namenjen za IRex Digital Reader 1000 čitače." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:196 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:644 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:658 msgid "This profile is intended for the IRex Digital Reader 800." msgstr "Ovaj profil je namenjen za IRex Digital Reader 800 čitače." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:208 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:658 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:672 msgid "This profile is intended for the B&N Nook." msgstr "Ovaj profil je namenjen za B&N Nook čitače." @@ -569,28 +569,28 @@ msgstr "" "je ako želite da proizvedete dokument koji može da se čita kako na računaru, " "tako i na raznim drugim uređajima." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:273 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:276 msgid "" "Intended for the iPad and similar devices with a resolution of 768x1024" msgstr "Namenjeno za iPad i slične uređaje s rezolucijom 768x1024" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:427 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:435 msgid "Intended for generic tablet devices, does no resizing of images" msgstr "Namenjeno generičkim tablet uređajima, ne menja veličinu slika" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:454 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:462 msgid "This profile is intended for the Kobo Reader." msgstr "Ovaj profil je namenjen za Kobo čitače" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:467 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:475 msgid "This profile is intended for the SONY PRS-300." msgstr "Ovaj profil je namenjen za SONY PRS-300 čitače." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:485 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:493 msgid "This profile is intended for the 5-inch JetBook." msgstr "Ovaj profil je namenjen za 5-inčne JetBook čitače." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:494 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:502 msgid "" "This profile is intended for the SONY PRS line. The 500/505/700 etc, in " "landscape mode. Mainly useful for comics." @@ -598,11 +598,11 @@ msgstr "" "Ovaj profil je namenjen SONY PRS liniji čitača, za modele 500/505/700 itd, u " "horizontalnom položaju. Uglavnom je koristan za stripove." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:597 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:609 msgid "This profile is intended for the Amazon Kindle DX." msgstr "Ovaj profil je namenjen za Amazon Kindle DX čitače." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:672 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:686 msgid "This profile is intended for the Sanda Bambook." msgstr "Ovaj profil je namenjen Sanda Bambook čitaču." @@ -678,7 +678,7 @@ msgstr "Isključi navedeni dodatak" msgid "Communicate with Android phones." msgstr "Uspastavi vezu sa Android telefonima." -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:53 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:56 msgid "" "Comma separated list of directories to send e-books to on the device. The " "first one that exists will be used" @@ -686,7 +686,7 @@ msgstr "" "Zarezima razdvojen spisak direktorijuma na uređaju u koje će se slati " "knjige. Koristiće se prvi postojeći." -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:95 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:98 msgid "Communicate with S60 phones." msgstr "Uspostavi vezu sa S60 telefonima." @@ -1042,6 +1042,14 @@ msgstr "Nook" msgid "Communicate with the Nook eBook reader." msgstr "Uspostavi vezu s Nook čitačem." +#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:85 +msgid "Nook Color" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:86 +msgid "Communicate with the Nook Color eBook reader." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:17 msgid "Communicate with the Nuut2 eBook reader." msgstr "Uspostavi vezu s Nuut2 čitačem." @@ -2792,7 +2800,7 @@ msgstr "" "LibraryThing.com\n" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1308 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1399 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 msgid "Cover" msgstr "Naslovna strana" @@ -2835,70 +2843,70 @@ msgstr "Svi članci" msgid "This is an Amazon Topaz book. It cannot be processed." msgstr "Ovo je Amazon Topaz knjiga. Nju nije moguće obraditi." -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1400 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 msgid "Title Page" msgstr "Naslovna strana" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 #: /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:199 msgid "Table of Contents" msgstr "Sadržaj" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 msgid "Index" msgstr "Indeks" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 msgid "Glossary" msgstr "Pojmovnik" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 msgid "Acknowledgements" msgstr "Zahvalnosti" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 msgid "Bibliography" msgstr "Bibliografija" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 msgid "Colophon" msgstr "Impresum" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 msgid "Copyright" msgstr "Autorska prava" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 msgid "Dedication" msgstr "Posveta" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 msgid "Epigraph" msgstr "Epigraf" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 msgid "Foreword" msgstr "Predgovor" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 msgid "List of Illustrations" msgstr "Spisak ilustracija" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 msgid "List of Tables" msgstr "Spisak tabela" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 msgid "Notes" msgstr "Beleške" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1416 msgid "Preface" msgstr "Predgovor" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1417 msgid "Main Text" msgstr "Glavni tekst" @@ -3954,7 +3962,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:391 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:741 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:742 msgid "Not allowed" msgstr "Nije dozvoljeno" @@ -5068,11 +5076,11 @@ msgstr "" "sačuvane od prethodne konverzije (ako postoje), umesto korišćenja " "podrazumevanih vrednosti u Podešavanjima" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:70 msgid "Bulk Convert" msgstr "Masovna konverzija" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:83 #: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:185 msgid "Options specific to the output format." msgstr "Opcije koje zavise od izlaznog formata." @@ -6281,10 +6289,10 @@ msgstr "Šaljem poruku za" #: /home/kovid/work/calibre/src/calibre/gui2/device.py:982 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:990 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1083 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1168 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1287 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1295 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1089 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1174 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1293 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1301 msgid "No suitable formats" msgstr "Nema odgovarajućih formata" @@ -6310,37 +6318,37 @@ msgstr "Nisam uspeo da pošaljem sledeće knjige:" msgid "Sent by email:" msgstr "Poslato elektronskom poštom:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1042 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1048 msgid "News:" msgstr "Vesti:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1043 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1049 msgid "Attached is the" msgstr "Priključeno je" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1054 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1060 msgid "Sent news to" msgstr "Poslao vesti za" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1084 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1169 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1288 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1090 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1175 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1294 msgid "Auto convert the following books before uploading to the device?" msgstr "Automatski konvertuj sledeće knjige pre slanja na uređaj?" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1114 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1120 msgid "Sending catalogs to device." msgstr "Šaljem katalog na uređaj." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1201 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1207 msgid "Sending news to device." msgstr "Šaljem vesti na uređaj." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1254 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1260 msgid "Sending books to device." msgstr "Šaljem knjige na uređaj." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1296 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1302 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." @@ -6349,11 +6357,11 @@ msgstr "" "odgovarajući formati. Morate prvo konvertovati knjige u format koji vaš " "uređaj podržava." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1360 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1366 msgid "No space on device" msgstr "Na uređaju nema dovoljno mesta" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1361 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1367 msgid "" "

Cannot upload books to device there is no more free space available " msgstr "" @@ -7745,45 +7753,45 @@ msgid "Advanced Search" msgstr "Napredna pretraga" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:199 -msgid "Find entries that have..." -msgstr "Pronađi stavke koje sadrže..." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:200 -msgid "&All these words:" -msgstr "&Sve ove reči:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:201 -msgid "This exact &phrase:" -msgstr "Ovu &frazu:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:202 -msgid "&One or more of these words:" -msgstr "&Jednu ili više ovih reči:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:203 -msgid "But dont show entries that have..." -msgstr "Ali ne prikazuj stavke koje sadrže..." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:204 -msgid "Any of these &unwanted words:" -msgstr "Bilo koje od ovih &neželjenih reči:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:205 msgid "What kind of match to use:" msgstr "Koju vrstu pogodaka da koristim:" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:200 +msgid "Contains: the word or phrase matches anywhere in the metadata field" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:201 +msgid "Equals: the word or phrase must match the entire metadata field" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:202 +msgid "" +"Regular expression: the expression must match anywhere in the metadata field" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:203 +msgid "Find entries that have..." +msgstr "Pronađi stavke koje sadrže..." + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:204 +msgid "&All these words:" +msgstr "&Sve ove reči:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:205 +msgid "This exact &phrase:" +msgstr "Ovu &frazu:" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:206 -msgid "Contains: the word or phrase matches anywhere in the metadata" -msgstr "Sadrži: reči ili fraze bilo gde među metapodacima" +msgid "&One or more of these words:" +msgstr "&Jednu ili više ovih reči:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:207 -msgid "Equals: the word or phrase must match an entire metadata field" -msgstr "Jednaki: rečima ili frazama koje odgovaraju celom polju metapodataka" +msgid "But dont show entries that have..." +msgstr "Ali ne prikazuj stavke koje sadrže..." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:208 -msgid "" -"Regular expression: the expression must match anywhere in the metadata" -msgstr "Regularni izraz: izraz mora biti pronađen bilo gde među metapodacima" +msgid "Any of these &unwanted words:" +msgstr "Bilo koje od ovih &neželjenih reči:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:209 msgid "" @@ -8627,47 +8635,47 @@ msgstr "Izabrano za brisanje" msgid "Double click to edit me

" msgstr "Kliknite dva puta da me promenite

" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:146 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:147 msgid "Hide column %s" msgstr "Sakrij kolonu %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:152 msgid "Sort on %s" msgstr "Sortiraj po koloni %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:152 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:153 msgid "Ascending" msgstr "Rastući redosled" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:156 msgid "Descending" msgstr "Opadajući redosled" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:168 msgid "Change text alignment for %s" msgstr "Promeni poravnanje za %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 msgid "Left" msgstr "Levo" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 msgid "Right" msgstr "Desno" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:171 msgid "Center" msgstr "Centrirano" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:190 msgid "Show column" msgstr "Prikaži kolonu" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:201 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:202 msgid "Restore default layout" msgstr "Vrati podrazumevani izgled" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:742 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:743 msgid "" "Dropping onto a device is not supported. First add the book to the calibre " "library." @@ -13368,6 +13376,13 @@ msgstr "Ne preuzimaj CSS stilove." #~ msgid "Download &cover" #~ msgstr "Preuzmi &naslovnu stranu" +#~ msgid "Contains: the word or phrase matches anywhere in the metadata" +#~ msgstr "Sadrži: reči ili fraze bilo gde među metapodacima" + +#~ msgid "" +#~ "Regular expression: the expression must match anywhere in the metadata" +#~ msgstr "Regularni izraz: izraz mora biti pronađen bilo gde među metapodacima" + #~ msgid "" #~ "For help with writing advanced news recipes, please visit User Recipes" @@ -13572,6 +13587,9 @@ msgstr "Ne preuzimaj CSS stilove." #~ msgid "Masthead font:" #~ msgstr "Vrsta slova za Impresum:" +#~ msgid "Equals: the word or phrase must match an entire metadata field" +#~ msgstr "Jednaki: rečima ili frazama koje odgovaraju celom polju metapodataka" + #~ msgid "Click to turn off Cover Browsing" #~ msgstr "Kliknite da isključite traženje u Izlogu naslovnih strana" diff --git a/src/calibre/translations/sv.po b/src/calibre/translations/sv.po index fa497a7a43..3c3466805e 100644 --- a/src/calibre/translations/sv.po +++ b/src/calibre/translations/sv.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2010-11-10 14:27+0000\n" -"PO-Revision-Date: 2010-11-10 21:45+0000\n" -"Last-Translator: Merarom \n" +"POT-Creation-Date: 2010-11-12 23:11+0000\n" +"PO-Revision-Date: 2010-11-12 23:04+0000\n" +"Last-Translator: Kovid Goyal \n" "Language-Team: Swedish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-11 04:42+0000\n" +"X-Launchpad-Export-Date: 2010-11-13 04:54+0000\n" "X-Generator: Launchpad (build Unknown)\n" "X-Poedit-Country: SWEDEN\n" "X-Poedit-Language: Swedish\n" @@ -33,7 +33,7 @@ msgstr "Gör absolut ingenting" #: /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:643 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:650 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:401 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 @@ -76,14 +76,14 @@ msgstr "Gör absolut ingenting" #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:78 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:119 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:153 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:616 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:822 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:824 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:620 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:826 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:828 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:911 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:916 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:913 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:918 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:984 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:143 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:150 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:64 @@ -125,8 +125,8 @@ msgstr "Gör absolut ingenting" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:141 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:927 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:936 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1243 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1246 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1249 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1252 #: /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 @@ -194,7 +194,7 @@ msgstr "Användargränssnittsåtgärd" msgid "Preferences" msgstr "Inställningar" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:17 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:15 msgid "" "Follow all local links in an HTML file and create a ZIP file containing all " "linked files. This plugin is run every time you add an HTML file to the " @@ -204,7 +204,7 @@ msgstr "" "alla länkade filer. Detta tillägg körs varje gång du lägger till en HTML-fil " "till biblioteket." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:53 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:51 msgid "" "Character encoding for the input HTML files. Common choices include: cp1252, " "latin1, iso-8859-1 and utf-8." @@ -212,7 +212,7 @@ msgstr "" "Teckenkodning för indata i HTML. Vanliga alternativ är: cp1252, latin1, iso-" "8859-1 och utf-8." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:60 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:58 msgid "" "Create a PMLZ archive containing the PML file and all images in the " "directory pmlname_img or images. This plugin is run every time you add a PML " @@ -222,7 +222,7 @@ msgstr "" "pmlname_img eller bilder. Detta tillägg körs varje gång du lägger till en " "PML-fil till biblioteket." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:94 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:92 msgid "Extract cover from comic files" msgstr "Extrahera omslag från serietidningsfiler" @@ -269,45 +269,45 @@ msgstr "Ställ in metadata i %s-filer" msgid "Set metadata from %s files" msgstr "Ställ in metadata utifrån %s-filer" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:711 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:712 msgid "Look and Feel" msgstr "Utseende och beteende" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:725 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:714 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:726 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:737 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:748 msgid "Interface" msgstr "Gränssnitt" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:717 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:718 msgid "Adjust the look and feel of the calibre interface to suit your tastes" msgstr "" "Justera utseendet och beteendet av Calibre-gränssnittet så det passar din " "smak" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:723 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 msgid "Behavior" msgstr "Beteende" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:729 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:730 msgid "Change the way calibre behaves" msgstr "Ändra Calibres beteende" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:734 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:208 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:735 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:209 msgid "Add your own columns" msgstr "Lägg till dina egna kolumner" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:740 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:741 msgid "Add/remove your own columns to the calibre book list" msgstr "Lägga till / ta bort dina egna kolumner till Calibres boklista" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:745 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:746 msgid "Customize the toolbar" msgstr "Anpassa verktygsfältet" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:751 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:752 msgid "" "Customize the toolbars and context menus, changing which actions are " "available in each" @@ -315,57 +315,57 @@ msgstr "" "Anpassa verktygsfält och menyer, genom att ändra vilka åtgärder som finns i " "varje" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:757 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 msgid "Input Options" msgstr "Inmatningsalternativ" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:759 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:770 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:760 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:771 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:782 msgid "Conversion" msgstr "Konvertera" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:763 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:764 msgid "Set conversion options specific to each input format" msgstr "Ange konverteringsalternativ specifika för varje indataformat" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:768 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 msgid "Common Options" msgstr "Vanliga alternativ" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:774 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:775 msgid "Set conversion options common to all formats" msgstr "Ange konverteringsalternativ gemensamma för alla format" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:779 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:780 msgid "Output Options" msgstr "Alternativ för utdata" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:785 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:786 msgid "Set conversion options specific to each output format" msgstr "Ange konvertering specifika för varje utdataformat" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:790 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:791 msgid "Adding books" msgstr "Lägga till böcker" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:792 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:804 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:816 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:828 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:817 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:829 msgid "Import/Export" msgstr "Import / Export" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:796 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:797 msgid "Control how calibre reads metadata from files when adding books" msgstr "" "Kontrollera hur Calibre läser metadata från filer när du lägger till böcker" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:802 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:803 msgid "Saving books to disk" msgstr "Spara böcker till disk" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:808 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:809 msgid "" "Control how calibre exports files from its database to disk when using Save " "to disk" @@ -373,32 +373,32 @@ msgstr "" "Kontrollera hur Calibre exporterar filer från databasen till hårddisken när " "du använder Spara till disk" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:814 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:815 msgid "Sending books to devices" msgstr "Skickar böcker till enheter" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:820 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:821 msgid "Control how calibre transfers files to your ebook reader" msgstr "Kontrollera hur Calibre överför filer till din läsplatta" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:826 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:827 msgid "Metadata plugboards" msgstr "Kontrollpanel för metadata" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:832 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:833 msgid "Change metadata fields before saving/sending" msgstr "Ändra metadatafält innan du sparar / skickar" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:837 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:838 msgid "Sharing books by email" msgstr "Dela böcker via e-post" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:839 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:851 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:840 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:852 msgid "Sharing" msgstr "Delar" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:843 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:844 msgid "" "Setup sharing of books via email. Can be used for automatic sending of " "downloaded news to your devices" @@ -406,11 +406,11 @@ msgstr "" "Ställ in delning av böcker via e-post. Kan användas för automatisk sändning " "av nedladdade nyheter till dina enheter" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:849 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:850 msgid "Sharing over the net" msgstr "Dela på nätet" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:855 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:856 msgid "" "Setup the calibre Content Server which will give you access to your calibre " "library from anywhere, on any device, over the internet" @@ -418,33 +418,33 @@ msgstr "" "Ställ in Calibre innehållsserver som ger dig tillgång till din Calibre-" "bibliotek från någonstans, på någon enhet på Internet" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:862 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:863 msgid "Plugins" msgstr "Tillägg" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:864 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:876 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:887 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:865 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:877 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:888 msgid "Advanced" msgstr "Avancerat" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:868 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:869 msgid "Add/remove/customize various bits of calibre functionality" msgstr "Lägg till / ta bort / anpassa olika bitar av Calibre-funktionalitet" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:874 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:875 msgid "Tweaks" msgstr "Justeringar" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:880 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:881 msgid "Fine tune how calibre behaves in various contexts" msgstr "Finjustera hur Calibre beter sig i olika sammanhang" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:885 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:886 msgid "Miscellaneous" msgstr "Diverse" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:891 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:892 msgid "Miscellaneous advanced configuration" msgstr "Diverse avancerad konfiguration" @@ -489,7 +489,7 @@ msgstr "" "du inte vet något om ingångsdokumentet." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:59 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:436 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:444 msgid "" "This profile is intended for the SONY PRS line. The 500/505/600/700 etc." msgstr "Denna profil är avsedd för Sonys PRS-linje: 500/505/600/700 m.fl." @@ -499,62 +499,62 @@ msgid "This profile is intended for the SONY PRS 300." msgstr "Denna profil är avsedd för Sony PRS-300." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:80 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:476 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:484 msgid "This profile is intended for the SONY PRS-900." msgstr "Denna profil är avsedd för Sony PRS-900." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:88 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:506 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:513 msgid "This profile is intended for the Microsoft Reader." msgstr "Denna profil är avsedd för Microsoft Reader." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:99 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:517 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:524 msgid "This profile is intended for the Mobipocket books." msgstr "Denna profil är avsedd för Mobipocket-böcker." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:112 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:530 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:537 msgid "This profile is intended for the Hanlin V3 and its clones." msgstr "Denna profil är avsedd för Hanlin V3 och dess varianter." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:124 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:542 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:549 msgid "This profile is intended for the Hanlin V5 and its clones." msgstr "Denna profil är avsedd för Hanlin V5 och dess varianter." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:134 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:550 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:557 msgid "This profile is intended for the Cybook G3." msgstr "Denna profil är avsedd för Cybook G3." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:147 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:563 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:570 msgid "This profile is intended for the Cybook Opus." msgstr "Denna profil är avsedd för Cybook Opus." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:159 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:576 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:583 msgid "This profile is intended for the Amazon Kindle." msgstr "Denna profil är avsedd för Amazon Kindle." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:171 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:617 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:631 msgid "This profile is intended for the Irex Illiad." msgstr "Denna profil är avsedd för Irex Illiad." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:183 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:630 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:644 msgid "This profile is intended for the IRex Digital Reader 1000." msgstr "Denna profil är avsedd för IRex Digital Reader 1000." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:196 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:644 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:658 msgid "This profile is intended for the IRex Digital Reader 800." msgstr "Denna profil är avsedd för Irex Digital Reader 800." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:208 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:658 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:672 msgid "This profile is intended for the B&N Nook." msgstr "Denna profil är avsedd för B&N Nook." @@ -572,28 +572,28 @@ msgstr "" "om du vill skapa en handling som skall läsas på en dator eller på en rad " "olika enheter." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:273 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:276 msgid "" "Intended for the iPad and similar devices with a resolution of 768x1024" msgstr "Avsedd för iPad och liknande enheter med en upplösningen 768x1024" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:427 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:435 msgid "Intended for generic tablet devices, does no resizing of images" msgstr "Avsedd för allmänna surfplattor - bilder skalas ej om." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:454 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:462 msgid "This profile is intended for the Kobo Reader." msgstr "Denna profil är avsedd för Kobo Reader." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:467 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:475 msgid "This profile is intended for the SONY PRS-300." msgstr "Denna profil är avsedd för SONY PRS-300." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:485 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:493 msgid "This profile is intended for the 5-inch JetBook." msgstr "Denna profil är avsedd för JetBook (5 tum)." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:494 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:502 msgid "" "This profile is intended for the SONY PRS line. The 500/505/700 etc, in " "landscape mode. Mainly useful for comics." @@ -601,11 +601,11 @@ msgstr "" "Denna profil är avsedd för Sonys PRS-linje, 500/505/700 m.fl, i liggande " "format. Används främst för serietidningar." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:597 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:609 msgid "This profile is intended for the Amazon Kindle DX." msgstr "Denna profil är avsedd för Amazon Kindle DX." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:672 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:686 msgid "This profile is intended for the Sanda Bambook." msgstr "Denna profil är avsedd för Sanda Bambook." @@ -684,7 +684,7 @@ msgstr "Inaktivera namngivet tillägg" msgid "Communicate with Android phones." msgstr "Kommunicera med Android-telefoner." -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:53 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:56 msgid "" "Comma separated list of directories to send e-books to on the device. The " "first one that exists will be used" @@ -692,7 +692,7 @@ msgstr "" "Kommaseparerad lista av kataloger på enheten dit e-böckerna skall skickas. " "Den första katalog som finns kommer att användas" -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:95 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:98 msgid "Communicate with S60 phones." msgstr "Kommunicera med S60-telefoner" @@ -1048,6 +1048,14 @@ msgstr "Nook" msgid "Communicate with the Nook eBook reader." msgstr "Kommunicera med läsplattan Nook." +#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:85 +msgid "Nook Color" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:86 +msgid "Communicate with the Nook Color eBook reader." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:17 msgid "Communicate with the Nuut2 eBook reader." msgstr "Kommunicera med läsplattan Nuut2." @@ -2798,7 +2806,7 @@ msgstr "" "LibraryThing.com\n" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1308 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1399 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 msgid "Cover" msgstr "Omslag" @@ -2840,70 +2848,70 @@ msgstr "Alla artiklar" msgid "This is an Amazon Topaz book. It cannot be processed." msgstr "Det här är en Amazon Topaz-bok. Den kan inte hanteras." -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1400 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 msgid "Title Page" msgstr "Titelsida" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 #: /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:199 msgid "Table of Contents" msgstr "Innehållsförteckning" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 msgid "Index" msgstr "Översikt" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 msgid "Glossary" msgstr "Ordförklaringar" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 msgid "Acknowledgements" msgstr "Tack till" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 msgid "Bibliography" msgstr "Litteraturförteckning" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 msgid "Colophon" msgstr "Kolofon" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 msgid "Copyright" msgstr "Upphovsrätt" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 msgid "Dedication" msgstr "Tillägnan" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 msgid "Epigraph" msgstr "Epigraf" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 msgid "Foreword" msgstr "Förord" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 msgid "List of Illustrations" msgstr "Illustrationslista" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 msgid "List of Tables" msgstr "Tabellista" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 msgid "Notes" msgstr "Anteckningar" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1416 msgid "Preface" msgstr "Förord" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1417 msgid "Main Text" msgstr "Huvudtext" @@ -3961,7 +3969,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:391 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:741 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:742 msgid "Not allowed" msgstr "Tillåẗs ej" @@ -5074,11 +5082,11 @@ msgstr "" "som sparats i en tidigare konvertering (om den finns) i stället för att " "använda de standardvärden som anges i Inställningar" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:70 msgid "Bulk Convert" msgstr "Masskonvertering" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:83 #: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:185 msgid "Options specific to the output format." msgstr "Alternativ specifika för utdataformatet." @@ -6284,10 +6292,10 @@ msgstr "Skickar e-post till" #: /home/kovid/work/calibre/src/calibre/gui2/device.py:982 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:990 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1083 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1168 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1287 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1295 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1089 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1174 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1293 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1301 msgid "No suitable formats" msgstr "Inga lämpliga format" @@ -6313,38 +6321,38 @@ msgstr "Kunde inte skicka följande böcker:" msgid "Sent by email:" msgstr "Skickat via e-post:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1042 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1048 msgid "News:" msgstr "Nyheter:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1043 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1049 msgid "Attached is the" msgstr "Bifogat är" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1054 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1060 msgid "Sent news to" msgstr "Skickat nyheter till" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1084 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1169 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1288 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1090 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1175 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1294 msgid "Auto convert the following books before uploading to the device?" msgstr "" "Skall följande böcker konverteras automatiskt innan de skickas till enheten?" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1114 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1120 msgid "Sending catalogs to device." msgstr "Skickar kataloger till enhet." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1201 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1207 msgid "Sending news to device." msgstr "Skickar nyheter till enheten." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1254 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1260 msgid "Sending books to device." msgstr "Skickar böcker till enheten." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1296 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1302 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." @@ -6353,11 +6361,11 @@ msgstr "" "format hittades. Konvertera boken/böckerna till ett format som stöds av " "enheten först." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1360 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1366 msgid "No space on device" msgstr "Inget ledigt utrymme på enheten" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1361 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1367 msgid "" "

Cannot upload books to device there is no more free space available " msgstr "" @@ -7744,45 +7752,45 @@ msgid "Advanced Search" msgstr "Avancerad sökning" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:199 -msgid "Find entries that have..." -msgstr "Hitta poster som ..." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:200 -msgid "&All these words:" -msgstr "&Alla dessa ord:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:201 -msgid "This exact &phrase:" -msgstr "Exakt denna fras:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:202 -msgid "&One or more of these words:" -msgstr "Ett eller flera av dessa &ord:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:203 -msgid "But dont show entries that have..." -msgstr "Men visa inte poster som har ..." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:204 -msgid "Any of these &unwanted words:" -msgstr "Något av dessa oönskade ord:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:205 msgid "What kind of match to use:" msgstr "Vilket slags matchning skall användas:" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:200 +msgid "Contains: the word or phrase matches anywhere in the metadata field" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:201 +msgid "Equals: the word or phrase must match the entire metadata field" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:202 +msgid "" +"Regular expression: the expression must match anywhere in the metadata field" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:203 +msgid "Find entries that have..." +msgstr "Hitta poster som ..." + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:204 +msgid "&All these words:" +msgstr "&Alla dessa ord:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:205 +msgid "This exact &phrase:" +msgstr "Exakt denna fras:" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:206 -msgid "Contains: the word or phrase matches anywhere in the metadata" -msgstr "Innehåller: ordet eller frasen matcher någonstans i metadata" +msgid "&One or more of these words:" +msgstr "Ett eller flera av dessa &ord:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:207 -msgid "Equals: the word or phrase must match an entire metadata field" -msgstr "Betydelse: ordet eller frasen som måste matcha ett helt metadatafält" +msgid "But dont show entries that have..." +msgstr "Men visa inte poster som har ..." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:208 -msgid "" -"Regular expression: the expression must match anywhere in the metadata" -msgstr "Reguljärt uttryck: uttrycket måste passa in någonstans i metadata" +msgid "Any of these &unwanted words:" +msgstr "Något av dessa oönskade ord:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:209 msgid "" @@ -7824,7 +7832,7 @@ msgstr "Ange etikett separerade med mellanslag" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:219 msgid "&Clear" -msgstr "%Rensa" +msgstr "&Rensa" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:220 msgid "Search only in specific fields:" @@ -8622,47 +8630,47 @@ msgstr "Markerat för borttagning" msgid "Double click to edit me

" msgstr "Dubbelklicka för att redigera mig

" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:146 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:147 msgid "Hide column %s" msgstr "Dölj kolumn %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:152 msgid "Sort on %s" msgstr "Sortera på %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:152 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:153 msgid "Ascending" msgstr "Stigande" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:156 msgid "Descending" msgstr "Fallande" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:168 msgid "Change text alignment for %s" msgstr "Ändra textjustering för %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 msgid "Left" msgstr "Vänster" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 msgid "Right" msgstr "till höger" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:171 msgid "Center" msgstr "Centrera" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:190 msgid "Show column" msgstr "Visa kolumn" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:201 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:202 msgid "Restore default layout" msgstr "Återställ standardutformning" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:742 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:743 msgid "" "Dropping onto a device is not supported. First add the book to the calibre " "library." @@ -13625,6 +13633,16 @@ msgstr "Hämta inte CSS-stilmallar." #~ "Automatically create the author sort entry based on the current author entry" #~ msgstr "Gissa hur författaren skall sorteras utifrån dess namn" +#~ msgid "Contains: the word or phrase matches anywhere in the metadata" +#~ msgstr "Innehåller: ordet eller frasen matcher någonstans i metadata" + +#~ msgid "Equals: the word or phrase must match an entire metadata field" +#~ msgstr "Betydelse: ordet eller frasen som måste matcha ett helt metadatafält" + +#~ msgid "" +#~ "Regular expression: the expression must match anywhere in the metadata" +#~ msgstr "Reguljärt uttryck: uttrycket måste passa in någonstans i metadata" + #~ msgid "" #~ "For help with writing advanced news recipes, please visit User Recipes" diff --git a/src/calibre/translations/th.po b/src/calibre/translations/th.po index 817a2a8e08..ddfe6247b1 100644 --- a/src/calibre/translations/th.po +++ b/src/calibre/translations/th.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2010-11-06 15:45+0000\n" -"PO-Revision-Date: 2010-11-06 00:56+0000\n" +"POT-Creation-Date: 2010-11-12 23:11+0000\n" +"PO-Revision-Date: 2010-11-13 04:51+0000\n" "Last-Translator: sksy \n" "Language-Team: Thai \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-07 04:47+0000\n" +"X-Launchpad-Export-Date: 2010-11-13 04:54+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:345 @@ -40,7 +40,7 @@ msgstr "ไม่มีอะไรเลย" #: /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:643 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:650 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:401 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 @@ -83,14 +83,14 @@ msgstr "ไม่มีอะไรเลย" #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:78 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:119 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:153 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:611 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:817 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:819 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:620 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:826 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:828 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:911 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:916 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:913 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:918 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:984 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:143 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:150 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:64 @@ -132,8 +132,8 @@ msgstr "ไม่มีอะไรเลย" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:141 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:927 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:936 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1243 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1246 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1249 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1252 #: /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 @@ -201,7 +201,7 @@ msgstr "การทำงานของส่วนติดต่อผู้ msgid "Preferences" msgstr "ปรับแต่ง" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:17 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:15 msgid "" "Follow all local links in an HTML file and create a ZIP file containing all " "linked files. This plugin is run every time you add an HTML file to the " @@ -211,14 +211,14 @@ msgstr "" "และสำเนาไฟล์เหล่านั้นไว้เพื่อนำมาสร้างเป็นไฟล์ ZIP " "ปลั้กอินนี้จะทำงานทุกครั้งที่คุณเพิ่มไฟล์ HTML เข้าไปในไลเบอรลี่" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:53 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:51 msgid "" "Character encoding for the input HTML files. Common choices include: cp1252, " "latin1, iso-8859-1 and utf-8." msgstr "" "รหัสตัวอักษรที่ใช้โดยทั่วไป ได้แก่ cp1252, latin1, iso-8859-1 และ utf-8" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:60 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:58 msgid "" "Create a PMLZ archive containing the PML file and all images in the " "directory pmlname_img or images. This plugin is run every time you add a PML " @@ -227,7 +227,7 @@ msgstr "" "สร้างชุดเอกสาร PMLZ ซึ่งประกอบด้วยไฟล์ PML และรูปทั้งหมดที่อยู่ในไดเรคตอรี่ " "pmlname_img หรือ images" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:94 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:92 msgid "Extract cover from comic files" msgstr "แยกปกออกจากหนังสือ" @@ -265,43 +265,43 @@ msgstr "อ่านข้อมูลจากหนังสือในไฟ msgid "Set metadata from %s files" msgstr "ตั้งค่าข้อมูลจาก %s ไฟล์" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:711 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:712 msgid "Look and Feel" msgstr "รูปลักษณ์" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:725 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:714 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:726 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:737 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:748 msgid "Interface" msgstr "ส่วนติดต่อ" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:717 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:718 msgid "Adjust the look and feel of the calibre interface to suit your tastes" msgstr "ปรับเปลี่ยนรูปลักษณ์ให้เหมาะกับรสนิยมในการใช้งานของคุณเอง" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:723 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 msgid "Behavior" msgstr "พฤติกรรม" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:729 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:730 msgid "Change the way calibre behaves" msgstr "เปลี่ยนแปลงพฤติกรรมในการทำงานของ calibre" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:734 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:206 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:735 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:209 msgid "Add your own columns" msgstr "เพิ่มคอลัมน์ของคุณเอง" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:740 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:741 msgid "Add/remove your own columns to the calibre book list" msgstr "เพิ่ม/ลดคอลัมน์ของคุณเองในรายการหนังสือของ calibre" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:745 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:746 msgid "Customize the toolbar" msgstr "ปรับเปลี่ยนทูลบาร์" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:751 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:752 msgid "" "Customize the toolbars and context menus, changing which actions are " "available in each" @@ -309,87 +309,87 @@ msgstr "" "ปรับเปลี่ยนทูลบาร์และเมนูเนื้อหา " "โดยกำหนดการเรียกใช้โปรแกรมในแต่ละเมนูและทูลบาร์" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:757 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 msgid "Input Options" msgstr "ตัวเลือกอินพุท" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:759 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:770 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:760 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:771 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:782 msgid "Conversion" msgstr "แปลงไฟล์" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:763 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:764 msgid "Set conversion options specific to each input format" msgstr "กำหนดตัวเลือกในการแปลงไฟล์ให้เฉพาะเจาะจงกับรูปแบบอินพุท" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:768 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 msgid "Common Options" msgstr "ตัวเลือกทั่วไป" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:774 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:775 msgid "Set conversion options common to all formats" msgstr "กำหนดตัวเลือกในการแปลงไฟล์ให้ใช้กับทุกรูปแบบ" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:779 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:780 msgid "Output Options" msgstr "ตัวเลือกเอาท์พุท" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:785 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:786 msgid "Set conversion options specific to each output format" msgstr "กำหนดตัวเลือกในการแปลงไฟล์ให้เฉพาะเจาะจงกับรูปแบบเอาท์พุท" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:790 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:791 msgid "Adding books" msgstr "เพิ่มหนังสือ" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:792 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:804 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:816 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:828 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:817 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:829 msgid "Import/Export" msgstr "นำเข้า/ส่งออก" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:796 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:797 msgid "Control how calibre reads metadata from files when adding books" msgstr "ควบคุมให้ calibre อ่านชุดข้อมูลจากไฟล์ในเวลาที่เพิ่มหนังสือ" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:802 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:803 msgid "Saving books to disk" msgstr "บันทึกหนังสือลงดิสก์" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:808 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:809 msgid "" "Control how calibre exports files from its database to disk when using Save " "to disk" msgstr "ควบคุมให้ calibre ส่งออกไฟล์จากฐานข้อมูลลงดิสก์เวลาสั่งบันทึก" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:814 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:815 msgid "Sending books to devices" msgstr "ส่งหนังสือไปยังอุปกรณ์ปลายทาง" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:820 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:821 msgid "Control how calibre transfers files to your ebook reader" msgstr "ควบคุมให้ calibre ส่งถ่ายไฟล์ลงในอีบุคส์รีดเดอร์" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:826 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:827 msgid "Metadata plugboards" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:832 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:833 msgid "Change metadata fields before saving/sending" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:837 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:838 msgid "Sharing books by email" msgstr "แบ่งปันทางอีเมลล์" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:839 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:851 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:840 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:852 msgid "Sharing" msgstr "แบ่งปัน" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:843 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:844 msgid "" "Setup sharing of books via email. Can be used for automatic sending of " "downloaded news to your devices" @@ -397,11 +397,11 @@ msgstr "" "การตั้งค่าแบ่งปันทางอีเมลล์สามารถใช้เป็นช่องทางในการส่งข้่าวสารการเดาน์โหลดโด" "ยอัตโนมัติไปยังอุปกรณ์ปลายทางของท่านได้" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:849 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:850 msgid "Sharing over the net" msgstr "แบ่งปันผ่านเน็ท" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:855 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:856 msgid "" "Setup the calibre Content Server which will give you access to your calibre " "library from anywhere, on any device, over the internet" @@ -409,33 +409,33 @@ msgstr "" "ตั้งค่าให้ calibre เป็นเซิฟเวอร์จะทำให้คุณสามารถเข้ามายังห้องสมุด calibre " "ของคุณจาก ณ ที่แห่งใดก็ได้ จากอุปกรณ์สื่อสารใดก็ได้ผ่านอินเตอร์เน็ท" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:862 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:863 msgid "Plugins" msgstr "ปลั๊กอิน" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:864 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:876 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:887 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:865 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:877 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:888 msgid "Advanced" msgstr "เชี่ยวชาญ" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:868 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:869 msgid "Add/remove/customize various bits of calibre functionality" msgstr "เพิ่ม/ลด/ปรับแต่ง ฟังก์ชั่นต่างๆของ calibre" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:874 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:875 msgid "Tweaks" msgstr "ปรับแต่ง" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:880 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:881 msgid "Fine tune how calibre behaves in various contexts" msgstr "ปรับพฤติกรรมของ calibre ที่จะตอบสนองกับส่วนต่างๆอย่างละเอียด" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:885 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:886 msgid "Miscellaneous" msgstr "อื่นๆ" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:891 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:892 msgid "Miscellaneous advanced configuration" msgstr "การปรับแต่งค่าตั้งต้นอื่นๆ" @@ -480,7 +480,7 @@ msgstr "" "งมากหากคุณไม่รู้อะไรเลยเกี่ยวกับเอกสารที่จะนำเข้า" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:59 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:436 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:444 msgid "" "This profile is intended for the SONY PRS line. The 500/505/600/700 etc." msgstr "" @@ -492,62 +492,62 @@ msgid "This profile is intended for the SONY PRS 300." msgstr "ชุดข้อมูลนี้ทำมาสำหรับ SONY PRS 300 โดยเฉพาะ" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:80 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:476 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:484 msgid "This profile is intended for the SONY PRS-900." msgstr "ชุดข้อมูลนี้ทำมาสำหรับ SONY PRS-900 โดยเฉพาะ" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:88 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:506 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:513 msgid "This profile is intended for the Microsoft Reader." msgstr "ชุดข้อมูลนี้ทำมาสำหรับ Microsoft Reader โดยเฉพาะ" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:99 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:517 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:524 msgid "This profile is intended for the Mobipocket books." msgstr "ชุดข้อมูลนี้ทำมาสำหรับ Mobipocket books โดยเฉพาะ" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:112 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:530 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:537 msgid "This profile is intended for the Hanlin V3 and its clones." msgstr "ชุดข้อมูลนี้ทำมาสำหรับ Hanlin V3 และรุ่นที่ลอกแบบ โดยเฉพาะ" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:124 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:542 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:549 msgid "This profile is intended for the Hanlin V5 and its clones." msgstr "ชุดข้อมูลนี้ทำมาสำหรับ Hanlin V5 และรุ่นลอกแบบ โดยเฉพาะ" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:134 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:550 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:557 msgid "This profile is intended for the Cybook G3." msgstr "ชุดข้อมูลนี้ทำมาสำหรับ Cybook G3 โดยเฉพาะ" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:147 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:563 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:570 msgid "This profile is intended for the Cybook Opus." msgstr "ชุดข้อมูลนี้ทำมาสำหรับ Cybook Opus โดยเฉพาะ" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:159 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:576 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:583 msgid "This profile is intended for the Amazon Kindle." msgstr "ชุดข้อมูลนี้ทำมาสำหรับ Amazon Kindle โดยเฉพาะ" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:171 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:617 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:631 msgid "This profile is intended for the Irex Illiad." msgstr "ชุดข้อมูลนี้ทำมาสำหรับ Irex Illiad โดยเฉพาะ" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:183 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:630 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:644 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:196 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:644 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:658 msgid "This profile is intended for the IRex Digital Reader 800." msgstr "ชุดข้อมูลนี้ทำมาสำหรับ IRex Digital Reader 800 โดยเฉพาะ" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:208 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:658 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:672 msgid "This profile is intended for the B&N Nook." msgstr "ชุดข้อมูลนี้ทำมาสำหรับ B&N Nook โดยเฉพาะ" @@ -565,30 +565,30 @@ msgstr "" "ซึ่งจะเหมาะกับเอกสารที่คุณผลิตแล้วต้องการให้อ่านบนคอมพิวเตอร์ " "หรืออุปกรณ์มาตรฐานกลุ่มหนึ่ง" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:273 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:276 msgid "" "Intended for the iPad and similar devices with a resolution of 768x1024" msgstr "" "เจาะจงสำหรับ iPad และอุปกรณ์ที่มีลักษณะเดียวกันซึ่งมีค่ารีโซลูชั่นเท่ากับ " "768x1024" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:427 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:435 msgid "Intended for generic tablet devices, does no resizing of images" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:454 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:462 msgid "This profile is intended for the Kobo Reader." msgstr "ชุดข้อมูลนี้ทำมาสำหรับ Kobo Reader โดยเฉพาะ" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:467 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:475 msgid "This profile is intended for the SONY PRS-300." msgstr "ชุดข้อมูลนี้ทำมาสำหรับ SONY PRS-300 โดยเฉพาะ" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:485 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:493 msgid "This profile is intended for the 5-inch JetBook." msgstr "ชุดข้อมูลนี้ทำมาสำหรับ JetBook ขนาด 5 นิ้ว โดยเฉพาะ" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:494 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:502 msgid "" "This profile is intended for the SONY PRS line. The 500/505/700 etc, in " "landscape mode. Mainly useful for comics." @@ -596,13 +596,13 @@ msgstr "" "ชุดข้อมูลนี้ทำมาสำหรับบรรทัดใน SONY PRS โดยเฉพาะรุ่น 500/505/700 " "เป็นต้นในโหมดของแนวขวาง ซึ่งเหมาะกับพวกหนังสือการ์ตูน" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:597 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:609 msgid "This profile is intended for the Amazon Kindle DX." msgstr "ชุดข้อมูลนี้ทำมาสำหรับ Amazon Kindle DX โดยเฉพาะ" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:672 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:686 msgid "This profile is intended for the Sanda Bambook." -msgstr "" +msgstr "ชุดข้อมูลนี้ใช้สำหรับ แซนด้า แบมบุค" #: /home/kovid/work/calibre/src/calibre/customize/ui.py:34 msgid "Installed plugins" @@ -670,7 +670,7 @@ msgstr "พักใช้งานเนมปลั้กอิน" msgid "Communicate with Android phones." msgstr "ติดต่อกับโทรศัพท์แอนดรอยด์" -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:53 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:56 msgid "" "Comma separated list of directories to send e-books to on the device. The " "first one that exists will be used" @@ -678,7 +678,7 @@ msgstr "" "รายการไดเรคตอรี่ที่คั่นด้วยคอมม่าเพื่อส่งอีบุคส์ไปยังอุปกรณ์ปลายทางซึ่งจะใช้ช" "ื่อที่พบครั้งแรกก่อน" -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:95 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:98 msgid "Communicate with S60 phones." msgstr "ติดต่อกับโทรศัพท์ S60" @@ -999,7 +999,7 @@ msgstr "ติดต่อกับ Sweex MM300" #: /home/kovid/work/calibre/src/calibre/devices/misc.py:79 msgid "Communicate with the Digma Q600" -msgstr "" +msgstr "ติดต่อกับ ดิ๊กม่า คิว 600" #: /home/kovid/work/calibre/src/calibre/devices/misc.py:88 msgid "Communicate with the Kogan" @@ -1038,6 +1038,14 @@ msgstr "The Nook" msgid "Communicate with the Nook eBook reader." msgstr "ติดต่อกับ The Nook eBook reader" +#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:85 +msgid "Nook Color" +msgstr "นุ๊กคัลเลอร์" + +#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:86 +msgid "Communicate with the Nook Color eBook reader." +msgstr "ติดต่อกับเครื่องอ่านอีบุ๊คนุ๊กคัลเลอร์" + #: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:17 msgid "Communicate with the Nuut2 eBook reader." msgstr "ติดต่อกับ Nuut2 eBook reader" @@ -1077,7 +1085,7 @@ msgstr "ติดต่อกับ Newsmy reader" #: /home/kovid/work/calibre/src/calibre/devices/teclast/driver.py:47 msgid "Communicate with the Pico reader." -msgstr "" +msgstr "ติดต่อกับเครื่องอ่านพิคโก" #: /home/kovid/work/calibre/src/calibre/devices/teclast/driver.py:57 msgid "Communicate with the iPapyrus reader." @@ -1119,6 +1127,7 @@ msgid "" "The main memory of %s is read only. This usually happens because of file " "system errors." msgstr "" +"หน่วยความจำหลักของ %s อยู่ในสถานะอ่านอย่างเดียวส่วนใหญ่เกิดจากระบบไฟล์มีปัญหา" #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:815 #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:817 @@ -1127,7 +1136,7 @@ msgstr "ตัวเครื่องไม่มี สดอเรจ กา #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:819 msgid "Selected slot: %s is not supported." -msgstr "" +msgstr "สลอทที่เลือก :%s ยังไม่มีโปรแกรมสนับสนุน" #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:848 msgid "There is insufficient free space in main memory" @@ -1210,6 +1219,9 @@ msgid "" "of less than 256 may result in blurred text on your device if you are " "creating your comics in EPUB format." msgstr "" +"จำนวนสีของการแปลงภาพให้เป็นขาวดำ ค่าเริ่มต้น:%default ตั้งค่าต่ำกว่า 256 " +"สีจะทำให้ตัวอักษรบนเครื่องของท่านไม่ชัดในกรณีที่แปลงไฟล์หนังสือการ์ตูนเป็นแบบ" +" EPUB" #: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:262 msgid "" @@ -2280,8 +2292,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:605 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:45 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:102 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:109 #: /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 @@ -2315,8 +2327,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:39 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:206 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:189 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:104 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:79 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:325 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1131 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:178 @@ -2596,7 +2608,7 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1308 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1399 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 msgid "Cover" msgstr "" @@ -2631,74 +2643,74 @@ msgstr "" msgid "All articles" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:259 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:262 msgid "This is an Amazon Topaz book. It cannot be processed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1400 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 msgid "Title Page" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 #: /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:199 msgid "Table of Contents" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 msgid "Index" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 msgid "Glossary" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 msgid "Acknowledgements" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 msgid "Bibliography" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 msgid "Colophon" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 msgid "Copyright" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 msgid "Dedication" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 msgid "Epigraph" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 msgid "Foreword" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 msgid "List of Illustrations" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 msgid "List of Tables" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 msgid "Notes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1416 msgid "Preface" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1417 msgid "Main Text" msgstr "" @@ -3630,7 +3642,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:391 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:739 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:742 msgid "Not allowed" msgstr "" @@ -3697,7 +3709,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:147 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:720 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:683 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:685 #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:189 msgid "Failed" msgstr "" @@ -4406,11 +4418,11 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:25 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:49 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:58 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:403 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:119 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:120 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:121 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:131 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:405 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:137 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:320 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1117 @@ -4419,10 +4431,10 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:52 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:122 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:123 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:124 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:133 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:319 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/emailp.py:24 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:117 @@ -4453,7 +4465,7 @@ msgstr "" msgid "None" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:404 msgid "Double-click to open Book Details window" msgstr "" @@ -4666,6 +4678,19 @@ msgstr "" msgid "Tab template for catalog.ui" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:25 +msgid "Bold" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:26 +msgid "Italic" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:28 +msgid "Underline" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:36 msgid "" "For settings that cannot be specified in this dialog, use the values saved " @@ -4673,11 +4698,11 @@ msgid "" "specified in the Preferences" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:70 msgid "Bulk Convert" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:83 #: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:185 msgid "Options specific to the output format." msgstr "" @@ -5161,6 +5186,7 @@ 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:353 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:214 msgid "&Series:" msgstr "" @@ -5346,7 +5372,7 @@ msgid "Options specific to the input format." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:76 #: /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" @@ -5533,8 +5559,8 @@ msgid "Force maximum line length" msgstr "" #: /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:72 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:78 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:46 #: /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 @@ -5838,10 +5864,10 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/device.py:982 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:990 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1083 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1168 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1287 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1295 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1089 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1174 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1293 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1301 msgid "No suitable formats" msgstr "" @@ -5866,47 +5892,47 @@ msgstr "" msgid "Sent by email:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1042 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1048 msgid "News:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1043 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1049 msgid "Attached is the" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1054 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1060 msgid "Sent news to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1084 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1169 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1288 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1090 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1175 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1294 msgid "Auto convert the following books before uploading to the device?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1114 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1120 msgid "Sending catalogs to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1201 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1207 msgid "Sending news to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1254 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1260 msgid "Sending books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1296 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1302 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:1360 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1366 msgid "No space on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1361 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1367 msgid "" "

Cannot upload books to device there is no more free space available " msgstr "" @@ -5957,15 +5983,15 @@ msgstr "" msgid "&Paste from clipboard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:80 msgid "Fit &cover within view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:81 msgid "&Previous" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:82 msgid "&Next" msgstr "" @@ -6128,6 +6154,7 @@ msgid "Set options for converting %s" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:211 msgid "&Title:" msgstr "" @@ -6378,13 +6405,12 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:274 msgid "" "You can destroy your library using this feature. Changes are " -"permanent. There is no undo function. This feature is experimental, and " -"there may be bugs. You are strongly encouraged to back up your library " -"before proceeding.

Search and replace in text fields using character " -"matching or regular expressions. " +"permanent. There is no undo function. You are strongly encouraged to back up " +"your library before proceeding.

Search and replace in text fields using " +"character matching or regular expressions. " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:282 msgid "" "In character mode, the field is searched for the entered search text. The " "text is replaced by the specified replacement text everywhere it is found in " @@ -6394,7 +6420,7 @@ msgid "" "text will match both upper- and lower-case letters" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:293 msgid "" "In regular expression mode, the search text is an arbitrary python-" "compatible regular expression. The replacement text can contain " @@ -6409,30 +6435,30 @@ msgid "" "function." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:436 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:438 msgid "You must specify a destination when source is a composite field" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:528 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:536 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:631 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:538 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:633 msgid "Search/replace invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:529 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:531 msgid "" "Authors cannot be set to the empty string. Book title %s not processed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:537 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:539 msgid "Title cannot be set to the empty string. Book title %s not processed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:632 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:634 msgid "Search pattern is invalid: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:671 msgid "" "Applying changes to %d books.\n" "Phase {0} {1}%%." @@ -6673,7 +6699,7 @@ msgid "Your test:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:401 -msgid "&Search and replace (experimental)" +msgid "&Search and replace" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:91 @@ -7183,61 +7209,98 @@ msgstr "" msgid "Negate" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:198 msgid "Advanced Search" msgstr "" -#: /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:120 -msgid "&All these words:" -msgstr "" - -#: /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:122 -msgid "&One or more of these words:" -msgstr "" - -#: /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:124 -msgid "Any of these &unwanted words:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:199 msgid "What kind of match to use:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:126 -msgid "Contains: the word or phrase matches anywhere in the metadata" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:200 +msgid "Contains: the word or phrase matches anywhere in the metadata field" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:127 -msgid "Equals: the word or phrase must match an entire metadata field" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:201 +msgid "Equals: the word or phrase must match the entire metadata field" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:202 msgid "" -"Regular expression: the expression must match anywhere in the metadata" +"Regular expression: the expression must match anywhere in the metadata field" msgstr "" -#: /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:203 +msgid "Find entries that have..." +msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:204 +msgid "&All these words:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:205 +msgid "This exact &phrase:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:206 +msgid "&One or more of these words:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:207 +msgid "But dont show entries that have..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:208 +msgid "Any of these &unwanted words:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:209 msgid "" "See the User Manual for more help" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:210 +msgid "A&dvanced Search" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:212 +msgid "Enter the title." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:213 +msgid "&Author:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:215 +msgid "Ta&gs:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:216 +msgid "Enter an author's name. Only one author can be used." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:217 +msgid "" +"Enter a series name, without an index. Only one series name can be used." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:218 +msgid "Enter tags separated by spaces" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:219 +msgid "&Clear" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:220 +msgid "Search only in specific fields:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:221 +msgid "Titl&e/Author/Series ..." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/select_formats.py:45 msgid "Choose formats" msgstr "" @@ -7883,37 +7946,41 @@ msgid "" "Books display will be restricted to those matching the selected saved search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:170 +msgid "Shift+Ctrl+F" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:173 msgid "Advanced search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:177 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:178 msgid "" "

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

Words separated by spaces are ANDed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:181 msgid "&Go!" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:187 msgid "Do Quick Search (you can also press the Enter key)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:192 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:193 msgid "Reset Quick Search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:204 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:205 msgid "Copy current search text (instead of search name)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:210 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:211 msgid "Save current search under the name shown in the box" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:217 msgid "Delete current saved search" msgstr "" @@ -7970,47 +8037,47 @@ msgstr "" msgid "Double click to edit me

" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:144 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:147 msgid "Hide column %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:152 msgid "Sort on %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:150 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:153 msgid "Ascending" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:153 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:156 msgid "Descending" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:168 msgid "Change text alignment for %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 msgid "Left" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 msgid "Right" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:171 msgid "Center" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:190 msgid "Show column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:199 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:202 msgid "Restore default layout" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:740 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:743 msgid "" "Dropping onto a device is not supported. First add the book to the calibre " "library." @@ -9758,7 +9825,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:704 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:708 msgid "Remember last used window size" msgstr "" @@ -9930,65 +9997,65 @@ msgstr "" msgid "No matches found for: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:481 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:485 msgid "Loading flow..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:517 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:521 msgid "Laying out %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:548 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:552 msgid "Bookmark #%d" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:552 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:556 msgid "Add bookmark" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:553 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:557 msgid "Enter title for bookmark:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:563 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:567 msgid "Manage Bookmarks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:600 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:604 msgid "Loading ebook..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:608 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:612 msgid "DRM Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:609 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:613 msgid "

This book is protected by DRM" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:613 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:617 msgid "Could not open ebook" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:691 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:695 msgid "Options to control the ebook viewer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:698 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:702 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:701 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:705 msgid "" "If specified, viewer window will try to open full screen when started." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:706 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:710 msgid "Print javascript alert and console messages to the console" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:712 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:716 msgid "" "%prog [options] file\n" "\n" @@ -11989,6 +12056,9 @@ msgstr "" msgid "Do not download CSS stylesheets." msgstr "" +#~ msgid " " +#~ msgstr " " + #~ msgid "Communicate with the Nokia 810 internet tablet." #~ msgstr "ติดต่อกับ Nokia 810 internet tablet" From ab527157db84cfcd2d58973bcc110cb4d61653e1 Mon Sep 17 00:00:00 2001 From: Translators <> Date: Sun, 14 Nov 2010 05:05:50 +0000 Subject: [PATCH 010/375] Launchpad automatic translations update. --- src/calibre/translations/ca.po | 15 ++++++++----- src/calibre/translations/cs.po | 31 ++++++++++++++------------- src/calibre/translations/da.po | 16 +++++++------- src/calibre/translations/en_GB.po | 2 +- src/calibre/translations/eu.po | 15 +++++++------ src/calibre/translations/fr.po | 31 ++++++++++++++------------- src/calibre/translations/it.po | 2 +- src/calibre/translations/sr.po | 2 +- src/calibre/translations/sv.po | 2 +- src/calibre/translations/th.po | 35 ++++++++++++++++++++++++------- 10 files changed, 91 insertions(+), 60 deletions(-) diff --git a/src/calibre/translations/ca.po b/src/calibre/translations/ca.po index 7dc7075706..150b871a0d 100644 --- a/src/calibre/translations/ca.po +++ b/src/calibre/translations/ca.po @@ -11,13 +11,13 @@ msgstr "" "Project-Id-Version: ca\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-11-12 23:11+0000\n" -"PO-Revision-Date: 2010-11-12 20:28+0000\n" +"PO-Revision-Date: 2010-11-13 12:22+0000\n" "Last-Translator: FerranRius \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-13 04:52+0000\n" +"X-Launchpad-Export-Date: 2010-11-14 05:03+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -1063,11 +1063,11 @@ msgstr "Comunica't amb un lector Nook." #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:85 msgid "Nook Color" -msgstr "" +msgstr "Nook Color" #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:86 msgid "Communicate with the Nook Color eBook reader." -msgstr "" +msgstr "Comunica't amb un lector Nook Color." #: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:17 msgid "Communicate with the Nuut2 eBook reader." @@ -6782,7 +6782,7 @@ msgstr "ISBN" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:162 msgid "Finding metadata..." -msgstr "S'esta cercant les metadades..." +msgstr "S'està cercant les metadades..." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:176 msgid "Could not find metadata" @@ -7852,15 +7852,20 @@ msgstr "Tipus de coincidència que s'ha de fer servir:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:200 msgid "Contains: the word or phrase matches anywhere in the metadata field" msgstr "" +"Conté: la paraula o frase coincideix amb qualsevol lloc del camp de les " +"metadades" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:201 msgid "Equals: the word or phrase must match the entire metadata field" msgstr "" +"Equival: la paraula o frase ha de coincidir amb tot el camp de les metadades" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:202 msgid "" "Regular expression: the expression must match anywhere in the metadata field" msgstr "" +"Expressió regular: l'expressió ha de coincidir amb qualsevol lloc del camp " +"de les metadades" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:203 msgid "Find entries that have..." diff --git a/src/calibre/translations/cs.po b/src/calibre/translations/cs.po index 88f90c8704..972625bad5 100644 --- a/src/calibre/translations/cs.po +++ b/src/calibre/translations/cs.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-11-12 23:11+0000\n" -"PO-Revision-Date: 2010-11-12 22:54+0000\n" -"Last-Translator: Kovid Goyal \n" +"PO-Revision-Date: 2010-11-13 20:32+0000\n" +"Last-Translator: Aleš Bajtalon \n" "Language-Team: Czech \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-13 04:52+0000\n" +"X-Launchpad-Export-Date: 2010-11-14 05:04+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -990,7 +990,7 @@ msgstr "Spojit se s Sweex MM300" #: /home/kovid/work/calibre/src/calibre/devices/misc.py:79 msgid "Communicate with the Digma Q600" -msgstr "" +msgstr "Komunikovat se čtečkou Digma Q600" #: /home/kovid/work/calibre/src/calibre/devices/misc.py:88 msgid "Communicate with the Kogan" @@ -1031,11 +1031,11 @@ msgstr "Komunikuje se čtečkou Nook." #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:85 msgid "Nook Color" -msgstr "" +msgstr "Nook Color" #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:86 msgid "Communicate with the Nook Color eBook reader." -msgstr "" +msgstr "Komunikovat se čtečkou knih Nook Color" #: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:17 msgid "Communicate with the Nuut2 eBook reader." @@ -5661,7 +5661,7 @@ msgstr "TXT Výstup" #: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:51 msgid "&Line ending style:" -msgstr "" +msgstr "Styl konce řádku" #: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:53 msgid "&Maximum line length:" @@ -5793,7 +5793,7 @@ msgstr "Nehodnoceno" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:156 msgid "Set '%s' to today" -msgstr "" +msgstr "Nastavit '%s' na dnes" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:266 msgid " index:" @@ -5892,7 +5892,7 @@ msgstr "Hlavní paměť" #: /home/kovid/work/calibre/src/calibre/gui2/device.py:492 msgid "Send specific format to" -msgstr "" +msgstr "Poslat specifický formát" #: /home/kovid/work/calibre/src/calibre/gui2/device.py:493 msgid "Send and delete from library" @@ -5908,7 +5908,7 @@ msgstr "Cyba komunikace se zařízením" #: /home/kovid/work/calibre/src/calibre/gui2/device.py:679 msgid "Select folder to open as device" -msgstr "" +msgstr "Označit složku a otevřít jako zařízení" #: /home/kovid/work/calibre/src/calibre/gui2/device.py:726 msgid "Error talking to device" @@ -5971,7 +5971,7 @@ msgstr "od" #: /home/kovid/work/calibre/src/calibre/gui2/device.py:939 msgid "in the %s format." -msgstr "" +msgstr "v %s formátu" #: /home/kovid/work/calibre/src/calibre/gui2/device.py:952 msgid "Sending email to" @@ -5994,6 +5994,7 @@ msgstr "Automaticky konvertovat knihy před emailovým odesláním?" msgid "" "Could not email the following books as no suitable formats were found:" msgstr "" +"Nemohu emailovat následující knihy, nebyl nalezen žádný vhodný formát:" #: /home/kovid/work/calibre/src/calibre/gui2/device.py:1009 msgid "Failed to email books" @@ -11772,7 +11773,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:152 msgid "TAGS: %s
" -msgstr "" +msgstr "TAGY: %s
" #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:157 msgid "SERIES: %s [%s]
" @@ -12068,10 +12069,12 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/web/feeds/input.py:40 msgid "Username for sites that require a login to access content." msgstr "" +"Uživatelské jméno pro stránky, které vyžadují přihlášení pro přístup k " +"obsahu." #: /home/kovid/work/calibre/src/calibre/web/feeds/input.py:43 msgid "Password for sites that require a login to access content." -msgstr "" +msgstr "Heslo pro stránky, které vyžadují přihlášení pro přístup k obsahu." #: /home/kovid/work/calibre/src/calibre/web/feeds/input.py:47 msgid "" @@ -12124,7 +12127,7 @@ msgstr "Pokouším se stáhnout obálku..." #: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:871 msgid "Generating masthead..." -msgstr "" +msgstr "Generování tiráže..." #: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:952 msgid "Starting download [%d thread(s)]..." diff --git a/src/calibre/translations/da.po b/src/calibre/translations/da.po index dd93151e79..03f7ea5495 100644 --- a/src/calibre/translations/da.po +++ b/src/calibre/translations/da.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-11-12 23:11+0000\n" -"PO-Revision-Date: 2010-11-12 22:04+0000\n" -"Last-Translator: Kovid Goyal \n" +"PO-Revision-Date: 2010-11-13 06:55+0000\n" +"Last-Translator: Glenn \n" "Language-Team: Danish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-13 04:52+0000\n" +"X-Launchpad-Export-Date: 2010-11-14 05:04+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -1050,11 +1050,11 @@ msgstr "Kommunikér med Nook e-bogslæser." #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:85 msgid "Nook Color" -msgstr "" +msgstr "Nook Color" #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:86 msgid "Communicate with the Nook Color eBook reader." -msgstr "" +msgstr "Kommunikér med Nook Color eBook reader." #: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:17 msgid "Communicate with the Nuut2 eBook reader." @@ -7752,16 +7752,16 @@ msgstr "Hvilken slags match skal anvendes:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:200 msgid "Contains: the word or phrase matches anywhere in the metadata field" -msgstr "" +msgstr "Indeholder: Ordet eller frasen matcher overalt i metadatafeltet" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:201 msgid "Equals: the word or phrase must match the entire metadata field" -msgstr "" +msgstr "Lig med: Ordet eller frasen skal matchr med hele metadatafeltet" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:202 msgid "" "Regular expression: the expression must match anywhere in the metadata field" -msgstr "" +msgstr "Regulært udtryk: Udtrykket skal matche overalt i metadatafeltet" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:203 msgid "Find entries that have..." diff --git a/src/calibre/translations/en_GB.po b/src/calibre/translations/en_GB.po index de8c211c01..fcf30b4401 100644 --- a/src/calibre/translations/en_GB.po +++ b/src/calibre/translations/en_GB.po @@ -14,7 +14,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-13 04:55+0000\n" +"X-Launchpad-Export-Date: 2010-11-14 05:05+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 diff --git a/src/calibre/translations/eu.po b/src/calibre/translations/eu.po index 39c6d3ad4c..ff9ee685d6 100644 --- a/src/calibre/translations/eu.po +++ b/src/calibre/translations/eu.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-11-12 23:11+0000\n" -"PO-Revision-Date: 2010-11-12 22:57+0000\n" -"Last-Translator: Kovid Goyal \n" +"PO-Revision-Date: 2010-11-14 04:08+0000\n" +"Last-Translator: gorkaazk \n" "Language-Team: Basque \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-13 04:51+0000\n" +"X-Launchpad-Export-Date: 2010-11-14 05:03+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -1069,11 +1069,11 @@ msgstr "Komunikatu Nook eBook irakurgailuarekin." #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:85 msgid "Nook Color" -msgstr "" +msgstr "Nook Color" #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:86 msgid "Communicate with the Nook Color eBook reader." -msgstr "" +msgstr "Jar zaitez Nook Color eBook reader horrekin harremanetan." #: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:17 msgid "Communicate with the Nuut2 eBook reader." @@ -7981,15 +7981,18 @@ msgstr "Zein motatako bat etortze erabili:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:200 msgid "Contains: the word or phrase matches anywhere in the metadata field" msgstr "" +"Badauka: hitza edo esaldia metadatu eremuko edozein tokitan bat dator" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:201 msgid "Equals: the word or phrase must match the entire metadata field" -msgstr "" +msgstr "Berdinak: hitza edo esaldia metadatu eremu osoan bat etorri behar du" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:202 msgid "" "Regular expression: the expression must match anywhere in the metadata field" msgstr "" +"Adierazpen erregularra: adierazpenak metadatu eremuko edozein tokitan bat " +"etorri behar" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:203 msgid "Find entries that have..." diff --git a/src/calibre/translations/fr.po b/src/calibre/translations/fr.po index a93dc4d4b4..cc1274a4c5 100644 --- a/src/calibre/translations/fr.po +++ b/src/calibre/translations/fr.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: calibre 0.4.22\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-11-12 23:11+0000\n" -"PO-Revision-Date: 2010-11-12 22:36+0000\n" -"Last-Translator: Kovid Goyal \n" +"PO-Revision-Date: 2010-11-13 11:33+0000\n" +"Last-Translator: Vincent C. \n" "Language-Team: Français \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-13 04:52+0000\n" +"X-Launchpad-Export-Date: 2010-11-14 05:04+0000\n" "X-Generator: Launchpad (build Unknown)\n" "X-Poedit-Bookmarks: 1177,1104,-1,-1,-1,-1,-1,-1,-1,-1\n" "Generated-By: pygettext.py 1.5\n" @@ -1060,7 +1060,7 @@ msgstr "Communiquer avec le lecteur d'ebook Nook." #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:85 msgid "Nook Color" -msgstr "" +msgstr "Nook Couleur" #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:86 msgid "Communicate with the Nook Color eBook reader." @@ -5175,11 +5175,11 @@ msgstr "Gabarit d'étiquette pour catalog.ui" #: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:25 msgid "Bold" -msgstr "" +msgstr "Gras" #: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:26 msgid "Italic" -msgstr "" +msgstr "Italique" #: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:28 @@ -7367,7 +7367,7 @@ msgstr "Votre test :" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:401 msgid "&Search and replace" -msgstr "" +msgstr "Rechercher et remplacer" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:91 msgid "Last modified: %s" @@ -7970,40 +7970,41 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:210 msgid "A&dvanced Search" -msgstr "" +msgstr "Recherche avancée" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:212 msgid "Enter the title." -msgstr "" +msgstr "Entrer le titre." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:213 msgid "&Author:" -msgstr "" +msgstr "&Auteur:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:215 msgid "Ta&gs:" -msgstr "" +msgstr "Étiquettes:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:216 msgid "Enter an author's name. Only one author can be used." -msgstr "" +msgstr "Entrer un nom d'auteur. Un seul auteur peut être utilisé." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:217 msgid "" "Enter a series name, without an index. Only one series name can be used." msgstr "" +"Entrer un nom de séries, sans index. Un seul nom de séries peut être utilisé." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:218 msgid "Enter tags separated by spaces" -msgstr "" +msgstr "Entrer des étiquettes séparées par des espaces" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:219 msgid "&Clear" -msgstr "" +msgstr "Effacer" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:220 msgid "Search only in specific fields:" -msgstr "" +msgstr "Chercher seulement dans les champs spécifiques:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:221 msgid "Titl&e/Author/Series ..." diff --git a/src/calibre/translations/it.po b/src/calibre/translations/it.po index ed6e43bc88..428371e543 100644 --- a/src/calibre/translations/it.po +++ b/src/calibre/translations/it.po @@ -15,7 +15,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-13 04:53+0000\n" +"X-Launchpad-Export-Date: 2010-11-14 05:04+0000\n" "X-Generator: Launchpad (build Unknown)\n" "X-Poedit-Bookmarks: -1,-1,-1,-1,-1,1105,-1,1312,-1,-1\n" "Generated-By: pygettext.py 1.5\n" diff --git a/src/calibre/translations/sr.po b/src/calibre/translations/sr.po index fb0128dd16..41c0c58861 100644 --- a/src/calibre/translations/sr.po +++ b/src/calibre/translations/sr.po @@ -14,7 +14,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-13 04:54+0000\n" +"X-Launchpad-Export-Date: 2010-11-14 05:05+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 diff --git a/src/calibre/translations/sv.po b/src/calibre/translations/sv.po index 3c3466805e..656b1906ea 100644 --- a/src/calibre/translations/sv.po +++ b/src/calibre/translations/sv.po @@ -14,7 +14,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-13 04:54+0000\n" +"X-Launchpad-Export-Date: 2010-11-14 05:05+0000\n" "X-Generator: Launchpad (build Unknown)\n" "X-Poedit-Country: SWEDEN\n" "X-Poedit-Language: Swedish\n" diff --git a/src/calibre/translations/th.po b/src/calibre/translations/th.po index ddfe6247b1..0c7940a1a7 100644 --- a/src/calibre/translations/th.po +++ b/src/calibre/translations/th.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-11-12 23:11+0000\n" -"PO-Revision-Date: 2010-11-13 04:51+0000\n" +"PO-Revision-Date: 2010-11-13 05:27+0000\n" "Last-Translator: sksy \n" "Language-Team: Thai \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-13 04:54+0000\n" +"X-Launchpad-Export-Date: 2010-11-14 05:05+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:345 @@ -1576,21 +1576,29 @@ msgstr "" msgid "" "Set the top margin in pts. Default is %default. Note: 72 pts equals 1 inch" msgstr "" +"ตั้งค่ากั้นหน้าด้านบนเป็นหน่วยพอยท์ ค่าเริ่มต้นคือ %default หมายเหตุ 72 " +"พอยท์เท่ากับ 1 นิ้ว" #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:294 msgid "" "Set the bottom margin in pts. Default is %default. Note: 72 pts equals 1 inch" msgstr "" +"ตั้งค่ากั้นหน้าด้านล่างเป็นหน่วยพอยท์ ค่าเริ่มต้นคือ %default หมายเหตุ 72 " +"พอยท์เท่ากับ 1 นิ้ว" #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:299 msgid "" "Set the left margin in pts. Default is %default. Note: 72 pts equals 1 inch" msgstr "" +"ตั้งค่ากั้นหน้าด้านซ้ายเป็นหน่วยพอยท์ ค่าเริ่มต้นคือ %default หมายเหตุ 72 " +"พอยท์เท่ากับ 1 นิ้ว" #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:304 msgid "" "Set the right margin in pts. Default is %default. Note: 72 pts equals 1 inch" msgstr "" +"ตั้งค่ากั้นหน้าด้านขวาเป็นหน่วยพอยท์ ค่าเริ่มต้นคือ %default หมายเหตุ 72 " +"พอยท์เท่ากับ 1 นิ้ว" #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:310 msgid "" @@ -1607,6 +1615,9 @@ msgid "" "1.5em. Spacing removal will not work if the source file does not use " "paragraphs (

or

tags)." msgstr "" +"ขจัดช่องว่างระหว่างพารากราฟออกจะทำให้ระยะห่างอยู่ที่ 1.5em " +"แต่ฟังก์ชั่นนี้จะใช้ไม่ได้กับไฟล์ต้นฉบับที่ไม่มีการใช้แทรคพารากราฟ (แทรค

" +"หรือ

)" #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:327 msgid "" @@ -1614,6 +1625,9 @@ msgid "" "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/ebooks/conversion/plumber.py:334 msgid "" @@ -1626,6 +1640,8 @@ msgid "" "Insert a blank line between paragraphs. Will not work if the source file " "does not use paragraphs (

or

tags)." msgstr "" +"แทรกบรรทัดว่างระหว่างพารากราฟซึ่งจะไม่ทำงานถ้าหากไฟล์ต้นฉบับไม่มีการใช้แทรคพา" +"รากราฟ ( แทรค

หรือ

)" #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:347 msgid "" @@ -1726,7 +1742,7 @@ msgstr "กำหนดชื่อผู้แต่ง ถ้ามีหล #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:458 msgid "The version of the title to be used for sorting. " -msgstr "" +msgstr "ใช้เลขจำนวนครั้งในการพิมพ์เป็นดัชนีในการเรียงลำดับ " #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:462 msgid "String to be used when sorting by author. " @@ -1754,7 +1770,7 @@ msgstr "ตั้งค่าชุดหนังสือของอีบุ #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:482 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:62 msgid "Set the index of the book in this series." -msgstr "" +msgstr "ตั้งค่าดัชนีหนังสือในชุด" #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:486 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:64 @@ -1787,11 +1803,11 @@ msgstr "กำหนดวันที่พิมพ์" #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:510 msgid "Set the book timestamp (used by the date column in calibre)." -msgstr "" +msgstr "ตั้งค่าเวลาของหนังสือ (จะถูกใช้ในคอลัมวันที่ในโปรแกรมคาริเบอร์)" #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:610 msgid "Could not find an ebook inside the archive" -msgstr "" +msgstr "ไม่พบอีบุคส์ในที่เก็บไฟล์" #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:668 msgid "Values of series index and rating must be numbers. Ignoring" @@ -1799,7 +1815,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:675 msgid "Failed to parse date/time" -msgstr "" +msgstr "ไม่สามารถใส่วันเวลาลงไปได้" #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:830 msgid "Converting input to HTML..." @@ -1807,7 +1823,7 @@ msgstr "แปลงอินพุทเป็น HTML" #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:858 msgid "Running transforms on ebook..." -msgstr "" +msgstr "กำลังทำการแปลงอีบุ๊ค" #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:945 msgid "Creating" @@ -1912,6 +1928,9 @@ msgid "" "JetBook Lite. Without this option, such devices will display the cover as a " "blank page." msgstr "" +"ห้ามใช้ภาพในรูปแบบ SVG เป็นปกหนังสือ ใช้อ๊อฟชั่นนี้ถ้าต้องการให้ ไฟล์ EPUB " +"ของท่านสามารถใช้กับ ไอโฟน หรือ เจ็ทบุคได้ " +"เพราะถ้าไม่ใช้อ๊อฟชั่นนี้จะทำให้รูปหน้าปกแสดงเป็นหน้าว่างๆ" #: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:94 msgid "" From 12c0f70d2e221fc609ffa92bb9737f801b8936e6 Mon Sep 17 00:00:00 2001 From: Translators <> Date: Mon, 15 Nov 2010 04:59:27 +0000 Subject: [PATCH 011/375] Launchpad automatic translations update. --- src/calibre/translations/ca.po | 324 +++++++++++++++--------------- src/calibre/translations/en_GB.po | 15 +- src/calibre/translations/es.po | 16 +- src/calibre/translations/eu.po | 2 +- src/calibre/translations/nl.po | 151 +++++++------- src/calibre/translations/sr.po | 15 +- 6 files changed, 266 insertions(+), 257 deletions(-) diff --git a/src/calibre/translations/ca.po b/src/calibre/translations/ca.po index 150b871a0d..156c341567 100644 --- a/src/calibre/translations/ca.po +++ b/src/calibre/translations/ca.po @@ -11,18 +11,18 @@ msgstr "" "Project-Id-Version: ca\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-11-12 23:11+0000\n" -"PO-Revision-Date: 2010-11-13 12:22+0000\n" +"PO-Revision-Date: 2010-11-14 13:15+0000\n" "Last-Translator: FerranRius \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-14 05:03+0000\n" +"X-Launchpad-Export-Date: 2010-11-15 04:58+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 msgid "Does absolutely nothing" -msgstr "No fa absolutament res" +msgstr "No fa res" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:46 #: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:87 @@ -175,7 +175,7 @@ msgstr "Lector de metadades" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:238 msgid "Metadata writer" -msgstr "Escriptor de metadades" +msgstr "Editor de metadades" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:268 msgid "Catalog generator" @@ -201,9 +201,9 @@ msgid "" "linked files. This plugin is run every time you add an HTML file to the " "library." msgstr "" -"Segueix tots els enllaços locals en un fitxer HTML i crea un arxiu ZIP que " -"contingui els fitxers enllaçats. Aquest connector s'executa cada vegada que " -"s'afegeix un fitxer HTML a la biblioteca." +"Segueix tots els enllaços locals d'un fitxer HTML i crea un arxiu ZIP amb " +"tots els fitxers enllaçats. S'executa cada cop que s'afegeix un fitxer HTML " +"a la biblioteca." #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:51 msgid "" @@ -220,8 +220,8 @@ msgid "" "file to the library." msgstr "" "Crea un arxiu PMLZ que conté el fitxer PML i totes les imatges de les " -"carpetes pmlname_ing o images. Aquest connector s'executa cada vegada que " -"afegiu un fitxer PML a la biblioteca." +"carpetes pmlname_img o imatges. S'executa cada cop que s'afegeix un fitxer " +"PML a la biblioteca." #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:92 msgid "Extract cover from comic files" @@ -298,12 +298,11 @@ msgstr "Canvia el comportament del calibre" #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:735 #: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:209 msgid "Add your own columns" -msgstr "Afegeix les teves columnes" +msgstr "Columnes" #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:741 msgid "Add/remove your own columns to the calibre book list" -msgstr "" -"Afegeix/elimina les teves columnes a la llista de llibres del calibre" +msgstr "Configura les columnes de la llista de llibres del calibre" #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:746 msgid "Customize the toolbar" @@ -314,8 +313,8 @@ 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" +"Personalitza les barres d'eines i els menús de context, canviant les accions " +"que estaran disponibles" #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 msgid "Input Options" @@ -380,7 +379,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:815 msgid "Sending books to devices" -msgstr "S'està enviant llibres als dispositius" +msgstr "Enviant llibres als dispositius" #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:821 msgid "Control how calibre transfers files to your ebook reader" @@ -420,12 +419,12 @@ 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 donarà accés a la biblioteca des de " -"qualsevol lloc i dispositiu, a través d'internet" +"Configura el Servidor de Continguts que dona accés a la biblioteca a través " +"d'internet des de qualsevol lloc i dispositiu" #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:863 msgid "Plugins" -msgstr "Plugins" +msgstr "Connectors" #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:865 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:877 @@ -436,7 +435,7 @@ msgstr "Avançat" #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:869 msgid "Add/remove/customize various bits of calibre functionality" msgstr "" -"Afegeix/suprimeix/personalitza diversos bits de la funcionalitat del calibre" +"Afegeix/suprimeix/personalitza diverses parts de les funcions del calibre" #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:875 msgid "Tweaks" @@ -457,7 +456,7 @@ msgstr "Configuració avançada" #: /home/kovid/work/calibre/src/calibre/customize/conversion.py:102 msgid "Conversion Input" -msgstr "Entrada per a la conversió" +msgstr "Entrada de la conversió" #: /home/kovid/work/calibre/src/calibre/customize/conversion.py:134 msgid "" @@ -481,7 +480,7 @@ msgid "" "readable as possible. May not have any effect for some output plugins." msgstr "" "Si ho indiqueu, el connector de sortida intentarà generar una sortida que " -"sigui el més llegible possible. Potser no tingui cap efecte en alguns " +"sigui el més llegible possible. Pot ser que no tingui cap efecte en alguns " "connectors de sortida." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:47 @@ -966,7 +965,7 @@ msgid "" "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\" " +"«Im_Reading». Creeu una etiqueta amb el nom «Im_Reading» " #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:65 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:68 @@ -1373,7 +1372,7 @@ msgstr "" "EXT es l'extensió del fitxer de sortida. En aquest cas, el nom del fitxer de " "sortida es deriva del nom del fitxer d'entrada. Els noms dels fitxers no " "poden començar amb un guionet. Per acabar, si al fitxer_final no consigna " -"cap extensió, aleshores es tracta com una carpeta i com un \"llibre obert\" " +"cap extensió, aleshores es tracta com una carpeta i com un «llibre obert» " "(OEB), que consisteix en fitxer HTML que es desen a la carpeta. Aquests " "fitxers són els que normalment haurien passat al connector de sortida.\n" "\n" @@ -1533,9 +1532,9 @@ msgid "" "of Contents at level one. If this is specified, it takes precedence over " "other forms of auto-detection." msgstr "" -"L'expressió XPath que defineix totes les etiquetes que s'haurien d'afegir al " -"nivell 1 de l'Índex de Continguts. Si es configura així, s'hi aplica abans " -"que altres formes d'autodetecció." +"Expressió XPath amb totes les etiquetes que s'han d'afegir al nivell 1 de " +"l'índex. Si es configura així, s'aplica abans que altres formes de detecció " +"automàtica." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:193 msgid "" @@ -1543,9 +1542,8 @@ msgid "" "of Contents at level two. Each entry is added under the previous level one " "entry." msgstr "" -"L'expressió XPath que defineix totes les etiquetes que s'haurien d'afegir al " -"nivell 2 de l'Índex de Continguts. Cada entrada s'hi afegeix sota l'entrada " -"prèvia de nivell 1." +"Expressió XPath amb totes les etiquetes que s'han d'afegir al nivell 2 de " +"l'índex. Cada entrada s'afegeix a sota de l'entrada de nivell 1 prèvia." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:201 msgid "" @@ -1553,9 +1551,8 @@ msgid "" "of Contents at level three. Each entry is added under the previous level two " "entry." msgstr "" -"L'expressió XPath que defineix totes les etiquetes que s'haurien d'afegir al " -"nivell 3 de l'Índex de Continguts. Cada entrada s'hi afegeix sota l'entrada " -"prèvia de nivell 2." +"Expressió XPath amb totes les etiquetes que s'han d'afegir al nivell 3 de " +"l'índex. Cada entrada s'afegeix a sota de l'entrada de nivell 2 prèvia." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:209 msgid "" @@ -1563,14 +1560,13 @@ msgid "" "preference to the auto-generated one. With this option, the auto-generated " "one is always used." msgstr "" -"Normalment, si el fitxer d'origen ja disposa d'un índex, aquest és utilitzat " -"amb preferència a l'autogenerat. Amb aquesta opció sempre s'utilitza l'auto-" -"generat." +"Normalment s'utilitza preferentment l'índex del fitxer d'origen, si " +"existeix, al generat automàticament. Amb aquesta opció sempre s'utilitza el " +"generat automàticament." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:217 msgid "Don't add auto-detected chapters to the Table of Contents." -msgstr "" -"No afegeixis els capítols detectats automàticament a l'índex de continguts" +msgstr "No afegeixis els capítols detectats automàticament a l'índex." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:224 msgid "" @@ -1595,9 +1591,9 @@ msgid "" "Remove entries from the Table of Contents whose titles match the specified " "regular expression. Matching entries and all their children are removed." msgstr "" -"Elimina les entrades de l'Índex de Continguts quan els seus títols " -"coincideixin amb l'expressió indicada. Les entrades coincidents i els seus " -"subapartats seran eliminades." +"Suprimeix les entrades de l'índex quan els seus títols coincideixin amb " +"l'expressió indicada. Se suprimiran les entrades coincidents i els seus " +"subapartats." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:250 msgid "" @@ -1609,12 +1605,12 @@ msgid "" "User Manual for further help on using this feature." msgstr "" "Una expressió XPath per a detectar els títol dels capítols. Per defecte es " -"consideren les etiquetes

o

que contenen les paraules \"capítol\", " -"\"llibre\", \"secció\" o \"part\" com a títols de capítol a l'igual que les " -"etiquetes que indiquen class=\"capítol\". L'expressió emprada ha d'avaluar " -"un llistat d'elements. Per a inhabilitar aquesta opció, empreu l'opció " -"\"/\". Vegeu el tutorial de XPath al Manual de l'usuari del calibre per a " -"més informació quant a aquesta característica." +"consideren les etiquetes

o

que contenen les paraules «capítol», " +"«llibre», «secció» o «part» com a títols de capítol a l'igual que les " +"etiquetes que indiquen class=«capítol». L'expressió emprada ha d'avaluar un " +"llistat d'elements. Per a inhabilitar aquesta opció, empreu l'opció «/». " +"Vegeu el tutorial de XPath al Manual de l'usuari del calibre per a més " +"informació quant a aquesta característica." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:264 msgid "" @@ -1623,11 +1619,11 @@ msgid "" "chapters. A value of \"none\" will disable chapter marking and a value of " "\"both\" will use both page breaks and lines to mark chapters." msgstr "" -"Especifica com marcar els capítols detectats. Un valor de \"salt de pàgina\" " -"inserirà salts de pàgina abans dels capítols. Un valor de \"pauta\" inserirà " -" una línia abans dels capítols. Un valor de \"cap\" inhabilitarà les marques " -"dels capítols i un valor de \"ambdós\" inserirà un salt de pàgina i una " -"línia per a marcar els capítols." +"Especifica com s'ha de marcar els capítols detectats. El valor «pagebreak» " +"insereix un salt de pàgina abans dels capítols. El valor «rule» insereix " +"una línia abans dels capítols. El valor «none» inhabilita les marques dels " +"capítols i el valor «both» insereix un salt de pàgina i una línia per marcar " +"els capítols." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:274 msgid "" @@ -1649,29 +1645,29 @@ msgstr "" msgid "" "Set the top margin in pts. Default is %default. Note: 72 pts equals 1 inch" msgstr "" -"Defineix el marge superior en punts (pts). El valor predeterminat és " -"%default. Nota: 72 pts equival a 1 polzada (2,54 cm)" +"Estableix el marge superior en punts (pts). Per defecte és %default. Nota: " +"72 pts són 1 polzada (2,54 cm)" #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:294 msgid "" "Set the bottom margin in pts. Default is %default. Note: 72 pts equals 1 inch" msgstr "" -"Defineix el marge inferior en punts (pts). El valor prederminat són " -"%default. Nota: 72 pts equivalen a 1 polzada (2,54 cm)" +"Estableix el marge inferior en punts (pts). Per defecte és %default. Nota: " +"72 pts són 1 polzada (2,54 cm)" #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:299 msgid "" "Set the left margin in pts. Default is %default. Note: 72 pts equals 1 inch" msgstr "" -"Estableix el marge esquerre en punts (pts). El valor predeterminat són " -"%default. Nota: 72 pt equivalent a 1 polzada (2,54 cm)" +"Estableix el marge esquerre en punts (pts). Per defecte és %default. Nota: " +"72 pt són 1 polzada (2,54 cm)" #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:304 msgid "" "Set the right margin in pts. Default is %default. Note: 72 pts equals 1 inch" msgstr "" -"Estableix el marge dret en punts (pts). El valor predeterminat són %default. " -"Nota: 72 pt equivalen a 1 polzada (2,54 cm)" +"Estableix el marge dret en punts (pts). Per defecte és %default. Nota: 72 pt " +"són 1 polzada (2,54 cm)" #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:310 msgid "" @@ -1805,13 +1801,12 @@ msgid "" "by Chinese and Japanese for instance) the representation used by the largest " "number of people will be used (Chinese in the previous example)." msgstr "" -"Converteix els caràcters unicode a una representació ASCII. Aneu en compte " -"amb aquesta opció, perquè això substituirà els caràcters unicode amb ASCII. " -"Per exemple, reemplaçarà \"%s\" per \"Mikhail Gorbachiov\". Tingueu també en " -"compte que en el cas que hi hagi moltes representacions per a un caràcter " -"(per exemple, caràcters compartits pel Xinès i el Japonès) la representació " -"emprada per la població més nombrosa serà seleccionada (el Xinès a l'exemple " -"anterior)." +"Converteix els caràcters unicode a una representació ASCII. Compte amb " +"aquesta opció, perquè substituirà els caràcters unicode per ASCII. Per " +"exemple, reemplaçarà «%s» per «Mikhail Gorbachiov». Tingueu també en compte " +"que si hi ha moltes representacions per a un caràcter (per exemple, " +"caràcters compartits pel xinès i el japonès) es selecciona la representació " +"que utilitza la població més nombrosa (el xinès a l'exemple anterior)." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:437 msgid "" @@ -1832,13 +1827,13 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:449 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:38 msgid "Set the title." -msgstr "Establiu el títol" +msgstr "Estableix el títol" #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:453 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 \"&\"." +"Estableix els autors. Si hi ha diversos autors, s'han de separar amb una " +"\"&\"." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:458 msgid "The version of the title to be used for sorting. " @@ -1855,52 +1850,53 @@ msgstr "Estableix la portada des del fitxer o URL indicats" #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:470 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:54 msgid "Set the ebook description." -msgstr "Establiu la descripció del llibre electrònic." +msgstr "Estableix la descripció del llibre." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:474 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:56 msgid "Set the ebook publisher." -msgstr "Establiu l'editorial del llibre electrònic." +msgstr "Estableix l'editorial del llibre." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:478 #: /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." +msgstr "Estableix la sèrie que pertany el llibre." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:482 #: /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." +msgstr "Estableix l'index del llibre a la sèrie." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:486 #: /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." +msgstr "Estableix la valoració. Ha de ser un nombre entre 1 i 5." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:490 #: /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." +msgstr "Estableix l'ISBN del llibre." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:494 #: /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." +"Estableix les etiquetes per al llibre. Ha de ser una llista separada per " +"comes." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:498 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:70 msgid "Set the book producer." -msgstr "Establiu el productor del llibre." +msgstr "Estableix el productor del llibre." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:502 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:72 msgid "Set the language." -msgstr "Establiu la llengua." +msgstr "Estableix la llengua." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:506 msgid "Set the publication date." -msgstr "Col·locar la data de publicació." +msgstr "Estableix la data de publicació." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:510 msgid "Set the book timestamp (used by the date column in calibre)." @@ -1984,7 +1980,7 @@ msgstr "Heu d'especificar un fitxer epub." #: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/unmanifested.py:17 msgid "Fix unmanifested files" -msgstr "Repara fitxers no manifestats" +msgstr "Corregeix fitxers sense declarar" #: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/unmanifested.py:21 msgid "" @@ -1992,11 +1988,11 @@ msgid "" "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'indiqui a l'opció \"esborra fitxers sense declarar\"" +"suprimir-los tal com s'indiqui a l'opció «suprimeix 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" -msgstr "Suprimeix fitxers no manifestats en lloc d'afegir-los al manifest" +msgstr "Suprimeix fitxers sense declarar en lloc d'afegir-los al manifest" #: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:56 msgid "" @@ -2077,11 +2073,11 @@ msgstr "Inici" #: /home/kovid/work/calibre/src/calibre/ebooks/rb/rbml.py:102 #: /home/kovid/work/calibre/src/calibre/ebooks/txt/txtml.py:77 msgid "Table of Contents:" -msgstr "Índex general:" +msgstr "Índex:" #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:32 msgid "Do not insert a Table of Contents at the beginning of the book." -msgstr "No insereixis un índex general al començament del llibre." +msgstr "No insereixis un índex al començament del llibre." #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/output.py:21 #: /home/kovid/work/calibre/src/calibre/ebooks/pdb/output.py:32 @@ -2089,7 +2085,7 @@ msgstr "No insereixis un índex general al començament del llibre." #: /home/kovid/work/calibre/src/calibre/ebooks/rb/output.py:21 #: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:35 msgid "Add Table of Contents to beginning of the book." -msgstr "Afegeix l'índex general al començament del llibre." +msgstr "Afegeix un índex al començament del llibre." #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/output.py:24 msgid "" @@ -2335,7 +2331,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:589 msgid "Set the book title" -msgstr "Indiqueu el nom del llibre" +msgstr "Estableix el nom del llibre" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:591 msgid "Set sort key for the title" @@ -2343,7 +2339,7 @@ msgstr "Indiqueu la clau d'ordenació per tí­tol" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:593 msgid "Set the author" -msgstr "Indiqueu l'autor" +msgstr "Estableix l'autor" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:595 msgid "Set sort key for the author" @@ -2368,19 +2364,19 @@ msgstr "Extreu la miniatura del fitxer LRF" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:608 msgid "Set the publisher" -msgstr "Establiu l'editorial" +msgstr "Estableix l'editorial" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:609 msgid "Set the book classification" -msgstr "Establiu la classificació del llibre" +msgstr "Estableix la classificació del llibre" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:610 msgid "Set the book creator" -msgstr "Establiu el creador del llibre" +msgstr "Estableix el creador del llibre" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:611 msgid "Set the book producer" -msgstr "Establiu el productor del llibre" +msgstr "Estableix el productor del llibre" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:613 msgid "" @@ -2402,7 +2398,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:94 msgid "Set the space between words in pts. Default is %default" -msgstr "Fixa l'espai entre paraules en punts. Per defecte: %default" +msgstr "Estableix l'espai entre paraules en punts. Per defecte: %default" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:97 msgid "Add a header to all the pages with title and author." @@ -2607,8 +2603,8 @@ msgid "" "Set the authors. Multiple authors should be separated by the & character. " "Author names should be in the order Firstname Lastname." msgstr "" -"Establir els autors. Si hi ha diversos autors s'han de separar per «&». Els " -"noms dels autors han d'estar en el format Nom Cognom." +"Estableix els autors. Si hi ha diversos autors, s'han de separar amb una " +"\"&\". Els noms dels autors han d'estar en el format Nom Cognom." #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:44 msgid "" @@ -2632,11 +2628,11 @@ msgstr "Estableix el fitxer indicat com a portada" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:58 msgid "Set the book category." -msgstr "Establiu la categoria del llibre." +msgstr "Estableix la categoria del llibre." #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:74 msgid "Set the published date." -msgstr "Establir la data de publicació." +msgstr "Estableix la data de publicació." #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:77 msgid "Get the cover from the ebook and save it at as the specified file." @@ -2865,13 +2861,12 @@ msgid "" "Don't add Table of Contents to end of book. Useful if the book has its own " "table of contents." msgstr "" -"No afegeixis índex al final del llibre. Útil si el llibre té el seu propi " -"índex." +"No afegeixis un índex al final del llibre. Útil si el llibre ja té un índex." #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/output.py:33 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/htmltoc.py:56 msgid "Title for any generated in-line table of contents." -msgstr "Títol per qualsevol índex generat en línia." +msgstr "Títol per a tots els índexs generats automàticament." #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/output.py:37 msgid "Disable compression of the file contents." @@ -2994,8 +2989,8 @@ msgstr "Versió OPF per generar. Per defecte és %default." msgid "" "Generate an Adobe \"page-map\" file if pagination information is available." msgstr "" -"Genera un fitxer Adobe \"page-map\" si la informació de paginació és " -"disponible." +"Genera un fitxer Adobe «page-map» si es disposa de la informació de " +"paginació." #: /home/kovid/work/calibre/src/calibre/ebooks/pdb/ereader/reader132.py:128 msgid "Footnotes" @@ -3427,12 +3422,12 @@ 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" +"Executa 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 "No insereixis una taula de contingut al text de sortida." +msgstr "No insereixis un índex al text de sortida." #: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:24 msgid "" @@ -3440,10 +3435,10 @@ 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." +"Tipus de salt de línia que es farà servir. Les opcions són %s. Per defecte " +"és «system». Utilitzeu «old_mac» si voleu compatibilitat amb el Mac OS 9 i " +"anteriors. Per al Mac OS X utilitzeu «unix». «system» prendrà el salt de " +"línia per defecte del vostre sistema operatiu." #: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:30 msgid "" @@ -4009,11 +4004,10 @@ msgid "" "GUI. You can recover your database using the 'calibredb restore_database' " "command line function." msgstr "" -"Aquesta ordre reconstrueix la vostra base de dades del calibre amb la " -"informació que ha desat el calibre als fitxers OPF.

Aquesta funció no està " -"disponible actualment a la interfície gràfica. Podeu recuperar la vostra " -"base de dades amb la funció de la línia de comandaments 'calibredb " -"restore_database'" +"Aquesta ordre reconstrueix la base de dades del calibre amb la informació " +"que ha desat el calibre als fitxers OPF.

Aquesta funció no està disponible " +"actualment a la interfície gràfica. Podeu recuperar la base de dades amb la " +"funció de la línia de comandaments «calibredb restore_database»" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:358 msgid "No library found" @@ -5056,9 +5050,9 @@ msgid "" " -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" +" -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. " @@ -5073,11 +5067,11 @@ msgstr "Opcions dels llibres" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:77 msgid "'Don't include this book' tag:" -msgstr "Etiqueta 'no incloguis aquest llibre':" +msgstr "Etiqueta «no incloguis aquest llibre»:" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:78 msgid "'Mark this book as read' tag:" -msgstr "Etiqueta 'marca aquest llibre com a llegit':" +msgstr "Etiqueta «marca aquest llibre com a llegit»:" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:79 msgid "Additional note tag prefix:" @@ -5105,11 +5099,11 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:84 msgid "Include 'Titles' Section" -msgstr "Inclou la secció 'Títols'" +msgstr "Inclou la secció «Títols»" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:85 msgid "Include 'Recently Added' Section" -msgstr "Inclou la secció 'Afegits recentment'" +msgstr "Inclou la secció «Afegits recentment»" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:86 msgid "Sort numbers as text" @@ -5117,7 +5111,7 @@ 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'" +msgstr "Inclou la secció «Sèrie»" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_tab_template_ui.py:33 msgid "Tab template for catalog.ui" @@ -5308,7 +5302,7 @@ msgstr "Entrada FB2" #: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_input_ui.py:34 msgid "Do not insert a &Table of Contents at the beginning of the book." -msgstr "No &insereixis un Índex al començament del llibre" +msgstr "No &insereixis un índex al començament del llibre" #: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output.py:14 msgid "FB2 Output" @@ -5606,7 +5600,7 @@ msgstr "Fes servir la portada del fitxer &original" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:174 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:415 msgid "Change &cover image:" -msgstr "¬Canvia la imatge de la &portada:" +msgstr "Canvia la imatge de la &portada:" #: /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." @@ -5939,7 +5933,7 @@ msgstr "&Marca de capítol:" #: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:82 msgid "Remove first &image" -msgstr "Suprimeix la primera &imatges" +msgstr "Suprimeix la primera &imatge" #: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:83 msgid "Insert &metadata as page at start of book" @@ -6011,7 +6005,7 @@ msgstr "Entrada TXT" #: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:54 msgid "Process using markdown" -msgstr "Processar com a markdown" +msgstr "Processa com a Markdown" #: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:55 msgid "" @@ -6020,14 +6014,12 @@ msgid "" "href=\"http://daringfireball.net/projects/markdown\">markdown." msgstr "" "

Markdown és un llenguatge de marcació senzill per a fitxers de text que " -"permet un format avançat. Per saber-ne més visiti markdown." +"permet un format avançat. Per saber-ne més vegeu Markdown." #: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:56 msgid "Do not insert Table of Contents into output text when using markdown" -msgstr "" -"No insertar la Taula de Continguts en text de sortida quan s'utilitzi " -"Markdown" +msgstr "No insereixis l'índex al text de sortida si es fa servir Markdown" #: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:57 msgid "Preserve &spaces" @@ -6138,8 +6130,8 @@ msgid "" "href=\"http://calibre-ebook.com/user_manual/xpath.html\">XPath Tutorial." msgstr "" "

Per exemple, per fer coincidir totes les etiquetes h2 que tinguin " -"class=\"chapter\", poseu h2 a l'etiqueta, class a l'atribut i " -"chapter a valor.

Un atribut en blanc correspon a qualsevol " +"class=«capítol», poseu h2 a l'etiqueta, class a l'atribut i " +"capítol a valor.

Un atribut en blanc correspon a qualsevol " "atribut i un valor en blanc a qualsevol valor. L'etiqueta * correspon a " "qualsevol etiqueta.

Si voleu saber més usos avançats d'XPath vegeu XPath " @@ -6178,7 +6170,7 @@ msgstr "Sense qualificació" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:156 msgid "Set '%s' to today" -msgstr "Establir data d'avui per '%s'" +msgstr "Estableix la data d'avui per a «%s»" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:266 msgid " index:" @@ -6935,7 +6927,7 @@ msgstr "Afegeix-ho al camp" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:206 msgid "Editing meta information for %d books" -msgstr "S'està editant la metainformació de %d llibres" +msgstr "S'està editant les metadades de %d llibres" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:259 msgid "Book %d:" @@ -6994,7 +6986,7 @@ msgstr "" "ho al començament o al final del text que es trobi. Vegeu aquesta referència si " "voleu més informació quant a les expressions regulars en python, " -"especialment quant a la funció 'sub'." +"especialment quant a la funció «sub»." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:438 msgid "You must specify a destination when source is a composite field" @@ -7031,7 +7023,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:334 msgid "Edit Meta information" -msgstr "Editar Meta-informació" +msgstr "Edita les metadades" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:336 msgid "A&utomatically set author sort" @@ -7046,8 +7038,8 @@ msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles." 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." +"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:339 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384 @@ -7068,7 +7060,7 @@ msgstr "Sense canvis" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:343 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:387 msgid " stars" -msgstr " estreles" +msgstr " estrelles" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:345 msgid "Add ta&gs: " @@ -7468,11 +7460,11 @@ msgstr "No s'ha pogut obrir %s. L'està fent servir un altre programa?" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:371 msgid "Edit Meta Information" -msgstr "Edita la meta-informació" +msgstr "Edita les metadades" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:372 msgid "Meta information" -msgstr "Meta-informació" +msgstr "Metadades" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:375 msgid "Swap the author and title" @@ -7489,8 +7481,8 @@ msgid "" "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 "" -"Especifiqueu com s'ha d'ordenar l'autor(s) d'aquest llibre. Per exemple, si " -"'Charles Dickens' s'ha d'ordenar com a 'Dickens, Charles'.\n" +"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».\n" "Si el quadre està en verd, el text coincideix amb l'ordre per autors " "individuals. Si està en vermell, els autors i el text no coincideixen." @@ -8180,7 +8172,7 @@ msgid "" msgstr "" "

Descomprimeix l'ePub per tal de visualitzar-los en una finestra del " "gestor de fitxers. Per ajustar els fitxers individuals, feu clic dret i " -"aleshores 'Obre amb...' i trieu l'editor. Quan acabeu amb els ajustos, " +"aleshores «Obre amb...» i trieu l'editor. Quan acabeu amb els ajustos, " "tanqueu la finestra del gestor de fitxers i les finestres de l'editor que " "hagueu fet servir per modificar-ne les dades.

Reconstrueix l'ePub " "i actualitza la vostra biblioteca del calibre.

" @@ -8314,8 +8306,8 @@ msgstr "" "

Crea una recepta de " "notícies bàsica, afegint canals RSS.
Per a la majoria dels canals, " -"necessitareu fer servir el \"Mode avançat\" per personalitzar millor el " -"procés de descàrrega de dades.

" +"necessitareu el «Mode avançat» per personalitzar millor el procés de " +"descàrrega de dades.

" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:265 msgid "Recipe &title:" @@ -8708,12 +8700,12 @@ msgstr "Llibre %s de %s." #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1236 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:407 msgid "The lookup/search name is \"{0}\"" -msgstr "El nom de la cerca és \"{0}\"" +msgstr "El nom de la cerca és «{0}»" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:699 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1238 msgid "This book's UUID is \"{0}\"" -msgstr "La UUID del llibre és \"{0}\"" +msgstr "L'UUID del llibre és «{0}»" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:922 msgid "In Library" @@ -8805,7 +8797,7 @@ msgstr " - Visor de LRF" #: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:160 msgid "No matches for the search phrase %s were found." -msgstr "No s'han trobat coincidències per al text \"%s\"." +msgstr "No s'ha trobat coincidències per al text «%s»." #: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:160 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:443 @@ -9171,7 +9163,7 @@ msgid "" "Set the default timeout for network fetches (i.e. anytime we go out to the " "internet to get information)" msgstr "" -"Configura el temps d'espera per defecte per a les sol·licituds de xarxa (per " +"Estableix el temps d'espera per defecte per a les sol·licituds de xarxa (per " "exemple cada cop que s'hagi d'anar a internet per aconseguir informació)" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:144 @@ -9409,8 +9401,8 @@ msgid "" "
  • dd MMMM yy gives 05 January 10
  • \n" " " msgstr "" -"

    Format de data. Fes servir 1-4 lletres 'd' per al dia, 1-4 lletres 'M' " -"per al mes, i 2 or 4 lletres 'y' per a l'any.

    \n" +"

    Format de data. Feu servir 1-4 lletres «d» per al dia, 1-4 lletres «M» " +"per al mes, i 2 o 4 lletres «y» per a l'any.

    \n" "

    Per exemple:\n" "

      \n" "
    • ddd, d MMM yyyy dóna Dil, 5 Gen 2010
    • \n" @@ -10321,7 +10313,7 @@ msgstr "Drecera &alternativa" #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:200 msgid "Rename '%s'" -msgstr "Reanomena '%s'" +msgstr "Reanomena «%s»" #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:204 msgid "Edit sort for '%s'" @@ -10394,7 +10386,7 @@ msgstr "Ordena segons la valoració mitjana" #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:875 msgid "Set the sort order for entries in the Tag Browser" -msgstr "Establiu d'ordre de les entrades a l'explorador d'etiquetes" +msgstr "Estableix l'ordre de les entrades a l'explorador d'etiquetes" #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:881 msgid "Match all" @@ -11275,7 +11267,7 @@ msgstr "Mala configuració" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:134 msgid "You must set the From email address" -msgstr "Heu d'establir d'adreça de correu electrònic remitent" +msgstr "Heu d'establir l'adreça de correu electrònic remitent" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:141 msgid "You must set the username and password for the mail server." @@ -11401,12 +11393,12 @@ msgstr "ahir" #: /home/kovid/work/calibre/src/calibre/library/caches.py:371 msgid "thismonth" -msgstr "aquestmes" +msgstr "aquest mes" #: /home/kovid/work/calibre/src/calibre/library/caches.py:374 #: /home/kovid/work/calibre/src/calibre/library/caches.py:375 msgid "daysago" -msgstr "dies" +msgstr "fa dies" #: /home/kovid/work/calibre/src/calibre/library/caches.py:539 #: /home/kovid/work/calibre/src/calibre/library/caches.py:549 @@ -11638,8 +11630,8 @@ msgid "" "Default: '%default'\n" "Applies to: ePub, MOBI output formats" msgstr "" -"Prefix de les etiquetes de notes de l'usuari, per exemple «pot ser que al " -"Josep li agradi llegir això».\n" +"Prefix de les etiquetes de notes de l'usuari, per exemple «* Al Josep li " +"agradarà».\n" "Per defecte: «%default»\n" "S'aplica als formats de sortida ePub i MOBI" @@ -12235,7 +12227,7 @@ msgstr "s'ha suprimit" #: /home/kovid/work/calibre/src/calibre/library/cli.py:871 msgid "Error: Action %s not recognized, must be one of: (add|remove|list)" -msgstr "Error: No es reconeix l'acció %s, ha de ser una de (add/remove/list)" +msgstr "Error: No es reconeix l'acció %s, ha de ser una de «add/remove/list»" #: /home/kovid/work/calibre/src/calibre/library/cli.py:879 msgid "" @@ -12475,7 +12467,7 @@ msgstr "Les etiquetes" #: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:37 msgid "The series" -msgstr "Les sèries" +msgstr "La sèrie" #: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:38 msgid "" @@ -12856,7 +12848,7 @@ msgstr "SÈRIE: %s [%s]
      " #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:248 msgid "Books in your library" -msgstr "LLibres a la teva biblioteca" +msgstr "Llibres a la biblioteca" #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:254 msgid "By " @@ -12915,7 +12907,7 @@ msgstr "Llista per ordre de preferència dels formats d'entrada" #: /home/kovid/work/calibre/src/calibre/utils/config.py:715 msgid "Read metadata from files" -msgstr "Llegeix metadades dels fitxers" +msgstr "Llegeix les metadades dels fitxers" #: /home/kovid/work/calibre/src/calibre/utils/config.py:717 msgid "The priority of worker processes" @@ -12956,7 +12948,7 @@ msgstr "«switch» necessita un número senar d'arguments" #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:43 msgid "Waiting..." -msgstr "Esperant..." +msgstr "S'està esperant..." #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:52 msgid "Stopped" @@ -12968,11 +12960,11 @@ msgstr "Finalitzat" #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:76 msgid "Working..." -msgstr "Treballant..." +msgstr "S'està treballant..." #: /home/kovid/work/calibre/src/calibre/utils/localization.py:95 msgid "Brazilian Portuguese" -msgstr "Portuguès de Canadà" +msgstr "Portuguès del Brasil" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:96 msgid "English (UK)" diff --git a/src/calibre/translations/en_GB.po b/src/calibre/translations/en_GB.po index fcf30b4401..3e7403810a 100644 --- a/src/calibre/translations/en_GB.po +++ b/src/calibre/translations/en_GB.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-11-12 23:11+0000\n" -"PO-Revision-Date: 2010-11-12 22:58+0000\n" -"Last-Translator: Kovid Goyal \n" +"PO-Revision-Date: 2010-11-15 01:12+0000\n" +"Last-Translator: Vladimir Oka \n" "Language-Team: English (United Kingdom) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-14 05:05+0000\n" +"X-Launchpad-Export-Date: 2010-11-15 04:59+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -1045,11 +1045,11 @@ msgstr "Communicate with the Nook eBook reader." #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:85 msgid "Nook Color" -msgstr "" +msgstr "Nook Color" #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:86 msgid "Communicate with the Nook Color eBook reader." -msgstr "" +msgstr "Communicate with the Nook Color eBook reader." #: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:17 msgid "Communicate with the Nuut2 eBook reader." @@ -7722,16 +7722,17 @@ msgstr "What kind of match to use:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:200 msgid "Contains: the word or phrase matches anywhere in the metadata field" -msgstr "" +msgstr "Contains: the word or phrase matches anywhere in the metadata field" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:201 msgid "Equals: the word or phrase must match the entire metadata field" -msgstr "" +msgstr "Equals: the word or phrase must match the entire metadata field" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:202 msgid "" "Regular expression: the expression must match anywhere in the metadata field" msgstr "" +"Regular expression: the expression must match anywhere in the metadata field" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:203 msgid "Find entries that have..." diff --git a/src/calibre/translations/es.po b/src/calibre/translations/es.po index 0059e6370a..d799d66c5a 100644 --- a/src/calibre/translations/es.po +++ b/src/calibre/translations/es.po @@ -11,13 +11,13 @@ msgstr "" "Project-Id-Version: es\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-11-12 23:11+0000\n" -"PO-Revision-Date: 2010-11-12 22:52+0000\n" -"Last-Translator: DiegoJ \n" +"PO-Revision-Date: 2010-11-14 17:36+0000\n" +"Last-Translator: Jellby \n" "Language-Team: Spanish\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-13 04:54+0000\n" +"X-Launchpad-Export-Date: 2010-11-15 04:59+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:502 @@ -1065,11 +1065,11 @@ msgstr "Comunicarse con el lector Nook." #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:85 msgid "Nook Color" -msgstr "" +msgstr "Nook Color" #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:86 msgid "Communicate with the Nook Color eBook reader." -msgstr "" +msgstr "Comunicar con el lector Nook Color." #: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:17 msgid "Communicate with the Nuut2 eBook reader." @@ -7866,15 +7866,21 @@ msgstr "Tipo de coincidencias:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:200 msgid "Contains: the word or phrase matches anywhere in the metadata field" msgstr "" +"Contiene: la palabra o frase se busca en cualquier lugar del campo de " +"metadatos" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:201 msgid "Equals: the word or phrase must match the entire metadata field" msgstr "" +"Coincide: la palabra o frase debe coincidir con el campo de metadatos " +"completo" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:202 msgid "" "Regular expression: the expression must match anywhere in the metadata field" msgstr "" +"Expresión regular: la expresión se busca en cualquier lugar del campo de " +"metadatos" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:203 msgid "Find entries that have..." diff --git a/src/calibre/translations/eu.po b/src/calibre/translations/eu.po index ff9ee685d6..4f750ecd14 100644 --- a/src/calibre/translations/eu.po +++ b/src/calibre/translations/eu.po @@ -14,7 +14,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-14 05:03+0000\n" +"X-Launchpad-Export-Date: 2010-11-15 04:58+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 diff --git a/src/calibre/translations/nl.po b/src/calibre/translations/nl.po index ca95ca48c6..f6dd336ba0 100644 --- a/src/calibre/translations/nl.po +++ b/src/calibre/translations/nl.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-11-12 23:11+0000\n" -"PO-Revision-Date: 2010-11-12 22:31+0000\n" -"Last-Translator: Kovid Goyal \n" +"PO-Revision-Date: 2010-11-14 20:32+0000\n" +"Last-Translator: Mar2zz \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-13 04:52+0000\n" +"X-Launchpad-Export-Date: 2010-11-15 04:58+0000\n" "X-Generator: Launchpad (build Unknown)\n" "X-Poedit-Country: NETHERLANDS\n" "X-Poedit-Language: Dutch\n" @@ -695,7 +695,7 @@ msgid "" "Comma separated list of directories to send e-books to on the device. The " "first one that exists will be used" msgstr "" -"Komma-gescheiden lijst van folders om e-boeken naar toe te sturen op het " +"Komma-gescheiden lijst van mappen om e-boeken naar toe te sturen op het " "apparaat. De eerste die wordt gevonden zal worden gebruikt." #: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:98 @@ -1057,11 +1057,11 @@ msgstr "Communiceer met de Nook eBook lezer." #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:85 msgid "Nook Color" -msgstr "" +msgstr "Nook Color" #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:86 msgid "Communicate with the Nook Color eBook reader." -msgstr "" +msgstr "Communiceer met de Nook Color eBook lezer." #: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:17 msgid "Communicate with the Nuut2 eBook reader." @@ -3015,7 +3015,7 @@ msgid "" "Normally calibre treats blank lines as paragraph markers. With this option " "it will assume that every line represents a paragraph instead." msgstr "" -"Normaal gesproken behandeld calibre blanco regels als paragraaf markering. " +"Normaal gesproken behandelt calibre blanco regels als paragraaf markering. " "Met deze optie zal het aannemen dat iedere regel een paragraaf representeert." #: /home/kovid/work/calibre/src/calibre/ebooks/pdb/input.py:26 @@ -3027,11 +3027,10 @@ msgid "" "spaces) represents a paragraph. Paragraphs end when the next line that " "starts with an indent is reached." msgstr "" -"Normaal gesproken behandeld calibre blanco regels als paragraaf markering. " -"Met deze optie zal het aanemen dat iedere regel die begint met een " +"Normaal gesproken behandelt calibre blanco regels als paragraaf markering. " +"Met deze optie zal het aannemen dat iedere regel die begint met een " "indentatie (een tab, of twee of meer spaties) een paragraaf voorstelt. " -"Paragrafen eindigeren wanneer de volgende lijn met een indentatie word " -"bereikt." +"Paragrafen eindigen wanneer de volgende lijn met een indentatie word bereikt." #: /home/kovid/work/calibre/src/calibre/ebooks/pdb/output.py:23 msgid "Format to use inside the pdb container. Choices are:" @@ -3616,16 +3615,16 @@ 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 "" -"Voeg boeken toe uit folders, inclusief sub-folders (Een boek per folder, " -"neemt aan dat ieder eboek bestand hetzelfde boek in een ander formaat bevat)" +"Voeg boeken toe uit mappen, inclusief submappen (Een boek per map, neemt aan " +"dat ieder e-boek bestand hetzelfde boek in een ander formaat bevat)" #: /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 "" -"Voeg boeken toe uit folders, inclusief sub-folders (Meerdere boeken per " -"folder, neemt aan dat ieder eboek bestand een ander boek bevat)" +"Voeg boeken toe uit mappen, inclusief submappen (Meerdere boeken per map, " +"neemt aan dat ieder e-boek bestand een ander boek bevat)" #: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:43 msgid "Add Empty book. (Book entry with no formats)" @@ -3875,9 +3874,9 @@ msgid "" "folder directly." msgstr "" "De volgende boeken hadden formaten in de database die niet beschikbaar zijn. " -"De ingangen voor deze formaten zijn verwijderd. Je zult deze handmatig " -"moeten checken. Dit kan gebeuren als je de bestanden in de folders direct " -"hebt gemanipuleerd." +"De opgaves voor deze formaten zijn verwijderd. Je zult deze handmatig moeten " +"nakijken. Dit kan gebeuren als je de bestanden in de mappen zelf hebt " +"aangepast." #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:148 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:51 @@ -4634,7 +4633,7 @@ msgstr "Toevoegen..." #: /home/kovid/work/calibre/src/calibre/gui2/add.py:211 msgid "Searching in all sub-directories..." -msgstr "Zoeken in alle subfolders..." +msgstr "Zoekend in alle submappen..." #: /home/kovid/work/calibre/src/calibre/gui2/add.py:224 msgid "Path error" @@ -4692,7 +4691,7 @@ msgstr "Opgeslagen" #: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/__init__.py:57 msgid "Searching for sub-folders" -msgstr "Zoeken naar sub-folders" +msgstr "Zoekend naar submappen" #: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/__init__.py:62 msgid "Searching for books" @@ -4756,13 +4755,13 @@ msgid "" "not
      under the root folder you choose.

      " msgstr "" "

      calibre kan automatisch uw computer op bestaande boeken doorzoeken. Deze " -"boeken zullen dan aan de calibre colllectie toegevoegd (=gekopieerd) " -"worden. Deze wizard zal u helpen bij het scannen, aanpassen en importeren " -"van uw bestaande collectie boeken.

      \n" -"

      Kies een start folder. Er zal alleen in deze en onderliggende folders " -"naar boeken gezocht worden.

      \n" -"

      Verzeker u ervan dat de folder waar calibre uw collectie bewaard zich " -"niet in dit pad bevind.

      " +"boeken zullen dan naar de calibre bibliotheek (=gekopieerd) worden. " +"Deze wizard zal u helpen bij het scannen, aanpassen en importeren van uw " +"bestaande collectie boeken.

      \n" +"

      Kies een beginmap. Er zal alleen in deze en onderliggende mappen naar " +"boeken gezocht worden.

      \n" +"

      Verzeker u ervan dat de map waar calibre uw collectie bewaart zich " +"niet in dit pad bevindt.

      " #: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:68 msgid "&Root folder:" @@ -4773,8 +4772,8 @@ msgid "" "This folder and its sub-folders will be scanned for books to import into " "calibre's library" msgstr "" -"Deze map en de sub-mappen worden gescand op te importeren boeken voor " -"calibre's library" +"Deze map en de submappen worden gescand op te importeren boeken voor " +"calibre's bibliotheek" #: /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 @@ -5125,16 +5124,16 @@ msgstr "Tab sjabloon voor catalog.ui" #: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:25 msgid "Bold" -msgstr "" +msgstr "Vet" #: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:26 msgid "Italic" -msgstr "" +msgstr "Cursief" #: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:28 msgid "Underline" -msgstr "" +msgstr "Onderstreept" #: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:36 msgid "" @@ -5880,7 +5879,7 @@ msgstr "Voeg een spatie toe voor de eerste regel van een paragraaf" #: /home/kovid/work/calibre/src/calibre/gui2/convert/snb_output_ui.py:42 msgid "Insert empty line between paragraphs" -msgstr "Voeg lege regelst toe tussen paragrafen" +msgstr "Voeg lege regels toe tussen paragrafen" #: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:17 msgid "" @@ -6464,7 +6463,7 @@ msgstr "Selecteer beschikbare formaten en hun ranglijst voor dit apparaat" #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:87 msgid "Use sub directories" -msgstr "Gebruik sub-folders" +msgstr "Gebruik submappen" #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:88 msgid "Use author sort for author" @@ -6944,6 +6943,10 @@ msgid "" "your library before proceeding.

      Search and replace in text fields using " "character matching or regular expressions. " msgstr "" +"Je kunt je bibliotheek hiermee vernietigen. Veranderingen zijn " +"permanent. Je kunt niet ongedaan maken. Je wordt sterk aangeraden om je " +"Bibliotheek-backup te maken voordat je verder gaat.

      Zoek en vervang in " +"tekstvelden met karaktermatching of reguliere expressies. " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:282 msgid "" @@ -7288,7 +7291,7 @@ msgstr "Jouw test:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:401 msgid "&Search and replace" -msgstr "" +msgstr "Zoek tek&st en vervang" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:91 msgid "Last modified: %s" @@ -7847,15 +7850,19 @@ msgstr "Welke vergelijking gebruiken:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:200 msgid "Contains: the word or phrase matches anywhere in the metadata field" msgstr "" +"Bevat: Het woord of de zin kan overal in het metagegevensveld matchen" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:201 msgid "Equals: the word or phrase must match the entire metadata field" msgstr "" +"Gelijke: Het woord of de zin moet matchen met het hele metagegevensveld." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:202 msgid "" "Regular expression: the expression must match anywhere in the metadata field" msgstr "" +"Reguliere expressie: de expressie moet overal in het metagegevensveld " +"matchen." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:203 msgid "Find entries that have..." @@ -7891,32 +7898,33 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:210 msgid "A&dvanced Search" -msgstr "" +msgstr "Geavanceer&d Zoeken" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:212 msgid "Enter the title." -msgstr "" +msgstr "Geef de titel op." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:213 msgid "&Author:" -msgstr "" +msgstr "&Auteur:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:215 msgid "Ta&gs:" -msgstr "" +msgstr "Ta&gs:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:216 msgid "Enter an author's name. Only one author can be used." -msgstr "" +msgstr "Geef een auteursnaam op. Er kan 1 auteur gebruikt worden." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:217 msgid "" "Enter a series name, without an index. Only one series name can be used." msgstr "" +"Geef een serienaam op, zonder index. Er kan 1 serienaam gebruikt worden." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:218 msgid "Enter tags separated by spaces" -msgstr "" +msgstr "Geef de tags op gescheiden met spaties" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:219 msgid "&Clear" @@ -7924,11 +7932,11 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:220 msgid "Search only in specific fields:" -msgstr "" +msgstr "Zoek in specifieke velden:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:221 msgid "Titl&e/Author/Series ..." -msgstr "" +msgstr "Tite&l/Auteur/Series ..." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/select_formats.py:45 msgid "Choose formats" @@ -7990,8 +7998,7 @@ msgstr "Verwijder de geselecteerde labelcategory" #: /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 "" -"Geef een nieuwe categorienaam in. Selecteer het type voor dat u de naam " -"toevoegd." +"Geef een nieuwe categorienaam op. Selecteer het type voor het toevoegen." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:170 msgid "Add the new category" @@ -8407,7 +8414,7 @@ msgstr "" "right:0px; -qt-block-indent:0; text-indent:0px;\">Gebruik de Test functionaliteit hieronder om de reguliere " "expressie uit te proberen op een aantal test bestandsnamen. De groepnamen " -"voor de diverse metadata velden zin gedocumenteerd onder " +"voor de diverse metadata velden zijn gedocumenteerd onder " "tooltips.

      " #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:119 @@ -8634,7 +8641,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:170 msgid "Shift+Ctrl+F" -msgstr "" +msgstr "Shift+Ctrl+F" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:173 msgid "Advanced search" @@ -9707,8 +9714,8 @@ msgid "" "users might do to force it to use the ';' that the kindle requires. A third " "would be to specify the language." msgstr "" -"Her kun je de metagegevens die calibre gebruikt om een boek te updaten " -"wanneer je deze opslaat of naar een apparaat stuurt.\n" +"Hier kun je de metagegevens aanpassen die calibre gebruikt om een boek te " +"updaten wanneer je deze opslaat of naar een apparaat stuurt.\n" "\n" "Gebuik dit om een 'pluginset' te maken voor een formaat (of alle formaten) " "en een apparaat (of alle apparaten). De pluginset geeft aan welke template " @@ -9718,8 +9725,8 @@ msgstr "" "hoeft niet. Je kunt elke template gebruiken in een bronveld die je elders in " "calibre kunt gebruiken. \n" "\n" -"Een mogelijk gebruik van een pluginset is het veranderen van de titel om " -"serie informatie te bevatten. Een andere kan auteursortering wijzigen, iets " +"Een mogelijk gebruik van een pluginset is het veranderen van de titel zodat " +"deze serie informatie bevat. Een andere kan auteursortering wijzigen, iets " "dat mobi-gebruikers zouden kunnen doen om ; te gebruiken, dat bij een kindle " "verplicht is." @@ -9869,11 +9876,11 @@ msgid "" "particular book does not have some metadata, the variable will be replaced " "by the empty string." msgstr "" -"Door het volgende sjabloon aan te passen, kun je beinvloeden in welke " -"folders de bestanden worden opgeslagen, en met welke namen. Je kunt het '/' " -"karakter gebruiken om subfolders aan te geven. Beschikbare metagegevens " -"variabelen worden hieronder omschreven. Als een specifiek boek sommige " -"metagegevens mist, dan zal de variabele een lege regel bevatten." +"Door het volgende sjabloon aan te passen, kun je beïnvloeden in welke mappen " +"de bestanden worden opgeslagen en met welke namen. Je kunt het '/' karakter " +"gebruiken om submappen aan te geven. Beschikbare metagegevens variabelen " +"worden hieronder beschreven. Als een specifiek boek sommige metagegevens " +"mist, dan zal de variabele een lege regel bevatten." #: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template_ui.py:49 msgid "Available variables:" @@ -10387,7 +10394,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:890 msgid "Manage &user categories" -msgstr "Beheer &door de gebruiker gecreëerde categorien" +msgstr "Beheer &zelfgemaakte categorien" #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:893 msgid "Add your own categories to the Tag Browser" @@ -11786,9 +11793,9 @@ msgid "" msgstr "" "%prog add [opties] bestand1 bestand2 bestand3 ...\n" "\n" -"Voeg de opgegeven bestanden toe als boeken in de database. Folders kunnen " -"ook worden\n" -"opgegeven, zie de folder gerelateerde opties hier onder.\n" +"Voeg de opgegeven bestanden toe als boeken in de database. Mappen kunnen ook " +"worden\n" +"opgegeven, zie de map gerelateerde opties hier onder.\n" #: /home/kovid/work/calibre/src/calibre/library/cli.py:279 msgid "" @@ -11801,7 +11808,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/library/cli.py:281 msgid "Process directories recursively" -msgstr "Bewerk folders recursief" +msgstr "Bewerk mappen recursief" #: /home/kovid/work/calibre/src/calibre/library/cli.py:283 msgid "" @@ -12528,10 +12535,10 @@ msgid "" "subdirectory with filenames containing title and author. Available controls " "are: {%s}" msgstr "" -"Het sjabloon dat de bestandsnaam en folder structuur bepaalt voor de " -"opgeslagen bestanden. Standaard is \"%s\", en dit slaat boeken op in per-" -"auteur folders met daarin bestandsnamen met de titel en auteur. Beschikbare " -"opties zijn: {%s}" +"Het sjabloon dat de bestandsnaam en mapstructuur bepaalt voor de opgeslagen " +"bestanden. Standaard is \"%s\", en dit slaat boeken op in per-auteur mappen " +"met daarin bestandsnamen met de titel en auteur. Beschikbare opties zijn: " +"{%s}" #: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:79 msgid "" @@ -12540,10 +12547,10 @@ msgid "" "directory with filenames containing title and author. Available controls " "are: {%s}" msgstr "" -"Het sjabloon om de bestands en folder namen te definieren van de bestanden " -"die naar het appraat worden gestuurd. Standaard is \"%s\", wat boeken " -"opslaat in folders per auteur, met bestandsnamen die zowel de titel an " -"auteur bevatten. BEschikbare instellingein zijn: {%s}" +"Het sjabloon om de bestands- en mapnamen te definiëren van de bestanden die " +"naar het apparaat worden gestuurd. Standaard is \"%s\", wat boeken opslaat " +"in folders per auteur, met bestandsnamen die zowel de titel an auteur " +"bevatten. Beschikbare instellingen zijn: {%s}" #: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:86 msgid "" @@ -12552,9 +12559,9 @@ msgid "" "experience errors when saving, depending on how well the filesystem you are " "saving to supports unicode." msgstr "" -"Normaal gesproken zal calibre alle niet-Engelse karaters automatisch in de " +"Normaal gesproken zal calibre alle niet-Engelse karakters automatisch in de " "Engelse equivalenten converteren voor bestandsnamen. WAARSCHUWING: als je " -"dit uitschakeld dan kun je fouten krijgen tijdens het opslaan, afhankelijk " +"dit uitschakelt dan kun je fouten krijgen tijdens het opslaan, afhankelijk " "van hoe goed je bestandssysteem unicode ondersteund." #: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:92 @@ -12568,7 +12575,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:98 msgid "Convert paths to lowercase." -msgstr "Converteer folders naar kleine letters" +msgstr "Converteer mappen naar kleine letters." #: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:100 msgid "Replace whitespace with underscores." diff --git a/src/calibre/translations/sr.po b/src/calibre/translations/sr.po index 41c0c58861..f711da07c8 100644 --- a/src/calibre/translations/sr.po +++ b/src/calibre/translations/sr.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-11-12 23:11+0000\n" -"PO-Revision-Date: 2010-11-12 23:08+0000\n" -"Last-Translator: Kovid Goyal \n" +"PO-Revision-Date: 2010-11-15 01:15+0000\n" +"Last-Translator: Vladimir Oka \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-14 05:05+0000\n" +"X-Launchpad-Export-Date: 2010-11-15 04:58+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -1044,11 +1044,11 @@ msgstr "Uspostavi vezu s Nook čitačem." #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:85 msgid "Nook Color" -msgstr "" +msgstr "Nook Color" #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:86 msgid "Communicate with the Nook Color eBook reader." -msgstr "" +msgstr "Uspostavi vezu s Nook Color čitačem" #: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:17 msgid "Communicate with the Nuut2 eBook reader." @@ -7758,16 +7758,19 @@ msgstr "Koju vrstu pogodaka da koristim:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:200 msgid "Contains: the word or phrase matches anywhere in the metadata field" -msgstr "" +msgstr "Sadrži: reč, ili fraza se nalaze bilo gde u polju s metapodacima" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:201 msgid "Equals: the word or phrase must match the entire metadata field" msgstr "" +"Jednako: reč, ili fraza moraju odgovarati kompletnom sadržaju polja s " +"metapodacima" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:202 msgid "" "Regular expression: the expression must match anywhere in the metadata field" msgstr "" +"Regularni izraz: izraz mora odgovarati bilo kom delu polja s metapodacima" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:203 msgid "Find entries that have..." From 8b8a6a6d30b5985411c9ddddfc4b69eb52abacae Mon Sep 17 00:00:00 2001 From: Translators <> Date: Tue, 16 Nov 2010 05:05:16 +0000 Subject: [PATCH 012/375] Launchpad automatic translations update. --- src/calibre/translations/en_GB.po | 2 +- src/calibre/translations/it.po | 28 +++++++++++++++++++--------- src/calibre/translations/sr.po | 2 +- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/calibre/translations/en_GB.po b/src/calibre/translations/en_GB.po index 3e7403810a..d1098e87fc 100644 --- a/src/calibre/translations/en_GB.po +++ b/src/calibre/translations/en_GB.po @@ -14,7 +14,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-15 04:59+0000\n" +"X-Launchpad-Export-Date: 2010-11-16 05:05+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 diff --git a/src/calibre/translations/it.po b/src/calibre/translations/it.po index 428371e543..2310e2e40c 100644 --- a/src/calibre/translations/it.po +++ b/src/calibre/translations/it.po @@ -9,13 +9,13 @@ msgstr "" "Project-Id-Version: calibre_calibre-it\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-11-12 23:11+0000\n" -"PO-Revision-Date: 2010-11-12 23:09+0000\n" -"Last-Translator: Kovid Goyal \n" +"PO-Revision-Date: 2010-11-15 12:15+0000\n" +"Last-Translator: MeltingShell \n" "Language-Team: italiano\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-14 05:04+0000\n" +"X-Launchpad-Export-Date: 2010-11-16 05:04+0000\n" "X-Generator: Launchpad (build Unknown)\n" "X-Poedit-Bookmarks: -1,-1,-1,-1,-1,1105,-1,1312,-1,-1\n" "Generated-By: pygettext.py 1.5\n" @@ -1060,11 +1060,11 @@ msgstr "Comunica con il lettore Nook." #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:85 msgid "Nook Color" -msgstr "" +msgstr "Nook Color" #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:86 msgid "Communicate with the Nook Color eBook reader." -msgstr "" +msgstr "Comunica con il lettore Nook Color" #: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:17 msgid "Communicate with the Nuut2 eBook reader." @@ -6557,6 +6557,8 @@ msgstr "Nomi da ignorare" msgid "" "Enter comma-separated standard file name wildcards, such as synctoy*.dat" msgstr "" +"Inserire una lista di nomi di file standard con wildcard, ad esempio " +"synctoy*.dat" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:62 msgid "Extensions to ignore" @@ -6941,6 +6943,11 @@ msgid "" "your library before proceeding.

      Search and replace in text fields using " "character matching or regular expressions. " msgstr "" +"È possibile distruggere la biblioteca con questa funzionalità. Le " +"modifiche sono permanenti, non è possible tornare indietro. È fortemente " +"consigliato di fare una copia della propria biblioteca prima di " +"procedere.

      Cerca e sostituisce nei campi di testo usando la corrispondenza " +"dei caratteri o le espressioni regolari. " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:282 msgid "" @@ -6970,6 +6977,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:438 msgid "You must specify a destination when source is a composite field" msgstr "" +"È necessario specificare una destinazione se la sorgente è un campo complesso" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:530 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:538 @@ -12175,6 +12183,8 @@ msgid "" "Comma-separated list of names to ignore.\n" "Default: all" msgstr "" +"Lista separata da virgole dei nomi da ignorare.\n" +"Predefinito: tutti" #: /home/kovid/work/calibre/src/calibre/library/cli.py:927 msgid "Unknown report check" @@ -12603,7 +12613,7 @@ msgstr "Sfoglia i libri per" #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:349 msgid "Choose a category to browse by:" -msgstr "" +msgstr "Selezionare una categoria in da sfogliare per:" #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:425 msgid "Browsing by" @@ -12619,7 +12629,7 @@ msgstr "in" #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:550 msgid "Books in" -msgstr "" +msgstr "Libri in" #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:602 msgid "Other formats" @@ -12639,7 +12649,7 @@ msgstr "Permalink" #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:630 msgid "A permanent link to this book" -msgstr "" +msgstr "Un collegamento permanente a questo libro" #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:641 msgid "This book has been deleted" @@ -12647,7 +12657,7 @@ msgstr "Questo libro è stato cancellato" #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:725 msgid "in search" -msgstr "" +msgstr "nella ricerca" #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:727 msgid "Matching books" diff --git a/src/calibre/translations/sr.po b/src/calibre/translations/sr.po index f711da07c8..16b4eadcb2 100644 --- a/src/calibre/translations/sr.po +++ b/src/calibre/translations/sr.po @@ -14,7 +14,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-15 04:58+0000\n" +"X-Launchpad-Export-Date: 2010-11-16 05:05+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 From f31a055135908f2d79efa4fd3c176a5a5e9e9a52 Mon Sep 17 00:00:00 2001 From: ldolse Date: Tue, 16 Nov 2010 14:39:53 +0800 Subject: [PATCH 013/375] work in progress on chapter detection improvements --- src/calibre/ebooks/conversion/utils.py | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/calibre/ebooks/conversion/utils.py b/src/calibre/ebooks/conversion/utils.py index 6002509013..724428fec0 100644 --- a/src/calibre/ebooks/conversion/utils.py +++ b/src/calibre/ebooks/conversion/utils.py @@ -165,6 +165,8 @@ class PreProcessor(object): title_header_close = ")\s*" title_line_close = "()?\s*()?\s*(]*>)?\s*" opt_title_close = ")?" + n_lookahead_open = "(?!=" + n_lookahead_close = ")" default_title = r"(\s*[\w\'\"-]+){1,5}?(?=<)" typical_chapters = r".?(Introduction|Synopsis|Acknowledgements|Chapter|Kapitel|Epilogue|Volume\s|Prologue|Book\s|Part\s|Dedication)\s*([\d\w-]+\:?\s*){0,4}" @@ -172,7 +174,11 @@ class PreProcessor(object): uppercase_chapters = r"\s*.?([A-Z#]+(\s|-){0,3}){1,5}\s*" numeric_titles = r".?(\d+\.?\s+([\d\w-]+\:?\'?-?\s?){0,5})\s*" - chapter_marker = lookahead+chapter_line_open+chapter_header_open+typical_chapters+chapter_header_close+chapter_line_close+blank_lines+opt_title_open+title_line_open+title_header_open+default_title+title_header_close+title_line_close+opt_title_close + full_chapter_line = chapter_line_open+chapter_header_open+typical_chapters+chapter_header_close+chapter_line_close + n_lookahead = re.sub("(out|inn|cha)", "l", full_chapter_line) + print "n_lookahead is " + n_lookahead + print "Chapter line is " + full_chapter_line + "\n\n" + chapter_marker = lookahead+full_chapter_line+blank_lines+n_lookahead_open+n_lookahead+n_lookahead_close+opt_title_open+title_line_open+title_header_open+default_title+title_header_close+title_line_close+opt_title_close print chapter_marker heading = re.compile(']*>', re.IGNORECASE) self.html_preprocess_sections = len(heading.findall(html)) @@ -184,21 +190,33 @@ class PreProcessor(object): html = chapdetect.sub(self.chapter_head, html) if self.html_preprocess_sections < 10: self.log("not enough chapters, only " + unicode(self.html_preprocess_sections) + ", trying numeric chapters") - chapter_marker = lookahead+chapter_line_open+chapter_header_open+numeric_chapters+chapter_header_close+chapter_line_close+blank_lines+opt_title_open+title_line_open+title_header_open+default_title+title_header_close+title_line_close+opt_title_close + full_chapter_line = chapter_line_open+chapter_header_open+numeric_chapters+chapter_header_close+chapter_line_close + n_lookahead = re.sub("(out|inn|cha)", "l", full_chapter_line) + print "n_lookahead is " + n_lookahead + print "Chapter line is " + full_chapter_line + "\n\n" + chapter_marker = lookahead+full_chapter_line+blank_lines+n_lookahead_open+n_lookahead+n_lookahead_close+opt_title_open+title_line_open+title_header_open+default_title+title_header_close+title_line_close+opt_title_close print chapter_marker chapdetect2 = re.compile(r'%s' % chapter_marker, re.IGNORECASE) html = chapdetect2.sub(self.chapter_head, html) if self.html_preprocess_sections < 10: self.log("not enough chapters, only " + unicode(self.html_preprocess_sections) + ", trying with uppercase words") - chapter_marker = lookahead+chapter_line_open+chapter_header_open+uppercase_chapters+chapter_header_close+chapter_line_close+blank_lines+opt_title_open+title_line_open+title_header_open+default_title+title_header_close+title_line_close+opt_title_close + full_chapter_line = chapter_line_open+chapter_header_open+uppercase_chapters+chapter_header_close+chapter_line_close + n_lookahead = re.sub("(out|inn|cha)", "l", full_chapter_line) + print "n_lookahead is " + n_lookahead + print "Chapter line is " + full_chapter_line + "\n\n" + chapter_marker = lookahead+full_chapter_line+blank_lines+n_lookahead_open+n_lookahead+n_lookahead_close+opt_title_open+title_line_open+title_header_open+default_title+title_header_close+title_line_close+opt_title_close print chapter_marker chapdetect2 = re.compile(r'%s' % chapter_marker, re.UNICODE) html = chapdetect2.sub(self.chapter_head, html) if self.html_preprocess_sections < 10: self.log("not enough chapters, only " + unicode(self.html_preprocess_sections) + ", trying numeric chapters with titles") - chapter_marker = lookahead+chapter_line_open+chapter_header_open+numeric_titles+chapter_header_close+chapter_line_close+blank_lines+opt_title_open+title_line_open+title_header_open+default_title+title_header_close+title_line_close+opt_title_close + full_chapter_line = chapter_line_open+chapter_header_open+numeric_titles+chapter_header_close+chapter_line_close + n_lookahead = re.sub("(out|inn|cha)", "l", full_chapter_line) + print "n_lookahead is " + n_lookahead + print "Chapter line is " + full_chapter_line + "\n\n" + chapter_marker = lookahead+full_chapter_line+blank_lines+n_lookahead_open+n_lookahead+n_lookahead_close+opt_title_open+title_line_open+title_header_open+default_title+title_header_close+title_line_close+opt_title_close print chapter_marker chapdetect2 = re.compile(r'%s' % chapter_marker, re.IGNORECASE) html = chapdetect2.sub(self.chapter_head, html) From f7e99d2e86fbcae5fbdae3428905836256fae687 Mon Sep 17 00:00:00 2001 From: ldolse Date: Tue, 16 Nov 2010 15:54:49 +0800 Subject: [PATCH 014/375] added accented characters to the line unwrap patterns, since they're not covered under a-z character classes using the unicode option. --- src/calibre/ebooks/conversion/preprocess.py | 2 +- src/calibre/ebooks/conversion/utils.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/calibre/ebooks/conversion/preprocess.py b/src/calibre/ebooks/conversion/preprocess.py index e1d73dcfd9..ef092f7954 100644 --- a/src/calibre/ebooks/conversion/preprocess.py +++ b/src/calibre/ebooks/conversion/preprocess.py @@ -475,7 +475,7 @@ class HTMLPreProcessor(object): end_rules.append((re.compile(u'(?<=.{%i}[–—])\s*

      \s*(?=[[a-z\d])' % length), lambda match: '')) end_rules.append( # Un wrap using punctuation - (re.compile(u'(?<=.{%i}([a-z,:)\IA\u00DF]|(?)?\s*(\s*)+\s*(?=(<(i|b|u)>)?\s*[\w\d$(])' % length, re.UNICODE), wrap_lines), + (re.compile(u'(?<=.{%i}([a-zäëïöüàèìòùáćéíóńśúâêîôûçąężı,:)\IA\u00DF]|(?)?\s*(\s*)+\s*(?=(<(i|b|u)>)?\s*[\w\d$(])' % length, re.UNICODE), wrap_lines), ) for rule in self.PREPROCESS + start_rules: diff --git a/src/calibre/ebooks/conversion/utils.py b/src/calibre/ebooks/conversion/utils.py index 724428fec0..143ece4b79 100644 --- a/src/calibre/ebooks/conversion/utils.py +++ b/src/calibre/ebooks/conversion/utils.py @@ -258,7 +258,7 @@ class PreProcessor(object): self.log("Done dehyphenating") # Unwrap lines using punctation and line length unwrap_quotes = re.compile(u"(?<=.{%i}\"')\s*\s*()?\s*(?P<(p|span|div)[^>]*>\s*(<(p|span|div)[^>]*>\s*\s*)\s*){0,3}\s*<(span|div|p)[^>]*>\s*(<(span|div|p)[^>]*>)?\s*(?=[a-z])" % length, re.UNICODE) - unwrap = re.compile(u"(?<=.{%i}([a-z,:)\IA\u00DF]|(?\s*()?\s*(?P<(p|span|div)[^>]*>\s*(<(p|span|div)[^>]*>\s*\s*)\s*){0,3}\s*<(span|div|p)[^>]*>\s*(<(span|div|p)[^>]*>)?\s*" % length, re.UNICODE) + unwrap = re.compile(u"(?<=.{%i}([a-zäëïöüàèìòùáćéíóńśúâêîôûçąężı,:)\IA\u00DF]|(?\s*()?\s*(?P<(p|span|div)[^>]*>\s*(<(p|span|div)[^>]*>\s*\s*)\s*){0,3}\s*<(span|div|p)[^>]*>\s*(<(span|div|p)[^>]*>)?\s*" % length, re.UNICODE) html = unwrap.sub(' ', html) #check any remaining hyphens, but only unwrap if there is a match dehyphenator = Dehyphenator() From 4526ced6d1257a34b9f3c093f02f373291657ab8 Mon Sep 17 00:00:00 2001 From: ldolse Date: Tue, 16 Nov 2010 18:34:21 +0800 Subject: [PATCH 015/375] made conversion of nbsp to indent a bit smarter --- src/calibre/ebooks/conversion/utils.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/calibre/ebooks/conversion/utils.py b/src/calibre/ebooks/conversion/utils.py index 143ece4b79..51139d3a18 100644 --- a/src/calibre/ebooks/conversion/utils.py +++ b/src/calibre/ebooks/conversion/utils.py @@ -44,10 +44,14 @@ class PreProcessor(object): span = match.group('span') self.found_indents = self.found_indents + 1 if pstyle: - if not span: - return '

      ' + if pstyle.lower().find('style'): + pstyle = re.sub(r'"$', '; text-indent:3%"', pstyle) else: - return '

      '+span + pstyle = pstyle+' style="text-indent:3%"' + if not span: + return '

      ' + else: + return '

      '+span else: if not span: return '

      ' From 26ba75f76cc1db12439fb6f3a7c6bc9fbd049507 Mon Sep 17 00:00:00 2001 From: ldolse Date: Wed, 17 Nov 2010 10:25:51 +0800 Subject: [PATCH 016/375] added a search for emphasized lines during chapter markup --- src/calibre/ebooks/conversion/utils.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/calibre/ebooks/conversion/utils.py b/src/calibre/ebooks/conversion/utils.py index 51139d3a18..bec15924d6 100644 --- a/src/calibre/ebooks/conversion/utils.py +++ b/src/calibre/ebooks/conversion/utils.py @@ -177,9 +177,10 @@ class PreProcessor(object): numeric_chapters = r".?(\d+\.?|(CHAPTER\s*([\dA-Z\-\'\"\?\.!#,]+\s*){1,10}))\s*" uppercase_chapters = r"\s*.?([A-Z#]+(\s|-){0,3}){1,5}\s*" numeric_titles = r".?(\d+\.?\s+([\d\w-]+\:?\'?-?\s?){0,5})\s*" + emphasized_lines = r"]*>\s*(]*>)?\s*(\s*(?=[\w#\-*\s]+<)([\w#-*]+\s*){1,5}\s*)()?\s*" full_chapter_line = chapter_line_open+chapter_header_open+typical_chapters+chapter_header_close+chapter_line_close - n_lookahead = re.sub("(out|inn|cha)", "l", full_chapter_line) + n_lookahead = re.sub("(ou|in|cha)", "lookahead_", full_chapter_line) print "n_lookahead is " + n_lookahead print "Chapter line is " + full_chapter_line + "\n\n" chapter_marker = lookahead+full_chapter_line+blank_lines+n_lookahead_open+n_lookahead+n_lookahead_close+opt_title_open+title_line_open+title_header_open+default_title+title_header_close+title_line_close+opt_title_close @@ -195,7 +196,7 @@ class PreProcessor(object): if self.html_preprocess_sections < 10: self.log("not enough chapters, only " + unicode(self.html_preprocess_sections) + ", trying numeric chapters") full_chapter_line = chapter_line_open+chapter_header_open+numeric_chapters+chapter_header_close+chapter_line_close - n_lookahead = re.sub("(out|inn|cha)", "l", full_chapter_line) + n_lookahead = re.sub("(ou|in|cha)", "lookahead_", full_chapter_line) print "n_lookahead is " + n_lookahead print "Chapter line is " + full_chapter_line + "\n\n" chapter_marker = lookahead+full_chapter_line+blank_lines+n_lookahead_open+n_lookahead+n_lookahead_close+opt_title_open+title_line_open+title_header_open+default_title+title_header_close+title_line_close+opt_title_close @@ -203,10 +204,21 @@ class PreProcessor(object): chapdetect2 = re.compile(r'%s' % chapter_marker, re.IGNORECASE) html = chapdetect2.sub(self.chapter_head, html) + if self.html_preprocess_sections < 10: + self.log("not enough chapters, only " + unicode(self.html_preprocess_sections) + ", trying emphazised lines") + full_chapter_line = chapter_line_open+chapter_header_open+emphasized_lines+chapter_header_close+chapter_line_close + n_lookahead = re.sub("(ou|in|cha)", "lookahead_", full_chapter_line) + print "n_lookahead is " + n_lookahead + print "Chapter line is " + full_chapter_line + "\n\n" + chapter_marker = lookahead+full_chapter_line+blank_lines+n_lookahead_open+n_lookahead+n_lookahead_close+opt_title_open+title_line_open+title_header_open+default_title+title_header_close+title_line_close+opt_title_close + print chapter_marker + chapdetect2 = re.compile(r'%s' % chapter_marker, re.IGNORECASE) + html = chapdetect2.sub(self.chapter_head, html) + if self.html_preprocess_sections < 10: self.log("not enough chapters, only " + unicode(self.html_preprocess_sections) + ", trying with uppercase words") full_chapter_line = chapter_line_open+chapter_header_open+uppercase_chapters+chapter_header_close+chapter_line_close - n_lookahead = re.sub("(out|inn|cha)", "l", full_chapter_line) + n_lookahead = re.sub("(ou|in|cha)", "lookahead_", full_chapter_line) print "n_lookahead is " + n_lookahead print "Chapter line is " + full_chapter_line + "\n\n" chapter_marker = lookahead+full_chapter_line+blank_lines+n_lookahead_open+n_lookahead+n_lookahead_close+opt_title_open+title_line_open+title_header_open+default_title+title_header_close+title_line_close+opt_title_close @@ -217,7 +229,7 @@ class PreProcessor(object): if self.html_preprocess_sections < 10: self.log("not enough chapters, only " + unicode(self.html_preprocess_sections) + ", trying numeric chapters with titles") full_chapter_line = chapter_line_open+chapter_header_open+numeric_titles+chapter_header_close+chapter_line_close - n_lookahead = re.sub("(out|inn|cha)", "l", full_chapter_line) + n_lookahead = re.sub("(ou|in|cha)", "lookahead_", full_chapter_line) print "n_lookahead is " + n_lookahead print "Chapter line is " + full_chapter_line + "\n\n" chapter_marker = lookahead+full_chapter_line+blank_lines+n_lookahead_open+n_lookahead+n_lookahead_close+opt_title_open+title_line_open+title_header_open+default_title+title_header_close+title_line_close+opt_title_close From 13449934996a99453129f391512f412fa880f7fd Mon Sep 17 00:00:00 2001 From: Translators <> Date: Wed, 17 Nov 2010 04:49:34 +0000 Subject: [PATCH 017/375] Launchpad automatic translations update. --- src/calibre/translations/cs.po | 14 +- src/calibre/translations/nb.po | 656 +++++++++++++++++++-------------- 2 files changed, 386 insertions(+), 284 deletions(-) diff --git a/src/calibre/translations/cs.po b/src/calibre/translations/cs.po index 972625bad5..0697578190 100644 --- a/src/calibre/translations/cs.po +++ b/src/calibre/translations/cs.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-11-12 23:11+0000\n" -"PO-Revision-Date: 2010-11-13 20:32+0000\n" -"Last-Translator: Aleš Bajtalon \n" +"PO-Revision-Date: 2010-11-16 19:32+0000\n" +"Last-Translator: Marek Sušický \n" "Language-Team: Czech \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-14 05:04+0000\n" +"X-Launchpad-Export-Date: 2010-11-17 04:49+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -4784,16 +4784,16 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:25 msgid "Bold" -msgstr "" +msgstr "Tlustě" #: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:26 msgid "Italic" -msgstr "" +msgstr "Italic" #: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:28 msgid "Underline" -msgstr "" +msgstr "Podtrženo" #: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:36 msgid "" @@ -4897,7 +4897,7 @@ msgstr "Debuguj konverzní proces" #: /home/kovid/work/calibre/src/calibre/gui2/convert/debug.py:39 #: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:56 msgid "Choose debug folder" -msgstr "" +msgstr "Zvolit ladicí složku" #: /home/kovid/work/calibre/src/calibre/gui2/convert/debug.py:58 msgid "Invalid debug directory" diff --git a/src/calibre/translations/nb.po b/src/calibre/translations/nb.po index b36b35dbc8..6afd6ed742 100644 --- a/src/calibre/translations/nb.po +++ b/src/calibre/translations/nb.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2010-11-06 15:45+0000\n" -"PO-Revision-Date: 2010-11-06 01:42+0000\n" -"Last-Translator: Kovid Goyal \n" +"POT-Creation-Date: 2010-11-12 23:11+0000\n" +"PO-Revision-Date: 2010-11-16 08:41+0000\n" +"Last-Translator: Øyvind Øritsland \n" "Language-Team: Norwegian Bokmal \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-07 04:45+0000\n" +"X-Launchpad-Export-Date: 2010-11-17 04:49+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -31,7 +31,7 @@ msgstr "Gjør absolutt ingenting" #: /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:643 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:650 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:401 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 @@ -74,14 +74,14 @@ msgstr "Gjør absolutt ingenting" #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:78 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:119 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:153 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:611 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:817 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:819 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:620 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:826 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:828 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:911 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:916 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:913 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:918 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:984 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:143 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:150 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:64 @@ -123,8 +123,8 @@ msgstr "Gjør absolutt ingenting" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:141 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:927 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:936 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1243 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1246 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1249 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1252 #: /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 @@ -192,7 +192,7 @@ msgstr "Handlinger for brukergrensesnitt" msgid "Preferences" msgstr "Innstillinger" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:17 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:15 msgid "" "Follow all local links in an HTML file and create a ZIP file containing all " "linked files. This plugin is run every time you add an HTML file to the " @@ -202,7 +202,7 @@ msgstr "" "lenkede filer. Dette programtillegget kjører hver gang du legger til en HTML " "fil til biblioteket." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:53 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:51 msgid "" "Character encoding for the input HTML files. Common choices include: cp1252, " "latin1, iso-8859-1 and utf-8." @@ -210,7 +210,7 @@ msgstr "" "Skrifttegnkoding for inndata av HTML filer. Vanlige valg inkluderer: cp1252, " "latin1, iso-8859-1 og utf-8." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:60 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:58 msgid "" "Create a PMLZ archive containing the PML file and all images in the " "directory pmlname_img or images. This plugin is run every time you add a PML " @@ -220,7 +220,7 @@ msgstr "" "pmlname_img eller images. Dette programtillegget kjører hver gang du legger " "til en PML-fil til biblioteket." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:94 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:92 msgid "Extract cover from comic files" msgstr "Ekstrakter omslagside fra tegneseriefiler" @@ -267,43 +267,43 @@ msgstr "Set metadata i %s filer" msgid "Set metadata from %s files" msgstr "Set metadata fra %s filer" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:711 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:712 msgid "Look and Feel" msgstr "Utseende" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:725 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:714 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:726 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:737 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:748 msgid "Interface" msgstr "Brukergrensesnitt" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:717 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:718 msgid "Adjust the look and feel of the calibre interface to suit your tastes" msgstr "Juster utseende for calibres brukergrensesnitt etter ditt ønske" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:723 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 msgid "Behavior" msgstr "Atferd" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:729 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:730 msgid "Change the way calibre behaves" msgstr "Endrer måten calibre oppfører seg" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:734 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:206 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:735 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:209 msgid "Add your own columns" msgstr "Legg til dine egne kolonner" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:740 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:741 msgid "Add/remove your own columns to the calibre book list" msgstr "Legg til /fjern dine egne kolonner i calibres bokliste" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:745 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:746 msgid "Customize the toolbar" msgstr "Tilpass verktøylinjen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:751 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:752 msgid "" "Customize the toolbars and context menus, changing which actions are " "available in each" @@ -311,58 +311,58 @@ msgstr "" "Tilpass verktøylinjen og kontekstmenyer. Endringer med handlinger er " "tilgjengelig i hver" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:757 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 msgid "Input Options" msgstr "Valg for inndata" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:759 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:770 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:760 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:771 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:782 msgid "Conversion" msgstr "konvertering" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:763 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:764 msgid "Set conversion options specific to each input format" msgstr "Angi spesifikke konverteringsalternativer for hvert inndata-format" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:768 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 msgid "Common Options" msgstr "Vanlige valg" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:774 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:775 msgid "Set conversion options common to all formats" msgstr "Angi felles konverteringsalternativer for alle formater" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:779 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:780 msgid "Output Options" msgstr "Valg for utdata" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:785 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:786 msgid "Set conversion options specific to each output format" msgstr "Angi spesifikke konverteringsalternativer for hvert utdata-format" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:790 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:791 msgid "Adding books" msgstr "Legger til bøker" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:792 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:804 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:816 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:828 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:817 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:829 msgid "Import/Export" msgstr "Improter/Exporter" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:796 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:797 msgid "Control how calibre reads metadata from files when adding books" msgstr "" "Kontrollerer hvordan calibre leser metadata fra filer når den legger til " "bøker" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:802 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:803 msgid "Saving books to disk" msgstr "Lagrer bøker til disk" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:808 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:809 msgid "" "Control how calibre exports files from its database to disk when using Save " "to disk" @@ -370,32 +370,32 @@ msgstr "" "Kontrollerer hvordan calibre eksporterer filer fra dens database til disken " "når \"lagre til disk\" benyttes" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:814 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:815 msgid "Sending books to devices" msgstr "Sender bøker til enheter" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:820 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:821 msgid "Control how calibre transfers files to your ebook reader" msgstr "Kontrollerer hvordan calibre overfører filer til din e-bokleser" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:826 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:827 msgid "Metadata plugboards" msgstr "Instrumenttavle for metadata" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:832 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:833 msgid "Change metadata fields before saving/sending" msgstr "Endre felt for metadata før lagring/sending" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:837 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:838 msgid "Sharing books by email" msgstr "Dele bøker ved e-post" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:839 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:851 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:840 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:852 msgid "Sharing" msgstr "Deling" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:843 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:844 msgid "" "Setup sharing of books via email. Can be used for automatic sending of " "downloaded news to your devices" @@ -403,11 +403,11 @@ msgstr "" "Klargjør for deling av bøker via e-post. Kan brukes til automatisk sending " "av nedlastede nyheter til enhetene" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:849 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:850 msgid "Sharing over the net" msgstr "Deling over nettet" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:855 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:856 msgid "" "Setup the calibre Content Server which will give you access to your calibre " "library from anywhere, on any device, over the internet" @@ -415,33 +415,33 @@ msgstr "" "Klargjør calibre Innholdsserver som vil gi deg tilgang til calibres " "biblioteket fra hvor som helst, på enhver enhet, over Internett" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:862 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:863 msgid "Plugins" msgstr "Programtillegg" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:864 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:876 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:887 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:865 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:877 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:888 msgid "Advanced" msgstr "Avansert" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:868 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:869 msgid "Add/remove/customize various bits of calibre functionality" msgstr "Legg til/fjern/tilpass varierende deler av calibres funksjonalitet" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:874 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:875 msgid "Tweaks" msgstr "Tilpassning" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:880 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:881 msgid "Fine tune how calibre behaves in various contexts" msgstr "Finjuster hvordan calibre oppfører seg under varierende situasjoner" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:885 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:886 msgid "Miscellaneous" msgstr "Diverse" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:891 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:892 msgid "Miscellaneous advanced configuration" msgstr "Diverse avanserte konfigurasjoner" @@ -486,7 +486,7 @@ msgstr "" "vet noe om dokumentets inndata." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:59 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:436 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:444 msgid "" "This profile is intended for the SONY PRS line. The 500/505/600/700 etc." msgstr "" @@ -498,62 +498,62 @@ msgid "This profile is intended for the SONY PRS 300." msgstr "Denne profilen er ment for SONY PRS 300" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:80 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:476 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:484 msgid "This profile is intended for the SONY PRS-900." msgstr "Denne profilen er ment for SONY PRS-900" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:88 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:506 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:513 msgid "This profile is intended for the Microsoft Reader." msgstr "Denne profilen er ment for Microsoft Reader." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:99 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:517 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:524 msgid "This profile is intended for the Mobipocket books." msgstr "Denne profilen er ment for Mobipocket bøker." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:112 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:530 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:537 msgid "This profile is intended for the Hanlin V3 and its clones." msgstr "Denne profilen er ment for Hanlin V3 og kloner av denne." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:124 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:542 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:549 msgid "This profile is intended for the Hanlin V5 and its clones." msgstr "Denne profilen er ment for HAnlin V5 og dens kloner" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:134 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:550 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:557 msgid "This profile is intended for the Cybook G3." msgstr "Denne profilen er ment for Cybook G3." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:147 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:563 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:570 msgid "This profile is intended for the Cybook Opus." msgstr "Denne profilen er ment for Cybook Opus." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:159 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:576 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:583 msgid "This profile is intended for the Amazon Kindle." msgstr "Denne profilen er ment for Amazon Kindle." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:171 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:617 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:631 msgid "This profile is intended for the Irex Illiad." msgstr "Denne profilen er ment for Irex Illiad." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:183 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:630 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:644 msgid "This profile is intended for the IRex Digital Reader 1000." msgstr "Denne profilen er ment for IRex Digital Reader 1000." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:196 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:644 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:658 msgid "This profile is intended for the IRex Digital Reader 800." msgstr "Denne profilen er ment for IRex Digital Reader 800" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:208 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:658 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:672 msgid "This profile is intended for the B&N Nook." msgstr "Denne profilen er ment for B&N Nook." @@ -571,28 +571,28 @@ msgstr "" "å lage et dokument som er ment til å bli lest på en datamaskin eller andre " "dataprodukter." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:273 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:276 msgid "" "Intended for the iPad and similar devices with a resolution of 768x1024" msgstr "Benyttes for iPad og liknende enheter med en oppløsning på 768x1024" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:427 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:435 msgid "Intended for generic tablet devices, does no resizing of images" msgstr "Ment for generiske tablet enheter, endrer ikke billedstørrelser" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:454 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:462 msgid "This profile is intended for the Kobo Reader." msgstr "Denne profilen er tiltenkt Kobo Reader" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:467 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:475 msgid "This profile is intended for the SONY PRS-300." msgstr "Denne profilen er ment for SONY PRS-300" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:485 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:493 msgid "This profile is intended for the 5-inch JetBook." msgstr "Denne profilen er ment for 5-inch JetBook." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:494 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:502 msgid "" "This profile is intended for the SONY PRS line. The 500/505/700 etc, in " "landscape mode. Mainly useful for comics." @@ -600,11 +600,11 @@ msgstr "" "Denne profilen er ment for SONY PRS serien. 500/505/700 osv, i " "landskapsmodus. Dette er hovedsakelig anvendelig for tegneserier." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:597 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:609 msgid "This profile is intended for the Amazon Kindle DX." msgstr "Denne profilen er ment for Amazon Kindle DX." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:672 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:686 msgid "This profile is intended for the Sanda Bambook." msgstr "Denne profilen er ment for Sandra Bambook." @@ -684,7 +684,7 @@ msgstr "Slå av navngitte programtillegg" msgid "Communicate with Android phones." msgstr "Kommuniser med Android-telefoner." -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:53 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:56 msgid "" "Comma separated list of directories to send e-books to on the device. The " "first one that exists will be used" @@ -692,7 +692,7 @@ msgstr "" "Komma-delt liste av foldere som av e-bøker som sendes til enheten. Den " "første som eksisterer vil bli benyttet" -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:95 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:98 msgid "Communicate with S60 phones." msgstr "Kommuniser med S60 telefoner." @@ -1009,7 +1009,7 @@ msgstr "Kommuniser med Sweex MM300" #: /home/kovid/work/calibre/src/calibre/devices/misc.py:79 msgid "Communicate with the Digma Q600" -msgstr "" +msgstr "Kommuniser med Digma Q600" #: /home/kovid/work/calibre/src/calibre/devices/misc.py:88 msgid "Communicate with the Kogan" @@ -1048,6 +1048,14 @@ msgstr "Nook" msgid "Communicate with the Nook eBook reader." msgstr "Kommuniser med Nook eBook leser" +#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:85 +msgid "Nook Color" +msgstr "Nook Color" + +#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:86 +msgid "Communicate with the Nook Color eBook reader." +msgstr "Kommuniser med Nook Color eBook leser." + #: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:17 msgid "Communicate with the Nuut2 eBook reader." msgstr "Kommuniser med Nuut2 eBook-reader" @@ -2105,25 +2113,27 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/html/output.py:33 msgid "CSS file used for the output instead of the default file" -msgstr "" +msgstr "CSS fil brukt til utdata fremfor standardfil" #: /home/kovid/work/calibre/src/calibre/ebooks/html/output.py:36 msgid "" "Template used for generation of the html index file instead of the default " "file" -msgstr "" +msgstr "Mal brukt til generering av html indekseringsfil fremfor standardfil" #: /home/kovid/work/calibre/src/calibre/ebooks/html/output.py:39 msgid "" "Template used for the generation of the html contents of the book instead of " "the default file" -msgstr "" +msgstr "Mal brukt til generering av html-innhold i boken, fremfor sandardfil" #: /home/kovid/work/calibre/src/calibre/ebooks/html/output.py:42 msgid "" "Extract the contents of the generated ZIP file to the specified directory. " "WARNING: The contents of the directory will be deleted." msgstr "" +"Ekstraherer innholdet av en generert ZIP-fil til den spesifiserte mappen. " +"ADVARSEL: Innholdet i mappen vil bli slettet." #: /home/kovid/work/calibre/src/calibre/ebooks/lit/from_any.py:47 msgid "Creating LIT file from EPUB..." @@ -2443,8 +2453,8 @@ msgstr "Ja" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:605 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:45 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:102 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:109 #: /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 @@ -2478,8 +2488,8 @@ msgstr "Produsent" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:39 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:206 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:189 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:104 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:79 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:325 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1131 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:178 @@ -2717,7 +2727,7 @@ msgstr "Last ned %s fra %s" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:149 msgid "Convert comments downloaded from %s to plain text" -msgstr "" +msgstr "Konverter kommentarer lasted ned fra %s til ordinær tekst" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:175 msgid "Downloads metadata from Google Books" @@ -2805,7 +2815,7 @@ msgstr "" "i oversettelsen.\n" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1308 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1399 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 msgid "Cover" msgstr "Omslagside" @@ -2844,74 +2854,74 @@ msgstr "Gi emneord til merket bok som skal lagres i Personlige Dokumenter" msgid "All articles" msgstr "Alle artikler" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:259 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:262 msgid "This is an Amazon Topaz book. It cannot be processed." msgstr "Dette er en Amazon Topaz-bok. Den kan ikke koverteres." -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1400 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 msgid "Title Page" msgstr "Tittelside" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 #: /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:199 msgid "Table of Contents" msgstr "Innholdsfortegnelse" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 msgid "Index" msgstr "Innhold" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 msgid "Glossary" msgstr "Ordliste" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 msgid "Acknowledgements" msgstr "Påskjønnelse" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 msgid "Bibliography" msgstr "Litteraturliste" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 msgid "Colophon" msgstr "Kolofon" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 msgid "Copyright" msgstr "Opphavsrettighet" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 msgid "Dedication" msgstr "Tilegnet" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 msgid "Epigraph" msgstr "Epigraf" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 msgid "Foreword" msgstr "Forord" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 msgid "List of Illustrations" msgstr "Illustrasjonsliste" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 msgid "List of Tables" msgstr "Tabell-liste" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 msgid "Notes" msgstr "Merknader" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1416 msgid "Preface" msgstr "Forord" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1417 msgid "Main Text" msgstr "Hovedtekst" @@ -3959,7 +3969,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:391 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:739 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:742 msgid "Not allowed" msgstr "Ikke tillatt" @@ -4026,7 +4036,7 @@ msgstr "Kunne ikke kopiere bøker: " #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:147 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:720 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:683 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:685 #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:189 msgid "Failed" msgstr "Mislykket" @@ -4268,6 +4278,10 @@ msgid "" "second and subsequently selected books will not be deleted or " "changed.

      Please confirm you want to proceed." msgstr "" +"Bokformat og metadata fra de valgte bøkene vil bli lagt til den første " +"valgte boken (%s). ISBN vil ikke bli lagt til.

      Den andre " +"og deretter valgte bøker vil ikke bli slettet eller " +"forandret..

      Vennligst bekreft at du ønsker å fortsette." #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:209 msgid "" @@ -4279,6 +4293,13 @@ msgid "" "books will be permanently deleted from your computer.

      Are " "you sure you want to proceed?" msgstr "" +"Bokformater og metadata fra de valgte bøkene vil bli slått sammen med " +"første valgte bok (%s). ISBN vil ikke bli slått " +"sammen.

      Etter å ha slått sammen, vil den andre og de deretter valgte " +"bøker bli slettet.

      Alle bokformater fra den første valgte " +"boken vil bli beholdt og alle duplikatformater i den andre og de deretter " +"valgte bøker vil bli permanent slettet fra datamaskinen din.

      " +"Er du sikker på at du ønsker å fortsette?" #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:222 msgid "" @@ -4473,24 +4494,24 @@ msgstr "Bøker med de samme taggene" #: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:15 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:54 msgid "Tweak ePub" -msgstr "" +msgstr "Juster ePub" #: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:16 msgid "Make small changes to ePub format books" -msgstr "" +msgstr "Gjør mindre endringer i ePub-formaterte bøker" #: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:17 msgid "T" -msgstr "" +msgstr "T" #: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:27 #: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:39 msgid "Cannot tweak ePub" -msgstr "" +msgstr "Kan ikke justere ePub" #: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:40 msgid "No ePub available. First convert the book to ePub." -msgstr "" +msgstr "Ingen ePub tilgjengelig. Konverter boken til ePub først." #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:24 msgid "V" @@ -4766,11 +4787,11 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:25 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:49 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:58 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:403 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:119 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:120 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:121 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:131 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:405 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:137 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:320 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1117 @@ -4779,10 +4800,10 @@ msgstr "Bane" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:52 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:122 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:123 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:124 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:133 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:319 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/emailp.py:24 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:117 @@ -4813,9 +4834,9 @@ msgstr "Klikk for å åpne" msgid "None" msgstr "Ingen" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:402 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:404 msgid "Double-click to open Book Details window" -msgstr "" +msgstr "Dobbeltklikk for å åpne vinduet for bokdetaljer" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex.py:16 msgid "BibTeX Options" @@ -5032,12 +5053,27 @@ msgstr "Sorter tall som tekst" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:87 msgid "Include 'Series' Section" -msgstr "" +msgstr "Inkluder 'Serier' seksjon" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_tab_template_ui.py:33 msgid "Tab template for catalog.ui" msgstr "Tab mal for katalog.ui" +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:25 +msgid "Bold" +msgstr "" +"Lokalisert i " +"/home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:87" + +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:26 +msgid "Italic" +msgstr "Kursiv" + +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:28 +msgid "Underline" +msgstr "Understrek" + #: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:36 msgid "" "For settings that cannot be specified in this dialog, use the values saved " @@ -5048,11 +5084,11 @@ msgstr "" "verdiene som er lagret i en tidligere konvertering (om de finnes) i stedet " "for å benytte standardspesifikasjonen under innstillinger." -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:70 msgid "Bulk Convert" msgstr "Samlet konvertering" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:83 #: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:185 msgid "Options specific to the output format." msgstr "Valg spesifikt til utdataformatet." @@ -5398,7 +5434,7 @@ msgstr "Behold &bindinger" #: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:147 msgid "Smarten &punctuation" -msgstr "" +msgstr "Forbedre & pynte" #: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output.py:19 msgid "LRF Output" @@ -5567,6 +5603,7 @@ 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:353 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:214 msgid "&Series:" msgstr "&Serier:" @@ -5752,7 +5789,7 @@ msgid "Options specific to the input format." msgstr "Valg spesifisert til inndataformat." #: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:76 #: /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" @@ -5768,19 +5805,19 @@ msgstr "Bruk &lagrede konverteringsinnstillinger for individuelle bøker" #: /home/kovid/work/calibre/src/calibre/gui2/convert/snb_output.py:14 msgid "SNB Output" -msgstr "" +msgstr "SNB Utdata" #: /home/kovid/work/calibre/src/calibre/gui2/convert/snb_output_ui.py:40 msgid "Hide chapter name" -msgstr "" +msgstr "Skjul kapittelnavn" #: /home/kovid/work/calibre/src/calibre/gui2/convert/snb_output_ui.py:41 msgid "Insert space before the first line for each paragraph" -msgstr "" +msgstr "Legg inn mellomrom før den første linjen av hvert avsnitt" #: /home/kovid/work/calibre/src/calibre/gui2/convert/snb_output_ui.py:42 msgid "Insert empty line between paragraphs" -msgstr "" +msgstr "Legg inn en tom linje mellom avsnitt" #: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:17 msgid "" @@ -5854,7 +5891,7 @@ msgstr "Fjern T&opptekst" #: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:86 msgid "Line &un-wrap factor during preprocess:" -msgstr "" +msgstr "Linje &utpakkingsfaktor under forprosesser:" #: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:87 msgid "&Preprocess input file to possibly improve structure detection" @@ -5946,8 +5983,8 @@ msgid "Force maximum line length" msgstr "Fremdriv maksimum linjelengde" #: /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:72 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:78 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:46 #: /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 @@ -6082,16 +6119,16 @@ msgstr " indeks:" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:493 msgid "Remove series" -msgstr "" +msgstr "Fjern serier" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:496 msgid "Automatically number books" -msgstr "" +msgstr "Nummerer bøker automatisk" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:499 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:366 msgid "Force numbers to start with " -msgstr "" +msgstr "Tving tall til å starte med " #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:562 msgid "Remove all tags" @@ -6173,7 +6210,7 @@ msgstr "Hovedminne" #: /home/kovid/work/calibre/src/calibre/gui2/device.py:492 msgid "Send specific format to" -msgstr "" +msgstr "Send spesifisert format til" #: /home/kovid/work/calibre/src/calibre/gui2/device.py:493 msgid "Send and delete from library" @@ -6260,10 +6297,10 @@ msgstr "Sender e-post til" #: /home/kovid/work/calibre/src/calibre/gui2/device.py:982 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:990 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1083 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1168 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1287 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1295 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1089 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1174 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1293 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1301 msgid "No suitable formats" msgstr "Ingen passende formater" @@ -6290,37 +6327,37 @@ msgstr "Kunne ikke sende de følgende bøkene via e-post:" msgid "Sent by email:" msgstr "Sent som e-post:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1042 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1048 msgid "News:" msgstr "Nyheter:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1043 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1049 msgid "Attached is the" msgstr "Vedlagt følger" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1054 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1060 msgid "Sent news to" msgstr "Sent nyheter til" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1084 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1169 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1288 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1090 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1175 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1294 msgid "Auto convert the following books before uploading to the device?" msgstr "Autokonverter følgende bøker før du laster dem opp til enheten?" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1114 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1120 msgid "Sending catalogs to device." msgstr "Sender kataloger til enheten." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1201 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1207 msgid "Sending news to device." msgstr "Sender nyheter til enheten" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1254 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1260 msgid "Sending books to device." msgstr "Sender bøker til enheten." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1296 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1302 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." @@ -6329,11 +6366,11 @@ msgstr "" "ble funnet. Konverter boken/bøkene til et format som er støttet av din enhet " "først." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1360 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1366 msgid "No space on device" msgstr "Ikke plass på enheten" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1361 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1367 msgid "" "

      Cannot upload books to device there is no more free space available " msgstr "" @@ -6390,15 +6427,15 @@ msgstr "" msgid "&Paste from clipboard" msgstr "&Lim inn fra utkippstavlen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:80 msgid "Fit &cover within view" msgstr "Tilpass &omslagsbilde innenfor synsfelt" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:81 msgid "&Previous" msgstr "&Forrige" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:82 msgid "&Next" msgstr "&Neste" @@ -6435,38 +6472,41 @@ msgstr "katalogvalg" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:26 msgid "Check Library" -msgstr "" +msgstr "Undersøk bibliotek" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:35 msgid "&Run the check" -msgstr "" +msgstr "&Kjør undersøkelsen" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:38 msgid "Copy &to clipboard" -msgstr "" +msgstr "Kopier &til utklippstavlen" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:54 msgid "Names to ignore:" -msgstr "" +msgstr "Navn som skal ignoreres:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:59 msgid "" "Enter comma-separated standard file name wildcards, such as synctoy*.dat" msgstr "" +"Legg inn kommaseparert standard filnavn med stjernetegn, som synctoy*.dat" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:62 msgid "Extensions to ignore" -msgstr "" +msgstr "Utvidelser som skal ignoreres" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:67 msgid "" "Enter comma-separated extensions without a leading dot. Used only in book " "folders" msgstr "" +"Legg inn kommaseparert utvidelser uten et etterfølgende punktum. Benyttes " +"kun i bokmapper" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:119 msgid "Path from library" -msgstr "" +msgstr "Sti fra biblioteket" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:119 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/bookmarkmanager.py:89 @@ -6479,6 +6519,7 @@ msgid "" "The marked files and folders will be permanently deleted. Are you " "sure?" msgstr "" +"De merkede filene og mappene vil bli slettet permanent. Er du sikker?" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:45 msgid "Choose Format" @@ -6562,6 +6603,7 @@ msgid "Set options for converting %s" msgstr "Sett valg for konvertering %s" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:211 msgid "&Title:" msgstr "&Tittel:" @@ -6622,12 +6664,12 @@ msgstr "Sortering blant forfattere" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:115 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:590 msgid "Invalid author name" -msgstr "" +msgstr "Feil ved forfatternavn" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:116 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:591 msgid "Author names cannot contain & characters." -msgstr "" +msgstr "Forfatternavn kan ikke inneholde & tegn" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:71 msgid "Manage authors" @@ -6693,6 +6735,8 @@ msgid "" "No metadata found, try adjusting the title and author and/or removing the " "ISBN." msgstr "" +"Ingen metadata ble funnet. Forsøk å justere tittel og forfatter og/eller " +"fjerne ISBN." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:90 msgid "Fetch metadata" @@ -6758,19 +6802,19 @@ msgstr "Stopp &alle arbeidsoppgaver for ikkeenheter" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:26 msgid "Title/Author" -msgstr "" +msgstr "Tittel/Forfatter" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:27 msgid "Standard metadata" -msgstr "" +msgstr "Standard metadata" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:28 msgid "Custom metadata" -msgstr "" +msgstr "Egendefinerte metadata" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:29 msgid "Search/Replace" -msgstr "" +msgstr "Søk/Erstatt" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:33 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress.py:76 @@ -6794,23 +6838,23 @@ msgstr "Store eller små bokstaver i tittelen" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:189 msgid "Character match" -msgstr "" +msgstr "Karaktertreff" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:190 msgid "Regular Expression" -msgstr "" +msgstr "Vanlig uttrykk" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:193 msgid "Replace field" -msgstr "" +msgstr "Erstatt felt" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:194 msgid "Prepend to field" -msgstr "" +msgstr "Flyttes til felt" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:195 msgid "Append to field" -msgstr "" +msgstr "Legges til felt" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:206 msgid "Editing meta information for %d books" @@ -6818,18 +6862,22 @@ msgstr "Rediger metainformasjon for %d bøker" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:259 msgid "Book %d:" -msgstr "" +msgstr "Bok %d:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:274 msgid "" "You can destroy your library using this feature. Changes are " -"permanent. There is no undo function. This feature is experimental, and " -"there may be bugs. You are strongly encouraged to back up your library " -"before proceeding.

      Search and replace in text fields using character " -"matching or regular expressions. " +"permanent. There is no undo function. You are strongly encouraged to back up " +"your library before proceeding.

      Search and replace in text fields using " +"character matching or regular expressions. " msgstr "" +"Biblioteket ditt kan ødelegges dersom du bruker denne egenskapen. " +"Endringen er permanent. Det finnes ingen metode for å gjøre om dette valget. " +"Du anbefales å ta en sikkerhetskopi av biblioteket før du fortsetter.

      Søk " +"og erstatt i tekstfelter benytter tegnsett som samsvarer med vanlige " +"uttrykk. " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:282 msgid "" "In character mode, the field is searched for the entered search text. The " "text is replaced by the specified replacement text everywhere it is found in " @@ -6839,7 +6887,7 @@ msgid "" "text will match both upper- and lower-case letters" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:293 msgid "" "In regular expression mode, the search text is an arbitrary python-" "compatible regular expression. The replacement text can contain " @@ -6854,30 +6902,30 @@ msgid "" "function." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:436 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:438 msgid "You must specify a destination when source is a composite field" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:528 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:536 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:631 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:538 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:633 msgid "Search/replace invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:529 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:531 msgid "" "Authors cannot be set to the empty string. Book title %s not processed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:537 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:539 msgid "Title cannot be set to the empty string. Book title %s not processed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:632 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:634 msgid "Search pattern is invalid: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:669 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:671 msgid "" "Applying changes to %d books.\n" "Phase {0} {1}%%." @@ -7123,7 +7171,7 @@ msgid "Your test:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:401 -msgid "&Search and replace (experimental)" +msgid "&Search and replace" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:91 @@ -7645,57 +7693,52 @@ msgstr "" msgid "Negate" msgstr "Opphev" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:198 msgid "Advanced Search" msgstr "Avansert søk" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:119 -msgid "Find entries that have..." -msgstr "Finn oppføringer som har..." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:120 -msgid "&All these words:" -msgstr "&Alle disse ordene:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:121 -msgid "This exact &phrase:" -msgstr "Denne eksakte &frasen:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:122 -msgid "&One or more of these words:" -msgstr "&En eller flere av disse ordene:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:123 -msgid "But dont show entries that have..." -msgstr "Men vis ikke oppføringer som har..." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:124 -msgid "Any of these &unwanted words:" -msgstr "Noen av disse &uønskede ordene:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:199 msgid "What kind of match to use:" msgstr "Hva slags samsvarstreff som skal benyttes:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:126 -msgid "Contains: the word or phrase matches anywhere in the metadata" -msgstr "Inneholder: ord eller frase som samsvarer alle steder i metadata" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:127 -msgid "Equals: the word or phrase must match an entire metadata field" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:200 +msgid "Contains: the word or phrase matches anywhere in the metadata field" msgstr "" -"Samsvarer med: ordet eller frasen må samsvare med hele metadatafeltet" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:201 +msgid "Equals: the word or phrase must match the entire metadata field" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:202 msgid "" -"Regular expression: the expression must match anywhere in the metadata" -msgstr "Vanlig uttrykk: utrykket må samsvare alle steder i metadata" +"Regular expression: the expression must match anywhere in the metadata field" +msgstr "" -#: /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:203 +msgid "Find entries that have..." +msgstr "Finn oppføringer som har..." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:204 +msgid "&All these words:" +msgstr "&Alle disse ordene:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:205 +msgid "This exact &phrase:" +msgstr "Denne eksakte &frasen:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:206 +msgid "&One or more of these words:" +msgstr "&En eller flere av disse ordene:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:207 +msgid "But dont show entries that have..." +msgstr "Men vis ikke oppføringer som har..." + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:208 +msgid "Any of these &unwanted words:" +msgstr "Noen av disse &uønskede ordene:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:209 msgid "" "See the User Manual for more help" @@ -7703,6 +7746,47 @@ msgstr "" "Se Brukermanual for mer hjelp" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:210 +msgid "A&dvanced Search" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:212 +msgid "Enter the title." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:213 +msgid "&Author:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:215 +msgid "Ta&gs:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:216 +msgid "Enter an author's name. Only one author can be used." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:217 +msgid "" +"Enter a series name, without an index. Only one series name can be used." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:218 +msgid "Enter tags separated by spaces" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:219 +msgid "&Clear" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:220 +msgid "Search only in specific fields:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:221 +msgid "Titl&e/Author/Series ..." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/select_formats.py:45 msgid "Choose formats" msgstr "Velg formater" @@ -8394,11 +8478,15 @@ msgid "" msgstr "" "Bokvisning vil begrenses til dem som samsvarer med de valgte lagrede søkene" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:170 +msgid "Shift+Ctrl+F" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:173 msgid "Advanced search" msgstr "Avansert søk" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:177 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:178 msgid "" "

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

      Words separated by spaces are ANDed" @@ -8406,27 +8494,27 @@ msgstr "" "

      Søk i listen over bøker etter tittel, forfatter, forlegger, emneord, " "kommentarer osv.

      Ord delt med mellomrom forstås som OG" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:181 msgid "&Go!" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:187 msgid "Do Quick Search (you can also press the Enter key)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:192 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:193 msgid "Reset Quick Search" msgstr "Tilbakestill hurtigsøk" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:204 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:205 msgid "Copy current search text (instead of search name)" msgstr "Kopier gjeldende søketekst (istedet for søkenavn)" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:210 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:211 msgid "Save current search under the name shown in the box" msgstr "Lagre gjledende søk under navnet som viser i boksen" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:217 msgid "Delete current saved search" msgstr "Slett gjeldende lagrete søk" @@ -8483,47 +8571,47 @@ msgstr "Merket for sletting" msgid "Double click to edit me

      " msgstr "Dobbelklikk til rediger me

      " -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:144 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:147 msgid "Hide column %s" msgstr "Skjul kolonne %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:152 msgid "Sort on %s" msgstr "Sorter blant %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:150 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:153 msgid "Ascending" msgstr "Stigende" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:153 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:156 msgid "Descending" msgstr "Synkende" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:168 msgid "Change text alignment for %s" msgstr "Forandre tekstjustering for %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 msgid "Left" msgstr "Venstre" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 msgid "Right" msgstr "Høyre" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:171 msgid "Center" msgstr "Senter" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:190 msgid "Show column" msgstr "Vis kolonne" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:199 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:202 msgid "Restore default layout" msgstr "Gjenopprett standard visning" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:740 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:743 msgid "" "Dropping onto a device is not supported. First add the book to the calibre " "library." @@ -10404,7 +10492,7 @@ msgid "Options to customize the ebook viewer" msgstr "Valgmuligheter for å egendefinere e-bokleseren" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:42 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:704 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:708 msgid "Remember last used window size" msgstr "Husk sist brukte vindustørrelse" @@ -10580,66 +10668,66 @@ msgstr "E-bøker" msgid "No matches found for: %s" msgstr "Ingen treff ble funnet for: %s" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:481 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:485 msgid "Loading flow..." msgstr "Lastingsflyt..." -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:517 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:521 msgid "Laying out %s" msgstr "Legger ut %s" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:548 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:552 msgid "Bookmark #%d" msgstr "Bokmerke #%d" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:552 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:556 msgid "Add bookmark" msgstr "Legg til bokmerke" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:553 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:557 msgid "Enter title for bookmark:" msgstr "Legg inn tittel for bokmerke:" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:563 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:567 msgid "Manage Bookmarks" msgstr "Behandle bokmerker" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:600 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:604 msgid "Loading ebook..." msgstr "Laster e-bok..." -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:608 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:612 msgid "DRM Error" msgstr "DRM Feil" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:609 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:613 msgid "

      This book is protected by DRM" msgstr "

      Denne boken er beskyttet av DRM" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:613 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:617 msgid "Could not open ebook" msgstr "Kunne ikke åpne e-boken" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:691 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:695 msgid "Options to control the ebook viewer" msgstr "Valgmuligheter for å kontrollere e-bokleseren" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:698 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:702 msgid "" "If specified, viewer window will try to come to the front when started." msgstr "" "Om spesifisert, vil leservinduet forsøke å legge seg foran når den starter." -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:701 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:705 msgid "" "If specified, viewer window will try to open full screen when started." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:706 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:710 msgid "Print javascript alert and console messages to the console" msgstr "Skriv ut javascriptadvarsel og konsollmeldinger til konsollen" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:712 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:716 msgid "" "%prog [options] file\n" "\n" @@ -14213,6 +14301,9 @@ msgstr "Ikke last ned CSS stilsett" #~ "Standard: %default\n" #~ "Gjelder: CSV, XML utdataformater" +#~ msgid " " +#~ msgstr " " + #~ msgid "Set font delta" #~ msgstr "Sett tegnsett delta" @@ -14244,6 +14335,17 @@ msgstr "Ikke last ned CSS stilsett" #~ "- Et regex-mønster av et enslig punktum ekskluderer alle genre av emneord, " #~ "ved å utelate Genre Område" +#~ msgid "" +#~ "Regular expression: the expression must match anywhere in the metadata" +#~ msgstr "Vanlig uttrykk: utrykket må samsvare alle steder i metadata" + +#~ msgid "Contains: the word or phrase matches anywhere in the metadata" +#~ msgstr "Inneholder: ord eller frase som samsvarer alle steder i metadata" + +#~ msgid "Equals: the word or phrase must match an entire metadata field" +#~ msgstr "" +#~ "Samsvarer med: ordet eller frasen må samsvare med hele metadatafeltet" + #~ msgid "Communicate with the Teclast K3 reader." #~ msgstr "Kommuniser med Teclast K3 leser" From a55b4dbbac65ef083d3af4943243f9b6e092d227 Mon Sep 17 00:00:00 2001 From: ldolse Date: Wed, 17 Nov 2010 13:49:12 +0800 Subject: [PATCH 018/375] remove extra line feeds from html comments when sanitizing --- src/calibre/library/comments.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/calibre/library/comments.py b/src/calibre/library/comments.py index 83eec89abe..00a6ef55ae 100644 --- a/src/calibre/library/comments.py +++ b/src/calibre/library/comments.py @@ -131,7 +131,8 @@ def comments_to_html(comments): def sanitize_comments_html(html): text = html2text(html) md = markdown.Markdown(safe_mode=True) - return md.convert(text) + cleansed = re.sub('\n+', '', md.convert(text)) + return cleansed def test(): for pat, val in [ From b03b8023943417dc544f70bd470ba5f61c59d848 Mon Sep 17 00:00:00 2001 From: ldolse Date: Wed, 17 Nov 2010 14:12:14 +0800 Subject: [PATCH 019/375] adjusted css to compact the comments display --- src/calibre/gui2/book_details.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/calibre/gui2/book_details.py b/src/calibre/gui2/book_details.py index e193fe10b2..8cc2965171 100644 --- a/src/calibre/gui2/book_details.py +++ b/src/calibre/gui2/book_details.py @@ -221,6 +221,8 @@ class BookInfo(QWebView): From fb124c50a767956abcadec577fe10ad1e0e4ae80 Mon Sep 17 00:00:00 2001 From: ldolse Date: Wed, 17 Nov 2010 17:55:50 +0800 Subject: [PATCH 020/375] added negative lookahead to reduce false positive matches during chapter marking --- src/calibre/ebooks/conversion/utils.py | 54 +++++++++++++++++--------- 1 file changed, 36 insertions(+), 18 deletions(-) diff --git a/src/calibre/ebooks/conversion/utils.py b/src/calibre/ebooks/conversion/utils.py index bec15924d6..ac38a0097d 100644 --- a/src/calibre/ebooks/conversion/utils.py +++ b/src/calibre/ebooks/conversion/utils.py @@ -83,6 +83,24 @@ class PreProcessor(object): if min_lns > tot_htm_ends: return True + def dump(self, raw, where): + import os + dp = getattr(self.extra_opts, 'debug_pipeline', None) + if dp and os.path.exists(dp): + odir = os.path.join(dp, 'preprocess') + if not os.path.exists(odir): + os.makedirs(odir) + if os.path.exists(odir): + odir = os.path.join(odir, where) + if not os.path.exists(odir): + os.makedirs(odir) + name, i = None, 0 + while not name or os.path.exists(os.path.join(odir, name)): + i += 1 + name = '%04d.html'%i + with open(os.path.join(odir, name), 'wb') as f: + f.write(raw.encode('utf-8')) + def __call__(self, html): self.log("********* Preprocessing HTML *********") @@ -150,7 +168,7 @@ class PreProcessor(object): #print "blanks between paragraphs is marked True" else: blanks_between_paragraphs = False - #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") + #self.dump(html, 'before_chapter_markup') # detect chapters/sections to match xpath or splitting logic # # Build the Regular Expressions in pieces @@ -158,7 +176,7 @@ class PreProcessor(object): chapter_line_open = "<(?Pp|div)[^>]*>\s*(<(?Pfont|span|[ibu])[^>]*>)?\s*(<(?Pfont|span|[ibu])[^>]*>)?\s*(<(?Pfont|span|[ibu])[^>]*>)?\s*" chapter_header_open = r"(?P" chapter_header_close = ")\s*" - chapter_line_close = "()?\s*()?\s*()?\s*\s*" + chapter_line_close = "()?\s*()?\s*()?\s*" if blanks_between_paragraphs: blank_lines = "(\s*]*>\s*

      ){0,2}\s*" else: @@ -169,7 +187,7 @@ class PreProcessor(object): title_header_close = ")\s*" title_line_close = "()?\s*()?\s*(]*>)?\s*" opt_title_close = ")?" - n_lookahead_open = "(?!=" + n_lookahead_open = "\s+(?!" n_lookahead_close = ")" default_title = r"(\s*[\w\'\"-]+){1,5}?(?=<)" @@ -181,10 +199,10 @@ class PreProcessor(object): full_chapter_line = chapter_line_open+chapter_header_open+typical_chapters+chapter_header_close+chapter_line_close n_lookahead = re.sub("(ou|in|cha)", "lookahead_", full_chapter_line) - print "n_lookahead is " + n_lookahead - print "Chapter line is " + full_chapter_line + "\n\n" + #print "n_lookahead is:\n" + n_lookahead + "\n\n" + #print "'normal' Chapter line - no title - is:\n" + full_chapter_line + "\n\n" chapter_marker = lookahead+full_chapter_line+blank_lines+n_lookahead_open+n_lookahead+n_lookahead_close+opt_title_open+title_line_open+title_header_open+default_title+title_header_close+title_line_close+opt_title_close - print chapter_marker + #print "full chapter regex with lookahead is:\n" + chapter_marker + "\n\n" heading = re.compile(']*>', re.IGNORECASE) self.html_preprocess_sections = len(heading.findall(html)) self.log("found " + unicode(self.html_preprocess_sections) + " pre-existing headings") @@ -197,10 +215,10 @@ class PreProcessor(object): self.log("not enough chapters, only " + unicode(self.html_preprocess_sections) + ", trying numeric chapters") full_chapter_line = chapter_line_open+chapter_header_open+numeric_chapters+chapter_header_close+chapter_line_close n_lookahead = re.sub("(ou|in|cha)", "lookahead_", full_chapter_line) - print "n_lookahead is " + n_lookahead - print "Chapter line is " + full_chapter_line + "\n\n" + #print "n_lookahead is " + n_lookahead + #print "Chapter line is " + full_chapter_line + "\n\n" chapter_marker = lookahead+full_chapter_line+blank_lines+n_lookahead_open+n_lookahead+n_lookahead_close+opt_title_open+title_line_open+title_header_open+default_title+title_header_close+title_line_close+opt_title_close - print chapter_marker + #print chapter_marker chapdetect2 = re.compile(r'%s' % chapter_marker, re.IGNORECASE) html = chapdetect2.sub(self.chapter_head, html) @@ -208,10 +226,10 @@ class PreProcessor(object): self.log("not enough chapters, only " + unicode(self.html_preprocess_sections) + ", trying emphazised lines") full_chapter_line = chapter_line_open+chapter_header_open+emphasized_lines+chapter_header_close+chapter_line_close n_lookahead = re.sub("(ou|in|cha)", "lookahead_", full_chapter_line) - print "n_lookahead is " + n_lookahead - print "Chapter line is " + full_chapter_line + "\n\n" + #print "n_lookahead is " + n_lookahead + #print "Chapter line is " + full_chapter_line + "\n\n" chapter_marker = lookahead+full_chapter_line+blank_lines+n_lookahead_open+n_lookahead+n_lookahead_close+opt_title_open+title_line_open+title_header_open+default_title+title_header_close+title_line_close+opt_title_close - print chapter_marker + #print chapter_marker chapdetect2 = re.compile(r'%s' % chapter_marker, re.IGNORECASE) html = chapdetect2.sub(self.chapter_head, html) @@ -219,10 +237,10 @@ class PreProcessor(object): self.log("not enough chapters, only " + unicode(self.html_preprocess_sections) + ", trying with uppercase words") full_chapter_line = chapter_line_open+chapter_header_open+uppercase_chapters+chapter_header_close+chapter_line_close n_lookahead = re.sub("(ou|in|cha)", "lookahead_", full_chapter_line) - print "n_lookahead is " + n_lookahead - print "Chapter line is " + full_chapter_line + "\n\n" + #print "n_lookahead is " + n_lookahead + #print "Chapter line is " + full_chapter_line + "\n\n" chapter_marker = lookahead+full_chapter_line+blank_lines+n_lookahead_open+n_lookahead+n_lookahead_close+opt_title_open+title_line_open+title_header_open+default_title+title_header_close+title_line_close+opt_title_close - print chapter_marker + #print chapter_marker chapdetect2 = re.compile(r'%s' % chapter_marker, re.UNICODE) html = chapdetect2.sub(self.chapter_head, html) @@ -230,10 +248,10 @@ class PreProcessor(object): self.log("not enough chapters, only " + unicode(self.html_preprocess_sections) + ", trying numeric chapters with titles") full_chapter_line = chapter_line_open+chapter_header_open+numeric_titles+chapter_header_close+chapter_line_close n_lookahead = re.sub("(ou|in|cha)", "lookahead_", full_chapter_line) - print "n_lookahead is " + n_lookahead - print "Chapter line is " + full_chapter_line + "\n\n" + #print "n_lookahead is " + n_lookahead + #print "Chapter line is " + full_chapter_line + "\n\n" chapter_marker = lookahead+full_chapter_line+blank_lines+n_lookahead_open+n_lookahead+n_lookahead_close+opt_title_open+title_line_open+title_header_open+default_title+title_header_close+title_line_close+opt_title_close - print chapter_marker + #print chapter_marker chapdetect2 = re.compile(r'%s' % chapter_marker, re.IGNORECASE) html = chapdetect2.sub(self.chapter_head, html) From b238903ba81af83b3a7246cdf5d4d839a48f0d9b Mon Sep 17 00:00:00 2001 From: ldolse Date: Wed, 17 Nov 2010 19:27:51 +0800 Subject: [PATCH 021/375] minor tweaks to chapter marking --- src/calibre/ebooks/conversion/utils.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/calibre/ebooks/conversion/utils.py b/src/calibre/ebooks/conversion/utils.py index ac38a0097d..fffb0d75d4 100644 --- a/src/calibre/ebooks/conversion/utils.py +++ b/src/calibre/ebooks/conversion/utils.py @@ -195,7 +195,7 @@ class PreProcessor(object): numeric_chapters = r".?(\d+\.?|(CHAPTER\s*([\dA-Z\-\'\"\?\.!#,]+\s*){1,10}))\s*" uppercase_chapters = r"\s*.?([A-Z#]+(\s|-){0,3}){1,5}\s*" numeric_titles = r".?(\d+\.?\s+([\d\w-]+\:?\'?-?\s?){0,5})\s*" - emphasized_lines = r"]*>\s*(]*>)?\s*(\s*(?=[\w#\-*\s]+<)([\w#-*]+\s*){1,5}\s*)()?\s*" + emphasized_lines = r"]*>\s*(]*>)?\s*(?!([*#•]+\s*)+)(\s*(?=[\w#\-*\s]+<)([\w#-*]+\s*){1,5}\s*)()?\s*" full_chapter_line = chapter_line_open+chapter_header_open+typical_chapters+chapter_header_close+chapter_line_close n_lookahead = re.sub("(ou|in|cha)", "lookahead_", full_chapter_line) @@ -308,10 +308,10 @@ class PreProcessor(object): html = re.sub(u'\xad\s*(\s*(\s*<[iubp][^>]*>\s*)?]*>|\s*<[iubp][^>]*>)?\s*', '', html) # If still no sections after unwrapping mark split points on lines with no punctuation - if self.html_preprocess_sections < 10: + if self.html_preprocess_sections < 5: self.log("Looking for more split points based on punctuation," " currently have " + unicode(self.html_preprocess_sections)) - chapdetect3 = re.compile(r'<(?P(p|div)[^>]*)>\s*(?P
      (]*>)?\s*(<[ibu][^>]*>){0,2}\s*(]*>)?\s*(<[ibu][^>]*>){0,2}\s*(]*>)?\s*.?(?=[a-z#\-*\s]+<)([a-z#-*]+\s*){1,5}\s*\s*()?(){0,2}\s*()?\s*(){0,2}\s*()?\s*)', re.IGNORECASE) + chapdetect3 = re.compile(r'<(?P(p|div)[^>]*)>\s*(?P
      (]*>)?\s*(?!([*#•]+\s*)+)(<[ibu][^>]*>){0,2}\s*(]*>)?\s*(<[ibu][^>]*>){0,2}\s*(]*>)?\s*.?(?=[a-z#\-*\s]+<)([a-z#-*]+\s*){1,5}\s*\s*()?(){0,2}\s*()?\s*(){0,2}\s*()?\s*)', 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 From 967152e5d8f26863b6125dc64d8485bff00ca3f5 Mon Sep 17 00:00:00 2001 From: Translators <> Date: Thu, 18 Nov 2010 04:45:08 +0000 Subject: [PATCH 022/375] Launchpad automatic translations update. --- src/calibre/translations/cs.po | 18 +- src/calibre/translations/gl.po | 1269 ++++++++++++++++++-------------- 2 files changed, 740 insertions(+), 547 deletions(-) diff --git a/src/calibre/translations/cs.po b/src/calibre/translations/cs.po index 0697578190..17629ff04e 100644 --- a/src/calibre/translations/cs.po +++ b/src/calibre/translations/cs.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-11-12 23:11+0000\n" -"PO-Revision-Date: 2010-11-16 19:32+0000\n" -"Last-Translator: Marek Sušický \n" +"PO-Revision-Date: 2010-11-17 17:23+0000\n" +"Last-Translator: Aleš Bajtalon \n" "Language-Team: Czech \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-17 04:49+0000\n" +"X-Launchpad-Export-Date: 2010-11-18 04:44+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -11392,7 +11392,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/library/database2.py:2350 msgid "Copying %s" -msgstr "" +msgstr "Kopírování %s" #: /home/kovid/work/calibre/src/calibre/library/database2.py:2367 msgid "Compacting database" @@ -11645,7 +11645,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:226 msgid "Popularity" -msgstr "" +msgstr "Oblíbenost" #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:245 msgid "Sort by" @@ -11712,7 +11712,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:630 msgid "A permanent link to this book" -msgstr "" +msgstr "Trvalý odkaz k této knize" #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:641 msgid "This book has been deleted" @@ -11745,7 +11745,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/library/server/main.py:54 msgid "Write process PID to the specified file" -msgstr "" +msgstr "Zapsat proces PID do zadaného souboru" #: /home/kovid/work/calibre/src/calibre/library/server/main.py:58 msgid "" @@ -11758,6 +11758,8 @@ msgid "" "Auto reload server when source code changes. May not work in all " "environments." msgstr "" +"Automaticky znovu načíst server při změně zdrojového kódu. Nemusí fungovat " +"ve všech prostředích." #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:112 msgid "%d book" @@ -11819,7 +11821,7 @@ msgstr "Přístupový klíč pro isbndb.com" #: /home/kovid/work/calibre/src/calibre/utils/config.py:703 msgid "Default timeout for network operations (seconds)" -msgstr "" +msgstr "Výchozí hodnota časového limitu pro síťové operace (v sekundách)" #: /home/kovid/work/calibre/src/calibre/utils/config.py:705 msgid "Path to directory in which your library of books is stored" diff --git a/src/calibre/translations/gl.po b/src/calibre/translations/gl.po index 276041a1da..f98da72b60 100644 --- a/src/calibre/translations/gl.po +++ b/src/calibre/translations/gl.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2010-10-29 19:59+0000\n" -"PO-Revision-Date: 2010-10-29 19:53+0000\n" +"POT-Creation-Date: 2010-11-12 23:11+0000\n" +"PO-Revision-Date: 2010-11-17 13:47+0000\n" "Last-Translator: Antón Méixome \n" "Language-Team: Galician \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-10-30 05:03+0000\n" +"X-Launchpad-Export-Date: 2010-11-18 04:45+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -31,7 +31,7 @@ msgstr "Non facer nada" #: /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:643 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:650 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:401 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 @@ -40,8 +40,8 @@ msgstr "Non facer nada" #: /home/kovid/work/calibre/src/calibre/ebooks/epub/periodical.py:124 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:93 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:95 -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:336 -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:339 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:343 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:346 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1894 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1896 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:24 @@ -55,7 +55,7 @@ msgstr "Non facer nada" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:36 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:61 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:50 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:333 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:354 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:36 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:64 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:66 @@ -74,14 +74,14 @@ msgstr "Non facer nada" #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:78 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:119 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:153 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:611 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:817 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:819 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:620 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:826 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:828 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:911 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:916 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:913 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:918 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:984 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:143 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:150 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:64 @@ -113,27 +113,27 @@ msgstr "Non facer nada" #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:241 #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:356 #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:363 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:277 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:282 #: /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:114 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:139 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:141 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:915 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:924 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1231 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1234 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:927 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:936 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1249 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1252 #: /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:571 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:186 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:383 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:402 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:925 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1119 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:918 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1112 #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:112 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:189 #: /home/kovid/work/calibre/src/calibre/library/cli.py:215 @@ -145,7 +145,7 @@ msgstr "Non facer nada" #: /home/kovid/work/calibre/src/calibre/library/database2.py:2161 #: /home/kovid/work/calibre/src/calibre/library/database2.py:2163 #: /home/kovid/work/calibre/src/calibre/library/database2.py:2295 -#: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:228 +#: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:229 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:139 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:142 #: /home/kovid/work/calibre/src/calibre/library/server/xml.py:78 @@ -192,7 +192,7 @@ msgstr "Acción da interface de usuario" msgid "Preferences" msgstr "Preferencias" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:17 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:15 msgid "" "Follow all local links in an HTML file and create a ZIP file containing all " "linked files. This plugin is run every time you add an HTML file to the " @@ -202,7 +202,7 @@ msgstr "" "todos os ficheiros ligados. Este engadido execútase cada vez que se engade " "un ficheiro HTML á biblioteca." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:53 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:51 msgid "" "Character encoding for the input HTML files. Common choices include: cp1252, " "latin1, iso-8859-1 and utf-8." @@ -210,7 +210,7 @@ msgstr "" "Codificación de caracteres para os ficheiros HTML de orixe. As opcións " "comúns inclúen: cp1252, latin1, iso-8859-1 e utf-8." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:60 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:58 msgid "" "Create a PMLZ archive containing the PML file and all images in the " "directory pmlname_img or images. This plugin is run every time you add a PML " @@ -220,7 +220,7 @@ msgstr "" "cartafol pmlname_img ou imaxes. Este engadido execútase cada vez que engade " "un ficheiro PML á biblioteca." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:94 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:92 msgid "Extract cover from comic files" msgstr "Extrae a portada dos ficheiros de banda deseñada" @@ -267,45 +267,45 @@ msgstr "Define os metadatos nos ficheiros %s" msgid "Set metadata from %s files" msgstr "Define os metadatos desde os ficheiros %s" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:708 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:712 msgid "Look and Feel" msgstr "Aparencia e comportamento" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:710 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:722 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:733 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:744 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:714 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:726 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:737 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:748 msgid "Interface" msgstr "Interface" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:714 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:718 msgid "Adjust the look and feel of the calibre interface to suit your tastes" msgstr "" "Axuste a aparencia e comportamento da interface do Calibre para que se " "adapte aos seus gustos" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:720 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 msgid "Behavior" msgstr "Comportamento" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:726 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:730 msgid "Change the way calibre behaves" msgstr "Cambiar o modo en que se comporta o Calibre" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:731 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:202 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:735 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:209 msgid "Add your own columns" msgstr "Engadir as súas propias columnas" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:737 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:741 msgid "Add/remove your own columns to the calibre book list" msgstr "Engadir/retirar as columnas propias da lista de libros do Calibre" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:742 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:746 msgid "Customize the toolbar" msgstr "Personalizar a barra de ferramentas" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:748 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:752 msgid "" "Customize the toolbars and context menus, changing which actions are " "available in each" @@ -313,60 +313,60 @@ msgstr "" "Personalizar as barras de ferramentas e os menús de contexto, cambiando as " "accións que estarán dispoñíbeis en cada un" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:754 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 msgid "Input Options" msgstr "Opcións de entrada" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:756 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:767 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:778 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:760 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:771 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:782 msgid "Conversion" msgstr "Conversión" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:760 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:764 msgid "Set conversion options specific to each input format" msgstr "" "Estabelecer as opcións de conversión específicas para cada formato de entrada" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:765 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 msgid "Common Options" msgstr "Opcións comúns" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:771 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:775 msgid "Set conversion options common to all formats" msgstr "Estabelecer as opcións de conversión comúns para todos os formatos" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:776 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:780 msgid "Output Options" msgstr "Opcións de saída" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:782 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:786 msgid "Set conversion options specific to each output format" msgstr "" "Estabelece as opcións específicas de conversión para cada formato de saída" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:787 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:791 msgid "Adding books" msgstr "Adición de libros" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:789 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:801 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:813 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:825 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:817 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:829 msgid "Import/Export" msgstr "Importar/exportar" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:797 msgid "Control how calibre reads metadata from files when adding books" msgstr "" "Controla o modo como Calibre le os metadatos dos ficheiros na proceso de " "adición de libros" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:799 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:803 msgid "Saving books to disk" msgstr "Gardado de libros no disco" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:809 msgid "" "Control how calibre exports files from its database to disk when using Save " "to disk" @@ -374,33 +374,33 @@ msgstr "" "Controla o modo como Calibre exporta ficheiros da súa base de datos no " "disco no proceso de Gardado no disco" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:811 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:815 msgid "Sending books to devices" msgstr "Envío de libros a dispositivos" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:817 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:821 msgid "Control how calibre transfers files to your ebook reader" msgstr "" "Controla cando Calibre transfere os ficheiros ao seu lector de libros" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:823 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:827 msgid "Metadata plugboards" msgstr "Plugboards de metadatos" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:829 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:833 msgid "Change metadata fields before saving/sending" msgstr "Cambiar campos de metadatos antes do gardado/envío" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:834 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:838 msgid "Sharing books by email" msgstr "Compartición de libros por correo" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:836 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:848 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:840 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:852 msgid "Sharing" msgstr "Compartición" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:840 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:844 msgid "" "Setup sharing of books via email. Can be used for automatic sending of " "downloaded news to your devices" @@ -408,11 +408,11 @@ msgstr "" "Configura a compartición de libros por correo electrónico. Pódese usar para " "enviar automticamente as noticias descargadas aos seus dispositivos" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:846 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:850 msgid "Sharing over the net" msgstr "Compartición na rede" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:852 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:856 msgid "" "Setup the calibre Content Server which will give you access to your calibre " "library from anywhere, on any device, over the internet" @@ -421,33 +421,33 @@ msgstr "" "biblioteca do Calibre en calquera lugar, con calquera dispositivo, a través " "da Internet." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:859 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:863 msgid "Plugins" msgstr "Complementos" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:861 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:873 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:884 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:865 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:877 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:888 msgid "Advanced" msgstr "Avanzado" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:865 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:869 msgid "Add/remove/customize various bits of calibre functionality" msgstr "Engadir/eliminar/configurar diversas funcións do Calibre" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:871 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:875 msgid "Tweaks" msgstr "Axustes" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:877 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:881 msgid "Fine tune how calibre behaves in various contexts" msgstr "Axuste fino de como se comporta o Calibre en diversos contextos" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:882 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:886 msgid "Miscellaneous" msgstr "Miscelánea" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:888 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:892 msgid "Miscellaneous advanced configuration" msgstr "Configuración miscelánea avanzada" @@ -492,7 +492,7 @@ msgstr "" "non sabe nada sobre o documento de entrada." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:59 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:433 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:444 msgid "" "This profile is intended for the SONY PRS line. The 500/505/600/700 etc." msgstr "" @@ -503,62 +503,62 @@ msgid "This profile is intended for the SONY PRS 300." msgstr "Este perfil é o propio para o SONY PRS 300." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:80 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:470 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:484 msgid "This profile is intended for the SONY PRS-900." msgstr "Este perfil é o propio para o SONY PRS-900." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:88 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:500 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:513 msgid "This profile is intended for the Microsoft Reader." msgstr "Este perfil é o propio para o Microsoft Reader." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:99 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:511 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:524 msgid "This profile is intended for the Mobipocket books." msgstr "Este perfil é o propio para os libros Mobipocket." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:112 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:524 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:537 msgid "This profile is intended for the Hanlin V3 and its clones." msgstr "Este perfil é o propio para o Hanlin V3 e os seus clones." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:124 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:536 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:549 msgid "This profile is intended for the Hanlin V5 and its clones." msgstr "Este perfil é o propio para o Hanlin V5 e os seus clones." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:134 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:544 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:557 msgid "This profile is intended for the Cybook G3." msgstr "Este perfil é o propio para o Cybook G3." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:147 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:557 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:570 msgid "This profile is intended for the Cybook Opus." msgstr "Este perfil é o propio para o Cybook Opus." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:159 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:568 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:583 msgid "This profile is intended for the Amazon Kindle." msgstr "Este perfil é o propio para o Kindle de Amazon." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:171 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:609 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:631 msgid "This profile is intended for the Irex Illiad." msgstr "Este perfil é o propio para o rex Illiad." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:183 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:622 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:644 msgid "This profile is intended for the IRex Digital Reader 1000." msgstr "Este peril é o propio para o IRex Digital Reader 1000." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:196 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:636 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:658 msgid "This profile is intended for the IRex Digital Reader 800." msgstr "Este perfil é o propio para o IRex Digital Reader 800." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:208 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:650 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:672 msgid "This profile is intended for the B&N Nook." msgstr "Este perfil é o propio para o B&N Nook." @@ -576,30 +576,30 @@ msgstr "" "quere producir un documento apropiado para ser lido nun computador ou noutro " "tipo de dispositivos." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:270 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:276 msgid "" "Intended for the iPad and similar devices with a resolution of 768x1024" msgstr "" "Sangrado para o iPad ou dispositivos semellantes cunha resolución de 768x1024" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:424 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:435 msgid "Intended for generic tablet devices, does no resizing of images" msgstr "" "Orientado dispositivos de tableta xenéricos, sen redimensionado de imaxes" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:448 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:462 msgid "This profile is intended for the Kobo Reader." msgstr "Este perfil está sangrado para o Kobo Reader." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:461 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:475 msgid "This profile is intended for the SONY PRS-300." msgstr "Este perfil é o propio para o SONY PRS-300." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:479 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:493 msgid "This profile is intended for the 5-inch JetBook." msgstr "Este perfil é o propio para o JetBook de cinco polgadas." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:488 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:502 msgid "" "This profile is intended for the SONY PRS line. The 500/505/700 etc, in " "landscape mode. Mainly useful for comics." @@ -607,11 +607,11 @@ msgstr "" "Este perfl é o propio para os da liña SONY PRS. Os 00/505/700 etc en modo " "apaisado. Usados sobre todo para cómics." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:589 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:609 msgid "This profile is intended for the Amazon Kindle DX." msgstr "Este perfil é o propio o Amazon Kindle DX." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:664 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:686 msgid "This profile is intended for the Sanda Bambook." msgstr "Este perfil está pensado para o Sandra Bambook." @@ -690,7 +690,7 @@ msgstr "Desactivar o complemento sinalado" msgid "Communicate with Android phones." msgstr "Comunicar con teléfonos Android." -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:53 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:56 msgid "" "Comma separated list of directories to send e-books to on the device. The " "first one that exists will be used" @@ -698,7 +698,7 @@ msgstr "" "Lista de cartafoles, separados por comas, onde almacenar os libros no " "dispositivo. Usarase o primeiro que exista" -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:95 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:98 msgid "Communicate with S60 phones." msgstr "Comunicar con teléfonos S60" @@ -733,14 +733,14 @@ msgstr "Actualizando a relación de metadatos..." #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:378 #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:947 #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:987 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2949 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2989 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2956 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2996 msgid "%d of %d" msgstr "%d de %d" #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:385 #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:992 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2995 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:3002 msgid "finished" msgstr "ramtouse" @@ -770,7 +770,7 @@ msgstr "" "Algunhas portadas non se converteron. \n" "Prema \"Amosar detalles\" para relacionalas." -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2546 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2553 #: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:444 #: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:467 #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:882 @@ -784,7 +784,7 @@ msgstr "" msgid "News" msgstr "Noticias" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2547 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2554 #: /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:1984 @@ -792,7 +792,7 @@ msgstr "Noticias" msgid "Catalog" msgstr "Catálogo" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2853 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2860 msgid "Communicate with iTunes." msgstr "Conectar con iTunes." @@ -1016,19 +1016,23 @@ msgid "Communicate with the Sweex MM300" msgstr "Conectar co Sweex MM300" #: /home/kovid/work/calibre/src/calibre/devices/misc.py:79 +msgid "Communicate with the Digma Q600" +msgstr "Comunicar co Digma Q600" + +#: /home/kovid/work/calibre/src/calibre/devices/misc.py:88 msgid "Communicate with the Kogan" msgstr "Comunicar co Kogan" -#: /home/kovid/work/calibre/src/calibre/devices/misc.py:87 -#: /home/kovid/work/calibre/src/calibre/devices/misc.py:114 +#: /home/kovid/work/calibre/src/calibre/devices/misc.py:96 +#: /home/kovid/work/calibre/src/calibre/devices/misc.py:123 msgid "Communicate with the Pandigital Novel" msgstr "Conectar co Pandigital Novel" -#: /home/kovid/work/calibre/src/calibre/devices/misc.py:130 +#: /home/kovid/work/calibre/src/calibre/devices/misc.py:142 msgid "Communicate with the VelocityMicro" msgstr "Comunicar con VelocityMono" -#: /home/kovid/work/calibre/src/calibre/devices/misc.py:148 +#: /home/kovid/work/calibre/src/calibre/devices/misc.py:160 msgid "Communicate with the GM2000" msgstr "Comunicar co GM2000" @@ -1052,6 +1056,14 @@ msgstr "O Nook" msgid "Communicate with the Nook eBook reader." msgstr "Comunicar co lector de libro electrónico Nook." +#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:85 +msgid "Nook Color" +msgstr "Nook Color" + +#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:86 +msgid "Communicate with the Nook Color eBook reader." +msgstr "Comunicar co lector de libros electrónicos Nook Color" + #: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:17 msgid "Communicate with the Nuut2 eBook reader." msgstr "Comunicar co lector Nuut2." @@ -1091,7 +1103,7 @@ msgstr "Comunicar co lector de Newsmy" #: /home/kovid/work/calibre/src/calibre/devices/teclast/driver.py:47 msgid "Communicate with the Pico reader." -msgstr "" +msgstr "Comunicar co lector Pico." #: /home/kovid/work/calibre/src/calibre/devices/teclast/driver.py:57 msgid "Communicate with the iPapyrus reader." @@ -2115,6 +2127,34 @@ msgstr "" "conversión parcial previa dun ficheiro PDF. O valor predefinido é %default, " "que desactiva esta opción." +#: /home/kovid/work/calibre/src/calibre/ebooks/html/output.py:33 +msgid "CSS file used for the output instead of the default file" +msgstr "CSS utilizado para a saída en vez do arquivo predeterminado" + +#: /home/kovid/work/calibre/src/calibre/ebooks/html/output.py:36 +msgid "" +"Template used for generation of the html index file instead of the default " +"file" +msgstr "" +"Modelo usado para a xeración do ficheiro de html index en lugar do ficheiro " +"predeterminado" + +#: /home/kovid/work/calibre/src/calibre/ebooks/html/output.py:39 +msgid "" +"Template used for the generation of the html contents of the book instead of " +"the default file" +msgstr "" +"Modelo usado para a xeración dos contidos de html do libro en lugar do " +"predeterminado" + +#: /home/kovid/work/calibre/src/calibre/ebooks/html/output.py:42 +msgid "" +"Extract the contents of the generated ZIP file to the specified directory. " +"WARNING: The contents of the directory will be deleted." +msgstr "" +"Extraer o contido do arquivo ZIP no cartafol correspondente. AVISO: " +"Borrarase o contido do cartafol." + #: /home/kovid/work/calibre/src/calibre/ebooks/lit/from_any.py:47 msgid "Creating LIT file from EPUB..." msgstr "Creando un ficheiro LIT a partir de EPUB..." @@ -2431,13 +2471,13 @@ msgstr "Si" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:605 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:45 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:102 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:109 #: /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:380 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:930 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:373 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:923 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:303 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:570 msgid "Title" @@ -2446,8 +2486,8 @@ msgstr "Título" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:606 #: /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:385 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:931 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:378 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:924 msgid "Author(s)" msgstr "Autores/as" @@ -2463,37 +2503,36 @@ msgid "Producer" msgstr "Produtor" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:609 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:37 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:212 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:39 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:206 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:189 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:104 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:72 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:332 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1138 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:79 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:325 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1131 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:178 msgid "Comments" msgstr "Comentarios" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:611 -#: /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/ebooks/oeb/transforms/jacket.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:29 #: /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:320 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1134 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:313 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1127 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:160 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:618 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:623 msgid "Tags" msgstr "Etiquetas" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:613 -#: /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/ebooks/oeb/transforms/jacket.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:28 #: /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:337 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1143 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:330 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1136 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:108 msgid "Series" msgstr "Series" @@ -2503,12 +2542,12 @@ msgid "Language" msgstr "Idioma" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:616 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1126 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1119 msgid "Timestamp" msgstr "Marca temporal" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:618 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:151 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:157 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:63 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:70 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:258 @@ -2683,35 +2722,39 @@ msgstr "" msgid "Downloads metadata from Douban.com" msgstr "Descargar os metadatos de Douban.com" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:51 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:57 msgid "Metadata download" msgstr "Descarga de metadatos" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:128 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:141 msgid "ratings" msgstr "puntuacións" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:128 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:141 msgid "tags" msgstr "etiquetas" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:129 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:142 msgid "description/reviews" msgstr "descrición/críticas" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:130 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:143 msgid "Download %s from %s" msgstr "Descargar %s desde %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:156 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:149 +msgid "Convert comments downloaded from %s to plain text" +msgstr "Coverter os comentarios descargados de %s a texto simple" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:175 msgid "Downloads metadata from Google Books" msgstr "Descarga os metadatos do Google Books" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:173 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:192 msgid "Downloads metadata from isbndb.com" msgstr "Descara os metadatos de isbndb.com" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:201 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:220 msgid "" "To use isbndb.com you must sign up for a %sfree account%s and enter your " "access key below." @@ -2719,11 +2762,11 @@ msgstr "" "Para empregar o isbndb.com, é preciso ter unha %sconta gratuíta%s e escribir " "a súa chave de acceso abaixo." -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:211 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:230 msgid "Downloads social metadata from amazon.com" msgstr "Descarga os metadatos de amazon.com" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:230 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:251 msgid "Downloads series/tags/rating information from librarything.com" msgstr "" "Descargar a información de series, etiquetas e puntuación de librarything.com" @@ -2787,7 +2830,7 @@ msgstr "" "través de LibraryThing.com\n" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1308 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1399 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 msgid "Cover" msgstr "Capa" @@ -2827,74 +2870,74 @@ msgstr "" msgid "All articles" msgstr "Todos os artigos" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:259 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:262 msgid "This is an Amazon Topaz book. It cannot be processed." msgstr "Este é un libro Topaz de Amazon. Por tanto, non se pode procesar." -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1400 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 msgid "Title Page" msgstr "Páxina de título" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 #: /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:199 msgid "Table of Contents" msgstr "Índice" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 msgid "Index" msgstr "Índice" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 msgid "Glossary" msgstr "Glosario" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 msgid "Acknowledgements" msgstr "Agradecementos" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 msgid "Bibliography" msgstr "Bibliografia" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 msgid "Colophon" msgstr "Colofón" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 msgid "Copyright" msgstr "Dereitos de copia" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 msgid "Dedication" msgstr "Dedicatoria" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 msgid "Epigraph" msgstr "Epígrafe" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 msgid "Foreword" msgstr "Prólogo" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 msgid "List of Illustrations" msgstr "Lista de ilustracións" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 msgid "List of Tables" msgstr "Lista de táboas" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 msgid "Notes" msgstr "Notas" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1416 msgid "Preface" msgstr "Prefacio" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1417 msgid "Main Text" msgstr "Texto principal" @@ -2911,9 +2954,9 @@ msgstr "Libro %s de %s" msgid "HTML TOC generation options." msgstr "Opcións da xeración HTM TOC" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:153 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:159 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:71 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:616 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:621 msgid "Rating" msgstr "Avaliación" @@ -3309,18 +3352,23 @@ msgstr "" msgid "" "Specify whether or not to insert an empty line between two paragraphs." msgstr "" +"Especificar se inserimos ou non unha liña baleira entre dous parágrafos." #: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:40 msgid "" "Specify whether or not to insert two space characters to indent the first " "line of each paragraph." msgstr "" +"Especificar se inserir ou non dous caracteres de espazo para identar a " +"primeira liña de cada parágrafo." #: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:44 msgid "" "Specify whether or not to hide the chapter title for each chapter. Useful " "for image-only output (eg. comics)." msgstr "" +"Especificar se agochar ou non o título do capítulo para cada capítulo. " +"Práctico no caso de saída soamente para imaxes (ex. cómics)" #: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:122 msgid "Start Page" @@ -3666,8 +3714,8 @@ msgstr "Engadir á biblioteca" #: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:246 #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:56 #: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:28 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:95 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:119 msgid "No book selected" msgstr "Non se seleccionou ningún libro" @@ -3691,7 +3739,7 @@ msgid "Add books to your calibre library from the connected device" msgstr "Engadir libros á biblioteca do Calibre desde o dispositivo conectado" #: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:536 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:548 msgid "Fetch annotations (experimental)" msgstr "Obter anotacións (experimental)" @@ -3788,7 +3836,7 @@ msgid "Checking database integrity" msgstr "A comprobar a integridade da base de datos" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:128 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:645 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:657 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:41 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:54 msgid "Error" @@ -3816,7 +3864,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:148 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:51 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:139 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:140 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:112 msgid "%d books" msgstr "%d libros" @@ -3963,7 +4011,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:391 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:734 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:742 msgid "Not allowed" msgstr "Non permitido" @@ -4029,8 +4077,8 @@ msgid "Could not copy books: " msgstr "No se puideron copiar estes libros: " #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:147 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:708 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:679 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:720 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:685 #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:189 msgid "Failed" msgstr "Fallou" @@ -4266,36 +4314,37 @@ msgstr "Non se poden unir os libros" msgid "At least two books must be selected for merging" msgstr "Precísase seleccionar, cando menos, dous libros para os unir" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:196 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:197 msgid "" "Book formats and metadata from the selected books will be added to the " -"first selected book. ISBN will not be merged.

      The " +"first selected book (%s). ISBN will not be merged.

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

      Please confirm you want to proceed." msgstr "" -"Os formatos e metadatos dos libros seleccionados engadiranse ao primeir " -"libro seleccionado. O ISBN non se engadirá.

      O segundo " -"libro e os seguintes non se borrarán nin se alterarán.

      Confirme que " -"desexa continuar." +"Os formatos de libro e os metadatos dos libros seleccionado serán engadidos " +"ao primeiro libro seleccionado (%s). O ISBN non se combinará. " +"

      O segundo e subsecuentes libros seleccionados non serán eliminados " +"nin cambiados.

      Confirme por favor que quere proceder." -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:209 msgid "" "Book formats and metadata from the selected books will be merged into the " -"first selected book. ISBN will not be merged.

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

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

      Are you sure " -"you want to proceed?" +"first selected book (%s). 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 "" -"Os formatos e metadatos dos libros seleccionados engadiranse ao primeiro " -"libro seleccionado. O ISBN non se engadirá.

      Despois da " -"unión, o segundo libro e os seguintes borraranse.

      Todos os " -"formatos do primeiro libro seleccionado manteranse e se hai formatos " -"duplicados nos restantes libros, borraranse permanentemente do seu " -"computador.

      Está seguro de querer continuar?" +"Os formatos de libro e os metadatos dos libros seleccionados combinaranse no " +"primeiro libro seleccionado (%s). O ISBN non non será " +"combinado.

      Despois de combinar o seguindo e subsecuentes libros " +"seleccionados, eliminaranse.

      Todos os formatos do primeiro " +"libro seleccionado gardaranse e calquera formato duplicado no segundo e " +"subsecuentes libros seleccionados eliminaranse do seu computador. " +"

      Está seguro de querer proceder?" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:222 msgid "" "You are about to merge more than 5 books. Are you sure you want to " "proceed?" @@ -4431,7 +4480,7 @@ msgid "Click the show details button to see which ones." msgstr "Prema o botón de amosar detalles para os ver." #: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:16 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:623 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:628 msgid "Show book details" msgstr "Amosar os detalles do libro" @@ -4518,21 +4567,21 @@ msgstr "Ver" msgid "View specific format" msgstr "Ver o formato específico" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:95 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:156 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:158 msgid "Cannot view" msgstr "Non se pode ver" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:100 #: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:77 msgid "Choose the format to view" msgstr "Escoller o formato de visualización" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:108 msgid "Multiple Books Selected" msgstr "Seleccionou múltiplos libros" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:109 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 " @@ -4544,11 +4593,11 @@ msgstr "" "computador. Ademais, unha vez comezado o proceso, non o pode deter até que " "rematar. Desexa, con todo, continuar?" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:118 msgid "Cannot open folder" msgstr "Non se pode abrir o ficheiro" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:157 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:159 msgid "%s has no available formats." msgstr "%s non ten formatos dispoíbeis" @@ -4573,7 +4622,7 @@ msgid "The specified directory could not be processed." msgstr "Non se puido procesar o directorio especificado." #: /home/kovid/work/calibre/src/calibre/gui2/add.py:229 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:857 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:869 msgid "No books" msgstr "Sen libros" @@ -4777,49 +4826,49 @@ msgstr "" "&Múltiplos libros por cartafol interpreta que cada ficheiro de ebook é un " "libro diferente" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:23 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:47 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:56 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:313 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:119 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:120 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:121 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:131 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:25 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:405 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:137 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:327 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1124 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:320 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1117 msgid "Path" msgstr "Camiño" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:24 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:50 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:122 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:123 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:124 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:127 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:326 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:319 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/emailp.py:24 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:117 msgid "Formats" msgstr "Formatos" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:25 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:934 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1127 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:927 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1120 msgid "Collections" msgstr "Coleccións" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:49 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:51 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:60 msgid "Click to open" msgstr "Prema para abrir" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:50 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:319 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:325 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:331 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1133 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1137 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:312 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:318 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1126 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1130 #: /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 @@ -4827,9 +4876,9 @@ msgstr "Prema para abrir" msgid "None" msgstr "Ningún" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:312 -msgid "Click to open Book Details window" -msgstr "Prema para abrir a xanela de detalles do libro" +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:404 +msgid "Double-click to open Book Details window" +msgstr "Facer doble clic para abrir a ventá Detalles do Libro" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex.py:16 msgid "BibTeX Options" @@ -5053,6 +5102,19 @@ msgstr "Incluír a sección \"Serie\"" msgid "Tab template for catalog.ui" msgstr "Modelo para catalog.ui" +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:25 +msgid "Bold" +msgstr "Negra" + +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:26 +msgid "Italic" +msgstr "Cursiva" + +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:28 +msgid "Underline" +msgstr "Subliñado" + #: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:36 msgid "" "For settings that cannot be specified in this dialog, use the values saved " @@ -5063,11 +5125,11 @@ msgstr "" "empregar os valores gardados na conversión anterior (se existir) no canto de " "as especificadas nas Preferencias." -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:70 msgid "Bulk Convert" msgstr "Conversión por Petición" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:83 #: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:185 msgid "Options specific to the output format." msgstr "Opcións específicas do formato de saida." @@ -5541,7 +5603,7 @@ msgid "Change the title of this book" msgstr "Mudar o título deste libro" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:179 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:333 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:335 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:377 msgid "&Author(s): " msgstr "&Autores/as: " @@ -5559,7 +5621,7 @@ msgstr "" "vírgulas" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:182 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:342 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:344 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:388 msgid "&Publisher: " msgstr "&Editorial: " @@ -5570,7 +5632,7 @@ msgid "Ta&gs: " msgstr "&Etiquetas " #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:184 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:344 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:346 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:390 msgid "" "Tags categorize the book. This is particularly useful while searching. " @@ -5581,15 +5643,16 @@ msgstr "" "estar separadas por vírgula." #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:185 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:351 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:353 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:214 msgid "&Series:" msgstr "&Serie:" #: /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:352 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:353 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:354 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:355 #: /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:395 msgid "List of known series. You can add new series." @@ -5770,7 +5833,7 @@ msgid "Options specific to the input format." msgstr "Opcións específicas do formato de entrada." #: /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/book_info_ui.py:76 #: /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" @@ -5791,7 +5854,7 @@ msgstr "Saída SNB" #: /home/kovid/work/calibre/src/calibre/gui2/convert/snb_output_ui.py:40 msgid "Hide chapter name" -msgstr "" +msgstr "Non amosar o número de capítulo" #: /home/kovid/work/calibre/src/calibre/gui2/convert/snb_output_ui.py:41 msgid "Insert space before the first line for each paragraph" @@ -5968,8 +6031,8 @@ msgid "Force maximum line length" msgstr "Forzar a lonxitude máxima da liña" #: /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/book_info_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:78 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:46 #: /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 @@ -6112,7 +6175,7 @@ msgid "Automatically number books" msgstr "Numerar automaticamente os libros" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:499 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:364 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:366 msgid "Force numbers to start with " msgstr "Forzar números para comezar con " @@ -6194,31 +6257,31 @@ msgstr "Enviar á tarxeta de almacenaxe B" msgid "Main Memory" msgstr "Memoria principal" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:491 -msgid "Send and delete from library" -msgstr "Enviar e borrar da biblioteca" - #: /home/kovid/work/calibre/src/calibre/gui2/device.py:492 msgid "Send specific format to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:493 +msgid "Send and delete from library" +msgstr "Enviar e borrar da biblioteca" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:536 msgid "Eject device" msgstr "Extraer dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:646 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:658 msgid "Error communicating with device" msgstr "Erro ao conectar co dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:667 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:679 msgid "Select folder to open as device" msgstr "Escoller o cartafol para abrir co como dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:714 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:726 msgid "Error talking to device" msgstr "Erro ao conectar co dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:715 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:727 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." @@ -6226,127 +6289,127 @@ msgstr "" "Produciuse un erro temporal na comunicación co dispositivo. Desconecte e " "volva conectar o dispositovo e/ou reinícieo." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:758 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:770 msgid "Device: " msgstr "Dispositivo: " -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:760 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:772 msgid " detected." msgstr " detectado" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:858 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:870 msgid "selected to send" msgstr "seleccionado para enviar" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:863 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:875 msgid "Choose format to send to device" msgstr "Elixa formato para enviar ao dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:872 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:884 msgid "No device" msgstr "Sen dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:873 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:885 msgid "Cannot send: No device is connected" msgstr "Non se pode enviar: non hai ningún dispositivo conectado" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:876 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:880 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:888 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:892 msgid "No card" msgstr "Sen tarxeta" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:877 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:881 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:889 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:893 msgid "Cannot send: Device has no storage card" msgstr "Non de pode enviar: o dispositivo non ten tarxeta de memoria" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:922 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:934 msgid "E-book:" msgstr "Libro electrónico:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:925 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:937 msgid "Attached, you will find the e-book" msgstr "O libro electrónico está anexo" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:926 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:938 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:107 msgid "by" msgstr "por" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:927 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:939 msgid "in the %s format." msgstr "no formato %s." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:940 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:952 msgid "Sending email to" msgstr "Enviando correo a" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:970 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:978 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1071 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1156 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1275 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1283 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:982 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:990 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1089 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1174 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1293 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1301 msgid "No suitable formats" msgstr "Non hai formatos axeitados" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:971 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:983 msgid "Auto convert the following books before sending via email?" msgstr "" "Desexa converter automaticamente os seguintes libros antes de os enviar por " "correo?" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:979 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:991 msgid "" "Could not email the following books as no suitable formats were found:" msgstr "" "Non se puideron enviar por correo os libros seguintes xa que non se achou ou " "formato correcto." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:997 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1009 msgid "Failed to email books" msgstr "Fallou ao enviar por correo os libros" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:998 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1010 msgid "Failed to email the following books:" msgstr "Fallou ao enviar por correo os libros seguintes:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1002 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1014 msgid "Sent by email:" msgstr "Enviar por correo:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1030 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1048 msgid "News:" msgstr "Novas:" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1031 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1049 msgid "Attached is the" msgstr "Anexo está o" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1042 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1060 msgid "Sent news to" msgstr "Enviar novas a" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1072 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1157 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1276 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1090 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1175 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1294 msgid "Auto convert the following books before uploading to the device?" msgstr "" "Desexa converter os libros seguintes antes de os enviar ao dispositivo?" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1102 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1120 msgid "Sending catalogs to device." msgstr "A enviar catálogos ao dispositivo." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1189 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1207 msgid "Sending news to device." msgstr "A enviar novas ao dispositivo." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1242 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1260 msgid "Sending books to device." msgstr "A enviar libros ao dispositivo." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1284 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1302 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." @@ -6355,11 +6418,11 @@ msgstr "" "atoparon formatos compatíbeis. Converta o ou os libros a un formato " "compatíbel co dispositivo." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1348 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1366 msgid "No space on device" msgstr "Non hai espazo no dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1349 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1367 msgid "" "

      Cannot upload books to device there is no more free space available " msgstr "" @@ -6416,15 +6479,15 @@ msgstr "" msgid "&Paste from clipboard" msgstr "&Pegar do portapapeis" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:80 msgid "Fit &cover within view" msgstr "Axustar a &capa dentro da visualización" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:81 msgid "&Previous" msgstr "&Anterior" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:82 msgid "&Next" msgstr "&Seguinte" @@ -6475,21 +6538,32 @@ msgstr "Copiar no por&tapapeis" msgid "Names to ignore:" msgstr "Nombres para ignorar:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:59 +msgid "" +"Enter comma-separated standard file name wildcards, such as synctoy*.dat" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:62 msgid "Extensions to ignore" msgstr "Extensiones para ignorar" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:67 +msgid "" +"Enter comma-separated extensions without a leading dot. Used only in book " +"folders" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:119 msgid "Path from library" msgstr "Camiño da biblioteca" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:119 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/bookmarkmanager.py:89 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:225 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:226 msgid "Name" msgstr "Nome" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:136 msgid "" "The marked files and folders will be permanently deleted. Are you " "sure?" @@ -6579,6 +6653,7 @@ msgid "Set options for converting %s" msgstr "Establecer as opcións para converter %s" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:211 msgid "&Title:" msgstr "&Título:" @@ -6616,7 +6691,7 @@ msgstr "Localización" #: /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:932 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:925 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:31 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:294 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:569 @@ -6624,7 +6699,7 @@ 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:1123 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1116 msgid "Format" msgstr "Formato" @@ -6844,18 +6919,12 @@ msgstr "Libro %d:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:274 msgid "" "You can destroy your library using this feature. Changes are " -"permanent. There is no undo function. This feature is experimental, and " -"there may be bugs. You are strongly encouraged to back up your library " -"before proceeding.

      Search and replace in text fields using character " -"matching or regular expressions. " +"permanent. There is no undo function. You are strongly encouraged to back up " +"your library before proceeding.

      Search and replace in text fields using " +"character matching or regular expressions. " msgstr "" -"Pode destruír a súa biblioteca con esta característica. Os cambios " -"son permanentes. Non existe unha función para desfacer. Esta característica " -"é experimental e pode haber erros. Recoméndaselle facer unha copia de " -"seguranza da biblioteca antes de continuar.

      Busque e substitúa nos campos " -"de texto utilizando un carácter coincidente ou expresións regulares. " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:282 msgid "" "In character mode, the field is searched for the entered search text. The " "text is replaced by the specified replacement text everywhere it is found in " @@ -6872,7 +6941,7 @@ msgstr "" "exactamente. Se está desactivada, encontraranse coincidencias tanto con " "maiúsculas coma con minúsculas" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:293 msgid "" "In regular expression mode, the search text is an arbitrary python-" "compatible regular expression. The replacement text can contain " @@ -6898,34 +6967,34 @@ msgstr "" "información sobre as expresións regulares de Python, e en particular sobre a " "función \"sub\"." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:436 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:438 msgid "You must specify a destination when source is a composite field" msgstr "Debe especificar un destino cando a orixe é un campo de composición" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:528 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:536 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:627 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:538 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:633 msgid "Search/replace invalid" msgstr "Buscar/substituir no vé correcto" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:529 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:531 msgid "" "Authors cannot be set to the empty string. Book title %s not processed" msgstr "" "A cadea Autores non se pode deixar en branco. O libro co título %s non foi " "procesado" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:537 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:539 msgid "Title cannot be set to the empty string. Book title %s not processed" msgstr "" "O título non se pode deixar en branco. O libro co título %s non foi " "procesado" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:628 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:634 msgid "Search pattern is invalid: %s" msgstr "O patrón de busca non é correcto: %s" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:665 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:671 msgid "" "Applying changes to %d books.\n" "Phase {0} {1}%%." @@ -6933,19 +7002,19 @@ msgstr "" "Aplicando cambios a %d libros.\n" "Fase {0} {1}%%." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:332 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:334 msgid "Edit Meta information" msgstr "Editar metainformación" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:334 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:336 msgid "A&utomatically set author sort" msgstr "Estabelecer a&utomaticamente a orde por autor" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:335 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:337 msgid "Author s&ort: " msgstr "Orde por aut&oría: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:336 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:338 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles." @@ -6953,64 +7022,64 @@ msgstr "" "Especificar como ordenar a autoría deste libro. Por exemplo, Rosalía de " "Castro pode ordenarse como Castro, Rosalía de." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:337 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:339 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384 msgid "&Rating:" msgstr "&Valoración" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:338 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:339 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:340 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:341 #: /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 msgid "Rating of this book. 0-5 stars" msgstr "Valoración deste libro. 0-5 estrelas" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:340 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:342 msgid "No change" msgstr "Sen mudanzas" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:343 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:387 msgid " stars" msgstr " estrelas" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:343 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:345 msgid "Add ta&gs: " msgstr "Engadir esti&quetas " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:345 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:346 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:347 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:348 #: /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:392 msgid "Open Tag Editor" msgstr "Abrir o editor de etiquetas" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:347 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:349 msgid "&Remove tags:" msgstr "&Quitar etiquetas:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:348 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:350 msgid "Comma separated list of tags to remove from the books. " msgstr "" "Listaxe de etiquetas, separadas por vírgula, para eliminar dos libros. " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:349 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:351 msgid "Check this box to remove all tags from the books." msgstr "Marque esta caixa para eliminar todas as etiquetas dos libros." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:350 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:352 msgid "Remove all" msgstr "Eliminar todo" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:354 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:356 msgid "If checked, the series will be cleared" msgstr "Se está marcado, as series serán desbotadas" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:355 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:357 msgid "Clear series" msgstr "Desbotar series" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:356 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:358 msgid "" "If not checked, the series number for the books will be set to 1.\n" "If checked, selected books will be automatically numbered, in the order\n" @@ -7023,11 +7092,11 @@ msgstr "" "o libro A e logo o B, o libro A será o número 1 na serie e o libro\n" "B será o número 2." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:360 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:362 msgid "Automatically number books in this series" msgstr "Numerar automaticamente os libros nesta serie" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:361 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:363 msgid "" "Series will normally be renumbered from the highest number in the database\n" "for that series. Checking this box will tell calibre to start numbering\n" @@ -7038,26 +7107,26 @@ msgstr "" "a serie. Se marca esta caixa Calibre comezará a numeración a partir do valor " "do cadro." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:365 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:367 msgid "Remove &format:" msgstr "Quitar &formato:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:366 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:368 msgid "&Swap title and author" msgstr "&Intercambiar título e autoría" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:367 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:369 msgid "" "Force the title to be in title case. If both this and swap authors are " "checked,\n" "title and author are swapped before the title case is set" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:369 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:371 msgid "Change title to title case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:370 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:372 msgid "" "Remove stored conversion settings for the selected books.\n" "\n" @@ -7068,73 +7137,73 @@ msgstr "" "\n" "A conversión futura destes libros empregará a preestablecida." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:373 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:375 msgid "Remove &stored conversion settings for the selected books" msgstr "Borrar a configuración de conversión para os libros &seleccionados" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:374 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:376 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:424 msgid "&Basic metadata" msgstr "Metadatos &básicos" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:375 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:377 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:425 msgid "&Custom metadata" msgstr "Metadatos &personalizados" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:378 msgid "Search &field:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:377 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:379 msgid "The name of the field that you want to search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:378 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:380 msgid "Search mode:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:379 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:381 msgid "" "Choose whether to use basic text matching or advanced regular expression " "matching" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:382 msgid "&Search for:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:381 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:383 msgid "" "Enter the what you are looking for, either plain text or a regular " "expression, depending on the mode" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:382 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:384 msgid "" "Check this box if the search string must match exactly upper and lower case. " "Uncheck it if case is to be ignored" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:383 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:385 msgid "Case sensitive" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:386 msgid "&Replace with:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:385 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:387 msgid "" "The replacement text. The matched search text will be replaced with this " "string" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:386 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:388 msgid "Apply function after replace:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:387 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:389 msgid "" "Specify how the text is to be processed after matching and replacement. In " "character mode, the entire\n" @@ -7142,49 +7211,49 @@ msgid "" "processed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:389 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:391 msgid "&Destination field:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:390 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:392 msgid "" "The field that the text will be put into after all replacements. If blank, " "the source field is used." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:391 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:393 msgid "Mode:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:392 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:394 msgid "Specify how the text should be copied into the destination." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:393 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:395 msgid "" "If the replace mode is prepend or append, then this box indicates whether a " "comma or\n" "nothing should be put between the original text and the inserted text" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:397 msgid "use comma" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:396 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:398 msgid "Test &text" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:397 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:399 msgid "Test re&sult" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:398 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:400 msgid "Your test:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:399 -msgid "&Search and replace (experimental)" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:401 +msgid "&Search and replace" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:91 @@ -7710,58 +7779,52 @@ msgstr "" msgid "Negate" msgstr "Negar" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:198 msgid "Advanced Search" msgstr "Procura avanzada" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:119 -msgid "Find entries that have..." -msgstr "Achar entradas que teñan..." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:120 -msgid "&All these words:" -msgstr "&Todas estas palabras:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:121 -msgid "This exact &phrase:" -msgstr "Esta &frase exacta:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:122 -msgid "&One or more of these words:" -msgstr "&Unha ou máis destas palabras" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:123 -msgid "But dont show entries that have..." -msgstr "Mais non buscar entradas que teñan..." - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:124 -msgid "Any of these &unwanted words:" -msgstr "Algunha destas palabras &non desexadas:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:199 msgid "What kind of match to use:" msgstr "Que tipo de coincidencia para empregar:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:126 -msgid "Contains: the word or phrase matches anywhere in the metadata" -msgstr "Contén: búscase a palabra ou a frase en calquera parte dos metadatos" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:127 -msgid "Equals: the word or phrase must match an entire metadata field" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:200 +msgid "Contains: the word or phrase matches anywhere in the metadata field" msgstr "" -"Igual: a palabra ou a frase debe coincidir cun campo completo de metadatos" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:201 +msgid "Equals: the word or phrase must match the entire metadata field" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:202 msgid "" -"Regular expression: the expression must match anywhere in the metadata" +"Regular expression: the expression must match anywhere in the metadata field" msgstr "" -"Expresión regular: búscase a expresión en calquera parte dos metadatos" -#: /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:203 +msgid "Find entries that have..." +msgstr "Achar entradas que teñan..." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:204 +msgid "&All these words:" +msgstr "&Todas estas palabras:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:205 +msgid "This exact &phrase:" +msgstr "Esta &frase exacta:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:206 +msgid "&One or more of these words:" +msgstr "&Unha ou máis destas palabras" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:207 +msgid "But dont show entries that have..." +msgstr "Mais non buscar entradas que teñan..." + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:208 +msgid "Any of these &unwanted words:" +msgstr "Algunha destas palabras &non desexadas:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:209 msgid "" "See the User Manual for more help" @@ -7769,6 +7832,47 @@ msgstr "" "Vexa o Manual de usuario para máis axuda" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:210 +msgid "A&dvanced Search" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:212 +msgid "Enter the title." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:213 +msgid "&Author:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:215 +msgid "Ta&gs:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:216 +msgid "Enter an author's name. Only one author can be used." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:217 +msgid "" +"Enter a series name, without an index. Only one series name can be used." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:218 +msgid "Enter tags separated by spaces" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:219 +msgid "&Clear" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:220 +msgid "Search only in specific fields:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:221 +msgid "Titl&e/Author/Series ..." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/select_formats.py:45 msgid "Choose formats" msgstr "Escoller formatos" @@ -8451,21 +8555,21 @@ msgstr "Amosar os libros almacenados na tarxeta B" msgid "available" msgstr "dispoñíbel" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:159 msgid "" "Books display will be restricted to those matching the selected saved search" msgstr "" "Só se amosarán os libros que coincidan coa busca gardada seleccionada" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:170 +msgid "Shift+Ctrl+F" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:173 msgid "Advanced search" msgstr "Procura avanzada" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:173 -msgid "&Search:" -msgstr "&Buscar:" - -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:178 msgid "" "

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

      Words separated by spaces are ANDed" @@ -8474,19 +8578,27 @@ msgstr "" "comentarios etc.

      Búscanse os libros que conteñan todas as palabras " "separadas por espazos" +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:181 +msgid "&Go!" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:187 +msgid "Do Quick Search (you can also press the Enter key)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:193 msgid "Reset Quick Search" msgstr "Reiniciar a procura rápida" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:199 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:205 msgid "Copy current search text (instead of search name)" msgstr "Copiar o texto de procura actual (no canto do nome da procura)" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:205 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:211 msgid "Save current search under the name shown in the box" msgstr "Gardar a procura actual baixo o nome amosado na caixa" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:217 msgid "Delete current saved search" msgstr "Borrar a actual procura gardada" @@ -8508,79 +8620,82 @@ msgstr "No dispositivo" msgid "Size (MB)" msgstr "Tamaño (MB)" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:338 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1143 -msgid "Book %s of %s." -msgstr "Libro %s de %s" +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:331 +msgid "Book %s of %s." +msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:700 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1243 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:693 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1236 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:407 msgid "The lookup/search name is \"{0}\"" msgstr "O nome de busca é \"{0}\"" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:706 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1245 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:699 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1238 msgid "This book's UUID is \"{0}\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:929 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:922 msgid "In Library" msgstr "Na biblioteca" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:933 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:926 msgid "Size" msgstr "Tamaño" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1223 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1136 +msgid "Book %s of %s." +msgstr "Libro %s de %s" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1216 msgid "Marked for deletion" msgstr "Marcado para borrar" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1226 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1219 msgid "Double click to edit me

      " msgstr "Prema dúas veces para editar

      " -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:140 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:147 msgid "Hide column %s" msgstr "Ocultar a columna %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:145 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:152 msgid "Sort on %s" msgstr "Ordenar en %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:146 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:153 msgid "Ascending" msgstr "Ascendente" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:156 msgid "Descending" msgstr "Descendente" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:168 msgid "Change text alignment for %s" msgstr "Mudar o aliñamento do texto a %s" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:163 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 msgid "Left" msgstr "Esquerda" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:163 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 msgid "Right" msgstr "Dereita" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:171 msgid "Center" msgstr "Centrado" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:183 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:190 msgid "Show column" msgstr "Amosar columna" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:195 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:202 msgid "Restore default layout" msgstr "Restaurar a disposición por defecto" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:735 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:743 msgid "" "Dropping onto a device is not supported. First add the book to the calibre " "library." @@ -8613,7 +8728,7 @@ msgid "No matches for the search phrase %s were found." msgstr "Sen coincidencias para a frase de busca %s." #: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:160 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:442 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:443 msgid "No matches found" msgstr "Non se atopou ningunha coincidencia" @@ -8847,7 +8962,7 @@ msgid "Successfully downloaded metadata for %d out of %d books" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:287 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:622 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:627 msgid "Details" msgstr "" @@ -9940,25 +10055,26 @@ msgid "&Current tweaks" msgstr "Axustes a&ctuais" #: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:97 -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:270 #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:574 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:250 msgid "Search" msgstr "Buscar" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:315 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:322 msgid "The selected search will be permanently deleted. Are you sure?" msgstr "" "A busca seleccionada será eliminada permanentemente. Está seguro?" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:357 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:364 msgid "Search (For Advanced Search click the button to the left)" msgstr "Busca (para buscas avanzadas faga clic no botón da esquerda)" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:399 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:406 msgid "Saved Searches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:407 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:414 msgid "Choose saved search or enter name for new saved search" msgstr "" @@ -10096,40 +10212,40 @@ msgstr "" msgid "The saved search name %s is already used." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:870 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:871 msgid "Sort by name" msgstr "Ordenar polo nome" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:870 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:871 msgid "Sort by popularity" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:872 msgid "Sort by average rating" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:874 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:875 msgid "Set the sort order for entries in the Tag Browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:880 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:881 msgid "Match all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:880 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:881 msgid "Match any" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:885 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:886 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:889 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:890 msgid "Manage &user categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:892 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:893 msgid "Add your own categories to the Tag Browser" msgstr "" @@ -10415,7 +10531,7 @@ msgid "Options to customize the ebook viewer" msgstr "Opcións para personalizar o visualizador de libros" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:42 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:703 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:708 msgid "Remember last used window size" msgstr "Lembrar o tamaño da última xanela usada" @@ -10575,77 +10691,77 @@ msgstr "Previsualización da impresión" msgid "Connecting to dict.org to lookup: %s…" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:409 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:410 msgid "Choose ebook" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:410 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:411 msgid "Ebooks" msgstr "Libros electrónicos" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:443 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:444 msgid "No matches found for: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:480 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:485 msgid "Loading flow..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:521 msgid "Laying out %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:547 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:552 msgid "Bookmark #%d" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:551 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:556 msgid "Add bookmark" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:552 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:557 msgid "Enter title for bookmark:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:562 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:567 msgid "Manage Bookmarks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:599 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:604 msgid "Loading ebook..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:607 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:612 msgid "DRM Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:608 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:613 msgid "

      This book is protected by DRM" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:612 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:617 msgid "Could not open ebook" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:690 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:695 msgid "Options to control the ebook viewer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:697 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:702 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:700 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:705 msgid "" "If specified, viewer window will try to open full screen when started." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:705 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:710 msgid "Print javascript alert and console messages to the console" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:711 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:716 msgid "" "%prog [options] file\n" "\n" @@ -11548,7 +11664,7 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/library/cli.py:665 -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:505 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:499 msgid "Show detailed output information. Useful for debugging" msgstr "" @@ -11996,12 +12112,12 @@ msgid "" "from Apache/nginx/etc." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/base.py:149 +#: /home/kovid/work/calibre/src/calibre/library/server/base.py:150 msgid "Password to access your calibre library. Username is " msgstr "" #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:51 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:401 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:405 msgid "Loading, please wait" msgstr "" @@ -12026,7 +12142,7 @@ msgid "Browsing %d books" msgstr "" #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:99 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:224 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:225 msgid "Average rating" msgstr "" @@ -12034,82 +12150,90 @@ msgstr "" msgid "%s: %.1f stars" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:132 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:133 msgid "%d stars" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:225 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:226 msgid "Popularity" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:244 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:245 msgid "Sort by" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:308 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:512 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:248 +msgid "library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:249 +msgid "home" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:310 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:516 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:569 msgid "Newest" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:309 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:513 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:311 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:517 msgid "All books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:341 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:344 msgid "Browse books by" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:346 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:349 msgid "Choose a category to browse by:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:421 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:425 msgid "Browsing by" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:422 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:426 msgid "Up" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:543 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:547 msgid "in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:546 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:550 msgid "Books in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:597 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:602 msgid "Other formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:604 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:609 msgid "Read %s in the %s format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:609 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:614 msgid "Get" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:624 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:629 msgid "Permalink" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:625 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:630 msgid "A permanent link to this book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:636 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:641 msgid "This book has been deleted" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:720 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:725 msgid "in search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:722 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:727 msgid "Matching books" msgstr "" @@ -12140,6 +12264,12 @@ msgid "" "overrides any per-library settings specified in the GUI" msgstr "" +#: /home/kovid/work/calibre/src/calibre/library/server/main.py:62 +msgid "" +"Auto reload server when source code changes. May not work in all " +"environments." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:112 msgid "%d book" msgstr "" @@ -12464,93 +12594,93 @@ msgstr "" msgid "Unknown News Source" msgstr "Fonte de Novas Descoñecida" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:614 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:628 msgid "The \"%s\" recipe needs a username and password." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:713 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:727 msgid "Download finished" msgstr "Rematou a descarga" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:715 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:729 msgid "Failed to download the following articles:" msgstr "Produciuse un fallo na descarga dos seguintes artigos:" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:721 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:735 msgid "Failed to download parts of the following articles:" msgstr "Produciuse un fallo na descarga de partes do seguintes artigos:" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:723 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:737 msgid " from " msgstr " desde " -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:725 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:739 msgid "\tFailed links:" msgstr "\tLigazóns erradas:" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:814 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:834 msgid "Could not fetch article. Run with -vv to see the reason" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:835 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:855 msgid "Fetching feeds..." msgstr "A obter os fluxos..." -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:840 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:860 msgid "Got feeds from index page" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:849 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:869 msgid "Trying to download cover..." msgstr "Tratando de descargar a capa..." -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:851 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:871 msgid "Generating masthead..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:932 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:952 msgid "Starting download [%d thread(s)]..." msgstr "A comezar a descarga [%d fío(s)]..." -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:948 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:968 msgid "Feeds downloaded to %s" msgstr "Fluxos descargados en %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:957 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:977 msgid "Could not download cover: %s" msgstr "Non se puido descargar a capa: %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:964 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:986 msgid "Downloading cover from %s" msgstr "A descargar a capa desde %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1009 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1032 msgid "Masthead image downloaded" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1177 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1200 msgid "Untitled Article" msgstr "Artigo sen Título" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1248 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1271 msgid "Article downloaded: %s" msgstr "Artigo descargado: %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1259 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1282 msgid "Article download failed: %s" msgstr "Erro ao descargar o artigo: %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1276 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1299 msgid "Fetching feed" msgstr "A obter o fluxo" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1423 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1446 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:1438 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1461 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." @@ -12571,18 +12701,18 @@ msgstr "Programado" msgid "Custom" msgstr "Personalizado" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:482 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:476 msgid "" "%prog URL\n" "\n" "Where URL is for example http://google.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:485 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:479 msgid "Base directory into which URL is saved. Default is %default" msgstr "Directorio base onde se gardan os URL. O predefinido é %default" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:488 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:482 msgid "" "Timeout in seconds to wait for a response from the server. Default: %default " "s" @@ -12590,38 +12720,38 @@ msgstr "" "Tempo máximo en segundos para esperar a resposta do servidor. Predefinido: " "%default s" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:491 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:485 msgid "" "Maximum number of levels to recurse i.e. depth of links to follow. Default " "%default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:494 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:488 msgid "" "The maximum number of files to download. This only applies to files from tags. Default is %default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:496 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:490 msgid "" "Minimum interval in seconds between consecutive fetches. Default is %default " "s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:498 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:492 msgid "" "The character encoding for the websites you are trying to download. The " "default is to try and guess the encoding." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:500 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:494 msgid "" "Only links that match this regular expression will be followed. This option " "can be specified multiple times, in which case as long as a link matches any " "one regexp, it will be followed. By default all links are followed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:502 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:496 msgid "" "Any link that matches this regular expression will be ignored. This option " "can be specified multiple times, in which case as long as any regexp matches " @@ -12630,7 +12760,7 @@ msgid "" "applied first." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:504 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:498 msgid "Do not download CSS stylesheets." msgstr "Non descargar follas de estilo CSS" @@ -12671,6 +12801,9 @@ msgstr "Non descargar follas de estilo CSS" #~ msgid "General" #~ msgstr "Xeral" +#~ msgid " " +#~ msgstr " " + #~ msgid "Path to a txt file containing a comment." #~ msgstr "Camiño a un ficheiro txt que contén un comentario." @@ -12698,6 +12831,9 @@ msgstr "Non descargar follas de estilo CSS" #~ msgid "Stop &all jobs" #~ msgstr "Parar &todos os traballos" +#~ msgid "&Search:" +#~ msgstr "&Buscar:" + #~ msgid "Communicate with the Kindle 2 eBook reader." #~ msgstr "Comunicar co lector Kindle 2" @@ -12803,6 +12939,9 @@ msgstr "Non descargar follas de estilo CSS" #~ "segundo e seguinte borrarase permanentemente do computador.

      " #~ "Ten certeza de que desexa continuar?" +#~ msgid "Click to open Book Details window" +#~ msgstr "Prema para abrir a xanela de detalles do libro" + #~ msgid "" #~ "Regex tips:\n" #~ "- The default regex - \\[[\\w ]*\\] - excludes genre tags of the form [tag], " @@ -13002,6 +13141,18 @@ msgstr "Non descargar follas de estilo CSS" #~ msgid "Download &cover" #~ msgstr "Descargar &capa" +#~ msgid "Contains: the word or phrase matches anywhere in the metadata" +#~ msgstr "Contén: búscase a palabra ou a frase en calquera parte dos metadatos" + +#~ msgid "Equals: the word or phrase must match an entire metadata field" +#~ msgstr "" +#~ "Igual: a palabra ou a frase debe coincidir cun campo completo de metadatos" + +#~ msgid "" +#~ "Regular expression: the expression must match anywhere in the metadata" +#~ msgstr "" +#~ "Expresión regular: búscase a expresión en calquera parte dos metadatos" + #~ msgid "" #~ "For help with writing advanced news recipes, please visit
      User Recipes" @@ -13041,8 +13192,48 @@ msgstr "Non descargar follas de estilo CSS" #~ msgid "&Tweaks" #~ msgstr "Axus&tes" +#~ msgid "" +#~ "Book formats and metadata from the selected books will be merged into the " +#~ "first selected book. ISBN will not be merged.

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

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

      Are you sure " +#~ "you want to proceed?" +#~ msgstr "" +#~ "Os formatos e metadatos dos libros seleccionados engadiranse ao primeiro " +#~ "libro seleccionado. O ISBN non se engadirá.

      Despois da " +#~ "unión, o segundo libro e os seguintes borraranse.

      Todos os " +#~ "formatos do primeiro libro seleccionado manteranse e se hai formatos " +#~ "duplicados nos restantes libros, borraranse permanentemente do seu " +#~ "computador.

      Está seguro de querer continuar?" + +#~ msgid "" +#~ "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 "" +#~ "Os formatos e metadatos dos libros seleccionados engadiranse ao primeir " +#~ "libro seleccionado. O ISBN non se engadirá.

      O segundo " +#~ "libro e os seguintes non se borrarán nin se alterarán.

      Confirme que " +#~ "desexa continuar." + #~ msgid "Run the check" #~ msgstr "Excutar a comprobación" #~ msgid "Additional Information" #~ msgstr "Información adicional" + +#~ msgid "" +#~ "You can destroy your library using this feature. Changes are " +#~ "permanent. There is no undo function. This feature is experimental, and " +#~ "there may be bugs. You are strongly encouraged to back up your library " +#~ "before proceeding.

      Search and replace in text fields using character " +#~ "matching or regular expressions. " +#~ msgstr "" +#~ "Pode destruír a súa biblioteca con esta característica. Os cambios " +#~ "son permanentes. Non existe unha función para desfacer. Esta característica " +#~ "é experimental e pode haber erros. Recoméndaselle facer unha copia de " +#~ "seguranza da biblioteca antes de continuar.

      Busque e substitúa nos campos " +#~ "de texto utilizando un carácter coincidente ou expresións regulares. " From 2b888a4add647821774fbf92ea7807bbdf435af9 Mon Sep 17 00:00:00 2001 From: ldolse Date: Fri, 19 Nov 2010 10:03:56 +0800 Subject: [PATCH 023/375] fix a problem with pdf unwrap_factor getting set to 0.0 --- src/calibre/gui2/convert/pdf_input.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/gui2/convert/pdf_input.py b/src/calibre/gui2/convert/pdf_input.py index 967a0fe234..f1ef7d24ee 100644 --- a/src/calibre/gui2/convert/pdf_input.py +++ b/src/calibre/gui2/convert/pdf_input.py @@ -22,5 +22,5 @@ class PluginWidget(Widget, Ui_Form): def set_value_handler(self, g, val): if val is None and isinstance(g, QDoubleSpinBox): - g.setValue(0.0) + g.setValue(0.45) return True From b8b336d8b65b5958d6425f84cb18e5f8eb21a1d5 Mon Sep 17 00:00:00 2001 From: Translators <> Date: Fri, 19 Nov 2010 04:48:01 +0000 Subject: [PATCH 024/375] Launchpad automatic translations update. --- src/calibre/translations/cs.po | 67 +- src/calibre/translations/el.po | 7843 +++++++++++++++++++------------- 2 files changed, 4639 insertions(+), 3271 deletions(-) diff --git a/src/calibre/translations/cs.po b/src/calibre/translations/cs.po index 17629ff04e..7c810a50c3 100644 --- a/src/calibre/translations/cs.po +++ b/src/calibre/translations/cs.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-11-12 23:11+0000\n" -"PO-Revision-Date: 2010-11-17 17:23+0000\n" -"Last-Translator: Aleš Bajtalon \n" +"PO-Revision-Date: 2010-11-18 20:58+0000\n" +"Last-Translator: Marek Sušický \n" "Language-Team: Czech \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-18 04:44+0000\n" +"X-Launchpad-Export-Date: 2010-11-19 04:47+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -423,7 +423,7 @@ msgstr "Rozšířené" #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:869 msgid "Add/remove/customize various bits of calibre functionality" -msgstr "" +msgstr "Přidat/odebrat/nastavit různé funkce calibre." #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:875 msgid "Tweaks" @@ -431,7 +431,7 @@ msgstr "Vylepšení" #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:881 msgid "Fine tune how calibre behaves in various contexts" -msgstr "" +msgstr "Doladit chování calibre v různých situacích" #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:886 msgid "Miscellaneous" @@ -975,6 +975,8 @@ 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 "" +"\".kobo\" soubory neexistují na zařízení jako knihy, jsou to řádky v sqlite " +"databázi. V současnosti nemohou být exportovány ani prohlíženy." #: /home/kovid/work/calibre/src/calibre/devices/misc.py:17 msgid "Communicate with the Palm Pre" @@ -3212,7 +3214,7 @@ msgstr "číslování knih v sérii římskými číslicemi" #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:77 msgid "Sort tags list by name, popularity, or rating" -msgstr "" +msgstr "Seřadit tagy podle jména, popularity, nebo hodnocení" #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:79 msgid "Number of covers to show in the cover browsing mode" @@ -3296,7 +3298,7 @@ msgstr "Rozvržení uživatelského rozhraní" #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:133 msgid "Show the average rating per item indication in the tag browser" -msgstr "" +msgstr "Ukaž průměrné hodnocení na položku v tag prohlížeči" #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:135 msgid "Disable UI animations" @@ -3401,7 +3403,7 @@ msgstr "MOBI knihy" #: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:166 msgid "Topaz books" -msgstr "" +msgstr "Topaz knihy" #: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:167 msgid "Text books" @@ -3506,7 +3508,7 @@ msgstr "Nejsou označeny žádné knihy" #: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:65 msgid "No books selected to fetch annotations from" -msgstr "" +msgstr "Nevybrané žádné knihy pro načtení anotací" #: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:90 msgid "Merging user annotations into database" @@ -3712,6 +3714,8 @@ msgid "" "Metadata will be backed up while calibre is running, at the rate of " "approximately 1 book per second." msgstr "" +"Metadata budou zazálohována během běhu calibre rychlostí zhruba 1kniha za " +"sekundu." #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:344 msgid "" @@ -4506,18 +4510,20 @@ msgstr "..." #: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:72 msgid "Handle multiple files per book" -msgstr "" +msgstr "Pracovat s více soubory ke knize" #: /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 "" +"&Jedna kniha na složku znamená, že každý ebook soubor ve složce je ta samá " +"kniha v jiném formátu" #: /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 "" +msgstr "&Více knih ve složce znamené, že každý ebook soubor je různá kniha" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:25 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:49 @@ -4595,7 +4601,7 @@ msgstr "BibTeX volby" #: /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 "Možnosti specifické pro" #: /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 @@ -4700,7 +4706,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:96 msgid "mixed" -msgstr "" +msgstr "smíšený" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:97 msgid "misc" @@ -4768,7 +4774,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:85 msgid "Include 'Recently Added' Section" -msgstr "" +msgstr "Zahrň sekci Nedávno přidané" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:86 msgid "Sort numbers as text" @@ -4776,7 +4782,7 @@ msgstr "Řadit čísla jako text" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:87 msgid "Include 'Series' Section" -msgstr "" +msgstr "Zahrň sekci Série" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_tab_template_ui.py:33 msgid "Tab template for catalog.ui" @@ -4905,7 +4911,7 @@ msgstr "Neplatný debug adresář" #: /home/kovid/work/calibre/src/calibre/gui2/convert/debug.py:59 msgid "Failed to create debug directory" -msgstr "" +msgstr "Nepodařilo se vytvořit ladící adresář" #: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:55 msgid "" @@ -4967,7 +4973,7 @@ msgstr "FB2 Výstup" #: /home/kovid/work/calibre/src/calibre/gui2/convert/rb_output_ui.py:34 #: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:52 msgid "&Inline TOC" -msgstr "" +msgstr "&Inline TOC" #: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:38 msgid "Sectionize Chapters (Use with care!)" @@ -6814,7 +6820,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:398 msgid "Test &text" -msgstr "" +msgstr "Testovací &text" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:399 msgid "Test re&sult" @@ -6826,7 +6832,7 @@ msgstr "Váš test:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:401 msgid "&Search and replace" -msgstr "" +msgstr "Najít a nahradit" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:91 msgid "Last modified: %s" @@ -6838,11 +6844,11 @@ msgstr "Není platný obrázek" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:150 msgid "Specify title and author" -msgstr "" +msgstr "Vybrat název a autora" #: /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 "" +msgstr "Před generováním obálky musíte určit název a autora" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:169 msgid "Choose formats for " @@ -6850,7 +6856,7 @@ msgstr "Zvolte formát pro " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:200 msgid "No permission" -msgstr "" +msgstr "Nedostatečná práva" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:201 msgid "You do not have permission to read the following files:" @@ -6893,6 +6899,8 @@ msgid "" " The red color indicates that the current author sort does not match the " "current author" msgstr "" +" Červená barva znamená, že současné třídění podle autora se neshoduje se " +"současným autorem" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:359 msgid "Abort the editing of all remaining books" @@ -6928,13 +6936,13 @@ msgstr "Stáhnout obálku..." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:662 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:667 msgid "Cannot fetch cover" -msgstr "" +msgstr "Nemohu stáhnout obálku" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:652 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:663 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:668 msgid "Could not fetch cover.
      " -msgstr "" +msgstr "Nemohu stáhnout obálku.
      " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:653 msgid "The download timed out." @@ -6948,6 +6956,7 @@ msgstr "Nemohu najít obal pro tuto knihu. Zkuste nejdříve zadat ISBN." msgid "" "For the error message from each cover source, click Show details below." msgstr "" +"Pro chybu z každého obálkového zdroje klikněte na Zobrazit detaily. (dole)" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:676 msgid "Bad cover" @@ -6963,7 +6972,7 @@ msgstr "Nastaly chyby" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:711 msgid "There were errors downloading social metadata" -msgstr "" +msgstr "Během stahování sociálních metadat došlo k chybám" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:742 msgid "Cannot fetch metadata" @@ -6989,7 +6998,7 @@ msgstr "Edituj metainformace" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:372 msgid "Meta information" -msgstr "" +msgstr "Meta informace" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:375 msgid "Swap the author and title" @@ -6997,7 +7006,7 @@ msgstr "Prohodit autora a název" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:378 msgid "Author S&ort: " -msgstr "" +msgstr "Řazení dle autora: " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:379 msgid "" @@ -7069,11 +7078,11 @@ msgstr "&Listovat" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:417 msgid "Remove border (if any) from cover" -msgstr "" +msgstr "Odstranit pozadí z obálky" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:418 msgid "T&rim" -msgstr "" +msgstr "Oříznout" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:419 msgid "Reset cover to default" diff --git a/src/calibre/translations/el.po b/src/calibre/translations/el.po index 65824c5de8..fc37eecd60 100644 --- a/src/calibre/translations/el.po +++ b/src/calibre/translations/el.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME \n" -"POT-Creation-Date: 2010-08-27 18:12+0000\n" -"PO-Revision-Date: 2010-08-27 20:29+0000\n" -"Last-Translator: Kovid Goyal \n" +"POT-Creation-Date: 2010-11-12 23:11+0000\n" +"PO-Revision-Date: 2010-11-18 10:45+0000\n" +"Last-Translator: MasterCom7 \n" "Language-Team: Greek \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-08-28 03:37+0000\n" +"X-Launchpad-Export-Date: 2010-11-19 04:48+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -22,62 +22,71 @@ msgid "Does absolutely nothing" msgstr "Δεν κάνει τίποτα" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:46 -#: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:72 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:87 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:88 +#: /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/books.py:24 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:444 #: /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/usbms/driver.py:405 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:650 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:401 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/metadata.py:56 #: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:407 -#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:70 -#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:72 -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:336 -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:339 +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/periodical.py:124 +#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:93 +#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:95 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:343 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:346 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1894 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1896 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:24 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:240 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:283 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:286 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:402 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:20 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:21 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:231 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:30 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:31 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:71 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:373 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:378 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:606 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:36 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:61 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:46 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:333 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:50 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:354 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:36 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:64 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:66 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:123 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:125 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:945 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1057 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:124 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:126 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1022 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1134 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdb.py:39 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdf.py:28 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pml.py:23 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pml.py:49 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/snb.py:16 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/txt.py:14 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:39 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:65 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:78 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:119 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:153 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:611 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:817 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:819 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:620 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:826 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:828 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:911 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:916 -#: /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/base.py:913 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:918 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:984 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:143 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:150 +#: /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 @@ -100,53 +109,52 @@ 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/gui2/add.py:172 -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:179 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/__init__.py:41 -#: /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/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:356 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:363 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:282 +#: /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:114 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:927 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:936 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1249 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1252 #: /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/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/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/library/cli.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:571 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:918 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1112 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:189 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:215 #: /home/kovid/work/calibre/src/calibre/library/database.py:913 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:362 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:374 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1007 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1076 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1760 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1762 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1889 -#: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:201 -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:136 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:399 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:411 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1283 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1387 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2161 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2163 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2295 +#: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:229 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:139 -#: /home/kovid/work/calibre/src/calibre/library/server/xml.py:70 -#: /home/kovid/work/calibre/src/calibre/utils/localization.py:117 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:142 +#: /home/kovid/work/calibre/src/calibre/library/server/xml.py:78 +#: /home/kovid/work/calibre/src/calibre/utils/localization.py:118 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:46 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:64 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:78 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/collection.py:47 -#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/collection.py:50 +#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/collection.py:55 msgid "Unknown" msgstr "Άγνωστο" @@ -170,19 +178,21 @@ msgstr "Εγγραφέας metadata" 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/dialogs/config/config_ui.py:605 -#: /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 "Προτιμήσεις" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:17 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:15 msgid "" "Follow all local links in an HTML file and create a ZIP file containing all " "linked files. This plugin is run every time you add an HTML file to the " @@ -192,7 +202,7 @@ msgstr "" "ένα αρχείο ZIP που περιέχει όλα τα συνδεδεμένα αρχεία. Το plugin τρέχει κάθε " "φορά που προσθέτετε ένα αρχείο HTML στην βιβλιοθήκη." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:53 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:51 msgid "" "Character encoding for the input HTML files. Common choices include: cp1252, " "latin1, iso-8859-1 and utf-8." @@ -200,7 +210,7 @@ msgstr "" "Κωδικοποίηση χαρακτήρων για τα εισαγόμενα αρχεία HTML. Συνήθεις επιλογές " "συμπεριλαμβάνουν : cp1252, latin1, iso-8859-1 και utf-8" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:60 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:58 msgid "" "Create a PMLZ archive containing the PML file and all images in the " "directory pmlname_img or images. This plugin is run every time you add a PML " @@ -209,7 +219,7 @@ msgstr "" "Δημιουργία μιας αρχειοθήκης PMLZ που περιέχει το αρχείο PML και όλες τις " "εικόνες στον κατάλογο pmlname_img ή images" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:94 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:92 msgid "Extract cover from comic files" msgstr "Εξαγωγή εξωφύλλου από αρχεία κόμικς" @@ -224,51 +234,211 @@ msgstr "Εξαγωγή εξωφύλλου από αρχεία κόμικς" #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:205 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:215 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:225 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:236 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:247 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:259 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:280 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:291 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:301 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:235 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:246 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:258 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:279 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:290 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:300 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:311 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:321 msgid "Read metadata from %s files" msgstr "Ανάγνωση συνδεδομένων από αρχεία %s" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:270 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:269 msgid "Read metadata from ebooks in RAR archives" msgstr "Ανάγνωση συνδεδομένων από ηλεκτρονικά βιβλία μέσα σε αρχειοθήκες RAR" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:322 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:332 msgid "Read metadata from ebooks in ZIP archives" msgstr "Ανάγνωση συνδεδομένων από ηλεκτρονικά βιβλία μέσα σε αρχειοθήκες ZIP" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:335 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:345 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:355 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:377 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:388 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:365 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:387 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:398 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:408 msgid "Set metadata in %s files" msgstr "Καθορισμός συνδεδομένων σε αρχεία %s" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:366 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:376 msgid "Set metadata from %s files" msgstr "Καθορισμός συνδεδομένων από αρχεία %s" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:681 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:712 msgid "Look and Feel" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:682 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:199 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:714 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:726 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:737 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:748 msgid "Interface" msgstr "Διεπαφή" +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:718 +msgid "Adjust the look and feel of the calibre interface to suit your tastes" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 +msgid "Behavior" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:730 +msgid "Change the way calibre behaves" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:735 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:209 +msgid "Add your own columns" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:741 +msgid "Add/remove your own columns to the calibre book list" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:746 +msgid "Customize the toolbar" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:752 +msgid "" +"Customize the toolbars and context menus, changing which actions are " +"available in each" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 +msgid "Input Options" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:760 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:771 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:782 +msgid "Conversion" +msgstr "Μετατροπή" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:764 +msgid "Set conversion options specific to each input format" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 +msgid "Common Options" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:775 +msgid "Set conversion options common to all formats" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:780 +msgid "Output Options" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:786 +msgid "Set conversion options specific to each output format" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:791 +msgid "Adding books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:817 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:829 +msgid "Import/Export" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:797 +msgid "Control how calibre reads metadata from files when adding books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:803 +msgid "Saving books to disk" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:809 +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:815 +msgid "Sending books to devices" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:821 +msgid "Control how calibre transfers files to your ebook reader" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:827 +msgid "Metadata plugboards" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:833 +msgid "Change metadata fields before saving/sending" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:838 +msgid "Sharing books by email" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:840 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:852 +msgid "Sharing" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:844 +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:850 +msgid "Sharing over the net" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:856 +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:863 +msgid "Plugins" +msgstr "Πρόσθετα" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:865 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:877 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:888 +msgid "Advanced" +msgstr "Για προχωρημένους" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:869 +msgid "Add/remove/customize various bits of calibre functionality" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:875 +msgid "Tweaks" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:881 +msgid "Fine tune how calibre behaves in various contexts" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:886 +msgid "Miscellaneous" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:892 +msgid "Miscellaneous advanced configuration" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/customize/conversion.py:102 msgid "Conversion Input" msgstr "Εισαγωγή (δεδομένων) προς μετατροπή" -#: /home/kovid/work/calibre/src/calibre/customize/conversion.py:129 +#: /home/kovid/work/calibre/src/calibre/customize/conversion.py:134 msgid "" "Specify the character encoding of the input document. If set this option " "will override any encoding declared by the document itself. Particularly " @@ -281,11 +451,11 @@ msgstr "" "για έγγραφα που δεν δηλώνουν κωδικοποίηση ή διαθέτουν εσφαλμένη δήλωση " "κωδικοποίησης." -#: /home/kovid/work/calibre/src/calibre/customize/conversion.py:241 +#: /home/kovid/work/calibre/src/calibre/customize/conversion.py:246 msgid "Conversion Output" msgstr "Εξαγωγή (δεδομένων) από μετατροπή" -#: /home/kovid/work/calibre/src/calibre/customize/conversion.py:255 +#: /home/kovid/work/calibre/src/calibre/customize/conversion.py:260 msgid "" "If specified, the output plugin will try to create output that is as human " "readable as possible. May not have any effect for some output plugins." @@ -294,11 +464,11 @@ msgstr "" "εξαγόμενα όσο το δυνατόν ανθρωπίνως αναγνώσιμα. Για ορισμένα πρόσθετα εξόδου " "μπορεί να μην έχει κανένα αποτέλεσμα." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:45 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:47 msgid "Input profile" msgstr "Περίγραμμα εισόδου" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:49 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:51 msgid "" "This profile tries to provide sane defaults and is useful if you know " "nothing about the input document." @@ -306,84 +476,84 @@ 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:59 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:444 msgid "" "This profile is intended for the SONY PRS line. The 500/505/600/700 etc." msgstr "" "Αυτό το περίγραμμα προορίζεται για τη σειρά SONY PRS. Τα 500/505/600/700 κλπ." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:69 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:71 msgid "This profile is intended for the SONY PRS 300." msgstr "Αυτό το περίγραμμα προορίζεται για το 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:80 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:484 msgid "This profile is intended for the SONY PRS-900." msgstr "Αυτό το περίγραμμα προορίζεται για το 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:88 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:513 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:99 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:524 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:112 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:537 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:124 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:549 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:134 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:557 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:147 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:570 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:159 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:583 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:171 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:631 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:183 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:644 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:196 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:658 msgid "This profile is intended for the IRex Digital Reader 800." msgstr "Αυτό το περίγραμμα προορίζεται για το 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:208 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:672 msgid "This profile is intended for the B&N Nook." msgstr "Αυτό το περίγραμμα προορίζεται για το B&N Nook." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:228 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:230 msgid "Output profile" msgstr "Περίγραμμα εξαγομένων" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:232 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:234 msgid "" "This profile tries to provide sane defaults and is useful if you want to " "produce a document intended to be read at a computer or on a range of " @@ -393,24 +563,28 @@ msgstr "" "και είναι χρήσιμο για την παραγωγή εγγράφων που προορίζονται να διαβαστούν " "σε Η/Υ ή σε μια ποικιλία συσκευών." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:259 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:276 msgid "" "Intended for the iPad and similar devices with a resolution of 768x1024" msgstr "Προορίζεται για το iPad και παρόμοιες συσκευές με ανάλυση 768x1024" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:427 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:435 +msgid "Intended for generic tablet devices, does no resizing of images" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:462 msgid "This profile is intended for the Kobo Reader." msgstr "Αυτό το περίγραμμα προορίζεται για το Kobo Reader." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:440 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:475 msgid "This profile is intended for the SONY PRS-300." msgstr "Αυτό το περίγραμμα προορίζεται για το SONY PRS-300." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:458 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:493 msgid "This profile is intended for the 5-inch JetBook." msgstr "Αυτό το περίγραμμα προορίζεται για το JetBook 5 ιντσών." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:467 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:502 msgid "" "This profile is intended for the SONY PRS line. The 500/505/700 etc, in " "landscape mode. Mainly useful for comics." @@ -418,10 +592,14 @@ msgstr "" "Αυτό το περίγραμμα προορίζεται για τη σειρά SONY PRS. Τα 500/505/700 κλπ., " "σε οριζόντια διάταξη (landscape). Χρήσιμο κυρίως για κόμικς." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:566 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:609 msgid "This profile is intended for the Amazon Kindle DX." msgstr "Αυτό το περίγραμμα προορίζεται για το Amazon Kindle DX." +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:686 +msgid "This profile is intended for the Sanda Bambook." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/customize/ui.py:34 msgid "Installed plugins" msgstr "Εγκατεστημένα πρόσθετα" @@ -442,15 +620,15 @@ msgstr "Απενεργοποιημένα πρόσθετα" msgid "Enabled plugins" msgstr "Ενεργοποιημένα πρόσθετα" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:86 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:93 msgid "No valid plugin found in " msgstr "Δεν βρέθηκε έγκυρο πρόσθετο " -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:501 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:508 msgid "Initialization of plugin %s failed with traceback:" msgstr "Η αρχικοποίηση του πρόσθετου %s απέτυχε με traceback:" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:534 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:541 msgid "" " %prog options\n" "\n" @@ -462,19 +640,19 @@ msgstr "" " Εξατομίκευση του calibre με φόρτωση εξωτερικών προσθέτων.\n" " " -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:540 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:547 msgid "Add a plugin by specifying the path to the zip file containing it." msgstr "" "Προσθήκη ενός προσθέτου με προσδιορισμό της διεύθυνσης (path) του αρχείου " "zip που το περιέχει." -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:542 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:549 msgid "Remove a custom plugin by name. Has no effect on builtin plugins" msgstr "" "Αφαίρεση εξατομικευμένων προσθέτων, ονομαστικά. Δεν επηρεάζει τα " "ενσωματωμένα πρόσθετα" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:544 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:551 msgid "" "Customize plugin. Specify name of plugin and customization string separated " "by a comma." @@ -482,15 +660,15 @@ msgstr "" "Εξατομίκευση προσθέτου. Προσδιόρισε όνομα προσθέτου και στοιχειοσειρά " "εξατομίκευσης χωρισμένα με κόμμα." -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:546 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:553 msgid "List all installed plugins" msgstr "Εμφάνιση όλων των εγκατεστημένων πρόσθετων" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:548 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:555 msgid "Enable the named plugin" msgstr "Ενεργοποίηση του ονομαζόμενου προσθέτου" -#: /home/kovid/work/calibre/src/calibre/customize/ui.py:550 +#: /home/kovid/work/calibre/src/calibre/customize/ui.py:557 msgid "Disable the named plugin" msgstr "Απενεργοποίηση του ονομαζόμενου προσθέτου" @@ -498,7 +676,7 @@ msgstr "Απενεργοποίηση του ονομαζόμενου προσθ msgid "Communicate with Android phones." msgstr "Επικοινωνία με τηλέφωνα Android." -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:50 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:56 msgid "" "Comma separated list of directories to send e-books to on the device. The " "first one that exists will be used" @@ -506,72 +684,92 @@ msgstr "" "Σειρά καταλόγων στη συσκευή, χωρισμένων με κόμμα, προς αποστολή ηλεκτρονικών " "βιβλίων. Ο πρώτος στη σειρά θα χρησιμοποιηθεί." -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:92 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:98 msgid "Communicate with S60 phones." msgstr "Επικοινωνία με τηλέφωνα S60." -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:87 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:90 +msgid "Apple device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:92 msgid "Communicate with iTunes/iBooks." msgstr "Επικοινωνία με iTunes/iBook" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:93 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:98 msgid "Apple device detected, launching iTunes, please wait ..." msgstr "Συσκευή της Apple εντοπίστηκε, έναρξη iTunes, παρακαλώ περιμένετε..." -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:246 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:249 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:100 +msgid "" +"Cannot copy books directly from iDevice. Drag from iTunes Library to " +"desktop, then add to calibre's Library window." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:260 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:263 msgid "Updating device metadata listing..." 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:339 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:378 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:947 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:987 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2956 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2996 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:385 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:992 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:3002 msgid "finished" msgstr "ολοκληρώθηκε" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:544 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:560 msgid "Use Series as Category in iTunes/iBooks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:546 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:562 msgid "Cache covers from iTunes/iBooks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:558 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:574 msgid "" "Some books not found in iTunes database.\n" "Delete using the iBooks app.\n" "Click 'Show Details' for a list." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:886 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:911 msgid "" "Some cover art could not be converted.\n" "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/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:190 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:203 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1644 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:132 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2553 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:444 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:467 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:882 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:888 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:918 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:257 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:212 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:225 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2021 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:149 msgid "News" msgstr "Νέα" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2729 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2554 +#: /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:1984 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2002 +msgid "Catalog" +msgstr "Κατάλογος" + +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2860 msgid "Communicate with iTunes." msgstr "Επικοινωνία με το iTunes" @@ -622,11 +820,11 @@ msgid "Communicate with the Sigmatek eBook reader." msgstr "Επικοινωνία με το Sigmatek eBook reader." #: /home/kovid/work/calibre/src/calibre/devices/folder_device/driver.py:16 -#: /home/kovid/work/calibre/src/calibre/devices/folder_device/driver.py:30 +#: /home/kovid/work/calibre/src/calibre/devices/folder_device/driver.py:32 msgid "Use an arbitrary folder as a device." msgstr "Επιλογή τυχαίου φακέλου ως συσκευή" -#: /home/kovid/work/calibre/src/calibre/devices/folder_device/driver.py:26 +#: /home/kovid/work/calibre/src/calibre/devices/folder_device/driver.py:28 #: /home/kovid/work/calibre/src/calibre/devices/interface.py:14 msgid "Device Interface" msgstr "Διεπαφή συσκευής" @@ -649,23 +847,32 @@ msgid "" "first one that exists will be used." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:18 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:22 msgid "Communicate with the Hanvon N520 eBook reader." msgstr "Επικοινωνία με το ηλ.αναγνωστήριο Hanvon N520." -#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:40 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:47 msgid "Communicate with The Book reader." msgstr "Επικοινωνία με το ηλ.αναγνωστήριο." -#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:52 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:59 msgid "Communicate with the SpringDesign Alex eBook reader." msgstr "Επικοινωνία με το ηλ.αναγνωστήριο SpringDesign Alex." -#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:68 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:102 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:113 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:264 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:296 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:256 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:274 +msgid "Removing books from device..." +msgstr "Αφαίρεση βιβλίων από τη συσκευή..." + +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:119 msgid "Communicate with the Azbooka" msgstr "Επικοινωνία με το Azbooka" -#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:81 +#: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:138 msgid "Communicate with the Elonex EB 511 eBook reader." msgstr "Επικοινωνία με το ηλ.αναγνωστήριο Elonex EB 511." @@ -679,6 +886,10 @@ msgstr "Επικοινωνία με το ηλ.αναγνωστήριο IRex Ilia msgid "John Schember" msgstr "John Schember" +#: /home/kovid/work/calibre/src/calibre/devices/interface.py:44 +msgid "Cannot get files from this device" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/irexdr/driver.py:16 msgid "Communicate with the IRex Digital Reader 1000 eBook reader." msgstr "Επικοινωνία με το ηλ.αναγνωστήριο IRex Digital Reader 1000." @@ -695,10 +906,14 @@ msgstr "Επικοινωνία με το Iriver Story reader." msgid "Communicate with the JetBook eBook reader." msgstr "Επικοινωνία με το ηλ.αναγνωστήριο JetBook." -#: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:86 +#: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:88 msgid "Communicate with the MiBuk Wolder reader." msgstr "Επικοινωνία με το MiBuk Wolder reader." +#: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:116 +msgid "Communicate with the JetBook Mini reader." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:43 msgid "Communicate with the Kindle eBook reader." msgstr "Επικοινωνία με το ηλ.αναγνωστήριο Kindle." @@ -711,14 +926,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 "Επικοινωνία με το 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:49 +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:65 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:68 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:71 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:204 #: /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 @@ -728,33 +949,26 @@ msgstr "Επικοινωνία με το Kobo Reader" 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/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/usbms/driver.py:278 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:283 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:300 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:307 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:281 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:286 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/usbms/driver.py:217 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:247 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:312 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:347 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:219 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:250 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:424 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:258 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:425 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." @@ -773,20 +987,33 @@ msgid "Communicate with the Sweex MM300" msgstr "Επικοινωνία με το Sweex MM300" #: /home/kovid/work/calibre/src/calibre/devices/misc.py:79 +msgid "Communicate with the Digma Q600" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/misc.py:88 msgid "Communicate with the Kogan" msgstr "Επικοινωνία με το Kogan" -#: /home/kovid/work/calibre/src/calibre/devices/misc.py:87 +#: /home/kovid/work/calibre/src/calibre/devices/misc.py:96 +#: /home/kovid/work/calibre/src/calibre/devices/misc.py:123 msgid "Communicate with the Pandigital Novel" msgstr "Επικοινωνία με το Pandigital Novel" +#: /home/kovid/work/calibre/src/calibre/devices/misc.py:142 +msgid "Communicate with the VelocityMicro" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/misc.py:160 +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 "Επικοινωνία με το Nokia 770 internet tablet." #: /home/kovid/work/calibre/src/calibre/devices/nokia/driver.py:40 -msgid "Communicate with the Nokia 810 internet tablet." -msgstr "Επικοινωνία με το Nokia 810 internet tablet." +msgid "Communicate with the Nokia 810/900 internet tablet." +msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/nokia/driver.py:74 msgid "Communicate with the Nokia E52" @@ -800,6 +1027,14 @@ msgstr "Το Nook" msgid "Communicate with the Nook eBook reader." msgstr "Επικοινωνία με το ηλ.αναγνωστήριο Nook." +#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:85 +msgid "Nook Color" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:86 +msgid "Communicate with the Nook Color eBook reader." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:17 msgid "Communicate with the Nuut2 eBook reader." msgstr "Επικοινωνία με το ηλ.αναγνωστήριο Nuut2." @@ -820,7 +1055,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:190 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/structure.py:68 msgid "Unnamed" msgstr "Χωρίς όνομα" @@ -837,28 +1072,36 @@ msgstr "Επικοινωνία με το Teclast K3/K5 reader." msgid "Communicate with the Newsmy reader." msgstr "Επικοινωνία με το Newsmy reader." -#: /home/kovid/work/calibre/src/calibre/devices/teclast/driver.py:48 +#: /home/kovid/work/calibre/src/calibre/devices/teclast/driver.py:47 +msgid "Communicate with the Pico reader." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/teclast/driver.py:57 msgid "Communicate with the iPapyrus reader." msgstr "Επικοινωνία με το iPapyrus reader." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:255 +#: /home/kovid/work/calibre/src/calibre/devices/teclast/driver.py:68 +msgid "Communicate with the Sovos reader." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:258 msgid "Unable to detect the %s disk drive. Try rebooting." msgstr "Αδύνατον να εντοπιστεί ο σκληρός δίσκος %s. Δοκιμάστε επανεκκίνηση." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:435 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:438 msgid "Unable to detect the %s mount point. Try rebooting." msgstr "" "Αδύνατον να εντοπιστεί το σημείο εφαρμογής %s. Δοκιμάστε επανεκκίνηση." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:500 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:503 msgid "Unable to detect the %s disk drive." msgstr "Αδύνατον να εντοπιστεί ο σκληρός δίσκος %s." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:593 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:596 msgid "Could not find mount helper: %s." msgstr "Δεν βρέθηκε ο βοηθός εφαρμογής: %s." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:605 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:608 msgid "" "Unable to detect the %s disk drive. Your kernel is probably exporting a " "deprecated version of SYSFS." @@ -866,25 +1109,31 @@ msgstr "" "Αδύνατον να εντοπιστεί ο σκληρός δίσκος %s. Είναι πιθανό ο πυρήνας σας " "(kernel) να εξαγάγει μια παρωχημένη έκδοση του SYSFS." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:613 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:616 msgid "Unable to mount main memory (Error code: %d)" msgstr "Αδύνατον να εφαρμοστεί η κύρια μνήμη (Κώδικας σφάλματος : %d)" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:750 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:752 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:667 +msgid "" +"The main memory of %s is read only. This usually happens because of file " +"system errors." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:815 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:817 msgid "The reader has no storage card in this slot." msgstr "Δεν υπάρχει κάρτα αποθήκευσης στην υποδοχή του ηλ.αναγνωστηρίου." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:754 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:819 msgid "Selected slot: %s is not supported." msgstr "Η επιλεγμένη υποδοχή: %s δεν υποστηρίζεται." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:783 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:848 msgid "There is insufficient free space in main memory" msgstr "Δεν υπάρχει αρκετός χώρος στην κύρια μνήμη." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:785 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:787 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:850 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:852 msgid "There is insufficient free space on the storage card" msgstr "Δεν υπάρχει αρκετός χώρος στην κάρτα αποθήκευσης" @@ -906,7 +1155,7 @@ msgid "Place files in sub directories if the device supports them" msgstr "Βάλε τα αρχεία σε υποφακέλους, αν υποστηρίζονται από τη συσκευή" #: /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 "Ανάγνωση συνδεδομένων από τα αρχεία της συσκευής" @@ -919,7 +1168,7 @@ msgid "Template to control how books are saved" msgstr "Σχεδιότυπο που ελέγχει πως αποθηκεύονται τα βιβλία" #: /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 "Πρόσθετη εξατομίκευση" @@ -931,102 +1180,15 @@ msgstr "Επικοινωνία με ένα ηλ.αναγνωστήριο." msgid "Get device information..." msgstr "Λήψη των στοιχείων της συσκευής" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:194 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:196 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:195 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:197 msgid "Transferring books to device..." msgstr "Μεταφορά βιβλίων στη συσκευή..." -#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:314 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:316 msgid "Sending metadata to device..." msgstr "Αποστολή συνδεδομένων στη συσκευή..." -#: /home/kovid/work/calibre/src/calibre/ebooks/chm/reader.py:41 -msgid "%prog [options] mybook.chm" -msgstr "%prog [παράμετροι] mybook.chm" - -#: /home/kovid/work/calibre/src/calibre/ebooks/chm/reader.py:42 -msgid "Output directory. Defaults to current directory" -msgstr "Φάκελλος εξαγωγής. Αρχικά έχει καθοριστεί ο τρέχων φάκελλος" - -#: /home/kovid/work/calibre/src/calibre/ebooks/chm/reader.py:45 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:589 -msgid "Set the book title" -msgstr "Καθορισμός τίτλου βιβλίου" - -#: /home/kovid/work/calibre/src/calibre/ebooks/chm/reader.py:47 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:591 -msgid "Set sort key for the title" -msgstr "Καθορισμός κλειδιού ταξινόμησης για τον τίτλο" - -#: /home/kovid/work/calibre/src/calibre/ebooks/chm/reader.py:49 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:593 -msgid "Set the author" -msgstr "Καθορισμός συγγραφέα" - -#: /home/kovid/work/calibre/src/calibre/ebooks/chm/reader.py:51 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:595 -msgid "Set sort key for the author" -msgstr "Καθορισμός κλειδιού ταξινόμησης για τον συγγραφέα" - -#: /home/kovid/work/calibre/src/calibre/ebooks/chm/reader.py:53 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:597 -msgid "The category this book belongs to. E.g.: History" -msgstr "Κατηγορία στην οποία ανήκει αυτό το βιβλίο. π.χ.: Ιστορία" - -#: /home/kovid/work/calibre/src/calibre/ebooks/chm/reader.py:56 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:600 -msgid "Path to a graphic that will be set as this files' thumbnail" -msgstr "" -"Διεύθυνση της εικόνας που θα χρησιμοποιηθεί ως εικονίδιο αυτού του αρχείου" - -#: /home/kovid/work/calibre/src/calibre/ebooks/chm/reader.py:59 -msgid "Path to a txt file containing a comment." -msgstr "Διεύθυνση ενός αρχείου txt που περιέχει κάποιο σχόλιο" - -#: /home/kovid/work/calibre/src/calibre/ebooks/chm/reader.py:62 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:607 -msgid "Extract thumbnail from LRF file" -msgstr "Εξαγωγή εικονιδίου από αρχείο LRF" - -#: /home/kovid/work/calibre/src/calibre/ebooks/chm/reader.py:63 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:608 -msgid "Set the publisher" -msgstr "Καθορισμός εκδότη" - -#: /home/kovid/work/calibre/src/calibre/ebooks/chm/reader.py:64 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:609 -msgid "Set the book classification" -msgstr "Καθορισμός κατηγοριοποίησης βιβλίου" - -#: /home/kovid/work/calibre/src/calibre/ebooks/chm/reader.py:65 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:610 -msgid "Set the book creator" -msgstr "Καθορισμός δημιουργού του βιβλίου" - -#: /home/kovid/work/calibre/src/calibre/ebooks/chm/reader.py:66 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:611 -msgid "Set the book producer" -msgstr "Καθορισμός παραγωγού του βιβλίου" - -#: /home/kovid/work/calibre/src/calibre/ebooks/chm/reader.py:68 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:613 -msgid "" -"Extract cover from LRF file. Note that the LRF format has no defined cover, " -"so we use some heuristics to guess the cover." -msgstr "" -"Εξαγωγή εξωφύλλου από αρχείο LRF. Σημειώστε ότι τα αρχεία LRF δεν έχουν " -"προκαθορισμένο εξώφυλλο, γι'αυτό χρησιμοποιούμε ευρετικές μεθόδους " -"(heuristics) για να μαντέψουμε το εξώφυλλο." - -#: /home/kovid/work/calibre/src/calibre/ebooks/chm/reader.py:70 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:615 -msgid "Set book ID" -msgstr "Καθορισμός ταυτότητας (ID) του βιβλίου" - -#: /home/kovid/work/calibre/src/calibre/ebooks/chm/reader.py:72 -msgid "Set font delta" -msgstr "Καθορισμός του δέλτα της γραμματοσειράς" - #: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:182 msgid "Rendered %s" msgstr "Ο/Η/Το %s επεξεργάσθηκε" @@ -1245,12 +1407,12 @@ msgstr "Κατάλογος ενσωματωμένων συνταγών" msgid "Output saved to" msgstr "Τα εξαγόμενα αποθηκεύτηκαν στον/στην" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:95 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:99 msgid "Level of verbosity. Specify multiple times for greater verbosity." msgstr "" "Επίπεδο πολυλογίας. Προσδιορίστε πολλές φορές για μεγαλύτερη πολυλογία." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:102 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:106 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 " @@ -1260,7 +1422,7 @@ msgstr "" "στον φάκελο που έχει προσδιοριστεί. Χρήσιμο όταν δε γνωρίζετε το ακριβές " "στάδιο της διαδικασίας μετατροπής όπου εμφανίζεται κάποιο σφάλμα." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:111 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:115 msgid "" "Specify the input profile. The input profile gives the conversion system " "information on how to interpret various information in the input document. " @@ -1272,7 +1434,7 @@ msgstr "" "στο εισαγόμενο έγγραφο. Π.χ. αποστάσεις που εξαρτώνται από την ανάλυση " "(αποστάσεις σε pixels). Οι επιλογές είναι:" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:122 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:126 msgid "" "Specify the output profile. The output profile tells the conversion system " "how to optimize the created document for the specified device. In some " @@ -1286,7 +1448,7 @@ msgstr "" "να λειτουργούν σε μια συσκευή. Π.χ. το EPUB στο ηλ.αναγνωστήριο SONY. Οι " "επιλογές είναι:" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:133 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:137 msgid "" "The base font size in pts. All font sizes in the produced book will be " "rescaled based on this size. By choosing a larger size you can make the " @@ -1299,7 +1461,7 @@ msgstr "" "εξαγόμενα κείμενα και αντίστροφα. Αρχικά, το μέγεθος αναφοράς επιλέγεται " "βάσει του περιγράμματος εξαγωγής που επιλέξατε." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:143 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:147 msgid "" "Mapping from CSS font names to font sizes in pts. An example setting is " "12,12,14,16,18,20,22,24. These are the mappings for the sizes xx-small to xx-" @@ -1315,11 +1477,11 @@ msgstr "" "τρόπο, τις γραμματοσειρές. Η αρχική αντιστοίχιση που χρησιμοποιείται " "εξαρτάται από το περίγραμμα εξαγωγής που επιλέξατε." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:155 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:159 msgid "Disable all rescaling of font sizes." msgstr "Απενεργοποίηση της επανακλιμάκωσης των μεγεθών των γραμματοσειρών." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:162 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:166 msgid "" "The line height in pts. Controls spacing between consecutive lines of text. " "By default no line height manipulation is performed." @@ -1327,7 +1489,7 @@ msgstr "" "Το ύψος γραμμής, σε σημεία (pts). Ελέγχει το διάστημα μεταξύ διαδοχικών " "γραμμών κειμένου. Αρχικά, δε γίνεται καμία αλλαγή στο ύψος γραμμής." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:170 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:174 msgid "" "Some badly designed documents use tables to control the layout of text on " "the page. When converted these documents often have text that runs off the " @@ -1340,7 +1502,7 @@ msgstr "" "παράμετρος εξαγάγει το περιεχόμενο απ'αυτούς τους πίνακες και το παρουσιάζει " "με γραμμικό τρόπο." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:180 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:184 msgid "" "XPath expression that specifies all tags that should be added to the Table " "of Contents at level one. If this is specified, it takes precedence over " @@ -1350,7 +1512,7 @@ msgstr "" "προστεθούν στον Πίνακα Περιεχομένων στο πρώτο επίπεδο. Αν προσδιοριστεί, " "έχει προτεραιότητα έναντι άλλων μορφών αυτόματου εντοπισμού." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:189 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:193 msgid "" "XPath expression that specifies all tags that should be added to the Table " "of Contents at level two. Each entry is added under the previous level one " @@ -1360,7 +1522,7 @@ msgstr "" "προστεθούν στον Πίνακα Περιεχομένων στο δεύτερο επίπεδο. Κάθε καταχώρηση " "προστίθεται κάτω από την προηγούμενη καταχώρηση του πρώτου επιπέδου." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:197 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:201 msgid "" "XPath expression that specifies all tags that should be added to the Table " "of Contents at level three. Each entry is added under the previous level two " @@ -1370,7 +1532,7 @@ msgstr "" "προστεθούν στον Πίνακα Περιεχομένων στο τρίτο επίπεδο. Κάθε καταχώρηση " "προστίθεται κάτω από την προηγούμενη καταχώρηση του δεύτερου επιπέδου." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:205 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:209 msgid "" "Normally, if the source file already has a Table of Contents, it is used in " "preference to the auto-generated one. With this option, the auto-generated " @@ -1380,13 +1542,13 @@ msgstr "" "χρησιμοποιείται αντί εκείνου που παράγεται αυτόματα. Μ'αυτή εδώ την " "παράμετρο, χρησιμοποιείται πάντα ο αυτόματα παραγόμενος." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:213 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:217 msgid "Don't add auto-detected chapters to the Table of Contents." msgstr "" "Να μην προστεθούν κεφάλαια, που έχουν εντοπιστεί αυτόματα, στον Πίνακα " "Περιεχομένων" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:220 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:224 msgid "" "If fewer than this number of chapters is detected, then links are added to " "the Table of Contents. Default: %default" @@ -1394,7 +1556,7 @@ msgstr "" "Αν εντοπιστούν κεφάλαια λιγότερα απ'αυτόν εδώ τον αριθμό, να προστεθούν " "σύνδεσμοι στον Πίνακα Περιεχομένων. Αρχική τιμή : %default" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:227 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:231 msgid "" "Maximum number of links to insert into the TOC. Set to 0 to disable. Default " "is: %default. Links are only added to the TOC if less than the threshold " @@ -1405,7 +1567,7 @@ msgstr "" "λιγότερα κεφάλαια από την τιμή-όριο θα προστεθούν σύνδεσμοι στον Πίνακα " "Περιεχομένων." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:235 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:239 msgid "" "Remove entries from the Table of Contents whose titles match the specified " "regular expression. Matching entries and all their children are removed." @@ -1414,7 +1576,7 @@ msgstr "" "ταιριάζουν σε μια προσδιορισμένη κανονική έκφραση. Οι καταχωρήσεις που " "ταιριάζουν και τα παιδιά τους αφαιρούνται." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:246 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:250 msgid "" "An XPath expression to detect chapter titles. The default is to consider " "

      or

      tags that contain the words \"chapter\",\"book\",\"section\" or " @@ -1424,7 +1586,7 @@ msgid "" "User Manual for further help on using this feature." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:260 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:264 msgid "" "Specify how to mark detected chapters. A value of \"pagebreak\" will insert " "page breaks before chapters. A value of \"rule\" will insert a line before " @@ -1432,39 +1594,39 @@ msgid "" "\"both\" will use both page breaks and lines to mark chapters." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:270 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:274 msgid "" "Either the path to a CSS stylesheet or raw CSS. This CSS will be appended to " "the style rules from the source file, so it can be used to override those " "rules." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:279 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:283 msgid "" "An XPath expression. Page breaks are inserted before the specified elements." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:285 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:289 msgid "" "Set the top margin in pts. Default is %default. Note: 72 pts equals 1 inch" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:290 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:294 msgid "" "Set the bottom margin in pts. Default is %default. Note: 72 pts equals 1 inch" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:295 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:299 msgid "" "Set the left margin in pts. Default is %default. Note: 72 pts equals 1 inch" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:300 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:304 msgid "" "Set the right margin in pts. Default is %default. Note: 72 pts equals 1 inch" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:306 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:310 msgid "" "Change text justification. A value of \"left\" converts all justified text " "in the source to left aligned (i.e. unjustified) text. A value of " @@ -1473,74 +1635,89 @@ msgid "" "Note that only some output formats support justification." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:316 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:320 msgid "" "Remove spacing between paragraphs. Also sets an indent on paragraphs of " "1.5em. Spacing removal will not work if the source file does not use " "paragraphs (

      or

      tags)." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:323 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:327 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/ebooks/conversion/plumber.py:330 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:334 msgid "" "Use the cover detected from the source file in preference to the specified " "cover." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:336 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:340 msgid "" "Insert a blank line between paragraphs. Will not work if the source file " "does not use paragraphs (

      or

      tags)." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:343 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:347 msgid "" "Remove the first image from the input ebook. Useful if the first image in " "the source file is a cover and you are specifying an external cover." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:351 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:355 msgid "" "Insert the book metadata at the start of the book. This is useful if your " "ebook reader does not support displaying/searching metadata directly." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:359 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:363 msgid "" "Attempt to detect and correct hard line breaks and other problems in the " "source file. This may make things worse, so use with care." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:367 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:371 +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:380 +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:388 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:395 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:401 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:408 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:415 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:422 msgid "" "Transliterate unicode characters to an ASCII representation. Use with care " "because this will replace unicode characters with ASCII. For instance it " @@ -1550,7 +1727,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:437 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 " @@ -1560,103 +1737,105 @@ msgid "" "instead." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:428 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:449 #: /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:453 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:458 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:462 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:466 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:470 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:54 msgid "Set the ebook description." -msgstr "" +msgstr "Εισαγωγή περιγραφής του ηλεκτρονικού βιβλίου." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:453 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:474 #: /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:478 #: /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:482 #: /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:486 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:64 msgid "Set the rating. Should be a number between 1 and 5." msgstr "Καταχώρηση βαθμολογίας. Επιλέξτε ένα νούμερο από 1 έως και 5." -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:469 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:490 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:66 msgid "Set the ISBN of the book." msgstr "Εισαγωγή του κωδικού ISBN του βιβλίου" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:473 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:494 #: /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:498 #: /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:502 #: /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:506 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:510 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:610 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:668 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:675 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:830 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:858 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:945 msgid "Creating" msgstr "Δημιουργία" @@ -1755,7 +1934,8 @@ msgid "" "option the image may be slightly distorted, but there will be no borders." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:169 +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:170 +#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:203 msgid "Start" msgstr "Έναρξη" @@ -1811,6 +1991,28 @@ msgid "" "conversion of a PDF file. Default is %default which disables this." msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/html/output.py:33 +msgid "CSS file used for the output instead of the default file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/html/output.py:36 +msgid "" +"Template used for generation of the html index file instead of the default " +"file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/html/output.py:39 +msgid "" +"Template used for the generation of the html contents of the book instead of " +"the default file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/html/output.py:42 +msgid "" +"Extract the contents of the generated ZIP file to the specified directory. " +"WARNING: The contents of the directory will be deleted." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/lit/from_any.py:47 msgid "Creating LIT file from EPUB..." msgstr "" @@ -1938,7 +2140,7 @@ msgid "Path to output file" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:290 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:114 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:128 msgid "Verbose processing" msgstr "" @@ -1959,11 +2161,69 @@ msgid "" "\n" msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:589 +msgid "Set the book title" +msgstr "Καθορισμός τίτλου βιβλίου" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:591 +msgid "Set sort key for the title" +msgstr "Καθορισμός κλειδιού ταξινόμησης για τον τίτλο" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:593 +msgid "Set the author" +msgstr "Καθορισμός συγγραφέα" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:595 +msgid "Set sort key for the author" +msgstr "Καθορισμός κλειδιού ταξινόμησης για τον συγγραφέα" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:597 +msgid "The category this book belongs to. E.g.: History" +msgstr "Κατηγορία στην οποία ανήκει αυτό το βιβλίο. π.χ.: Ιστορία" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:600 +msgid "Path to a graphic that will be set as this files' thumbnail" +msgstr "" +"Διεύθυνση της εικόνας που θα χρησιμοποιηθεί ως εικονίδιο αυτού του αρχείου" + #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:603 msgid "" "Path to a txt file containing the comment to be stored in the lrf file." msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:607 +msgid "Extract thumbnail from LRF file" +msgstr "Εξαγωγή εικονιδίου από αρχείο LRF" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:608 +msgid "Set the publisher" +msgstr "Καθορισμός εκδότη" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:609 +msgid "Set the book classification" +msgstr "Καθορισμός κατηγοριοποίησης βιβλίου" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:610 +msgid "Set the book creator" +msgstr "Καθορισμός δημιουργού του βιβλίου" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:611 +msgid "Set the book producer" +msgstr "Καθορισμός παραγωγού του βιβλίου" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:613 +msgid "" +"Extract cover from LRF file. Note that the LRF format has no defined cover, " +"so we use some heuristics to guess the cover." +msgstr "" +"Εξαγωγή εξωφύλλου από αρχείο LRF. Σημειώστε ότι τα αρχεία LRF δεν έχουν " +"προκαθορισμένο εξώφυλλο, γι'αυτό χρησιμοποιούμε ευρετικές μεθόδους " +"(heuristics) για να μαντέψουμε το εξώφυλλο." + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:615 +msgid "Set book ID" +msgstr "Καθορισμός ταυτότητας (ID) του βιβλίου" + #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:90 msgid "Enable autorotation of images that are wider than the screen width." msgstr "" @@ -2020,99 +2280,117 @@ msgstr "" msgid "Comic" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:401 -#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:45 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:97 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:98 -#: /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/library/server/opds.py:569 -msgid "Title" -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 -msgid "Author(s)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:403 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:61 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:72 -msgid "Publisher" -msgstr "Εκδότης" - -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:404 -#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:49 -msgid "Producer" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:405 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:35 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:210 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:211 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:184 -#: /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 -msgid "Comments" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:413 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:27 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:50 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:73 -#: /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 -msgid "Tags" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:415 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:50 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:74 -#: /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 -msgid "Series" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:416 -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 -msgid "Timestamp" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:420 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:63 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:70 -msgid "Published" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:422 -msgid "Rights" -msgstr "Δικαιώματα" - -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/amazon.py:85 -msgid "EDITORIAL REVIEW" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/archive.py:41 msgid "" "Extract common e-book formats from archives (zip/rar) files. Also try to " "autodetect if they are actually cbz/cbr files." msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:114 +msgid "TEMPLATE ERROR" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:533 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:59 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:448 +msgid "No" +msgstr "Όχι" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:533 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:59 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:448 +msgid "Yes" +msgstr "Ναι" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:605 +#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:45 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:109 +#: /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:373 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:923 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:303 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:570 +msgid "Title" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:606 +#: /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:378 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:924 +msgid "Author(s)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:607 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:61 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:72 +msgid "Publisher" +msgstr "Εκδότης" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:608 +#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:49 +msgid "Producer" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:609 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:39 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:79 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:325 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1131 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:178 +msgid "Comments" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:611 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:29 +#: /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:313 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1127 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:160 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:623 +msgid "Tags" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:613 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:28 +#: /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:330 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1136 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:108 +msgid "Series" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:614 +msgid "Language" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:616 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1119 +msgid "Timestamp" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:618 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:157 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:70 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:258 +msgid "Published" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:620 +msgid "Rights" +msgstr "Δικαιώματα" + #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:20 msgid "options" msgstr "επιλογές" @@ -2206,87 +2484,99 @@ msgstr "" msgid "No cover found" msgstr "Δε βρέθηκε εξώφυλλο" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:27 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:28 msgid "Cover download" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:79 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:80 msgid "Download covers from openlibrary.org" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:107 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:136 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:108 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:137 msgid "ISBN: %s not found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:117 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:118 msgid "Download covers from librarything.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:128 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:68 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:129 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:69 msgid "LibraryThing.com timed out. Try again later." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:135 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:75 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:136 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:76 msgid "" "Could not fetch cover as server is experiencing high load. Please try again " "later." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:139 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:79 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:140 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:80 msgid "LibraryThing.com server error. Try again later." msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:226 +msgid "Download covers from Douban.com" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:235 +msgid "Douban.com API timed out. Try again later." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/douban.py:42 msgid "Downloads metadata from Douban.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:51 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:57 msgid "Metadata download" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:128 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:141 msgid "ratings" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:128 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:141 msgid "tags" msgstr "ετικέτες" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:129 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:142 msgid "description/reviews" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:130 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:143 msgid "Download %s from %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:156 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:149 +msgid "Convert comments downloaded from %s to plain text" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:175 msgid "Downloads metadata from Google Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:173 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:192 msgid "Downloads metadata from isbndb.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:201 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:220 msgid "" "To use isbndb.com you must sign up for a %sfree account%s and enter your " "access key below." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:211 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:230 msgid "Downloads social metadata from amazon.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:230 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:251 msgid "Downloads series/tags/rating information from librarything.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:95 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:109 msgid "" "\n" "%prog [options] key\n" @@ -2300,27 +2590,27 @@ msgid "" "\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:106 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:120 msgid "The ISBN ID of the book you want metadata for." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:108 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:122 msgid "The author whose book to search for." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:110 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:124 msgid "The title of the book to search for." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:112 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:126 msgid "The publisher of the book to search for." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:76 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:77 msgid " not found." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:86 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:87 msgid "" "\n" "%prog [options] ISBN\n" @@ -2329,8 +2619,8 @@ msgid "" "LibraryThing.com\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1226 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1399 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1308 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 msgid "Cover" msgstr "Εξώφυλλο" @@ -2361,78 +2651,78 @@ msgstr "" msgid "Tag marking book to be filed with Personal Docs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/output.py:108 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/output.py:107 msgid "All articles" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:259 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:262 msgid "This is an Amazon Topaz book. It cannot be processed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1400 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 msgid "Title Page" msgstr "Σελίδα τίτλου" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 #: /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 "Πίνακας Περιεχομένων" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 msgid "Index" msgstr "Ευρετήριο" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 msgid "Glossary" msgstr "Γλωσσάρι" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 msgid "Acknowledgements" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 msgid "Bibliography" msgstr "Βιβλιογραφία" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 msgid "Colophon" msgstr "Κολοφώνας" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 msgid "Copyright" msgstr "Πνευματικά Δικαιώματα" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 msgid "Dedication" msgstr "Αφιέρωση" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 msgid "Epigraph" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 msgid "Foreword" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 msgid "List of Illustrations" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 msgid "List of Tables" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 msgid "Notes" msgstr "Σημειώσεις" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1416 msgid "Preface" msgstr "Πρόλογος" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1417 msgid "Main Text" msgstr "" @@ -2440,13 +2730,20 @@ msgstr "" msgid "%s format books are not supported" msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/cover.py:103 +#: /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" -msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:159 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:71 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:621 +msgid "Rating" +msgstr "Αξιολόγηση" #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/split.py:34 msgid "" @@ -2509,8 +2806,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 @@ -2614,7 +2911,7 @@ msgstr "" #: /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 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:33 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:34 msgid "Author" msgstr "Συγγραφέας" @@ -2736,11 +3033,52 @@ msgid "" "%s" msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:25 #: /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 "" +#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:29 +#: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:38 +msgid "" +"The maximum number of characters per line. This splits on the first space " +"before the specified value. If no space is found the line will be broken at " +"the space after and will exceed the specified value. Also, there is a " +"minimum of 25 characters. Use 0 to disable line splitting." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:36 +msgid "" +"Specify whether or not to insert an empty line between two paragraphs." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:40 +msgid "" +"Specify whether or not to insert two space characters to indent the first " +"line of each paragraph." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:44 +msgid "" +"Specify whether or not to hide the chapter title for each chapter. Useful " +"for image-only output (eg. comics)." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:122 +msgid "Start Page" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:132 +#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:134 +msgid "Cover Pages" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:147 +#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:150 +msgid " (Preface)" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/tcr/output.py:27 msgid "" "Specify the compression level to use. Scale 1 - 10. 1 being the lowest " @@ -2777,144 +3115,136 @@ msgid "" "Note: This option is not honored by all formats." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:38 -msgid "" -"The maximum number of characters per line. This splits on the first space " -"before the specified value. If no space is found the line will be broken at " -"the space after and will exceed the specified value. Also, there is a " -"minimum of 25 characters. Use 0 to disable line splitting." -msgstr "" - #: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:45 msgid "" "Force splitting on the max-line-length value when no space is present. Also " "allows max-line-length to be below the minimum" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:67 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:69 msgid "Confirm before deleting" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:71 msgid "Main window geometry" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:73 msgid "Notify when a new version is available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:75 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:77 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:79 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:81 msgid "Defaults for conversion to LRF" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:83 msgid "Options for the LRF ebook viewer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:86 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:88 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:89 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:90 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:91 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:93 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:95 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:97 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:99 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:101 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:121 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:123 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:125 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:127 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:129 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:131 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:133 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:135 msgid "Disable UI animations" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:181 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:479 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:183 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:494 msgid "Copied" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:217 msgid "Copy" msgstr "Αντιγραφή" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:217 msgid "Copy to Clipboard" msgstr "Αντιγραφή στο Πρόχειρο" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:433 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:467 msgid "Choose Files" msgstr "" @@ -2930,127 +3260,133 @@ msgstr "" msgid "A" msgstr "" -#: /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:202 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 "" -#: /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 "" -#: /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 "" -#: /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 "" -#: /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 "" -#: /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 "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:169 +msgid "SNB Books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:170 msgid "Comics" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:171 msgid "Archives" msgstr "Αρχεία" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:175 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:211 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:212 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:221 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:222 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:241 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:246 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:265 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/add.py:246 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:28 #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:94 #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:119 msgid "No book selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:252 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:259 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:265 msgid "No book files found" msgstr "" @@ -3063,136 +3399,266 @@ msgid "Add books to your calibre library from the connected device" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:499 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:548 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 "" - #: /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: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:99 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:74 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:140 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:176 -#: /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:124 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:189 +#: /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/add.py:264 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:230 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 "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:73 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar.py:50 -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:112 +msgid "Checking database integrity" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:657 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:41 +#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:54 +msgid "Error" +msgstr "Σφάλμα" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:129 +msgid "Failed to check database integrity" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:134 +msgid "Some inconsistencies found" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:135 +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/actions/choose_library.py:148 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:51 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:140 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:112 msgid "%d books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:149 msgid "Choose calibre library to work with" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:83 -msgid "Switch to library..." +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:158 +msgid "Switch/create library..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:77 msgid "Quick switch" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:78 +msgid "Rename library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:79 +msgid "Delete library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:187 +msgid "Library Maintenance" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:188 +msgid "Library metadata backup status" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:192 +msgid "Start backing up metadata of all books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:196 +msgid "Check library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:200 +msgid "Check database integrity" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:204 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:343 +msgid "Recover database" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:269 +msgid "Rename" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:270 +msgid "Choose a new name for the library %s. " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:271 +msgid "Note that the actual library folder will be renamed." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:190 +msgid "Already exists" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:279 +msgid "The folder %s already exists. Delete it first." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:285 +msgid "Rename failed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:286 +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:296 +#: /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 "Είστε σίγουροι;" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:297 +msgid "All files from %s will be permanently deleted. Are you sure?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:316 +msgid "none" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:317 +msgid "Backup status" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:318 +msgid "Book metadata files remaining to be written: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:324 +msgid "Backup metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:325 +msgid "" +"Metadata will be backed up while calibre is running, at the rate of " +"approximately 1 book per second." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:344 +msgid "" +"This command rebuilds your calibre database from the information stored by " +"calibre in the OPF files.

      This function is not currently available in the " +"GUI. You can recover your database using the 'calibredb restore_database' " +"command line function." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:358 msgid "No library found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:150 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:359 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:182 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:187 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:100 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:540 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:391 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:742 msgid "Not allowed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:183 -msgid "You cannot change libraries when a device is connected." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:188 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:392 msgid "You cannot change libraries while jobs are running." msgstr "" @@ -3204,58 +3670,63 @@ msgstr "" 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 "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:83 msgid "Copy to library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:84 msgid "Copy selected books to the specified library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:98 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:114 +msgid "(delete after copy)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:123 msgid "Cannot copy" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:128 msgid "No library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:129 msgid "No library found at %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:107 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:111 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:136 msgid "Copying" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:147 msgid "Could not copy books: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:121 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:678 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:234 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:147 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:720 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:685 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:189 msgid "Failed" msgstr "Απέτυχε" -#: /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:150 msgid "Copied %d books to %s" msgstr "" @@ -3267,82 +3738,82 @@ msgstr "Διαγραφή" 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/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:473 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:482 msgid "Storage Card A" msgstr "" -#: /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:475 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:484 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:200 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:173 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 "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:185 msgid "" "The selected books will be permanently deleted from your device. Are " "you sure?" @@ -3399,11 +3870,11 @@ msgstr "" msgid "Manage the collections on this device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:24 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:23 msgid "E" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:24 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:23 msgid "Edit metadata" msgstr "" @@ -3447,97 +3918,79 @@ msgstr "" 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:74 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:94 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:96 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:96 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:223 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:97 msgid "Downloading %s for %d book(s)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:124 -msgid "Failed to download some metadata" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:125 -msgid "Failed to download metadata for the following:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:128 -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/device.py:608 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:569 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:1001 -#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:54 -msgid "Error" -msgstr "Σφάλμα" - -#: /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:121 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:159 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:188 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:191 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:192 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:197 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 (%s). 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:209 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 (%s). 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:222 msgid "" "You are about to merge more than 5 books. Are you sure you want to " "proceed?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/fetch_news.py:18 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/fetch_news.py:17 msgid "F" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/fetch_news.py:18 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/fetch_news.py:17 msgid "Fetch news" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/fetch_news.py:53 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/fetch_news.py:52 msgid "Fetching news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/fetch_news.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/fetch_news.py:66 msgid " fetched." msgstr "" @@ -3587,6 +4040,7 @@ msgid "&Restart" msgstr "&Επανεκκίνηση" #: /home/kovid/work/calibre/src/calibre/gui2/actions/restart.py:14 +#: /home/kovid/work/calibre/src/calibre/utils/pyconsole/main.py:59 msgid "Ctrl+R" msgstr "" @@ -3599,57 +4053,58 @@ msgid "S" msgstr "" #: /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 "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:16 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:628 msgid "Show book details" msgstr "" @@ -3657,11 +4112,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 "" @@ -3669,53 +4124,75 @@ 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 -msgid "Alt+S" -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:27 msgid "Alt+P" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:25 +#: /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:26 +#: /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:26 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:28 msgid "Books with the same tags" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:15 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:54 +msgid "Tweak ePub" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:16 +msgid "Make small changes to ePub format books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:17 +msgid "T" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:39 +msgid "Cannot tweak ePub" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:40 +msgid "No ePub available. First convert the book to ePub." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:24 msgid "V" msgstr "" #: /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:158 msgid "Cannot view" msgstr "" @@ -3740,7 +4217,7 @@ msgstr "" 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:159 msgid "%s has no available formats." msgstr "" @@ -3748,60 +4225,60 @@ msgstr "" msgid "Searching in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:232 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:198 msgid "Adding..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:245 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:211 msgid "Searching in all sub-directories..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:224 msgid "Path error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:225 msgid "The specified directory could not be processed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:263 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:811 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:869 msgid "No books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:328 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:294 msgid "Added" msgstr "Προστέθηκε" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:307 msgid "Adding failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:342 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:308 msgid "" "The add books process seems to have hung. Try restarting calibre and adding " "the books in smaller increments, until you find the problem book." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:357 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:323 msgid "Duplicates found!" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:358 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:324 msgid "" "Books with the same title as the following already exist in the database. " "Add them anyway?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:361 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:327 msgid "Adding duplicates..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:428 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:390 msgid "Saving..." msgstr "Αποθήκευση..." -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:481 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:443 msgid "Saved" msgstr "Αποθηκεύτηκε" @@ -3818,7 +4295,7 @@ msgid "Looking for duplicates based on file hash" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/__init__.py:109 -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:70 msgid "Choose root folder" msgstr "" @@ -3834,32 +4311,32 @@ msgstr "" msgid "Add books to calibre" msgstr "" -#: /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/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 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/scan_ui.py:26 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:62 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/finish_ui.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/kindle_ui.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/library_ui.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/stanza_ui.py:46 msgid "WizardPage" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/scan_ui.py:22 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/scan_ui.py:27 msgid "Scanning root folder for books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/scan_ui.py:23 +#: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/scan_ui.py:28 msgid "This may take a few minutes" msgstr "" -#: /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 "" -#: /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 "" -#: /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 " @@ -3871,139 +4348,137 @@ msgid "" "not under the root folder you choose.

      " msgstr "" -#: /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 "" -#: /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 "" -#: /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:620 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:621 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:633 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:635 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:637 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:639 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:640 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:693 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:103 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:106 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/toolbar_ui.py:108 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:364 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:369 +#: /home/kovid/work/calibre/src/calibre/gui2/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:133 +#: /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:376 #: /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:397 +#: /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 +#: /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:420 +#: /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/preferences/behavior_ui.py:143 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:144 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:78 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:80 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:82 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/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/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 "" -#: /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 "" -#: /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 "" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:23 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:45 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:54 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:311 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:114 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:115 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:25 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:405 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:125 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:137 #: /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:320 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1117 msgid "Path" msgstr "Διαδρομή" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:24 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:48 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:117 -#: /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/book_details.py:26 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:319 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/emailp.py:24 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:117 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/book_details.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:927 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1120 msgid "Collections" msgstr "Συλλογές" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:47 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:51 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:60 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/book_details.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:312 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:318 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1126 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1130 #: /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 "Κανένα" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:310 -msgid "Click to open Book Details window" +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:404 +msgid "Double-click to open Book Details window" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex.py:16 @@ -4024,6 +4499,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_input.py:13 #: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_output.py:18 #: /home/kovid/work/calibre/src/calibre/gui2/convert/rb_output.py:15 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/snb_output.py:15 #: /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" @@ -4039,105 +4515,118 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_output.py:17 #: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_output.py:18 #: /home/kovid/work/calibre/src/calibre/gui2/convert/rb_output.py:15 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/snb_output.py:15 #: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output.py:17 msgid "output" 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_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/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/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/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 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_output_ui.py:35 -#: /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/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/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/dialogs/search_item_ui.py:35 -#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:106 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:125 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:97 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml_ui.py:42 +#: /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:32 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:53 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_input_ui.py:33 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:36 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_input_ui.py:36 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_output_ui.py:40 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_input_ui.py:43 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_output_ui.py:47 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/rb_output_ui.py:33 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/snb_output_ui.py:39 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/toc_ui.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:51 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_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:72 +#: /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:40 +#: /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:105 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc_ui.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:113 +#: /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:68 +#: /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:112 msgid "Form" msgstr "Φόρμα" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:87 msgid "Bib file encoding:" msgstr "" -#: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml_ui.py:43 msgid "Fields to include in output:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:89 msgid "ascii/LaTeX" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:90 msgid "Encoding configuration (change if you have errors) :" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:91 msgid "strict" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:87 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:92 msgid "replace" msgstr "αντικατάσταση" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:88 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:93 msgid "ignore" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:94 msgid "backslashreplace" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:95 msgid "BibTeX entry type:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:96 msgid "mixed" msgstr "Μικτό" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:97 msgid "misc" msgstr "διάφορα" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:98 msgid "book" msgstr "βιβλίο" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:99 msgid "Create a citation tag?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:100 msgid "Expression to form the BibTeX citation tag:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:101 msgid "" "Some explanation about this template:\n" " -The fields availables are 'author_sort', 'authors', 'id',\n" @@ -4156,30 +4645,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:1607 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1625 -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], " @@ -4188,22 +4670,39 @@ 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_tab_template_ui.py:28 +#: /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:33 msgid "Tab template for catalog.ui" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:25 +msgid "Bold" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:26 +msgid "Italic" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:28 +msgid "Underline" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:36 msgid "" "For settings that cannot be specified in this dialog, use the values saved " @@ -4211,11 +4710,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:70 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:83 #: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:185 msgid "Options specific to the output format." msgstr "" @@ -4232,66 +4731,66 @@ msgstr "" msgid "input" msgstr "" -#: /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/convert/comic_input_ui.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:99 msgid "&Number of Colors:" msgstr "" -#: /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/convert/comic_input_ui.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:101 msgid "Disable &normalize" msgstr "" -#: /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/convert/comic_input_ui.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:102 msgid "Keep &aspect ratio" msgstr "Δι&ατήρηση αναλογίας διαστάσεων" -#: /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/convert/comic_input_ui.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:103 msgid "Disable &Sharpening" msgstr "" -#: /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/convert/comic_input_ui.py:98 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:109 msgid "Disable &Trimming" msgstr "" -#: /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/convert/comic_input_ui.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:108 msgid "&Wide" msgstr "" -#: /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/convert/comic_input_ui.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:104 msgid "&Landscape" msgstr "&Οριζόντια" -#: /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/convert/comic_input_ui.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:106 msgid "&Right to left" msgstr "" -#: /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/convert/comic_input_ui.py:102 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:105 msgid "Don't so&rt" msgstr "" -#: /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/convert/comic_input_ui.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:107 msgid "De&speckle" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:104 msgid "&Disable comic processing" msgstr "" -#: /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/comic_input_ui.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:120 msgid "&Output format:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:106 msgid "Disable conversion of images to &black and white" msgstr "" @@ -4304,7 +4803,7 @@ msgid "Debug the conversion process." msgstr "" #: /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 "" @@ -4316,7 +4815,7 @@ msgstr "" msgid "Failed to create debug directory" msgstr "" -#: /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 " @@ -4324,7 +4823,7 @@ msgid "" "conversion parameters like Table of Contents and Chapter Detection." msgstr "" -#: /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 " @@ -4335,27 +4834,27 @@ msgstr "" msgid "EPUB Output" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:54 msgid "Do not &split on page breaks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:55 msgid "No default &cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:51 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:56 msgid "No &SVG cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:57 msgid "Preserve cover &aspect ratio" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:53 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:58 msgid "Split files &larger than:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:59 msgid " KB" msgstr " KB" @@ -4363,7 +4862,7 @@ msgstr " KB" msgid "FB2 Input" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_input_ui.py:29 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_input_ui.py:34 msgid "Do not insert a &Table of Contents at the beginning of the book." msgstr "" @@ -4371,22 +4870,22 @@ msgstr "" msgid "FB2 Output" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:32 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_output_ui.py:37 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/rb_output_ui.py:29 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:47 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:37 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_output_ui.py:42 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/rb_output_ui.py:34 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:52 msgid "&Inline TOC" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:33 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:38 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 " @@ -4402,52 +4901,52 @@ 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 "" -#: /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:131 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/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/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:130 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:135 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:123 #: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:125 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:121 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:123 -#: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:132 msgid " pt" msgstr " σημ" -#: /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 "" @@ -4471,244 +4970,249 @@ 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:128 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:129 msgid "Base &font size:" msgstr "" -#: /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:132 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:134 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:136 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:137 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:138 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:139 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:140 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:141 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:142 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:143 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:144 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:145 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:146 msgid "Keep &ligatures" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:147 +msgid "Smarten &punctuation" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output.py:19 msgid "LRF Output" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:121 msgid "Enable &autorotation of wide images" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:122 msgid "&Wordspace:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:124 msgid "Minimum para. &indent:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:126 msgid "Render &tables as images" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:127 msgid "Text size multiplier for text in rendered tables:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:128 msgid "Add &header" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:129 msgid "Header &separation:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:131 msgid "Header &format:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:132 msgid "&Embed fonts" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:133 msgid "&Serif font family:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:134 msgid "S&ans-serif font family:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:135 msgid "&Monospaced font family:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:41 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:44 #: /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 "Μεταδεδομένα" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:43 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:46 msgid "" "Set the metadata. The output file will contain as much of this metadata as " "possible." 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/convert/metadata.py:168 +#: /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/convert/metadata.py:175 +#: /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/convert/metadata.py:176 +#: /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/convert/metadata.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:191 +#: /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/convert/metadata.py:185 +#: /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/convert/metadata.py:192 +#: /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: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:414 msgid "Book Cover" msgstr "" -#: /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:415 msgid "Change &cover image:" msgstr "" -#: /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 "" -#: /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:373 msgid "&Title: " msgstr "&Τίτλος: " -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:173 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py: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:374 msgid "Change the title of this book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:174 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py: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:335 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:377 msgid "&Author(s): " msgstr "" -#: /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 "" -#: /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 "" -#: /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:344 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:388 msgid "&Publisher: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:178 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py: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:389 msgid "Ta&gs: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:179 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py: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:346 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:390 msgid "" "Tags categorize the book. This is particularly useful while searching. " "

      They can be any words or phrases, separated by commas." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:180 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py: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:353 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:214 msgid "&Series:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:181 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:182 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py: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:354 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:355 +#: /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:395 msgid "List of known series. You can add new series." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:183 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py: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:400 msgid "Book " msgstr "" @@ -4716,39 +5220,39 @@ msgstr "" 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 "Προκαθορισμένο" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:72 msgid "&Title for Table of Contents:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:73 msgid "Rescale images for &Palm devices" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:74 msgid "Use author &sort for author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:75 msgid "Disable compression of the file contents" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:76 msgid "Do not add Table of Contents to book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:72 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:77 msgid "Kindle options" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:78 msgid "Periodical masthead font:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:79 msgid "Personal Doc tag:" msgstr "" @@ -4756,35 +5260,35 @@ msgstr "" msgid "Page Setup" msgstr "Διαμόρφωση σελίδας" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:121 msgid "&Output profile:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:122 msgid "Profile description" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:123 msgid "&Input profile:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:124 msgid "Margins" msgstr "Περιθώρια" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:125 msgid "&Left:" msgstr "&Αριστερά:" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:127 msgid "&Top:" msgstr "&Πάνω:" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:129 msgid "&Right:" msgstr "&Δεξιά:" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:131 msgid "&Bottom:" msgstr "&Κάτω:" @@ -4792,13 +5296,13 @@ msgstr "&Κάτω:" msgid "PDB Input" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_input_ui.py:32 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:47 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_input_ui.py:37 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:52 msgid "Treat each &line as a paragraph" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_input_ui.py:33 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:48 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_input_ui.py:38 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:53 msgid "Assume print formatting" msgstr "" @@ -4806,7 +5310,7 @@ msgstr "" msgid "PDB Output" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_output_ui.py:36 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_output_ui.py:41 msgid "&Format:" msgstr "&Μορφή:" @@ -4814,11 +5318,11 @@ msgstr "&Μορφή:" msgid "PDF Input" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_input_ui.py:39 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_input_ui.py:44 msgid "Line &Un-Wrapping Factor:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_input_ui.py:40 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_input_ui.py:45 msgid "No &Images" msgstr "" @@ -4826,15 +5330,15 @@ msgstr "" msgid "PDF Output" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_output_ui.py:43 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_output_ui.py:48 msgid "&Paper Size:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_output_ui.py:44 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_output_ui.py:49 msgid "&Orientation:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_output_ui.py:45 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_output_ui.py:50 msgid "Preserve &aspect ratio of cover" msgstr "" @@ -4854,20 +5358,20 @@ msgstr "" msgid "Open book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder_ui.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder_ui.py:57 msgid "Regex Builder" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder_ui.py:53 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder_ui.py:58 msgid "Preview" msgstr "Προεπισκόπηση" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder_ui.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder_ui.py:59 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/convert/regex_builder_ui.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:122 msgid "Test" msgstr "Έλεγχος" @@ -4879,21 +5383,37 @@ msgstr "Μετατροπή" 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:76 +#: /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 "" +#: /home/kovid/work/calibre/src/calibre/gui2/convert/snb_output.py:14 +msgid "SNB Output" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/snb_output_ui.py:40 +msgid "Hide chapter name" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/snb_output_ui.py:41 +msgid "Insert space before the first line for each paragraph" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/snb_output_ui.py:42 +msgid "Insert empty line between paragraphs" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:17 msgid "" "Structure\n" @@ -4905,66 +5425,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" @@ -4987,23 +5511,23 @@ msgstr "" msgid "Level &3 TOC (XPath expression):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/toc_ui.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/toc_ui.py:68 msgid "Do not add &detected chapters to the Table of Contents" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/toc_ui.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/toc_ui.py:69 msgid "Number of &links to add to Table of Contents" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/toc_ui.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/toc_ui.py:70 msgid "Chapter &threshold" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/toc_ui.py:66 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/toc_ui.py:71 msgid "&Force use of auto-generated Table of Contents" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/toc_ui.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/toc_ui.py:72 msgid "TOC &Filter:" msgstr "" @@ -5011,22 +5535,22 @@ msgstr "" msgid "TXT Input" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:54 msgid "Process using markdown" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:55 msgid "" "

      Markdown is a simple markup language for text files, that allows for " "advanced formatting. To learn more visit markdown." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:51 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:56 msgid "Do not insert Table of Contents into output text when using markdown" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:57 msgid "Preserve &spaces" msgstr "" @@ -5034,98 +5558,98 @@ msgstr "" msgid "TXT Output" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:51 msgid "&Line ending style:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:48 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:53 msgid "&Maximum line length:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:54 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:77 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:78 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:46 +#: /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 "Ετικέτα κειμένου" -#: /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 "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:73 msgid "Match HTML &tags with tag name:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:74 msgid "*" msgstr "*" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:75 msgid "a" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:76 msgid "br" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:72 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:77 msgid "div" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:78 msgid "h1" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:79 msgid "h2" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:80 msgid "h3" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:81 msgid "h4" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:82 msgid "h5" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:78 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:83 msgid "h6" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:79 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:84 msgid "hr" msgstr "Κροατία" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:85 msgid "span" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:86 msgid "Having the &attribute:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:87 msgid "With &value:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:88 msgid "(A regular expression)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:89 msgid "" "

      For example, to match all h2 tags that have class=\"chapter\", set tag to " "h2, attribute to class and value to " @@ -5149,26 +5673,15 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:145 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:164 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:270 -#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:110 -#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:130 -#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:205 -#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:238 -#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:242 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:448 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:111 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:131 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:243 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 -msgid "Yes" -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:132 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_ct_column_ui.py:134 -msgid "No" -msgstr "Όχι" - #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:122 msgid "star(s)" msgstr "" @@ -5185,270 +5698,292 @@ msgstr "" 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 -msgid "Automatically number books in this series" +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:493 +msgid "Remove series" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:498 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:496 +msgid "Automatically number books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:499 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:366 +msgid "Force numbers to start with " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:562 msgid "Remove all tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:519 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:583 msgid "tags to add" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:524 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:588 msgid "tags to remove" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:50 #: /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:189 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:307 msgid "Get device information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:318 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:328 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:340 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:345 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:380 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:395 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:412 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:422 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:456 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:462 msgid "Send to main memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:427 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:464 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:466 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:471 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:480 msgid "Main Memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:454 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:492 +msgid "Send specific format to" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:493 msgid "Send and delete from library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:455 -msgid "Send specific format" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:491 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:536 msgid "Eject device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:609 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:658 msgid "Error communicating with device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:636 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:679 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:726 msgid "Error talking to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:685 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:727 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:724 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:770 msgid "Device: " msgstr "Συσκευή: " -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:726 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:772 msgid " detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:812 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:870 msgid "selected to send" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:817 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:875 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:884 msgid "No device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:827 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:885 msgid "Cannot send: No device is connected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:830 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:834 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:888 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:892 msgid "No card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:831 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:835 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:889 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:893 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:934 msgid "E-book:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:879 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:937 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:938 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:107 msgid "by" msgstr "από" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:881 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:939 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:952 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:982 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:990 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1089 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1174 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1293 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1301 msgid "No suitable formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:925 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:983 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:991 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:1009 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:1010 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:1014 msgid "Sent by email:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:985 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1048 msgid "News:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:986 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1049 msgid "Attached is the" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:997 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1060 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:1090 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1175 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1294 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:1120 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:1207 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:1260 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:1302 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:1366 msgid "No space on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1279 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1367 msgid "" "

      Cannot upload books to device there is no more free space available " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:78 -msgid "Select available formats and their order for this device" +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:234 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:57 +msgid "Invalid template" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:82 -msgid "Use sub directories" +#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:325 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:58 +msgid "The template %s is invalid:" msgstr "" #: /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:87 +msgid "Use sub directories" +msgstr "" + +#: /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 " @@ -5456,19 +5991,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:80 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:81 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:82 msgid "&Next" msgstr "Επόμε&νο" @@ -5476,33 +6011,80 @@ msgstr "Επόμε&νο" 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/dialogs/catalog_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:304 msgid "Generate catalog" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:75 msgid "Generate catalog for {0} books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:76 msgid "Catalog &format:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:72 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:77 msgid "" "Catalog &title (existing catalog with the same title will be replaced):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:78 msgid "&Send catalog to device automatically" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:79 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/check_library.py:26 +msgid "Check Library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:35 +msgid "&Run the check" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:38 +msgid "Copy &to clipboard" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:54 +msgid "Names to ignore:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:59 +msgid "" +"Enter comma-separated standard file name wildcards, such as synctoy*.dat" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:62 +msgid "Extensions to ignore" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:67 +msgid "" +"Enter comma-separated extensions without a leading dot. Used only in book " +"folders" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:119 +msgid "Path from library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/bookmarkmanager.py:89 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:226 +msgid "Name" +msgstr "Όνομα" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:136 +msgid "" +"The marked files and folders will be permanently deleted. Are you " +"sure?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:45 msgid "Choose Format" msgstr "" @@ -5543,6 +6125,7 @@ msgid "No location selected" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:635 msgid "Bad location" msgstr "" @@ -5550,27 +6133,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 "" @@ -5582,1108 +6165,28 @@ 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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:211 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 "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comments_dialog_ui.py:41 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comments_dialog_ui.py:46 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 "Γενικά" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:200 -msgid "Conversion" -msgstr "Μετατροπή" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py: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 "Πρόσθετα" - -#: /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:491 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:24 -msgid "Wide" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:492 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:24 -msgid "Narrow" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:508 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:50 -msgid "Medium" -msgstr "Μεσαίο" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:508 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:50 -msgid "Small" -msgstr "Μικρό" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:509 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:51 -msgid "Large" -msgstr "Μεγάλο" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:515 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:54 -msgid "Always" -msgstr "Πάντα" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:515 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:54 -msgid "Automatic" -msgstr "Αυτόματο" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:516 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:55 -msgid "Never" -msgstr "Ποτέ" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:529 -msgid "Toolbars/Context menus" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:543 -msgid "Done" -msgstr "Ολοκληρώθηκε" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:544 -msgid "Confirmation dialogs have all been reset" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:549 -msgid "System port selected" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:550 -msgid "" -"The value %d you have chosen for the content server port is a system " -"port. Your operating system may not allow the server to run on this " -"port. To be safe choose a port number larger than 1024." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:570 -msgid "Failed to install command line tools." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:573 -msgid "Command line tools installed" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:574 -msgid "Command line tools installed in" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:575 -msgid "" -"If you move calibre.app, you have to re-install the command line tools." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:626 -msgid "No valid plugin path" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:627 -msgid "%s is not a valid plugin path" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:630 -msgid "Choose plugin" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:642 -msgid "Plugin cannot be disabled" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:643 -msgid "The plugin: %s cannot be disabled" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:652 -msgid "Plugin not customizable" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:653 -msgid "Plugin: %s does not need customization" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:661 -msgid "Customize" -msgstr "Προσαρμογή" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:699 -msgid "Cannot remove builtin plugin" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:700 -msgid " cannot be removed. It is a builtin plugin. Try disabling it instead." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:715 -msgid "Invalid tweaks" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:716 -msgid "" -"The tweaks you entered are invalid, try resetting the tweaks to default and " -"changing them one by one until you find the invalid setting." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:746 -msgid "You must select a column to delete it" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:751 -msgid "The selected column is not a custom column" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:752 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:48 -msgid "Are you sure?" -msgstr "Είστε σίγουροι;" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:753 -msgid "Do you really want to delete column %s and all its data?" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:820 -msgid "Error log:" -msgstr "Αρχείο καταγραφής σφαλμάτων:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:827 -msgid "Access log:" -msgstr "Αρχείο καταγραφής προσβάσεων:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:855 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:319 -msgid "Failed to start content server" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:880 -msgid "Invalid size" -msgstr "Μη έγκυρο μέγεθος" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:881 -msgid "The size %s is invalid. must be of the form widthxheight" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:947 -msgid "Must restart" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:948 -msgid "" -"The changes you made require that Calibre be restarted. Please restart as " -"soon as practical." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:982 -msgid "Checking database integrity" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:1002 -msgid "Failed to check database integrity" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:1007 -msgid "Some inconsistencies found" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:1008 -msgid "" -"The following books had formats listed in the database that are not actually " -"available. The entries for the formats have been removed. You should check " -"them manually. This can happen if you manipulate the files in the library " -"folder directly." -msgstr "" - -#: /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:606 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:128 -msgid "Show notification when &new version is available" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:607 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:127 -msgid "Download &social metadata (tags/ratings/etc.) by default" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:608 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:126 -msgid "&Overwrite author and title by default when fetching metadata" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:609 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:131 -msgid "Default network &timeout:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:610 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:132 -msgid "" -"Set the default timeout for network fetches (i.e. anytime we go out to the " -"internet to get information)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:611 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:133 -msgid " seconds" -msgstr " δευτερόλεπτα" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:612 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:100 -msgid "Choose &language (requires restart):" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:613 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:134 -msgid "Normal" -msgstr "Κανονικό" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:614 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:135 -msgid "High" -msgstr "Υψηλή" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:615 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:136 -msgid "Low" -msgstr "Χαμηλή" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:616 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:137 -msgid "Job &priority:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:617 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:138 -msgid "Preferred &output format:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:618 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:141 -msgid "Reset all disabled &confirmation dialogs" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:619 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:142 -msgid "Preferred &input format order:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:622 -#: /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:623 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:99 -msgid "&Number of covers to show in browse mode (needs restart):" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:624 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:139 -msgid "Restriction to apply when the current library is opened:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:625 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:140 -msgid "" -"Apply this restriction on calibre startup if the current library is being " -"used. Also applied when switching to this library. Note that this setting is " -"per library. " -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:626 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:102 -msgid "Disable all animations. Useful if you have a slow/old computer." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:627 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:103 -msgid "Disable &animations" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:628 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:110 -msgid "&Toolbar" -msgstr "Γραμμή &εργαλείων" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:629 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:111 -msgid "&Icon size:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:630 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:112 -msgid "Show &text under icons:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:631 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:130 -msgid "&Delete news from library when it is automatically sent to reader" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:632 -msgid "Select visible &columns in library view" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:634 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:79 -msgid "Remove a user-defined column" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:636 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:81 -msgid "Add a user-defined column" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:638 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:83 -msgid "Edit settings of a user-defined column" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:641 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:145 -msgid "Use internal &viewer for:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:642 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:109 -msgid "Search as you type" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:643 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:107 -msgid "Use &Roman numerals for series" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:644 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:104 -msgid "Enable system &tray icon (needs restart)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:645 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:101 -msgid "Show &average ratings in the tags browser" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:646 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:129 -msgid "Automatically send downloaded &news to ebook reader" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:647 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:105 -msgid "Show &splash screen at startup" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:648 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:108 -msgid "Show cover &browser in a separate window (needs restart)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:649 -msgid "Show ¬ifications in system tray" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:650 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:662 -msgid "&Miscellaneous" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:651 -msgid "Add an email address to which to send books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:652 -msgid "&Add email" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:653 -msgid "Make &default" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:654 -msgid "&Remove email" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:655 -msgid "" -"calibre can send your books to you (or your reader) by email. Emails will be " -"automatically sent for downloaded news to all email addresses that have Auto-" -"send checked." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:656 -msgid "&Maximum number of waiting worker processes (needs restart):" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:657 -msgid "Limit the max. simultaneous jobs to the available CPU &cores" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:658 -msgid "Debug &device detection" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:659 -msgid "&Check database integrity" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:660 -msgid "Open calibre &configuration directory" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:661 -msgid "&Install command line tools" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:663 -msgid "" -"Values for the tweaks are shown below. Edit them to change the behavior of " -"calibre" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:664 -msgid "All available tweaks" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:665 -msgid "&Current tweaks" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:666 -msgid "&Restore to defaults" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:667 -msgid "&Tweaks" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:668 -msgid "" -"calibre contains a network server that allows you to access your book " -"collection using a browser from anywhere in the world. Any changes to the " -"settings will only take effect after a server restart." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:669 -msgid "Server &port:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:670 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:58 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:212 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:117 -msgid "&Username:" -msgstr "Όν&ομα χρήστη:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:671 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:59 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:213 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:119 -msgid "&Password:" -msgstr "&Κωδικός πρόσβασης:" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:672 -msgid "" -"If you leave the password blank, anyone will be able to access your book " -"collection using the web interface." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:673 -msgid "" -"The maximum size (widthxheight) for displayed covers. Larger covers are " -"resized. " -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:674 -msgid "Max. &cover size:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:675 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:60 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:214 -msgid "&Show password" -msgstr "&Εμφάνιση κωδικού πρόσβασης" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:676 -msgid "Max. &OPDS items per query:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:677 -msgid "Max. OPDS &ungrouped items:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:678 -msgid "Restriction (saved search) to apply:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:679 -msgid "" -"This restriction (based on a saved search) will restrict the books the " -"content server makes available to those matching the search. This setting is " -"per library (i.e. you can have a different restriction per library)." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:680 -msgid "&Start Server" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:681 -msgid "St&op Server" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:682 -msgid "&Test Server" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:683 -msgid "Run server &automatically on startup" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:684 -msgid "View &server logs" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:685 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/stanza_ui.py:46 -msgid "" -"

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

    Stanza should see your calibre collection automatically. If not, try " -"adding the URL http://myhostname:8080 as a new catalog in the Stanza reader " -"on your iPhone. Here myhostname should be the fully qualified hostname or " -"the IP address of the computer calibre is running on." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:687 -msgid "" -"Here you can customize the behavior of Calibre by controlling what plugins " -"it uses." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:688 -msgid "Enable/&Disable plugin" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:689 -msgid "&Customize plugin" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:690 -msgid "&Remove plugin" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:691 -msgid "Add new plugin" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:692 -msgid "Plugin &file:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:694 -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:568 -msgid "Date" -msgstr "Ημερομηνία" - -#: /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:116 -msgid "No column heading was provided" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:122 -msgid "The lookup name %s is already used" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/create_custom_column.py:132 -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 "Ctrl+Ε" - -#: /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 "ΣΦΑΛΜΑ" @@ -6698,38 +6201,57 @@ 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:925 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:31 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:294 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:569 +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:1116 msgid "Format" msgstr "Μορφοποίηση" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device_ui.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device_ui.py:55 msgid "Delete from device" msgstr "Διαγραφή από τη συσκευή" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:33 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:34 msgid "Author sort" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:66 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:590 +msgid "Invalid author name" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:591 +msgid "Author names cannot contain & characters." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:71 msgid "Manage authors" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:72 msgid "Sort by author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:73 msgid "Sort by author sort" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:74 msgid "" "Reset all the author sort values to a value automatically generated from the " "author. Exactly how this value is automatically generated can be controlled " "via Preferences->Advanced->Tweaks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:75 msgid "Recalculate all author sort values" msgstr "" @@ -6767,14 +6289,15 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:192 msgid "" -"No metadata found, try adjusting the title and author or the ISBN key." +"No metadata found, try adjusting the title and author and/or removing the " +"ISBN." 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 "" -#: /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 " @@ -6782,675 +6305,1025 @@ 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 "Ανάκτηση" -#: /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 "Ταιριάσματα" -#: /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 "" -#: /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 "" -#: /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:26 +msgid "Title/Author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:27 +msgid "Standard metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:28 +msgid "Custom metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:29 +msgid "Search/Replace" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:33 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress.py:76 +msgid "Working" +msgstr "Σε εργασία" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:386 +msgid "Lower Case" +msgstr "Πεζά" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:385 +msgid "Upper Case" +msgstr "Κεφαλαία" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:388 +msgid "Title Case" +msgstr "Κεφαλαία/Πεζά Τίτλου" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:189 +msgid "Character match" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:190 +msgid "Regular Expression" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:193 +msgid "Replace field" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:194 +msgid "Prepend to field" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:195 +msgid "Append to field" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:206 msgid "Editing meta information for %d books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:225 -msgid "Applying changes to %d books. This may take a while." +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:259 +msgid "Book %d:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:274 +msgid "" +"You can destroy your library using this feature. Changes are " +"permanent. There is no undo function. You are strongly encouraged to back up " +"your library before proceeding.

    Search and replace in text fields using " +"character matching or regular expressions. " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:282 +msgid "" +"In character mode, the field is searched for the entered search text. The " +"text is replaced by the specified replacement text everywhere it is found in " +"the specified field. After replacement is finished, the text can be changed " +"to upper-case, lower-case, or title-case. If the case-sensitive check box is " +"checked, the search text must match exactly. If it is unchecked, the search " +"text will match both upper- and lower-case letters" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:293 +msgid "" +"In regular expression mode, the search text is an arbitrary python-" +"compatible regular expression. The replacement text can contain " +"backreferences to parenthesized expressions in the pattern. The search is " +"not anchored, and can match and replace multiple times on the same string. " +"The modification functions (lower-case etc) are applied to the matched text, " +"not to the field as a whole. The destination box specifies the field where " +"the result after matching and replacement is to be assigned. You can replace " +"the text in the field, or prepend or append the matched text. See this reference for more " +"information on python's regular expressions, and in particular the 'sub' " +"function." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:438 +msgid "You must specify a destination when source is a composite field" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:538 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:633 +msgid "Search/replace invalid" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:531 +msgid "" +"Authors cannot be set to the empty string. Book title %s not processed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:539 +msgid "Title cannot be set to the empty string. Book title %s not processed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:634 +msgid "Search pattern is invalid: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:671 +msgid "" +"Applying changes to %d books.\n" +"Phase {0} {1}%%." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:334 msgid "Edit Meta information" msgstr "" -#: /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:336 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:337 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:338 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: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:339 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384 msgid "&Rating:" msgstr "" -#: /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:340 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:341 +#: /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 msgid "Rating of this book. 0-5 stars" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:342 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:343 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:387 msgid " stars" 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:345 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:347 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:348 +#: /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:392 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:349 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:350 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:351 msgid "Check this box to remove all tags from the books." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:182 -msgid "Remove &format:" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:352 +msgid "Remove all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:183 -msgid "&Swap title and author" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:356 +msgid "If checked, the series will be cleared" 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:357 +msgid "Clear series" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:358 msgid "" -"Selected books will be automatically numbered,\n" -"in the order you selected them.\n" -"So if you selected Book A and then Book B,\n" +"If not checked, the series number for the books will be set to 1.\n" +"If checked, selected books will be automatically numbered, in the order\n" +"you selected them. So if you selected Book A and then Book B,\n" "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:362 +msgid "Automatically number books in this series" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:363 +msgid "" +"Series will normally be renumbered from the highest number in the database\n" +"for that series. Checking this box will tell calibre to start numbering\n" +"from the value in the box" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:367 +msgid "Remove &format:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:368 +msgid "&Swap title and author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:369 +msgid "" +"Force the title to be in title case. If both this and swap authors are " +"checked,\n" +"title and author are swapped before the title case is set" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:371 +msgid "Change title to title case" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:372 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:375 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:376 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:424 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:377 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:425 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:378 +msgid "Search &field:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:379 +msgid "The name of the field that you want to search" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:380 +msgid "Search mode:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:381 +msgid "" +"Choose whether to use basic text matching or advanced regular expression " +"matching" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:382 +msgid "&Search for:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:383 +msgid "" +"Enter the what you are looking for, either plain text or a regular " +"expression, depending on the mode" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:384 +msgid "" +"Check this box if the search string must match exactly upper and lower case. " +"Uncheck it if case is to be ignored" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:385 +msgid "Case sensitive" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:386 +msgid "&Replace with:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:387 +msgid "" +"The replacement text. The matched search text will be replaced with this " +"string" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:388 +msgid "Apply function after replace:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:389 +msgid "" +"Specify how the text is to be processed after matching and replacement. In " +"character mode, the entire\n" +"field is processed. In regular expression mode, only the matched text is " +"processed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:391 +msgid "&Destination field:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:392 +msgid "" +"The field that the text will be put into after all replacements. If blank, " +"the source field is used." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:393 +msgid "Mode:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:394 +msgid "Specify how the text should be copied into the destination." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:395 +msgid "" +"If the replace mode is prepend or append, then this box indicates whether a " +"comma or\n" +"nothing should be put between the original text and the inserted text" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:397 +msgid "use comma" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:398 +msgid "Test &text" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:399 +msgid "Test re&sult" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:400 +msgid "Your test:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:401 +msgid "&Search and replace" +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:351 +msgid "" +" The green color indicates that the current author sort matches the current " +"author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:354 +msgid "" +" The red color indicates that the current author sort does not match the " +"current author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:359 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:524 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:529 msgid "This ISBN number is valid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:474 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:532 msgid "This ISBN number is invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:553 -msgid "Cannot use tag editor" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:611 +msgid "Tags changed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:554 -msgid "The tags editor cannot be used if you have modified the tags" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:612 +msgid "" +"You have changed the tags. In order to use the tags editor, you must either " +"discard or apply these changes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:574 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:639 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:651 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:656 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:662 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:667 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:652 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:663 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:668 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:653 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:657 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:669 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:676 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:677 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:710 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:711 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:742 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:743 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:833 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:834 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:371 msgid "Edit Meta Information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:360 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:372 msgid "Meta information" msgstr "" -#: /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:375 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:378 msgid "Author S&ort: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:368 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:379 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 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:381 +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:396 msgid "Remove unused series (Series that have no books)" msgstr "" -#: /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:398 msgid "IS&BN:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:385 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:399 msgid "Publishe&d:" msgstr "" -#: /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:402 msgid "dd MMM yyyy" 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:403 msgid "&Date:" msgstr "Η&μερομηνία:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:390 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:404 msgid "&Comments" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:391 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:405 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:406 msgid "Available Formats" 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:407 msgid "Add a new format for this book to the database" 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:409 msgid "Remove the selected formats for this book from the database." 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:411 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:413 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:416 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:417 +msgid "Remove border (if any) from cover" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:418 +msgid "T&rim" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:419 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:421 +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:422 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:423 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 "" +#: /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:122 +msgid "&Username:" +msgstr "Όν&ομα χρήστη:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:124 +msgid "&Password:" +msgstr "&Κωδικός πρόσβασης:" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:130 +msgid "&Show password" +msgstr "&Εμφάνιση κωδικού πρόσβασης" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress.py:59 msgid "Aborting..." msgstr "Εγκατάλειψη..." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress.py:76 -msgid "Working" -msgstr "Σε εργασία" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor.py:54 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 "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:126 msgid "Need username and password" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:127 msgid "You must provide a username and/or password to use this news source." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:166 +msgid "Account" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:167 +msgid "(optional)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:168 +msgid "(required)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:185 msgid "Created by: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:192 msgid "Last downloaded: never" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:194 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:207 msgid "%d days, %d hours and %d minutes ago" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:196 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:209 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.py:233 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:197 msgid "Schedule news download" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:236 msgid "Add a custom news source" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:241 msgid "Download all scheduled new sources" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:328 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:341 msgid "No internet connection" msgstr "Δεν υπάρχει ενεργή σύνδεση Internet" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:329 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:342 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/user_profiles.py:278 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:198 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:283 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 "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:36 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:41 msgid "contains" msgstr "περιέχει" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:37 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:42 msgid "The text to search for. It is interpreted as a regular expression." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:38 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:43 msgid "" "

    Negate this match. That is, only return results that do not match " "this query." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:39 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:44 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:198 msgid "Advanced Search" msgstr "Προχωρημένη αναζήτηση" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:114 -msgid "Find entries that have..." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:115 -msgid "&All these words:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:116 -msgid "This exact &phrase:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:117 -msgid "&One or more of these words:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:118 -msgid "But dont show entries that have..." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:119 -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:199 msgid "What kind of match to use:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:121 -msgid "Contains: the word or phrase matches anywhere in the metadata" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:200 +msgid "Contains: the word or phrase matches anywhere in the metadata field" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:122 -msgid "Equals: the word or phrase must match an entire metadata field" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:201 +msgid "Equals: the word or phrase must match the 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:202 msgid "" -"Regular expression: the expression must match anywhere in the metadata" +"Regular expression: the expression must match anywhere in the metadata field" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:124 -msgid " " -msgstr " " +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:203 +msgid "Find entries that have..." +msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:204 +msgid "&All these words:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:205 +msgid "This exact &phrase:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:206 +msgid "&One or more of these words:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:207 +msgid "But dont show entries that have..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:208 +msgid "Any of these &unwanted words:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:209 msgid "" "See the User Manual for more help" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:210 +msgid "A&dvanced Search" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:212 +msgid "Enter the title." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:213 +msgid "&Author:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:215 +msgid "Ta&gs:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:216 +msgid "Enter an author's name. Only one author can be used." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:217 +msgid "" +"Enter a series name, without an index. Only one series name can be used." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:218 +msgid "Enter tags separated by spaces" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:219 +msgid "&Clear" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:220 +msgid "Search only in specific fields:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:221 +msgid "Titl&e/Author/Series ..." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/select_formats.py:45 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:97 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:128 msgid "Publishers" msgstr "" @@ -7463,51 +7336,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 "" @@ -7522,43 +7395,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 "" @@ -7567,12 +7440,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:580 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:581 msgid "An item cannot be set to nothing. Delete it instead." msgstr "" @@ -7596,149 +7469,184 @@ 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 "Ctrl+Ε" + +#: /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 "&Δοκιμή" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:127 -msgid "No recipe selected" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:55 +msgid "Display contents of exploded ePub" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:56 +msgid "&Explode ePub" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:57 +msgid "Rebuild ePub from exploded contents" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:58 +msgid "&Rebuild ePub" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:59 +msgid "Discard changes" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:218 +msgid "&Cancel" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:61 +msgid "" +"

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

    Rebuild the ePub, " +"updating your calibre library.

    " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:132 +msgid "No recipe selected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:137 msgid "The attached file: %s is a recipe to download %s." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:138 msgid "Recipe for " 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.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:260 msgid "Switch to Advanced mode" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:156 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:169 msgid "Switch to Basic mode" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179 msgid "Feed must have a title" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180 msgid "The feed must have a title" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:184 msgid "Feed must have a URL" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:185 msgid "The feed %s must have a URL" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:185 -msgid "Already exists" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:191 msgid "This feed has already been added to the recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:227 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:236 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:286 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:232 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:291 msgid "Invalid input" msgstr "Άκυρη εισαγωγή" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:228 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:237 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:287 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:233 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:242 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:292 msgid "

    Could not create recipe. Error:
    %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:241 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:263 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:246 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:295 msgid "Replace recipe?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:242 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:264 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:247 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:296 msgid "A custom recipe named %s already exists. Do you want to replace it?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:257 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:262 msgid "Pick recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:257 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:262 msgid "Pick the recipe to customize" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:277 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:282 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 "" " @@ -227,7 +227,7 @@ class BookInfo(QWebView): %%s - '''%(p, f, c) + '''%(f, c) if self.vertical: if comments: rows += u'%s'%comments diff --git a/src/calibre/translations/calibre.pot b/src/calibre/translations/calibre.pot index 262d5915ec..c513e267e3 100644 --- a/src/calibre/translations/calibre.pot +++ b/src/calibre/translations/calibre.pot @@ -4,9 +4,9 @@ # msgid "" msgstr "" -"Project-Id-Version: calibre 0.7.30\n" -"POT-Creation-Date: 2010-11-26 10:43+MST\n" -"PO-Revision-Date: 2010-11-26 10:43+MST\n" +"Project-Id-Version: calibre 0.7.31\n" +"POT-Creation-Date: 2010-11-27 11:31+MST\n" +"PO-Revision-Date: 2010-11-27 11:31+MST\n" "Last-Translator: Automatically generated\n" "Language-Team: LANGUAGE\n" "MIME-Version: 1.0\n" From 664266577d2c29e0622037f25c53c6615778ceaf Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 27 Nov 2010 13:00:00 -0700 Subject: [PATCH 159/375] ... --- src/calibre/gui2/book_details.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/calibre/gui2/book_details.py b/src/calibre/gui2/book_details.py index c6fa4ddc27..7e9d048e66 100644 --- a/src/calibre/gui2/book_details.py +++ b/src/calibre/gui2/book_details.py @@ -219,7 +219,7 @@ class BookInfo(QWebView): @@ -227,7 +227,7 @@ class BookInfo(QWebView): %%s - '''%(f, c) + '''%(p, f, c) if self.vertical: if comments: rows += u'%s'%comments From f1b2a23dac1bad4173448873c1d67a4fd16e4dda Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 27 Nov 2010 13:21:07 -0700 Subject: [PATCH 160/375] More robust technique to make the background of the details panel transparent --- src/calibre/gui2/book_details.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/calibre/gui2/book_details.py b/src/calibre/gui2/book_details.py index 7e9d048e66..28ca06b352 100644 --- a/src/calibre/gui2/book_details.py +++ b/src/calibre/gui2/book_details.py @@ -190,6 +190,10 @@ class BookInfo(QWebView): self.page().setLinkDelegationPolicy(self.page().DelegateAllLinks) self.linkClicked.connect(self.link_activated) self._link_clicked = False + self.setAttribute(Qt.WA_OpaquePaintEvent, False) + palette = self.palette() + palette.setBrush(QPalette.Base, Qt.transparent) + self.page().setPalette(palette) def link_activated(self, link): self._link_clicked = True @@ -211,8 +215,6 @@ class BookInfo(QWebView): def _show_data(self, rows, comments): f = QFontInfo(QApplication.font(self.parent())).pixelSize() - p = unicode(QApplication.palette().color(QPalette.Normal, - QPalette.Window).name()) c = unicode(QApplication.palette().color(QPalette.Normal, QPalette.WindowText).name()) templ = u'''\ @@ -227,7 +229,7 @@ class BookInfo(QWebView): %%s - '''%(p, f, c) + '''%(f, c) if self.vertical: if comments: rows += u'%s'%comments From 711112d1a492cbcacf4610dd07d38b7c1f8052b8 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 27 Nov 2010 13:59:25 -0700 Subject: [PATCH 161/375] Enable SQLite C extension to speed up large library initialization --- src/calibre/library/sqlite.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/library/sqlite.py b/src/calibre/library/sqlite.py index 94338433a5..8aa76b2643 100644 --- a/src/calibre/library/sqlite.py +++ b/src/calibre/library/sqlite.py @@ -150,7 +150,7 @@ class DBThread(Thread): detect_types=sqlite.PARSE_DECLTYPES|sqlite.PARSE_COLNAMES) self.conn.execute('pragma cache_size=5000') encoding = self.conn.execute('pragma encoding').fetchone()[0] - c_ext_loaded = False #load_c_extensions(self.conn) + c_ext_loaded = load_c_extensions(self.conn) self.conn.row_factory = sqlite.Row if self.row_factory else lambda cursor, row : list(row) self.conn.create_aggregate('concat', 1, Concatenate) if not c_ext_loaded: From 19f12f8a5d59f07cc450011f4914460671db2938 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 27 Nov 2010 15:17:29 -0700 Subject: [PATCH 162/375] ... --- src/calibre/gui2/book_details.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/calibre/gui2/book_details.py b/src/calibre/gui2/book_details.py index 28ca06b352..4ffc8da650 100644 --- a/src/calibre/gui2/book_details.py +++ b/src/calibre/gui2/book_details.py @@ -214,9 +214,18 @@ class BookInfo(QWebView): def _show_data(self, rows, comments): + + def color_to_string(col): + ans = '#000000' + if col.isValid(): + col = col.toRgb() + if col.isValid(): + ans = unicode(col.name()) + return ans + f = QFontInfo(QApplication.font(self.parent())).pixelSize() - c = unicode(QApplication.palette().color(QPalette.Normal, - QPalette.WindowText).name()) + c = color_to_string(QApplication.palette().color(QPalette.Normal, + QPalette.WindowText)) templ = u'''\ From 90462414850f558638db5e644271df043c5b9b35 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 27 Nov 2010 15:40:59 -0700 Subject: [PATCH 163/375] Make InterfaceAction plugins loadable from zip files --- src/calibre/customize/__init__.py | 9 +++++++++ src/calibre/gui2/ui.py | 4 +--- src/calibre/manual/plugins.rst | 9 +++++++++ 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/calibre/customize/__init__.py b/src/calibre/customize/__init__.py index 523fc51d92..251f527bb6 100644 --- a/src/calibre/customize/__init__.py +++ b/src/calibre/customize/__init__.py @@ -370,6 +370,15 @@ class InterfaceActionBase(Plugin): # {{{ can_be_disabled = False actual_plugin = None + + def load_actual_plugin(self, gui): + ''' + This method should must the actual interface action plugin object. + ''' + mod, cls = self.actual_plugin.split(':') + return getattr(__import__(mod, fromlist=['1'], level=0), cls)(gui, + self.site_customization) + # }}} class PreferencesPlugin(Plugin): # {{{ diff --git a/src/calibre/gui2/ui.py b/src/calibre/gui2/ui.py index bd0743e819..00bba2b491 100644 --- a/src/calibre/gui2/ui.py +++ b/src/calibre/gui2/ui.py @@ -102,9 +102,7 @@ class Main(MainWindow, MainWindowMixin, DeviceMixin, EmailMixin, # {{{ self.device_connected = None acmap = OrderedDict() for action in interface_actions(): - mod, cls = action.actual_plugin.split(':') - ac = getattr(__import__(mod, fromlist=['1'], level=0), cls)(self, - action.site_customization) + ac = action.load_actual_plugin(self) if ac.name in acmap: if ac.priority >= acmap[ac.name].priority: acmap[ac.name] = ac diff --git a/src/calibre/manual/plugins.rst b/src/calibre/manual/plugins.rst index eb955aebee..0a62218fb9 100644 --- a/src/calibre/manual/plugins.rst +++ b/src/calibre/manual/plugins.rst @@ -161,11 +161,20 @@ The base class for such devices is :class:`calibre.devices.usbms.driver.USBMS`. User Interface Actions -------------------------- +If you are adding your own plugin in a zip file, you should subclass both InterfaceActionBase and InterfaceAction. The :meth:`load_actual_plugin` method of you InterfaceActionBase subclass must return an instantiated object of your InterfaceBase subclass. + + .. autoclass:: calibre.gui2.actions.InterfaceAction :show-inheritance: :members: :member-order: bysource +.. autoclass:: calibre.customize.InterfaceActionBase + :show-inheritance: + :members: + :member-order: bysource + + Preferences Plugins -------------------------- From b3c6bb4cb1e938176150d12429ab0c55748baab0 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 27 Nov 2010 15:45:15 -0700 Subject: [PATCH 164/375] ... --- src/calibre/customize/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/customize/__init__.py b/src/calibre/customize/__init__.py index 251f527bb6..b4e9b6c448 100644 --- a/src/calibre/customize/__init__.py +++ b/src/calibre/customize/__init__.py @@ -373,7 +373,7 @@ class InterfaceActionBase(Plugin): # {{{ def load_actual_plugin(self, gui): ''' - This method should must the actual interface action plugin object. + This method must return the actual interface action plugin object. ''' mod, cls = self.actual_plugin.split(':') return getattr(__import__(mod, fromlist=['1'], level=0), cls)(gui, From 3ac65b82c08c63f2ec799540cc63f0f3bf2b3411 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 27 Nov 2010 17:45:48 -0700 Subject: [PATCH 165/375] A Hello World GUI plugin --- src/calibre/manual/customize.rst | 38 ++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/calibre/manual/customize.rst b/src/calibre/manual/customize.rst index e0f799f572..5272a88f53 100644 --- a/src/calibre/manual/customize.rst +++ b/src/calibre/manual/customize.rst @@ -98,6 +98,44 @@ Every time you use calibre to convert a book, the plugin's :meth:`run` method wi converted book will have its publisher set to "Hello World". For more information about |app|'s plugin system, read on... + +A Hello World GUI plugin +--------------------------- + +Here's a simple Hello World plugin for the |app| GUI. It will cause a box to popup with the message "Hellooo World!" when you press Ctrl+Shift+H + +.. code-block:: python + + from calibre.customize import InterfaceActionBase + + class HelloWorldBase(InterfaceActionBase): + + name = 'Hello World GUI' + author = 'The little green man' + + def load_actual_plugin(self, gui): + from calibre.gui2.actions import InterfaceAction + + class HelloWorld(InterfaceAction): + name = 'Hello World GUI' + action_spec = ('Hello World!', 'add_book.png', None, + _('Ctrl+Shift+H')) + + def genesis(self): + self.qaction.triggered.connect(self.hello_world) + + def hello_world(self, *args): + from calibre.gui2 import info_dialog + info_dialog(self.gui, 'Hello World!', 'Hellooo World!', + show=True) + + return HelloWorld(gui, None) + +You can also have it show up in the toolbars/context menu by going to Preferences->Toolbars and adding this plugin to the locations you want it to be in. + +While this plugin is utterly useless, note that all calibre GUI actions like adding/saving/removing/viewing/etc. are implemented as plugins, so there is no limit to what you can acheive. The key thing to remember is that the plugin has access to the full |app| GUI via ``self.gui``. + + The Plugin base class ------------------------ From 3c01ad453a8c0659bdee160d1742da478b940d54 Mon Sep 17 00:00:00 2001 From: Sengian Date: Sun, 28 Nov 2010 01:51:33 +0100 Subject: [PATCH 166/375] First draft of amazon plugin --- src/calibre/ebooks/metadata/amazonfr.py | 457 ++++++++++++++++++++++++ 1 file changed, 457 insertions(+) create mode 100644 src/calibre/ebooks/metadata/amazonfr.py diff --git a/src/calibre/ebooks/metadata/amazonfr.py b/src/calibre/ebooks/metadata/amazonfr.py new file mode 100644 index 0000000000..7091719f30 --- /dev/null +++ b/src/calibre/ebooks/metadata/amazonfr.py @@ -0,0 +1,457 @@ +from __future__ import with_statement +__license__ = 'GPL 3' +__copyright__ = '2010, sengian ' + +import sys, textwrap, re, traceback +from urllib import urlencode +from math import ceil + +from lxml import html +from lxml.html import soupparser + +from calibre.utils.date import parse_date, utcnow +from calibre import browser, preferred_encoding +from calibre.ebooks.chardet import xml_to_unicode +from calibre.ebooks.metadata import MetaInformation, check_isbn, \ + authors_to_sort_string +from calibre.ebooks.metadata.fetch import MetadataSource +from calibre.utils.config import OptionParser +from calibre.library.comments import sanitize_comments_html + + +class AmazonFr(MetadataSource): + + name = 'Amazon french' + description = _('Downloads social metadata from amazon.fr') + supported_platforms = ['windows', 'osx', 'linux'] + author = 'Sengian' + version = (1, 0, 0) + has_html_comments = True + + def fetch(self): + try: + self.results = search(self.title, self.book_author, self.publisher, + self.isbn, max_results=10, verbose=self.verbose, lang='fr') + except Exception, e: + self.exception = e + self.tb = traceback.format_exc() + +class Amazon(MetadataSource): + + name = 'Amazon' + description = _('Downloads social metadata from amazon.com') + supported_platforms = ['windows', 'osx', 'linux'] + author = 'Kovid Goyal & Sengian' + version = (1, 1, 0) + has_html_comments = True + + def fetch(self): + try: + self.results = search(self.title, self.book_author, self.publisher, + self.isbn, max_results=10, verbose=self.verbose, lang='en') + except Exception, e: + self.exception = e + self.tb = traceback.format_exc() + + +def report(verbose): + if verbose: + import traceback + traceback.print_exc() + +def replace_monthsfr(datefr): + # Replace french months by english equivalent for parse_date + frtoen = { + u'[jJ]anvier': u'jan', + u'[fF].vrier': u'feb', + u'[mM]ars': u'mar', + u'[aA]vril': u'apr', + u'[mM]ai': u'may', + u'[jJ]uin': u'jun', + u'[jJ]uillet': u'jul', + u'[aA]o.t': u'aug', + u'[sS]eptembre': u'sep', + u'[Oo]ctobre': u'oct', + u'[nN]ovembre': u'nov', + u'[dD].cembre': u'dec' } + for k in frtoen.iterkeys(): + tmp = re.sub(k, frtoen[k], datefr) + if tmp <> datefr: break + return tmp + +class Query(object): + + BASE_URL_FR = 'http://www.amazon.fr' + BASE_URL_EN = 'http://www.amazon.com' + + def __init__(self, title=None, author=None, publisher=None, isbn=None, keywords=None, + max_results=20, rlang='en'): + assert not(title is None and author is None and publisher is None \ + and isbn is None and keywords is None) + assert (max_results < 21) + + self.max_results = int(max_results) + self.renbres = re.compile(u'\s*(\d+)\s*') + + q = { 'search-alias' : 'stripbooks' , + 'unfiltered' : '1', + 'field-keywords' : '', + 'field-author' : '', + 'field-title' : '', + 'field-isbn' : '', + 'field-publisher' : '' + #get to amazon detailed search page to get all options + # 'node' : '', + # 'field-binding' : '', + #before, during, after + # 'field-dateop' : '', + #month as number + # 'field-datemod' : '', + # 'field-dateyear' : '', + #french only + # 'field-collection' : '', + #many options available + } + + if rlang =='en': + q['sort'] = 'relevanceexprank' + self.urldata = self.BASE_URL_EN + elif rlang =='fr': + q['sort'] = 'relevancerank' + self.urldata = self.BASE_URL_FR + self.baseurl = self.urldata + + if isbn is not None: + q['field-isbn'] = isbn.replace('-', '') + else: + if title is not None: + q['field-title'] = title + if author is not None: + q['field-author'] = author + if publisher is not None: + q['field-publisher'] = publisher + if keywords is not None: + q['field-keywords'] = keywords + + if isinstance(q, unicode): + q = q.encode('utf-8') + self.urldata += '/gp/search/ref=sr_adv_b/?' + urlencode(q) + + def __call__(self, browser, verbose, timeout = 5.): + if verbose: + print 'Query:', self.urldata + + try: + raw = browser.open_novisit(self.urldata, timeout=timeout).read() + except Exception, e: + report(verbose) + if callable(getattr(e, 'getcode', None)) and \ + e.getcode() == 404: + return + raise + if '404 - ' in raw: + return + raw = xml_to_unicode(raw, strip_encoding_pats=True, + resolve_entities=True)[0] + try: + feed = soupparser.fromstring(raw) + except: + return None, self.urldata + + #nb of page + try: + nbresults = self.renbres.findall(feed.xpath("//*[@class='resultCount']")[0].text) + rpp = 0 + if len(nbresults) > 1: + rpp = int(nbresults[1]) + nbresults = int(nbresults[2]) + except: + return None, self.urldata + + pages =[feed] + if rpp: + nbpagetoquery = int(ceil(float(min(nbresults, self.max_results))/ rpp)) + for i in xrange(2, nbpagetoquery + 1): + try: + urldata = self.urldata + '&page=' + str(i) + raw = browser.open_novisit(urldata, timeout=timeout).read() + except Exception, e: + continue + if '<title>404 - ' in raw: + continue + raw = xml_to_unicode(raw, strip_encoding_pats=True, + resolve_entities=True)[0] + try: + feed = soupparser.fromstring(raw) + except: + continue + pages.append(feed) + + results = [] + for x in pages: + results.extend([i.getparent().get('href') \ + for i in x.xpath("//a/span[@class='srTitle']")]) + return results[:self.max_results], self.baseurl + +class ResultList(list): + + def __init__(self, baseurl, lang = 'en'): + self.baseurl = baseurl + self.lang = lang + self.repub = re.compile(u'\((.*)\)') + self.rerat = re.compile(u'([0-9.]+)') + self.reattr = re.compile(r'<([a-zA-Z0-9]+)\s[^>]+>') + self.reoutp = re.compile(r'(?s)<em>--This text ref.*?</em>') + self.recom = re.compile(r'(?s)<!--.*?-->') + self.republi = re.compile(u'(Editeur|Publisher)', re.I) + self.reisbn = re.compile(u'(ISBN-10|ISBN-10|ASIN)', re.I) + self.relang = re.compile(u'(Language|Langue)', re.I) + self.reratelt = re.compile(u'(Average\s*Customer\s*Review|Moyenne\s*des\s*commentaires\s*client)', re.I) + self.reprod = re.compile(u'(Product\s*Details|D.tails\s*sur\s*le\s*produit)', re.I) + + def strip_tags_etree(self, etreeobj, invalid_tags): + for (itag, rmv) in invalid_tags.iteritems(): + if rmv: + for elts in etreeobj.getiterator(itag): + elts.drop_tree() + else: + for elts in etreeobj.getiterator(itag): + elts.drop_tag() + + def clean_entry(self, entry, invalid_tags = {'script': True}, + invalid_id = (), invalid_class=()): + #invalid_tags: remove tag and keep content if False else remove + #remove tags + if invalid_tags: + self.strip_tags_etree(entry, invalid_tags) + #remove id + if invalid_id: + for eltid in invalid_id: + elt = entry.get_element_by_id(eltid) + if elt is not None: + elt.drop_tree() + #remove class + if invalid_class: + for eltclass in invalid_class: + elts = entry.find_class(eltclass) + if elts is not None: + for elt in elts: + elt.drop_tree() + + def get_title(self, entry): + title = entry.get_element_by_id('btAsinTitle') + if title is not None: + title = title.text + return unicode(title.replace('\n', '').strip()) + + def get_authors(self, entry): + author = entry.get_element_by_id('btAsinTitle') + while author.getparent().tag != 'div': + author = author.getparent() + author = author.getparent() + authortext = [] + for x in author.getiterator('a'): + authortext.append(unicode(x.text_content().strip())) + return authortext + + def get_description(self, entry, verbose): + try: + description = entry.get_element_by_id("productDescription").find("div[@class='content']") + inv_class = ('seeAll', 'emptyClear') + inv_tags ={'img': True, 'a': False} + self.clean_entry(description, invalid_tags=inv_tags, invalid_class=inv_class) + description = html.tostring(description, method='html', encoding=unicode).strip() + # remove all attributes from tags + description = self.reattr.sub(r'<\1>', description) + # Remove the notice about text referring to out of print editions + description = self.reoutp.sub('', description) + # Remove comments + description = self.recom.sub('', description) + return unicode(sanitize_comments_html(description)) + except: + report(verbose) + return None + + def get_tags(self, entry, browser, verbose): + try: + tags = entry.get_element_by_id('tagContentHolder') + testptag = tags.find_class('see-all') + if testptag: + for x in testptag: + alink = x.xpath('descendant-or-self::a') + if alink: + if alink[0].get('class') == 'tgJsActive': + continue + link = self.baseurl + alink[0].get('href') + entry = self.get_individual_metadata(browser, link, verbose) + tags = entry.get_element_by_id('tagContentHolder') + break + tags = [a.text for a in tags.getiterator('a') if a.get('rel') == 'tag'] + except: + report(verbose) + tags = [] + return tags + + def get_book_info(self, entry, mi, verbose): + try: + entry = entry.get_element_by_id('SalesRank').getparent() + except: + try: + for z in entry.getiterator('h2'): + if self.reprod.search(z.text_content()): + entry = z.getparent().find("div[@class='content']/ul") + break + except: + report(verbose) + return mi + elts = entry.findall('li') + #pub & date + elt = filter(lambda x: self.republi.search(x.find('b').text), elts) + if elt: + pub = elt[0].find('b').tail + mi.publisher = unicode(self.repub.sub('', pub).strip()) + d = self.repub.search(pub) + if d is not None: + d = d.group(1) + try: + default = utcnow().replace(day=15) + if self.lang == 'fr': + d = replace_monthsfr(d) + d = parse_date(d, assume_utc=True, default=default) + mi.pubdate = d + except: + report(verbose) + #ISBN + elt = filter(lambda x: self.reisbn.search(x.find('b').text), elts) + if elt: + isbn = elt[0].find('b').tail.replace('-', '').strip() + if check_isbn(isbn): + mi.isbn = unicode(isbn) + elif len(elt) > 1: + isbn = elt[1].find('b').tail.replace('-', '').strip() + if check_isbn(isbn): + mi.isbn = unicode(isbn) + #Langue + elt = filter(lambda x: self.relang.search(x.find('b').text), elts) + if elt: + langue = elt[0].find('b').tail.strip() + if langue: + mi.language = unicode(langue) + #ratings + elt = filter(lambda x: self.reratelt.search(x.find('b').text), elts) + if elt: + ratings = elt[0].find_class('swSprite') + if ratings: + ratings = self.rerat.findall(ratings[0].get('title')) + if len(ratings) == 2: + mi.rating = float(ratings[0])/float(ratings[1]) * 5 + return mi + + def fill_MI(self, entry, title, authors, browser, verbose): + mi = MetaInformation(title, authors) + mi.author_sort = authors_to_sort_string(authors) + mi.comments = self.get_description(entry, verbose) + mi = self.get_book_info(entry, mi, verbose) + mi.tags = self.get_tags(entry, browser, verbose) + return mi + + def get_individual_metadata(self, browser, linkdata, verbose): + try: + raw = browser.open_novisit(linkdata).read() + except Exception, e: + report(verbose) + if callable(getattr(e, 'getcode', None)) and \ + e.getcode() == 404: + return + raise + if '<title>404 - ' in raw: + report(verbose) + return + raw = xml_to_unicode(raw, strip_encoding_pats=True, + resolve_entities=True)[0] + try: + return soupparser.fromstring(raw) + except: + return + + def populate(self, entries, browser, verbose=False): + for x in entries: + try: + entry = self.get_individual_metadata(browser, x, verbose) + # clean results + # inv_ids = ('divsinglecolumnminwidth', 'sims.purchase', 'AutoBuyXGetY', 'A9AdsMiddleBoxTop') + # inv_class = ('buyingDetailsGrid', 'productImageGrid') + # inv_tags ={'script': True, 'style': True, 'form': False} + # self.clean_entry(entry, invalid_id=inv_ids) + title = self.get_title(entry) + authors = self.get_authors(entry) + except Exception, e: + if verbose: + print 'Failed to get all details for an entry' + print e + continue + self.append(self.fill_MI(entry, title, authors, browser, verbose)) + + +def search(title=None, author=None, publisher=None, isbn=None, + max_results=5, verbose=False, keywords=None, lang='en'): + br = browser() + entries, baseurl = Query(title=title, author=author, isbn=isbn, publisher=publisher, + keywords=keywords, max_results=max_results,rlang=lang)(br, verbose) + + if entries is None or len(entries) == 0: + return + + #List of entry + ans = ResultList(baseurl, lang) + ans.populate(entries, br, verbose) + return ans + +def option_parser(): + parser = OptionParser(textwrap.dedent(\ + '''\ + %prog [options] + + Fetch book metadata from Amazon. You must specify one of title, author, + ISBN, publisher or keywords. Will fetch a maximum of 10 matches, + so you should make your query as specific as possible. + You can chose the language for metadata retrieval (french & american). + ''' + )) + parser.add_option('-t', '--title', help='Book title') + parser.add_option('-a', '--author', help='Book author(s)') + parser.add_option('-p', '--publisher', help='Book publisher') + parser.add_option('-i', '--isbn', help='Book ISBN') + parser.add_option('-k', '--keywords', help='Keywords') + parser.add_option('-c', '--covers', default=0, + help='Covers: 1-Check/ 2-Download') + parser.add_option('-p', '--coverspath', default='', + help='Covers files path') + parser.add_option('-m', '--max-results', default=10, + help='Maximum number of results to fetch') + parser.add_option('-l', '--lang', default='en', + help='Chosen language for metadata search') + parser.add_option('-v', '--verbose', default=0, action='count', + help='Be more verbose about errors') + return parser + +def main(args=sys.argv): + parser = option_parser() + opts, args = parser.parse_args(args) + try: + results = search(opts.title, opts.author, isbn=opts.isbn, publisher=opts.publisher, + keywords=opts.keywords, verbose=opts.verbose, max_results=opts.max_results, + lang=opts.lang) + except AssertionError: + report(True) + parser.print_help() + return 1 + if results is None or len(results) == 0: + print 'No result found for this search!' + return 0 + for result in results: + print unicode(result).encode(preferred_encoding, 'replace') + print + +if __name__ == '__main__': + sys.exit(main()) \ No newline at end of file From fa4986e6c897f8c32208308aa488f455ee3337de Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Sat, 27 Nov 2010 19:05:13 -0700 Subject: [PATCH 167/375] Improve Revista Muy Intersante --- resources/recipes/revista_muy.recipe | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/resources/recipes/revista_muy.recipe b/resources/recipes/revista_muy.recipe index b101fe97ce..c4516f718d 100644 --- a/resources/recipes/revista_muy.recipe +++ b/resources/recipes/revista_muy.recipe @@ -13,6 +13,8 @@ class RevistaMuyInteresante(BasicNewsRecipe): no_stylesheets = True remove_javascript = True + conversion_options = {'linearize_tables': True} + extra_css = ' .txt_articulo{ font-family: sans-serif; font-size: medium; text-align: justify } .contentheading{font-family: serif; font-size: large; font-weight: bold; color: #000000; text-align: center}' @@ -39,11 +41,12 @@ class RevistaMuyInteresante(BasicNewsRecipe): keep_only_tags = [dict(name='div', attrs={'class':['article']}),dict(name='td', attrs={'class':['txt_articulo']})] remove_tags = [ - dict(name=['object','link','script','ul']) + dict(name=['object','link','script','ul','iframe','ins']) ,dict(name='div', attrs={'id':['comment']}) ,dict(name='td', attrs={'class':['buttonheading']}) - ,dict(name='div', attrs={'class':['tags_articles']}) + ,dict(name='div', attrs={'class':['tags_articles','bajo_title']}) ,dict(name='table', attrs={'class':['pagenav']}) + ,dict(name='form', attrs={'class':['voteform']}) ] remove_tags_after = dict(name='div', attrs={'class':'tags_articles'}) @@ -115,3 +118,5 @@ class RevistaMuyInteresante(BasicNewsRecipe): if link_item: cover_url = "http://www.muyinteresante.es"+link_item['src'] return cover_url + + From 3a7da561cc69594b4a61306241e1ca330a17fbc6 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Sat, 27 Nov 2010 19:31:12 -0700 Subject: [PATCH 168/375] Fix regression taht broke RTF conversion on some linux systems --- src/calibre/ebooks/rtf/input.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/calibre/ebooks/rtf/input.py b/src/calibre/ebooks/rtf/input.py index 75c839eb83..57903a6711 100644 --- a/src/calibre/ebooks/rtf/input.py +++ b/src/calibre/ebooks/rtf/input.py @@ -292,7 +292,8 @@ class RTFInput(InputFormatPlugin): # Replace newlines inserted by the 'empty_paragraphs' option in rtf2xml with html blank lines if not getattr(self.options, 'remove_paragraph_spacing', False): res = re.sub('\s*<body>', '<body>', res) - res = re.sub('(?<=\n)\n{2}', u'<p>\u00a0</p>\n', res) + res = re.sub('(?<=\n)\n{2}', + u'<p>\u00a0</p>\n'.encode('utf-8'), res) if self.options.preprocess_html: preprocessor = PreProcessor(self.options, log=getattr(self, 'log', None)) res = preprocessor(res) From 3cea3ec006db7d81449a7ea3cfec7bf7b07d8253 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Sat, 27 Nov 2010 19:33:05 -0700 Subject: [PATCH 169/375] ... --- src/calibre/manual/customize.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/calibre/manual/customize.rst b/src/calibre/manual/customize.rst index 5272a88f53..0d6f75b9cf 100644 --- a/src/calibre/manual/customize.rst +++ b/src/calibre/manual/customize.rst @@ -129,11 +129,11 @@ Here's a simple Hello World plugin for the |app| GUI. It will cause a box to pop info_dialog(self.gui, 'Hello World!', 'Hellooo World!', show=True) - return HelloWorld(gui, None) + return HelloWorld(gui, self.site_customization) You can also have it show up in the toolbars/context menu by going to Preferences->Toolbars and adding this plugin to the locations you want it to be in. -While this plugin is utterly useless, note that all calibre GUI actions like adding/saving/removing/viewing/etc. are implemented as plugins, so there is no limit to what you can acheive. The key thing to remember is that the plugin has access to the full |app| GUI via ``self.gui``. +While this plugin is utterly useless, note that all calibre GUI actions like adding/saving/removing/viewing/etc. are implemented as plugins, so there is no limit to what you can achieve. The key thing to remember is that the plugin has access to the full |app| GUI via ``self.gui``. The Plugin base class From 0f1d3b1ca871e625181459f4295a6711a5149fc8 Mon Sep 17 00:00:00 2001 From: Translators <> Date: Sun, 28 Nov 2010 04:48:08 +0000 Subject: [PATCH 170/375] Launchpad automatic translations update. --- src/calibre/translations/ca.po | 63 +- src/calibre/translations/cs.po | 142 +- src/calibre/translations/en_GB.po | 29 +- src/calibre/translations/es.po | 29 +- src/calibre/translations/fr.po | 30 +- src/calibre/translations/it.po | 10 +- src/calibre/translations/sr.po | 30 +- src/calibre/translations/zh_CN.po | 2054 +++++++++++++++++------------ 8 files changed, 1417 insertions(+), 970 deletions(-) diff --git a/src/calibre/translations/ca.po b/src/calibre/translations/ca.po index a12bf0058b..a4dc332e77 100644 --- a/src/calibre/translations/ca.po +++ b/src/calibre/translations/ca.po @@ -10,14 +10,14 @@ msgid "" msgstr "" "Project-Id-Version: ca\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-11-26 19:04+0000\n" -"PO-Revision-Date: 2010-11-26 21:32+0000\n" +"POT-Creation-Date: 2010-11-27 20:21+0000\n" +"PO-Revision-Date: 2010-11-28 01:00+0000\n" "Last-Translator: FerranRius <frius64@hotmail.com>\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-11-27 04:47+0000\n" +"X-Launchpad-Export-Date: 2010-11-28 04:46+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -617,7 +617,7 @@ msgstr "Aquest perfil és adient per a l'Amazon Kindle DX." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:684 msgid "This profile is intended for the B&N Nook Color." -msgstr "" +msgstr "Aquest perfil és adient per al B&N Nook Color." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:695 msgid "This profile is intended for the Sanda Bambook." @@ -840,7 +840,7 @@ msgstr "Comunica't amb un lector PocketBook 301" #: /home/kovid/work/calibre/src/calibre/devices/eb600/driver.py:233 msgid "Communicate with the PocketBook 602 reader." -msgstr "" +msgstr "Comunica't amb el PocketBook 602 reader." #: /home/kovid/work/calibre/src/calibre/devices/edge/driver.py:17 msgid "Entourage Edge" @@ -1054,7 +1054,7 @@ msgstr "Comunica't amb un GM2000" #: /home/kovid/work/calibre/src/calibre/devices/misc.py:180 msgid "Communicate with the Acer Lumiread" -msgstr "" +msgstr "Comunica't amb l'Acer Lumiread." #: /home/kovid/work/calibre/src/calibre/devices/nokia/driver.py:17 msgid "Communicate with the Nokia 770 internet tablet." @@ -2712,7 +2712,8 @@ msgstr "Descarrega portades des de librarything.com" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:129 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:69 msgid "LibraryThing.com timed out. Try again later." -msgstr "LibraryThing.com ha esgotat el temps. Provi-ho de nou més tard." +msgstr "" +"El temps d'espera per a LibraryThing.com s'ha esgotat. Intenteu-ho més tard." #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:136 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:76 @@ -2735,7 +2736,7 @@ msgstr "Descarrega portades de Douban.com" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:235 msgid "Douban.com API timed out. Try again later." msgstr "" -"El temps d'espera d l'API Douban.com s'ha esgotat. Intenteu-ho més tard." +"El temps d'espera de l'API Douban.com s'ha esgotat. Intenteu-ho més tard." #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/douban.py:42 msgid "Downloads metadata from Douban.com" @@ -2852,19 +2853,20 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:25 msgid "Downloads metadata from french Nicebooks" -msgstr "" +msgstr "Descarrega metadades del Nicebooks francès" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:41 msgid "Downloads covers from french Nicebooks" -msgstr "" +msgstr "Descarrega portades del Nicebooks francès" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:332 msgid "Nicebooks timed out. Try again later." msgstr "" +"El temps d'espera per a Nicebooks s'ha esgotat. Intenteu-ho més tard." #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:337 msgid "An errror occured with Nicebooks cover fetcher" -msgstr "" +msgstr "Hi ha hagut un error a la descàrrega de portades des de Nicebooks" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1308 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 @@ -3893,6 +3895,10 @@ msgid "" "removed. You should check them manually. This can happen if you manipulate " "the files in the library folder directly." msgstr "" +"Aquests llibres tenien formats o portades a la llista de la base de dades " +"que no estan disponibles. S'ha suprimit les entrades per als " +"formats/portades. Caldria comprovar-ho manualment. Pot passar en manipular " +"directament els fitxers a la carpeta de la biblioteca." #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:148 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:51 @@ -4079,6 +4085,7 @@ msgstr "S'està començant la conversió de %d llibre(s)" #: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:170 msgid "Empty output file, probably the conversion process crashed" msgstr "" +"Fitxer de sortida buit, probablement el procés de conversió ha fallat" #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:83 msgid "Copy to library" @@ -4207,16 +4214,16 @@ msgid "" "The selected books will be <b>permanently deleted</b> and the files removed " "from your calibre library. Are you sure?" msgstr "" -"Els llibres que seleccionats s'eliminaran <b>permanentment</b> i els fitxers " -"es suprimiran de la vostra llibreria del calibre. N'esteu segur?" +"Els llibres seleccionats se suprimiran <b>permanentment</b> i els fitxers es " +"suprimiran de la vostra llibreria del calibre. N'esteu segur?" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:185 msgid "" "The selected books will be <b>permanently deleted</b> from your device. Are " "you sure?" msgstr "" -"Els llibres que seleccionats se suprimiran <b>permanentment</b> del " -"dispositiu. N'esteu segur?" +"Els llibres seleccionats se suprimiran <b>permanentment</b> del dispositiu. " +"N'esteu segur?" #: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:26 msgid "Connect to folder" @@ -4647,7 +4654,7 @@ msgstr "S'està cercant a" #: /home/kovid/work/calibre/src/calibre/gui2/add.py:198 msgid "Adding..." -msgstr "Afegint..." +msgstr "S'està afegint..." #: /home/kovid/work/calibre/src/calibre/gui2/add.py:211 msgid "Searching in all sub-directories..." @@ -4668,7 +4675,7 @@ msgstr "Cap llibre" #: /home/kovid/work/calibre/src/calibre/gui2/add.py:294 msgid "Added" -msgstr "Afegit" +msgstr "S'ha afegit" #: /home/kovid/work/calibre/src/calibre/gui2/add.py:307 msgid "Adding failed" @@ -6455,6 +6462,13 @@ msgid "" "enter the full path to the file after a <code>>></code>. For example:</p>\n" "<p><code>9788842915232 >> %s</code></p>" msgstr "" +"<p>Introduïu una llista d'ISBNs al quadre de l'esquerra, un per línia. El " +"calibre crearà entrades per als llibres automàticament basant-se en l'ISBN i " +"en descarregarà les metadades i portades.</p>\n" +"<p>S'ignora qualsevol ISBN de la llista no vàlid.</p>\n" +"<p>També podeu indicar un fitxer per afegir amb cada ISBN. Introduïu el camí " +"complert del fitxer després de <code>>></code> per fer-ho. Exemple:</p>\n" +"<p><code>9788842915232 >> %s</code></p>" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:53 msgid "&Paste from clipboard" @@ -8339,7 +8353,7 @@ msgstr "Codi font de la recepta (python)" #: /home/kovid/work/calibre/src/calibre/gui2/email.py:145 msgid "Email %s to %s" -msgstr "" +msgstr "Envia per correu electrònic %s a %s" #: /home/kovid/work/calibre/src/calibre/gui2/email.py:187 msgid "News:" @@ -8347,7 +8361,7 @@ msgstr "Notícies:" #: /home/kovid/work/calibre/src/calibre/gui2/email.py:189 msgid "Attached is the %s periodical downloaded by calibre." -msgstr "" +msgstr "S'adjunta el diari %s descarregat pel calibre." #: /home/kovid/work/calibre/src/calibre/gui2/email.py:242 msgid "E-book:" @@ -8385,11 +8399,11 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/email.py:303 msgid "Failed to email book" -msgstr "" +msgstr "No s'ha pogut enviar el llibre" #: /home/kovid/work/calibre/src/calibre/gui2/email.py:306 msgid "sent" -msgstr "" +msgstr "s'ha enviat" #: /home/kovid/work/calibre/src/calibre/gui2/email.py:329 msgid "Sent news to" @@ -11248,6 +11262,9 @@ msgid "" "<p>Choose a location for your books. When you add books to calibre, they " "will be copied here. Use an <b>empty folder</b> for a new calibre library:" msgstr "" +"<p>Trieu una localització per als llibres. Quan s'afegeixin llibres al " +"calibre es copiaran aquí. Utilitzeu una <b>carpeta buida</b> per a una nova " +"biblioteca del calibre:" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/library_ui.py:59 msgid "&Change" @@ -11418,11 +11435,11 @@ msgstr "&SSL" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:143 msgid "WARNING: Using no encryption is highly insecure" -msgstr "" +msgstr "Avís: No fer servir encriptació és molt insegur" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:144 msgid "&None" -msgstr "" +msgstr "&Cap" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:145 msgid "Use Gmail" diff --git a/src/calibre/translations/cs.po b/src/calibre/translations/cs.po index de78b7d549..52e5d861dd 100644 --- a/src/calibre/translations/cs.po +++ b/src/calibre/translations/cs.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" -"POT-Creation-Date: 2010-11-26 19:04+0000\n" -"PO-Revision-Date: 2010-11-26 21:42+0000\n" -"Last-Translator: Kovid Goyal <Unknown>\n" +"POT-Creation-Date: 2010-11-27 20:21+0000\n" +"PO-Revision-Date: 2010-11-27 20:34+0000\n" +"Last-Translator: Aleš Bajtalon <Unknown>\n" "Language-Team: Czech <cs@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-27 04:47+0000\n" +"X-Launchpad-Export-Date: 2010-11-28 04:46+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -817,7 +817,7 @@ msgstr "Spojit se s PocketBook 301" #: /home/kovid/work/calibre/src/calibre/devices/eb600/driver.py:233 msgid "Communicate with the PocketBook 602 reader." -msgstr "" +msgstr "Komunikovat se čtečkou PocketBook 602." #: /home/kovid/work/calibre/src/calibre/devices/edge/driver.py:17 msgid "Entourage Edge" @@ -1031,7 +1031,7 @@ msgstr "Spojit se s GM2000" #: /home/kovid/work/calibre/src/calibre/devices/misc.py:180 msgid "Communicate with the Acer Lumiread" -msgstr "" +msgstr "Komunikovat s Acer Lumiread" #: /home/kovid/work/calibre/src/calibre/devices/nokia/driver.py:17 msgid "Communicate with the Nokia 770 internet tablet." @@ -1768,6 +1768,11 @@ msgid "" "by Chinese and Japanese for instance) the representation used by the largest " "number of people will be used (Chinese in the previous example)." msgstr "" +"Přeložit unicode znaky do ASCII. Používat opatrně, protože nahradí znaky " +"Unicode za znaky ASCII. Například nahradí \"%s\" s \"Michail Gorbachiov\". " +"Také si všimněte, že v případech, kdy existuje více zastoupení znaku " +"(například znaky sdílené čínštinou a japonštinou) bude použité to " +"nejpoužívanější (čínština v předchozím příkladě)." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:437 msgid "" @@ -1997,6 +2002,11 @@ msgid "" "and bottom of the image, but the image will never be distorted. Without this " "option the image may be slightly distorted, but there will be no borders." msgstr "" +"Při použití obálky ve formátu SVG tato volba způsobí, že obálka pokryje " +"dostupné oblasti obrazovky, ale zachová poměr stran (poměr šířky k výšce). " +"To znamená, že mohou být vidět bílé okraje po stranách nebo v horní a dolní " +"části obrazovky, ale obraz již nikdy nebude zkřivený. Bez této volby může " +"být obraz mírně zkřivený, ale nebudou vidět žádné okraje." #: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:170 #: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:203 @@ -2706,6 +2716,15 @@ msgid "" "isbndb.com.\n" "\n" msgstr "" +"\n" +"%prog [options] key\n" +"\n" +"Získat metadata pro knihy z isndb.com. Můžete zadat buď ISBN ID\n" +"knihy nebo její název a autora. Pokud zadáte název knihy a autora,\n" +"potom může být nalezena více než jedna kniha.\n" +"\n" +"klíč je klíč k účtu, který vygenerujete po přihlášení k účtu na isbndb.com.\n" +"\n" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:118 msgid "The ISBN ID of the book you want metadata for." @@ -3234,6 +3253,10 @@ 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 "" +"Maximální počet znaků na řádek. Rozdělení bude provedeno v první mezeře před " +"stanovenou hodnotu. Pokud není nalezena mezera, bude rozděleno až v další " +"mezeře a překročí tak stanovenou hodnotu. Minimum je 25 znaků. Použitím " +"hodnoty 0 lze rozdělení řádku vypnout." #: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:36 msgid "" @@ -3728,6 +3751,10 @@ msgid "" "removed. You should check them manually. This can happen if you manipulate " "the files in the library folder directly." msgstr "" +"Následující knihy mají formáty nebo obálky uvedené v databázi, které ve " +"skutečnosti nejsou k dispozici. Údaje pro formáty/obálky byly odstraněny. " +"Měli byste je zkontrolovat ručně. Tato situace může nastat v případě, pokud " +"budete manipulovat přímo se soubory ve složce knihovny." #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:148 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:51 @@ -3911,7 +3938,7 @@ msgstr "Zahajuji konverzi %d knih(y)" #: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:170 msgid "Empty output file, probably the conversion process crashed" -msgstr "" +msgstr "Výstupní soubor je prázdný, pravděpodobně proces převodu havaroval" #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:83 msgid "Copy to library" @@ -6805,6 +6832,11 @@ msgid "" "you selected them. So if you selected Book A and then Book B,\n" "Book A will have series number 1 and Book B series number 2." msgstr "" +"Pokud není zaškrtnuto, bude pořadové číslo knihy nastaveno na 1.\n" +"Pokud je zaškrtnuto, budou vybrané knihy automaticky číslovány v pořadí,\n" +"ve kterém jste je vybrali. Takže pokud jste vybrali knihu A a potom knihu " +"B,\n" +"kniha A bude mít pořadové číslo 1 a kniha B pořadové číslo 2." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:363 msgid "Automatically number books in this series" @@ -6842,6 +6874,9 @@ msgid "" "\n" "Future conversion of these books will use the default settings." msgstr "" +"Smazat uložené nastavení konverze pro vybrané knihy.\n" +"\n" +"Pro budoucí konverzi těchto knih bude použito výchozí nastavení." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:376 msgid "Remove &stored conversion settings for the selected books" @@ -7624,7 +7659,7 @@ msgstr "Aplikované položky" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:163 msgid "Unapply (remove) tag from current tag category" -msgstr "" +msgstr "Nepoužívat (odebrat) tag z aktuální kategorie tagů" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories_ui.py:165 msgid "Category name: " @@ -8008,7 +8043,7 @@ msgstr "Kód zdroje (python)" #: /home/kovid/work/calibre/src/calibre/gui2/email.py:145 msgid "Email %s to %s" -msgstr "" +msgstr "E-mail %s pro %s" #: /home/kovid/work/calibre/src/calibre/gui2/email.py:187 msgid "News:" @@ -8051,11 +8086,11 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/email.py:303 msgid "Failed to email book" -msgstr "" +msgstr "Chyba při odeslání knihy" #: /home/kovid/work/calibre/src/calibre/gui2/email.py:306 msgid "sent" -msgstr "" +msgstr "odesláno" #: /home/kovid/work/calibre/src/calibre/gui2/email.py:329 msgid "Sent news to" @@ -8084,6 +8119,27 @@ msgid "" "expression on a few sample filenames. The group names for the various " "metadata entries are documented in tooltips.</p></body></html>" msgstr "" +"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" " +"\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" +"<html><head><meta name=\"qrichtext\" content=\"1\" /><style " +"type=\"text/css\">\n" +"p, li { white-space: pre-wrap; }\n" +"</style></head><body style=\" font-family:'Candara'; font-size:10pt; font-" +"weight:400; font-style:normal;\">\n" +"<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-" +"right:0px; -qt-block-indent:0; text-indent:0px;\">Nastavit vzor regulárního " +"výrazu k použití, pokud se snaží odhadnout ebook metadata z názvů souborů. " +"</p>\n" +"<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-" +"right:0px; -qt-block-indent:0; text-indent:0px;\"><a " +"href=\"http://docs.python.org/lib/re-syntax.html\"><span style=\" text-" +"decoration: underline; color:#0000ff;\">Reference</span></a> o syntaxi " +"regulárních výrazů jsou k dispozici.</p>\n" +"<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-" +"right:0px; -qt-block-indent:0; text-indent:0px;\">Použijte funkci <span " +"style=\" font-weight:600;\">TEST</span> uvedenou níže, která prověří Váš " +"regulární výraz na několika vzorových souborech. Názvy skupin pro různé " +"položky metadat jsou zdokumentovány ve vysvětlivkách.</p></body></html>" #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:119 msgid "Regular &expression" @@ -8303,6 +8359,7 @@ msgstr "dostupné" msgid "" "Books display will be restricted to those matching the selected saved search" msgstr "" +"Zobrazení knih bude omezeno na ty, které odpovídají zvolenému uložené hledání" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:170 msgid "Shift+Ctrl+F" @@ -9009,6 +9066,8 @@ msgid "" "Used for searching the column. Must contain only digits and lower case " "letters." msgstr "" +"Používá se pro prohledávání sloupců. Musí obsahovat pouze číslice a malá " +"písmena." #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:131 msgid "" @@ -9055,7 +9114,7 @@ msgstr "Formát &data" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:143 msgid "<p>Field template. Uses the same syntax as save templates." -msgstr "" +msgstr "<p>Pole šablony. Používá stejnou syntaxi jako ukládání šablon." #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:144 msgid "Similar to save templates. For example, {title} {isbn}" @@ -9401,6 +9460,8 @@ msgid "" "\n" "Customization: " msgstr "" +"\n" +"Přizpůsobení: " #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:155 msgid "No valid plugin path" @@ -9577,6 +9638,10 @@ msgid "" "Send to Device button. This setting can be overriden for individual devices " "by customizing the device interface plugins in Preferences->Advanced->Plugins" msgstr "" +"Zde můžete nastavit, jakým způsobem Calibre uloží Vaše knihy, když kliknete " +"na tlačítko Odeslat do zařízení. Toto nastavení může být potlačeno pro " +"jednotlivá zařízení přizpůsobením pluginů rozhraní zařízení v Nastavení-> " +"Upřesnit-> Pluginy" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server.py:75 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:331 @@ -9678,6 +9743,12 @@ msgid "" "on your iPhone. Here myhostname should be the fully qualified hostname or " "the IP address of the computer calibre is running on." msgstr "" +"<p>Nezapomeňte, že Calibre běží jako server tak dlouho, jak dlouho je " +"spuštěný program Calibre.\n" +"<p>Stanza by měla vidět Vaši Calibre sbírku automaticky. Pokud ne, zkuste " +"přidat ve Stanza čtečce v iPhonu nový katalog s URL http://myhostname:8080. " +"Myhostname označuje název hostitele nebo IP adresu počítače, kde Calibre " +"běží." #: /home/kovid/work/calibre/src/calibre/gui2/preferences/social.py:34 msgid "Downloading social metadata, please wait..." @@ -9764,6 +9835,8 @@ 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 "" +"Vylepšení, která jste zadali, jsou neplatná, zkuste vylepšení vrátit do " +"výchozího nastavení a měnit je postupně, dokud nenajdete neplatné nastavení." #: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks_ui.py:50 msgid "" @@ -10031,7 +10104,7 @@ msgstr "&Vysunout připojené zařízení" #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:218 msgid "Calibre Quick Start Guide" -msgstr "" +msgstr "Calibre příručka pro začínající uživatele" #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:439 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:450 @@ -10638,6 +10711,9 @@ msgid "" "WordPlayer. Here myhostname should be the fully qualified hostname or the IP " "address of the computer calibre is running on." msgstr "" +"Musíte v aplikaci WordPlayer přidat Calibre knihovnu s URL " +"http://myhostname:8080. Myhostname označuje název hostitele nebo IP adresu " +"počítače, na kterém Calibre běží." #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:483 msgid "Moving library..." @@ -10927,11 +11003,11 @@ msgstr "&SSL" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:143 msgid "WARNING: Using no encryption is highly insecure" -msgstr "" +msgstr "VAROVÁNÍ: Nepoužívání žádného šifrování je velice nebezpečné" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:144 msgid "&None" -msgstr "" +msgstr "Žádný" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:145 msgid "Use Gmail" @@ -10972,7 +11048,7 @@ msgstr "tentoměsíc" #: /home/kovid/work/calibre/src/calibre/library/caches.py:374 #: /home/kovid/work/calibre/src/calibre/library/caches.py:375 msgid "daysago" -msgstr "" +msgstr "dní zpět" #: /home/kovid/work/calibre/src/calibre/library/caches.py:539 #: /home/kovid/work/calibre/src/calibre/library/caches.py:549 @@ -11062,6 +11138,10 @@ msgid "" "Default: '%default'\n" "Applies to: BIBTEX output format" msgstr "" +"BibTeX kódování výstupního souboru.\n" +"Dostupné typy: utf8, cp1252, ascii.\n" +"Výchozí: '%default'\n" +"Platí pro: výstupní formát BIBTEX" #: /home/kovid/work/calibre/src/calibre/library/catalog.py:261 msgid "" @@ -11078,6 +11158,10 @@ msgid "" "Default: '%default'\n" "Applies to: BIBTEX output format" msgstr "" +"Typ záznamu pro katalog BibTeX.\n" +"Dostupné typy: kniha, různé, smíšené.\n" +"Výchozí: '%default'\n" +"Platí pro: výstupní formát BIBTEX" #: /home/kovid/work/calibre/src/calibre/library/catalog.py:540 msgid "" @@ -11085,6 +11169,9 @@ msgid "" "Default: '%default'\n" "Applies to: ePub, MOBI output formats" msgstr "" +"Název vygenerovaného katalogu použit jako název v metadatech.\n" +"Výchozí: '%default'\n" +"Platí pro: výstupní formáty ePub a MOBI" #: /home/kovid/work/calibre/src/calibre/library/catalog.py:547 msgid "" @@ -11253,6 +11340,9 @@ msgid "" "Available fields: %s\n" "Default: %%default" msgstr "" +"Pole podle kterého třídit výsledky\n" +"Dostupná pole: %s\n" +"Výchozí: %%default" #: /home/kovid/work/calibre/src/calibre/library/cli.py:139 msgid "Sort results in ascending order" @@ -11318,6 +11408,8 @@ msgid "" "Assume that each directory has only a single logical book and that all files " "in it are different e-book formats of that book" msgstr "" +"Předpokládá se, že každý adresář obsahuje pouze jednu logickou knihu, a že " +"všechny soubory v něm jsou různé formáty této knihy" #: /home/kovid/work/calibre/src/calibre/library/cli.py:281 msgid "Process directories recursively" @@ -11359,6 +11451,11 @@ msgid "" "separated list of id numbers (you can get id numbers by using the list " "command). For example, 23,34,57-85\n" msgstr "" +"%prog remove ids\n" +"\n" +"Odstraní knihy označené podle ids z databáze. Ids by měl být seznam id čísel " +"oddělený čárkami (id čísla můžete získat pomocí seznamu příkazů). Například, " +"23,34,57-85\n" #: /home/kovid/work/calibre/src/calibre/library/cli.py:349 msgid "You must specify at least one book to remove" @@ -11565,6 +11662,11 @@ msgid "" " List available custom columns. Shows column labels and ids.\n" " " msgstr "" +"\n" +" %prog custom_columns [options]\n" +"\n" +" Seznam dostupných vlastních sloupců. Zobrazí popisky sloupců a ids.\n" +" " #: /home/kovid/work/calibre/src/calibre/library/cli.py:775 msgid "Show details for each column." @@ -11676,10 +11778,12 @@ msgid "" "Comma-separated list of names to ignore.\n" "Default: all" msgstr "" +"Čárkami oddělený seznam ignorovaných jmen.\n" +"Výchozí: all" #: /home/kovid/work/calibre/src/calibre/library/cli.py:927 msgid "Unknown report check" -msgstr "" +msgstr "Neznámé hlášení o kontrole" #: /home/kovid/work/calibre/src/calibre/library/cli.py:960 msgid "" @@ -11734,6 +11838,8 @@ msgid "" "Comma-separated list of category lookup names.\n" "Default: all" msgstr "" +"Čárkami oddělený seznam kategorií hledaných jmen.\n" +"Výchozí: all" #: /home/kovid/work/calibre/src/calibre/library/cli.py:1047 msgid "The string used to separate fields in CSV mode. Default is a comma." @@ -11797,7 +11903,7 @@ msgstr "Kontrola chybějících souborů." #: /home/kovid/work/calibre/src/calibre/library/database2.py:2516 msgid "Checked id" -msgstr "" +msgstr "Zkontrolované id" #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:139 msgid "Ratings" diff --git a/src/calibre/translations/en_GB.po b/src/calibre/translations/en_GB.po index 4fe876a7db..8a286ac249 100644 --- a/src/calibre/translations/en_GB.po +++ b/src/calibre/translations/en_GB.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" -"POT-Creation-Date: 2010-11-26 19:04+0000\n" -"PO-Revision-Date: 2010-11-26 21:48+0000\n" -"Last-Translator: Kovid Goyal <Unknown>\n" +"POT-Creation-Date: 2010-11-27 20:21+0000\n" +"PO-Revision-Date: 2010-11-27 10:19+0000\n" +"Last-Translator: Vladimir Oka <Unknown>\n" "Language-Team: English (United Kingdom) <en_GB@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-27 04:50+0000\n" +"X-Launchpad-Export-Date: 2010-11-28 04:47+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -823,7 +823,7 @@ msgstr "Communicate with the PocketBook 301 reader." #: /home/kovid/work/calibre/src/calibre/devices/eb600/driver.py:233 msgid "Communicate with the PocketBook 602 reader." -msgstr "" +msgstr "Communicate with the PocketBook 602 reader." #: /home/kovid/work/calibre/src/calibre/devices/edge/driver.py:17 msgid "Entourage Edge" @@ -1037,7 +1037,7 @@ msgstr "Communicate with the GM2000" #: /home/kovid/work/calibre/src/calibre/devices/misc.py:180 msgid "Communicate with the Acer Lumiread" -msgstr "" +msgstr "Communicate with the Acer Lumiread" #: /home/kovid/work/calibre/src/calibre/devices/nokia/driver.py:17 msgid "Communicate with the Nokia 770 internet tablet." @@ -6361,6 +6361,13 @@ msgid "" "enter the full path to the file after a <code>>></code>. For example:</p>\n" "<p><code>9788842915232 >> %s</code></p>" msgstr "" +"<p>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 " +"metadata and covers for them.</p>\n" +"<p>Any invalid ISBNs in the list will be ignored.</p>\n" +"<p>You can also specify a file that will be added with each ISBN. To do this " +"enter the full path to the file after a <code>>></code>. For example:</p>\n" +"<p><code>9788842915232 >> %s</code></p>" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:53 msgid "&Paste from clipboard" @@ -8223,7 +8230,7 @@ msgstr "News:" #: /home/kovid/work/calibre/src/calibre/gui2/email.py:189 msgid "Attached is the %s periodical downloaded by calibre." -msgstr "" +msgstr "Attached is the %s periodical downloaded by calibre." #: /home/kovid/work/calibre/src/calibre/gui2/email.py:242 msgid "E-book:" @@ -8258,11 +8265,11 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/email.py:303 msgid "Failed to email book" -msgstr "" +msgstr "Failed to email book" #: /home/kovid/work/calibre/src/calibre/gui2/email.py:306 msgid "sent" -msgstr "" +msgstr "sent" #: /home/kovid/work/calibre/src/calibre/gui2/email.py:329 msgid "Sent news to" @@ -11227,11 +11234,11 @@ msgstr "&SSL" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:143 msgid "WARNING: Using no encryption is highly insecure" -msgstr "" +msgstr "WARNING: Using no encryption is highly insecure" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:144 msgid "&None" -msgstr "" +msgstr "&None" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:145 msgid "Use Gmail" diff --git a/src/calibre/translations/es.po b/src/calibre/translations/es.po index 1291d31a6e..bf383dd5f5 100644 --- a/src/calibre/translations/es.po +++ b/src/calibre/translations/es.po @@ -10,14 +10,14 @@ msgid "" msgstr "" "Project-Id-Version: es\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-11-26 19:04+0000\n" -"PO-Revision-Date: 2010-11-26 21:41+0000\n" -"Last-Translator: Kovid Goyal <Unknown>\n" +"POT-Creation-Date: 2010-11-27 20:21+0000\n" +"PO-Revision-Date: 2010-11-27 17:43+0000\n" +"Last-Translator: DiegoJ <diegojromerolopez@gmail.com>\n" "Language-Team: Spanish\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-27 04:49+0000\n" +"X-Launchpad-Export-Date: 2010-11-28 04:47+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:502 @@ -622,7 +622,7 @@ msgstr "Este perfil está pensado para el JetBook de 5 pulgadas." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:684 msgid "This profile is intended for the B&N Nook Color." -msgstr "" +msgstr "Este perfil está orientado al B&N Nook Color." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:695 msgid "This profile is intended for the Sanda Bambook." @@ -842,7 +842,7 @@ msgstr "Comunicarse con el lector PocketBook 301." #: /home/kovid/work/calibre/src/calibre/devices/eb600/driver.py:233 msgid "Communicate with the PocketBook 602 reader." -msgstr "" +msgstr "Comunicarse con el lector PocketBook 602." #: /home/kovid/work/calibre/src/calibre/devices/edge/driver.py:17 msgid "Entourage Edge" @@ -1057,7 +1057,7 @@ msgstr "Comunicar con el GM2000" #: /home/kovid/work/calibre/src/calibre/devices/misc.py:180 msgid "Communicate with the Acer Lumiread" -msgstr "" +msgstr "Comunicarse con el Acer Lumiread" #: /home/kovid/work/calibre/src/calibre/devices/nokia/driver.py:17 msgid "Communicate with the Nokia 770 internet tablet." @@ -2855,19 +2855,21 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:25 msgid "Downloads metadata from french Nicebooks" -msgstr "" +msgstr "Descarga metadatos en francés de Nicebooks" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:41 msgid "Downloads covers from french Nicebooks" -msgstr "" +msgstr "Descarga portadas en francés de Nicebooks" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:332 msgid "Nicebooks timed out. Try again later." msgstr "" +"El tiempo de conexión con Nicebooks ha vencido. Inténtelo de nuevo más tarde." #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:337 msgid "An errror occured with Nicebooks cover fetcher" msgstr "" +"Ha ocurrido un error al intentar obtener las portadas desde Nicebooks" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1308 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 @@ -4087,6 +4089,7 @@ msgstr "Iniciando la conversión de %d libro(s)" #: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:170 msgid "Empty output file, probably the conversion process crashed" msgstr "" +"Archivo de salida vacío, probablemente el proceso de conversión ha reventado" #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:83 msgid "Copy to library" @@ -8410,11 +8413,11 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/email.py:303 msgid "Failed to email book" -msgstr "" +msgstr "Falló al enviar por correo el libro" #: /home/kovid/work/calibre/src/calibre/gui2/email.py:306 msgid "sent" -msgstr "" +msgstr "enviado" #: /home/kovid/work/calibre/src/calibre/gui2/email.py:329 msgid "Sent news to" @@ -11441,11 +11444,11 @@ msgstr "&SSL" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:143 msgid "WARNING: Using no encryption is highly insecure" -msgstr "" +msgstr "Aviso: no usar cifrado es muy inseguro" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:144 msgid "&None" -msgstr "" +msgstr "&Ninguno" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:145 msgid "Use Gmail" diff --git a/src/calibre/translations/fr.po b/src/calibre/translations/fr.po index 844aa6eff6..fda8edd7c0 100644 --- a/src/calibre/translations/fr.po +++ b/src/calibre/translations/fr.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre 0.4.22\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-11-26 19:04+0000\n" -"PO-Revision-Date: 2010-11-26 21:38+0000\n" -"Last-Translator: Kovid Goyal <Unknown>\n" +"POT-Creation-Date: 2010-11-27 20:21+0000\n" +"PO-Revision-Date: 2010-11-27 11:43+0000\n" +"Last-Translator: sengian <Unknown>\n" "Language-Team: Français <kde-i18n-doc@kde.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-27 04:48+0000\n" +"X-Launchpad-Export-Date: 2010-11-28 04:47+0000\n" "X-Generator: Launchpad (build Unknown)\n" "X-Poedit-Bookmarks: 1177,1104,-1,-1,-1,-1,-1,-1,-1,-1\n" "Generated-By: pygettext.py 1.5\n" @@ -615,7 +615,7 @@ msgstr "Ce profil est prévu pour le Kindle DX d'Amazon." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:684 msgid "This profile is intended for the B&N Nook Color." -msgstr "" +msgstr "Ce profil est prévu pour le B&N Nook Color." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:695 msgid "This profile is intended for the Sanda Bambook." @@ -2887,19 +2887,21 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:25 msgid "Downloads metadata from french Nicebooks" -msgstr "" +msgstr "Télécharger les métadonnées depuis Nicebooks (français)" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:41 msgid "Downloads covers from french Nicebooks" -msgstr "" +msgstr "Télécharger les couvertures depuis Nicebooks (français)" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:332 msgid "Nicebooks timed out. Try again later." -msgstr "" +msgstr "Le délai d'attente de Nicebooks est dépassé. Essayez plus tard." #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:337 msgid "An errror occured with Nicebooks cover fetcher" msgstr "" +"Une erreur est survenue dans le processus de récupération des couvertures de " +"Nicebooks" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1308 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 @@ -3941,6 +3943,11 @@ msgid "" "removed. You should check them manually. This can happen if you manipulate " "the files in the library folder directly." msgstr "" +"Les livres suivants avaient des formats ou des couvertures répertoriés dans " +"la base de donnée qui ne sont pas actuellement disponibles. Les entrées pour " +"les formats/couvertures ont étés supprimées. Vous devriez les vérifiez " +"manuellement. Ceci peut arriver si vous manipulez directement les fichiers " +"dans le dossier de la bibliothèque." #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:148 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:51 @@ -4131,6 +4138,8 @@ msgstr "Démarrer la conversion de %d livre(s)" #: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:170 msgid "Empty output file, probably the conversion process crashed" msgstr "" +"Fichier de sortie vide, le processus de conversion a probablement cessé de " +"fonctionné" #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:83 msgid "Copy to library" @@ -8434,7 +8443,7 @@ msgstr "Code source de la recette (python)" #: /home/kovid/work/calibre/src/calibre/gui2/email.py:145 msgid "Email %s to %s" -msgstr "" +msgstr "Envoyer par mél % à %s" #: /home/kovid/work/calibre/src/calibre/gui2/email.py:187 msgid "News:" @@ -11366,6 +11375,9 @@ msgid "" "<p>Choose a location for your books. When you add books to calibre, they " "will be copied here. Use an <b>empty folder</b> for a new calibre library:" msgstr "" +"<p>Choisissez un emplacement pour vos livres. Quand vous ajoutez des livres " +"à Calibre, ils seront copiés ici. Utilisez un <b>dossier vide</b> pour votre " +"nouvelle bibliothèque Calibre :" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/library_ui.py:59 msgid "&Change" diff --git a/src/calibre/translations/it.po b/src/calibre/translations/it.po index 9cf0ee4610..5b939669a6 100644 --- a/src/calibre/translations/it.po +++ b/src/calibre/translations/it.po @@ -8,14 +8,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre_calibre-it\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-11-26 19:04+0000\n" -"PO-Revision-Date: 2010-11-26 21:54+0000\n" -"Last-Translator: Kovid Goyal <Unknown>\n" +"POT-Creation-Date: 2010-11-27 20:21+0000\n" +"PO-Revision-Date: 2010-11-27 14:56+0000\n" +"Last-Translator: Enrico Battocchi <Unknown>\n" "Language-Team: italiano\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-27 04:49+0000\n" +"X-Launchpad-Export-Date: 2010-11-28 04:47+0000\n" "X-Generator: Launchpad (build Unknown)\n" "X-Poedit-Bookmarks: -1,-1,-1,-1,-1,1105,-1,1312,-1,-1\n" "Generated-By: pygettext.py 1.5\n" @@ -12616,7 +12616,7 @@ msgstr "Sto caricando, attendere" #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:85 #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:106 msgid "Go to" -msgstr "" +msgstr "Vai a" #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:101 msgid "First" diff --git a/src/calibre/translations/sr.po b/src/calibre/translations/sr.po index 3a7c398e11..24eb885f14 100644 --- a/src/calibre/translations/sr.po +++ b/src/calibre/translations/sr.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" -"POT-Creation-Date: 2010-11-26 19:04+0000\n" -"PO-Revision-Date: 2010-11-26 21:50+0000\n" -"Last-Translator: Kovid Goyal <Unknown>\n" +"POT-Creation-Date: 2010-11-27 20:21+0000\n" +"PO-Revision-Date: 2010-11-27 10:24+0000\n" +"Last-Translator: Vladimir Oka <Unknown>\n" "Language-Team: Serbian <sr@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-27 04:49+0000\n" +"X-Launchpad-Export-Date: 2010-11-28 04:47+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -822,7 +822,7 @@ msgstr "Uspstavi vezu s PocketBook 301 čitačem." #: /home/kovid/work/calibre/src/calibre/devices/eb600/driver.py:233 msgid "Communicate with the PocketBook 602 reader." -msgstr "" +msgstr "Uspostavi vezu s PocketBook 602 čitačem" #: /home/kovid/work/calibre/src/calibre/devices/edge/driver.py:17 msgid "Entourage Edge" @@ -1036,7 +1036,7 @@ msgstr "Uspostavi komunikaciju s GM2000" #: /home/kovid/work/calibre/src/calibre/devices/misc.py:180 msgid "Communicate with the Acer Lumiread" -msgstr "" +msgstr "Uspostavi vezu sa Acer Lumiread čitačem" #: /home/kovid/work/calibre/src/calibre/devices/nokia/driver.py:17 msgid "Communicate with the Nokia 770 internet tablet." @@ -6388,6 +6388,14 @@ msgid "" "enter the full path to the file after a <code>>></code>. For example:</p>\n" "<p><code>9788842915232 >> %s</code></p>" msgstr "" +"<p>Unesite listu ISBN brojeva u polje s leve strane, jedan broj po redu. " +"calibre će automatski napraviti stavke za knjige zasnovane na ovim ISBN " +"brojevima i za njih preuzeti metapodatke i naslovne strane.</p>\n" +"<p>Neispravni ISBN brojevi će biti ignorisani.</p>\n" +"<p>Možete navesti i fajl koji će se priključiti svakom ISBN broju. Da biste " +"ovo uradili dodajte punu putanju do fajla iza <code>>></code>. Na " +"primer:</p>\n" +"<p><code>9788842915232 >> %s</code></p>" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:53 msgid "&Paste from clipboard" @@ -8267,7 +8275,7 @@ msgstr "Vesti:" #: /home/kovid/work/calibre/src/calibre/gui2/email.py:189 msgid "Attached is the %s periodical downloaded by calibre." -msgstr "" +msgstr "Priključen je magazin %s koji je calibre preuzeo za vas." #: /home/kovid/work/calibre/src/calibre/gui2/email.py:242 msgid "E-book:" @@ -8302,11 +8310,11 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/email.py:303 msgid "Failed to email book" -msgstr "" +msgstr "Nisam uspeo da pošaljem knjigu elektronskom poštom" #: /home/kovid/work/calibre/src/calibre/gui2/email.py:306 msgid "sent" -msgstr "" +msgstr "poslato" #: /home/kovid/work/calibre/src/calibre/gui2/email.py:329 msgid "Sent news to" @@ -11297,11 +11305,11 @@ msgstr "&SSL" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:143 msgid "WARNING: Using no encryption is highly insecure" -msgstr "" +msgstr "UPOZORENJE: Nekorišćenje enkripcije je veoma nebezbedno" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:144 msgid "&None" -msgstr "" +msgstr "&Nijedna" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:145 msgid "Use Gmail" diff --git a/src/calibre/translations/zh_CN.po b/src/calibre/translations/zh_CN.po index 4149726b30..0f64cb6def 100644 --- a/src/calibre/translations/zh_CN.po +++ b/src/calibre/translations/zh_CN.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" -"POT-Creation-Date: 2010-10-29 19:59+0000\n" -"PO-Revision-Date: 2010-10-29 19:52+0000\n" -"Last-Translator: Kovid Goyal <Unknown>\n" +"POT-Creation-Date: 2010-11-27 20:21+0000\n" +"PO-Revision-Date: 2010-11-28 00:33+0000\n" +"Last-Translator: Jimmie Lin <Unknown>\n" "Language-Team: Simplified Chinese <wanglihao@gmail.com>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-10-30 05:04+0000\n" +"X-Launchpad-Export-Date: 2010-11-28 04:48+0000\n" "X-Generator: Launchpad (build Unknown)\n" "X-Poedit-Country: CHINA\n" "X-Poedit-Language: Chinese\n" @@ -29,11 +29,11 @@ msgstr "不做任何处理" #: /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/books.py:24 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:444 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:448 #: /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:643 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:657 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:401 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 @@ -42,8 +42,8 @@ msgstr "不做任何处理" #: /home/kovid/work/calibre/src/calibre/ebooks/epub/periodical.py:124 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:93 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:95 -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:336 -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:339 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:338 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:341 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1894 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1896 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:24 @@ -57,7 +57,7 @@ msgstr "不做任何处理" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:36 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:61 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:50 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:333 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:357 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:36 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:64 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:66 @@ -76,14 +76,14 @@ msgstr "不做任何处理" #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:78 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:119 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:153 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:611 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:817 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:819 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:627 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:833 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:835 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:911 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:916 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:913 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:918 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:984 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:143 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:150 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:64 @@ -91,7 +91,7 @@ msgstr "不做任何处理" #: /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 +#: /home/kovid/work/calibre/src/calibre/ebooks/pdb/input.py:40 #: /home/kovid/work/calibre/src/calibre/ebooks/pdb/palmdoc/writer.py:29 #: /home/kovid/work/calibre/src/calibre/ebooks/pdb/ztxt/writer.py:27 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/crop.py:82 @@ -111,43 +111,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:239 -#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:241 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:356 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:363 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:277 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:280 +#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:304 +#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:306 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:355 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:362 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:282 #: /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:114 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:139 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:141 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:915 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:924 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1231 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1234 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1039 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1042 #: /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:571 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:186 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:383 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:402 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:925 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1119 +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:244 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:918 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1112 #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:112 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:189 #: /home/kovid/work/calibre/src/calibre/library/cli.py:215 -#: /home/kovid/work/calibre/src/calibre/library/database.py:913 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:399 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:411 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1283 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1387 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2161 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2163 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2295 -#: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:228 +#: /home/kovid/work/calibre/src/calibre/library/database.py:914 +#: /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:1254 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1355 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2151 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2153 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2284 +#: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:229 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:139 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:142 #: /home/kovid/work/calibre/src/calibre/library/server/xml.py:78 @@ -187,27 +187,27 @@ msgstr "用户界面行为" #: /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: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/preferences/main.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:283 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:206 msgid "Preferences" msgstr "首选项" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:17 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:15 msgid "" "Follow all local links in an HTML file and create a ZIP file containing all " "linked files. This plugin is run every time you add an HTML file to the " "library." msgstr "保持所有的 HTML 文件中的超链接并将所有链接的文件放入一个压缩文件内。该插件此后将在添加 HTML 文件到书库时自动运行。" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:53 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:51 msgid "" "Character encoding for the input HTML files. Common choices include: cp1252, " "latin1, iso-8859-1 and utf-8." msgstr "输入 HTML 文件的字符编码。如常用编码:cp1252, latin1, iso-8859-1 和 utf-8。" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:60 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:58 msgid "" "Create a PMLZ archive containing the PML file and all images in the " "directory pmlname_img or images. This plugin is run every time you add a PML " @@ -215,7 +215,7 @@ msgid "" msgstr "" "在 pmlname_img 或 images 目录下创建一个包含 PML 文件及所有图像的 PMLZ 归档。此插件在每次向书库添加 PML 文件时运行。" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:94 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:92 msgid "Extract cover from comic files" msgstr "从漫画文件中提取封面" @@ -262,171 +262,171 @@ msgstr "设置 %s 文件的元数据" msgid "Set metadata from %s files" msgstr "从 %s 文件设置元数据" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:708 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:717 msgid "Look and Feel" msgstr "外表和感受" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:710 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:722 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:733 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:744 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:719 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:731 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:742 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:753 msgid "Interface" msgstr "界面" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:714 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:723 msgid "Adjust the look and feel of the calibre interface to suit your tastes" msgstr "调整成你喜欢的外观" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:720 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:729 msgid "Behavior" msgstr "操作方式" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:726 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:735 msgid "Change the way calibre behaves" msgstr "改变calibre的操作方式" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:731 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:202 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:740 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:209 msgid "Add your own columns" msgstr "增加栏目" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:737 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:746 msgid "Add/remove your own columns to the calibre book list" msgstr "向calibre书籍列表中增加或删除你自定义的栏目" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:742 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:751 msgid "Customize the toolbar" msgstr "自定义工具栏" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:748 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:757 msgid "" "Customize the toolbars and context menus, changing which actions are " "available in each" msgstr "自定义工具栏和上下文菜单,设置它们所可以提供的功能" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:754 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:763 msgid "Input Options" msgstr "输入选项" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:756 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:767 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:778 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:765 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:776 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:787 msgid "Conversion" msgstr "转换" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:760 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 msgid "Set conversion options specific to each input format" msgstr "设置针对特定输入格式的转换选项" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:765 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:774 msgid "Common Options" msgstr "常规选项" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:771 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:780 msgid "Set conversion options common to all formats" msgstr "设置所有输入格式共有的转换选项" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:776 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:785 msgid "Output Options" msgstr "输出选项" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:782 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:791 msgid "Set conversion options specific to each output format" msgstr "设置针对特定输出格式的转换选项" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:787 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:796 msgid "Adding books" msgstr "增加图书" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:789 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:801 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:813 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:825 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:798 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:810 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:822 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:834 msgid "Import/Export" msgstr "导入/导出" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:802 msgid "Control how calibre reads metadata from files when adding books" msgstr "控制向calibre添加书籍时读取元数据的方式" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:799 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:808 msgid "Saving books to disk" msgstr "保存图书到磁盘" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:814 msgid "" "Control how calibre exports files from its database to disk when using Save " "to disk" msgstr "控制使用“保存到磁盘”功能时calibre从数据库导出文件的方式" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:811 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:820 msgid "Sending books to devices" msgstr "发送图书到设备" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:817 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:826 msgid "Control how calibre transfers files to your ebook reader" msgstr "控制calibre将文件传输到电子阅读器的方式" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:823 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:832 msgid "Metadata plugboards" msgstr "元数据控制板" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:829 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:838 msgid "Change metadata fields before saving/sending" msgstr "保存或发送前更改元数据域" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:834 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:843 msgid "Sharing books by email" msgstr "通过Email分享图书" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:836 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:848 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:845 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:857 msgid "Sharing" msgstr "分享" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:840 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:849 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:846 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:855 msgid "Sharing over the net" msgstr "通过网络分享" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:852 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:861 msgid "" "Setup the calibre Content Server which will give you access to your calibre " "library from anywhere, on any device, over the internet" msgstr "设置calibre内容服务器以便通过网络在任何设备和地点访问到calibre书库。" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:859 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:868 msgid "Plugins" msgstr "插件" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:861 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:873 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:884 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:870 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:882 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:893 msgid "Advanced" msgstr "高级" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:865 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:874 msgid "Add/remove/customize various bits of calibre functionality" msgstr "添回/删除/自定义各种calibre功能" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:871 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:880 msgid "Tweaks" msgstr "优化调整" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:877 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:886 msgid "Fine tune how calibre behaves in various contexts" msgstr "微调calibre在各种情况下的行为" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:882 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:891 msgid "Miscellaneous" msgstr "杂项" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:888 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:897 msgid "Miscellaneous advanced configuration" msgstr "其它高级选项" @@ -463,7 +463,7 @@ msgid "" msgstr "如果您不了解输入文件的详情请使用本默认配置文件。" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:59 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:433 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:444 msgid "" "This profile is intended for the SONY PRS line. The 500/505/600/700 etc." msgstr "该配置文件适用所拟 PRS 产品系列。如 500/505/600/700 等。" @@ -473,62 +473,62 @@ msgid "This profile is intended for the SONY PRS 300." msgstr "该配置文件适用索尼 PRS 300。" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:80 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:470 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:484 msgid "This profile is intended for the SONY PRS-900." msgstr "该配置文件适用索尼 PRS-900。" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:88 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:500 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:513 msgid "This profile is intended for the Microsoft Reader." msgstr "该配置文件适用 Microsoft Reader。" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:99 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:511 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:524 msgid "This profile is intended for the Mobipocket books." msgstr "该配置文件适用 Mobipocket 书籍。" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:112 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:524 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:537 msgid "This profile is intended for the Hanlin V3 and its clones." msgstr "该配置文件适用翰林 V3 和类似设备。" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:124 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:536 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:549 msgid "This profile is intended for the Hanlin V5 and its clones." msgstr "该配置文件适用翰林 V5 和类似设备。" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:134 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:544 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:557 msgid "This profile is intended for the Cybook G3." msgstr "该配置文件适用 Cybook G3 设备。" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:147 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:557 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:570 msgid "This profile is intended for the Cybook Opus." msgstr "该配置文件适用 Cybook Opus 设备。" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:159 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:568 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:583 msgid "This profile is intended for the Amazon Kindle." msgstr "该配置文件适用 Amazon Kindle。" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:171 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:609 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:631 msgid "This profile is intended for the Irex Illiad." msgstr "该配置文件适用 Irex Illiad 设备。" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:183 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:622 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:644 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:196 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:636 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:658 msgid "This profile is intended for the IRex Digital Reader 800." msgstr "该配置文件适用 IRex Digital Reader 800。" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:208 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:650 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:672 msgid "This profile is intended for the B&N Nook." msgstr "该配置文件适用 B&N Nook。" @@ -543,38 +543,42 @@ msgid "" "devices." msgstr "若您希望在电脑和设备上阅读文档,请使用本默认配置文件" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:270 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:276 msgid "" "Intended for the iPad and similar devices with a resolution of 768x1024" msgstr "适用于iPad或屏幕分辨率为768x1024的类似设备。" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:424 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:435 msgid "Intended for generic tablet devices, does no resizing of images" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:448 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:462 msgid "This profile is intended for the Kobo Reader." msgstr "该配置文件适用 Kobo Reader。" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:461 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:475 msgid "This profile is intended for the SONY PRS-300." msgstr "该配置文件适用索尼 PRS-300。" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:479 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:493 msgid "This profile is intended for the 5-inch JetBook." msgstr "该配置文件适用 5 英寸 JetBook 设备。" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:488 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:502 msgid "" "This profile is intended for the SONY PRS line. The 500/505/700 etc, in " "landscape mode. Mainly useful for comics." msgstr "该配置文件适用 SONY PRS 产品线,如 500/505/700 型号等,使用横向页面,主要适用于漫画。" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:589 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:609 msgid "This profile is intended for the Amazon Kindle DX." msgstr "该配置文件适用 Amazon Kindle DX。" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:664 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:684 +msgid "This profile is intended for the B&N Nook Color." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:695 msgid "This profile is intended for the Sanda Bambook." msgstr "该配置文件适用于盛大锦书(Bambook)。" @@ -648,13 +652,13 @@ msgstr "禁用该名称插件" msgid "Communicate with Android phones." msgstr "与 Android 手机通信。" -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:53 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:56 msgid "" "Comma separated list of directories to send e-books to on the device. The " "first one that exists will be used" msgstr "逗号间隔的电子书发送到设备的目录列表。将使用第一个存在的目录。" -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:95 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:98 msgid "Communicate with S60 phones." msgstr "与 S60 手机通信。" @@ -685,14 +689,14 @@ msgstr "更新设备元数据列表……" #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:378 #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:947 #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:987 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2949 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2989 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2956 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2996 msgid "%d of %d" msgstr "第%d个(共%d个)" #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:385 #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:992 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2995 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:3002 msgid "finished" msgstr "完成" @@ -722,29 +726,29 @@ msgstr "" "无法转换部分封面图像。\n" "点击“详细信息”查看列表。" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2546 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2553 #: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:444 #: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:467 #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:882 #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:888 #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:918 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:257 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:212 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:225 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2021 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:187 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:200 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2015 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:149 msgid "News" msgstr "新闻" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2547 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2554 #: /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:1984 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2002 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:560 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1978 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1996 msgid "Catalog" msgstr "类目" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2853 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2860 msgid "Communicate with iTunes." msgstr "与iTunes通信。" @@ -766,6 +770,10 @@ msgstr "Kovid Goyal" msgid "Communicate with the Cybook Gen 3 / Opus eBook reader." msgstr "与 通信。" +#: /home/kovid/work/calibre/src/calibre/devices/cybook/driver.py:64 +msgid "Communicate with the Cybook Orizon eBook reader." +msgstr "和 CyBook Orizon eBook 阅读器进行交流" + #: /home/kovid/work/calibre/src/calibre/devices/eb600/driver.py:24 msgid "Communicate with the EB600 eBook reader." msgstr "与 EB600 eBook reader 通信。" @@ -778,6 +786,10 @@ msgstr "与Astak Mentor EB600通信" msgid "Communicate with the PocketBook 301 reader." msgstr "与PocketBook 301阅读器通信。" +#: /home/kovid/work/calibre/src/calibre/devices/eb600/driver.py:233 +msgid "Communicate with the PocketBook 602 reader." +msgstr "和 PocketBook 602 阅读器进行交流" + #: /home/kovid/work/calibre/src/calibre/devices/edge/driver.py:17 msgid "Entourage Edge" msgstr "Entourage Edge" @@ -836,8 +848,8 @@ msgstr "与 SpringDesign Alex 通信。" #: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:102 #: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:113 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:264 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:296 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:268 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:300 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:256 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:274 msgid "Removing books from device..." @@ -924,26 +936,26 @@ msgstr "Kobo目前仅支持一个集合:\"Im_Reading\" 列表。 请创建一 msgid "Getting list of books on device..." msgstr "从设备中获取书籍列表..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:300 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:307 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:304 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:311 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:281 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:286 msgid "Removing books from device metadata listing..." msgstr "将书籍从设备的元数据列表移除中..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:312 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:347 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:316 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:351 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:219 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:250 msgid "Adding books to device metadata listing..." msgstr "将书籍添加到设备的元数据列表中..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:424 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:258 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:428 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:262 msgid "Not Implemented" msgstr "尚未实现" -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:425 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:429 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." @@ -962,29 +974,37 @@ msgid "Communicate with the Sweex MM300" msgstr "与Sweex MM300通信" #: /home/kovid/work/calibre/src/calibre/devices/misc.py:79 +msgid "Communicate with the Digma Q600" +msgstr "和 Digma Q600 阅读器进行交流" + +#: /home/kovid/work/calibre/src/calibre/devices/misc.py:88 msgid "Communicate with the Kogan" msgstr "与 Kogan 通信" -#: /home/kovid/work/calibre/src/calibre/devices/misc.py:87 -#: /home/kovid/work/calibre/src/calibre/devices/misc.py:114 +#: /home/kovid/work/calibre/src/calibre/devices/misc.py:96 +#: /home/kovid/work/calibre/src/calibre/devices/misc.py:123 msgid "Communicate with the Pandigital Novel" msgstr "与Pandigital Novel通信" -#: /home/kovid/work/calibre/src/calibre/devices/misc.py:130 +#: /home/kovid/work/calibre/src/calibre/devices/misc.py:142 msgid "Communicate with the VelocityMicro" msgstr "与VelocityMicro进行通讯" -#: /home/kovid/work/calibre/src/calibre/devices/misc.py:148 +#: /home/kovid/work/calibre/src/calibre/devices/misc.py:160 msgid "Communicate with the GM2000" msgstr "与 GM2000 通信" +#: /home/kovid/work/calibre/src/calibre/devices/misc.py:180 +msgid "Communicate with the Acer Lumiread" +msgstr "和 Acer Lumiread 阅读器进行交流" + #: /home/kovid/work/calibre/src/calibre/devices/nokia/driver.py:17 msgid "Communicate with the Nokia 770 internet tablet." msgstr "与诺基亚 770 网络平板通信。" #: /home/kovid/work/calibre/src/calibre/devices/nokia/driver.py:40 msgid "Communicate with the Nokia 810/900 internet tablet." -msgstr "" +msgstr "和 Nokia 810/900 平板电脑进行交流" #: /home/kovid/work/calibre/src/calibre/devices/nokia/driver.py:74 msgid "Communicate with the Nokia E52" @@ -998,6 +1018,14 @@ msgstr "Nook" msgid "Communicate with the Nook eBook reader." msgstr "与 Nook 通信。" +#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:85 +msgid "Nook Color" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:86 +msgid "Communicate with the Nook Color eBook reader." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:17 msgid "Communicate with the Nuut2 eBook reader." msgstr "与 Nuut2 电子书阅读器通信。" @@ -1883,11 +1911,27 @@ msgstr "" "通常该输入插件将重整源文件文件夹组织结构到标准文件夹组织结构. 如果您了解该如何手动完成此操作, 您可以打开本选项关闭自动文件结构重整, " "错误的操作将会导致整个转换操作队列失败." -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:273 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/output.py:33 +msgid "CSS file used for the output instead of the default file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/html/output.py:36 msgid "" -"Average line length for line breaking if the HTML is from a previous partial " -"conversion of a PDF file. Default is %default which disables this." -msgstr "PDF 文件部分转换为 HTML,在此设定平均换行行宽。默认为 %default  即已禁用。" +"Template used for generation of the html index file instead of the default " +"file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/html/output.py:39 +msgid "" +"Template used for the generation of the html contents of the book instead of " +"the default file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/html/output.py:42 +msgid "" +"Extract the contents of the generated ZIP file to the specified directory. " +"WARNING: The contents of the directory will be deleted." +msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lit/from_any.py:47 msgid "Creating LIT file from EPUB..." @@ -2024,7 +2068,7 @@ msgid "Path to output file" msgstr "输出文件路经" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:290 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:128 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:126 msgid "Verbose processing" msgstr "处理时打印信息" @@ -2189,13 +2233,13 @@ msgstr "是" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:605 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:45 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:102 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:109 #: /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:380 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:930 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:373 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:923 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:303 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:570 msgid "Title" @@ -2204,8 +2248,8 @@ msgstr "标题" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:606 #: /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:385 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:931 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:378 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:924 msgid "Author(s)" msgstr "作者" @@ -2221,37 +2265,36 @@ msgid "Producer" msgstr "出品人" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:609 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:37 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:212 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:39 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:206 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:189 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:104 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:72 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:332 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1138 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:79 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:325 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1131 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:178 msgid "Comments" msgstr "注释" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:611 -#: /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/ebooks/oeb/transforms/jacket.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:29 #: /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:320 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1134 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:313 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1127 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:160 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:618 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:655 msgid "Tags" msgstr "标签" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:613 -#: /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/ebooks/oeb/transforms/jacket.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:28 #: /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:337 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1143 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:330 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1136 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:108 msgid "Series" msgstr "系列" @@ -2261,12 +2304,12 @@ msgid "Language" msgstr "语言" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:616 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1126 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1119 msgid "Timestamp" msgstr "时间戳" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:618 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:151 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:157 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:63 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:70 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:258 @@ -2381,6 +2424,7 @@ msgid "No cover found" msgstr "没有找到封面" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:28 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:44 msgid "Cover download" msgstr "下载图书封面" @@ -2426,49 +2470,53 @@ msgstr "Douban.com API超时。请稍后重试。" msgid "Downloads metadata from Douban.com" msgstr "从豆瓣网(www.douban.com)下载元数据" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:51 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:57 msgid "Metadata download" msgstr "元数据下载" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:128 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:141 msgid "ratings" msgstr "评分" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:128 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:141 msgid "tags" msgstr "标签" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:129 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:142 msgid "description/reviews" msgstr "描述/评论" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:130 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:143 msgid "Download %s from %s" msgstr "下载 %s 来自 %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:156 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:150 +msgid "Convert comments downloaded from %s to plain text" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:178 msgid "Downloads metadata from Google Books" msgstr "从谷歌图书下载元数据" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:173 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:195 msgid "Downloads metadata from isbndb.com" msgstr "从 isbndb.com 下载元数据" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:201 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:223 msgid "" "To use isbndb.com you must sign up for a %sfree account%s and enter your " "access key below." msgstr "您需在 isbndb.com 注册%s免费帐户%s并在之下填写您的访问密钥才能访问。" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:211 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:233 msgid "Downloads social metadata from amazon.com" msgstr "从 amazon.com 下载社会性元数据" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:230 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:254 msgid "Downloads series/tags/rating information from librarything.com" msgstr "从librarything.com下载系列、标签、星级信息。" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:109 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:107 msgid "" "\n" "%prog [options] key\n" @@ -2491,23 +2539,24 @@ msgstr "" "密钥是您在 isbndb.com 注册免费账户时创建的账户密钥。\n" "\n" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:120 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:118 msgid "The ISBN ID of the book you want metadata for." msgstr "待查找书籍的 ISBN ID。" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:122 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:120 msgid "The author whose book to search for." msgstr "待查找书籍的作者。" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:124 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:122 msgid "The title of the book to search for." msgstr "待查找书籍的标题。" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:126 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:124 msgid "The publisher of the book to search for." msgstr "待查找书籍的出版商。" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:77 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:336 msgid " not found." msgstr " 无法找到。" @@ -2524,8 +2573,24 @@ msgstr "" "\n" "从LibraryThing.com为书籍标识符ISBN采集封面图像/社会元数据\n" +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:25 +msgid "Downloads metadata from french Nicebooks" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:41 +msgid "Downloads covers from french Nicebooks" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:332 +msgid "Nicebooks timed out. Try again later." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:337 +msgid "An errror occured with Nicebooks cover fetcher" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1308 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1399 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 msgid "Cover" msgstr "封面" @@ -2560,74 +2625,74 @@ msgstr "标记标签的书籍将被归档为个人文档" msgid "All articles" msgstr "所有文章" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:259 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:262 msgid "This is an Amazon Topaz book. It cannot be processed." msgstr "这是一部 Amazon Topaz 书籍。无法处理。" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1400 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 msgid "Title Page" msgstr "标题页" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 #: /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:199 msgid "Table of Contents" msgstr "目录" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 msgid "Index" msgstr "索引" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 msgid "Glossary" msgstr "词汇表" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 msgid "Acknowledgements" msgstr "致谢" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 msgid "Bibliography" msgstr "参考文献" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 msgid "Colophon" msgstr "末页" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 msgid "Copyright" msgstr "版权" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 msgid "Dedication" msgstr "献辞" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 msgid "Epigraph" msgstr "题辞" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 msgid "Foreword" msgstr "前言" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 msgid "List of Illustrations" msgstr "插图列表" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 msgid "List of Tables" msgstr "表格列表" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 msgid "Notes" msgstr "注释" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1416 msgid "Preface" msgstr "序言" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1417 msgid "Main Text" msgstr "正文" @@ -2635,7 +2700,7 @@ msgstr "正文" msgid "%s format books are not supported" msgstr "不支持 %s 格式电子书" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/cover.py:103 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/cover.py:98 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:156 msgid "Book %s of %s" msgstr "书籍%s/%s" @@ -2644,9 +2709,9 @@ msgstr "书籍%s/%s" msgid "HTML TOC generation options." msgstr "HTML 目录生成选项。" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:153 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:159 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:71 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:616 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:653 msgid "Rating" msgstr "评分" @@ -2676,7 +2741,7 @@ msgstr "脚注" msgid "Sidebar" msgstr "侧边栏" -#: /home/kovid/work/calibre/src/calibre/ebooks/pdb/input.py:22 +#: /home/kovid/work/calibre/src/calibre/ebooks/pdb/input.py:23 #: /home/kovid/work/calibre/src/calibre/ebooks/tcr/input.py:23 #: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:24 msgid "" @@ -2684,7 +2749,7 @@ msgid "" "it will assume that every line represents a paragraph instead." msgstr "一般情况下,Calibre 会将空行识别为段落分隔。而此选项将假定每个空行都代表一个段落。" -#: /home/kovid/work/calibre/src/calibre/ebooks/pdb/input.py:26 +#: /home/kovid/work/calibre/src/calibre/ebooks/pdb/input.py:27 #: /home/kovid/work/calibre/src/calibre/ebooks/tcr/input.py:27 #: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:28 msgid "" @@ -2976,7 +3041,7 @@ msgid "" "Specify the character encoding of the output document. The default is cp1252." msgstr "指定输出文档的字符编码。默认为 cp1252。" -#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:196 +#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:256 msgid "" "This RTF file has a feature calibre does not support. Convert it to HTML " "first and then try it.\n" @@ -3187,7 +3252,7 @@ msgid "Disable UI animations" msgstr "禁用界面动画" #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:183 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:494 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:509 msgid "Copied" msgstr "已复制" @@ -3199,7 +3264,7 @@ msgstr "复制" msgid "Copy to Clipboard" msgstr "复制到剪贴板" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:467 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:466 msgid "Choose Files" msgstr "选择文件" @@ -3247,101 +3312,101 @@ msgstr "多少空白书籍?" msgid "How many empty books should be added?" msgstr "应添加多少空白书籍?" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:143 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:202 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:147 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:206 msgid "Uploading books to device." msgstr "正在上传书籍到设备。" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:164 #: /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:161 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:165 msgid "EPUB Books" msgstr "EPUB 书籍" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:162 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:166 msgid "LRF Books" msgstr "LRF 书籍" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:163 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:167 msgid "HTML Books" msgstr "HTML 书籍" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:168 msgid "LIT Books" msgstr "LIT 书籍" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:169 msgid "MOBI Books" msgstr "MOBI 书籍" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:170 msgid "Topaz books" msgstr "Topaz 书籍" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:171 msgid "Text books" msgstr "文本书籍" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:172 msgid "PDF Books" msgstr "PDF 书籍" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:173 msgid "SNB Books" msgstr "SNB 书籍" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:174 msgid "Comics" msgstr "漫画" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:175 msgid "Archives" msgstr "归档" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:179 msgid "Supported books" msgstr "支持的书j" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:215 msgid "Merged some books" msgstr "合并一些书籍" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:216 msgid "" "Some duplicates were found and merged into the following existing books:" msgstr "找到一些重复内容,并入如下已有书籍:" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:225 msgid "Failed to read metadata" msgstr "无法读取元数据" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:226 msgid "Failed to read metadata from the following" msgstr "无法从下列项目读取元数据" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:241 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:246 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:245 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:250 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:269 msgid "Add to library" msgstr "添加到书库" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:246 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:250 #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:56 #: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:28 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:95 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:119 msgid "No book selected" msgstr "未选择书籍" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:263 msgid "" "The following books are virtual and cannot be added to the calibre library:" msgstr "下列书籍是虚拟的,不能添加到calibre书库中。" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:269 msgid "No book files found" msgstr "未找到书籍文件" @@ -3354,7 +3419,7 @@ msgid "Add books to your calibre library from the connected device" msgstr "从连接的设备添加书籍到你的calibre书库" #: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:536 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:542 msgid "Fetch annotations (experimental)" msgstr "抓取注释(实验功能)" @@ -3451,7 +3516,7 @@ msgid "Checking database integrity" msgstr "检查数据库完整性" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:128 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:645 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:593 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:41 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:54 msgid "Error" @@ -3467,15 +3532,15 @@ msgstr "找到部分不一致" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:135 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 "下列书籍使用格式曾经在数据库中,现已不可用。格式项被移除。您需手动检查。这可能是由于您直接在 library 文件夹操作文件引起的。" +"The following books had formats or covers listed in the database that are " +"not actually available. The entries for the formats/covers 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/actions/choose_library.py:148 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:51 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:139 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:162 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:112 msgid "%d books" msgstr "%d本书" @@ -3613,7 +3678,7 @@ msgstr "在%s中无法找到现有的caliber书库。它将被从已知书库列 #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:391 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:734 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:742 msgid "Not allowed" msgstr "不允许" @@ -3645,6 +3710,10 @@ msgstr "无法转换" msgid "Starting conversion of %d book(s)" msgstr "开始转换 %d 本书" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:170 +msgid "Empty output file, probably the conversion process crashed" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:83 msgid "Copy to library" msgstr "复制到书库" @@ -3679,9 +3748,9 @@ msgid "Could not copy books: " msgstr "无法复制书籍: " #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:147 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:708 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:679 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:664 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:687 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:190 msgid "Failed" msgstr "失败" @@ -3742,14 +3811,14 @@ msgid "Main memory" msgstr "主内存" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:473 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:482 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:467 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:476 msgid "Storage Card A" msgstr "存储卡A" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:475 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:484 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:469 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:478 msgid "Storage Card B" msgstr "存储卡B" @@ -3890,7 +3959,7 @@ msgid "covers" msgstr "封面" #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:96 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:224 msgid "metadata" msgstr "元数据" @@ -3912,31 +3981,26 @@ msgstr "无法合并书籍" msgid "At least two books must be selected for merging" msgstr "合并需要选定至少两本书籍" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:196 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:197 msgid "" "Book formats and metadata from the selected books will be added to the " -"<b>first selected book.</b> ISBN will <i>not</i> be merged.<br><br> The " +"<b>first selected book</b> (%s). ISBN will <i>not</i> be merged.<br><br> The " "second and subsequently selected books will not be deleted or " "changed.<br><br>Please confirm you want to proceed." msgstr "" -"选定书籍的格式和元数据将被添加到<b>第一本选定书籍。</b>ISBN<i>不会</i>被合并。<br><br> \r\n" -"第二本和随后的选定书籍将不会被删除或更改。 <br><br>如果要继续的话请先确认。" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:209 msgid "" "Book formats and metadata from the selected books will be merged into the " -"<b>first selected book</b>. ISBN will <i>not</i> be merged.<br><br>After " -"merger the second and subsequently selected books will be <b>deleted</b>. " -"<br><br>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 <b>deleted</b> from your computer.<br><br> Are you <b>sure</b> " -"you want to proceed?" +"<b>first selected book</b> (%s). ISBN will <i>not</i> be " +"merged.<br><br>After merger the second and subsequently selected books will " +"be <b>deleted</b>. <br><br>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 <b>deleted</b> from your computer.<br><br> Are " +"you <b>sure</b> you want to proceed?" msgstr "" -"选定书籍的格式和元数据将会被合并进<b>第一本选定书籍</b>中。ISBN<i>不会</i> " -"被合并。<br><br>合并后,选定的第二本书籍及随后的书籍将会被<b>删除</b>。<br><br>选定的第一本书籍的所有书籍格式都会被保留下来,而选定" -"书籍的第二本和随后的书籍的重复格式都将从你电脑上永久<b>删除</b>。<br><br>你<b>确定</b>要继续吗?" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:222 msgid "" "You are about to merge more than 5 books. Are you <b>sure</b> you want to " "proceed?" @@ -3983,6 +4047,7 @@ msgid "Ctrl+P" msgstr "Ctrl+P" #: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:23 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:200 msgid "Run welcome wizard" msgstr "运行欢迎向导" @@ -4068,7 +4133,7 @@ msgid "Click the show details button to see which ones." msgstr "点击显示详情按钮查看具体哪些。" #: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:16 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:623 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:660 msgid "Show book details" msgstr "显示书籍详情" @@ -4155,21 +4220,21 @@ msgstr "查看" msgid "View specific format" msgstr "查看特定格式" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:95 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:156 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:158 msgid "Cannot view" msgstr "无法查看" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:100 #: /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:109 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:108 msgid "Multiple Books Selected" msgstr "选定多本书籍" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:109 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 " @@ -4177,11 +4242,11 @@ msgid "" "continue?" msgstr "您正在试图打开 %d 本书籍。同时打开太多书籍可能会变慢,并对电脑响应速度有消极影响。一旦开始,需等待进程完成。是否继续?" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:118 msgid "Cannot open folder" msgstr "无法打开文件夹" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:157 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:159 msgid "%s has no available formats." msgstr "%s 无可用格式。" @@ -4206,7 +4271,7 @@ msgid "The specified directory could not be processed." msgstr "无法处理指定目录。" #: /home/kovid/work/calibre/src/calibre/gui2/add.py:229 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:857 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:813 msgid "No books" msgstr "没有书籍" @@ -4391,49 +4456,49 @@ msgid "" "&Multiple books per folder, assumes every ebook file is a different book" msgstr "每个文件夹中放多本书籍,假定个电子书文件是不同的书籍" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:23 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:47 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:56 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:313 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:119 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:120 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:121 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:131 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:25 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:405 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:137 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:327 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1124 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:320 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1117 msgid "Path" msgstr "路径" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:24 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:50 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:122 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:123 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:124 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:127 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:326 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:319 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/emailp.py:24 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:117 msgid "Formats" msgstr "格式" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:25 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:934 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1127 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:927 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1120 msgid "Collections" msgstr "集合" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:49 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:51 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:60 msgid "Click to open" msgstr "点击打开" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:50 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:319 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:325 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:331 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1133 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1137 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:312 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:318 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1126 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1130 #: /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 @@ -4441,9 +4506,9 @@ msgstr "点击打开" msgid "None" msgstr "无" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:312 -msgid "Click to open Book Details window" -msgstr "点击打开书籍详情窗口" +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:404 +msgid "Double-click to open Book Details window" +msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex.py:16 msgid "BibTeX Options" @@ -4486,7 +4551,7 @@ msgstr "输出" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:86 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml_ui.py:42 -#: /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:82 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_tab_template_ui.py:32 #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:93 #: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:54 @@ -4529,7 +4594,7 @@ msgstr "输出" #: /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:112 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:123 msgid "Form" msgstr "来自" @@ -4615,23 +4680,23 @@ msgstr "CSV/XML 选项" msgid "E-book options" 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:83 msgid "'Don't include this book' tag:" 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:84 msgid "'Mark this book as read' tag:" msgstr "\"标记已读\"标签:" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:79 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:85 msgid "Additional note tag prefix:" msgstr "附加笔记标签前缀:" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:86 msgid "Regex pattern describing tags to exclude as genres:" msgstr "正则表达式描述标签,以排除体裁:" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:87 msgid "" "Regex tips:\n" "- The default regex - \\[.+\\] - excludes genre tags of the form [tag], " @@ -4640,26 +4705,43 @@ msgid "" "Genre Section" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:90 msgid "Include 'Titles' Section" msgstr "包含\"标题\"部分" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:91 msgid "Include 'Recently Added' Section" msgstr "包含\"最近添加\"部分" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:92 msgid "Sort numbers as text" msgstr "将数字做文本处理" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:87 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:93 msgid "Include 'Series' Section" msgstr "包含'系列'节" +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:94 +msgid "Wishlist tag:" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_tab_template_ui.py:33 msgid "Tab template for catalog.ui" msgstr "catalog.ui 的 Tab 模板" +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:25 +msgid "Bold" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:26 +msgid "Italic" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:28 +msgid "Underline" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:36 msgid "" "For settings that cannot be specified in this dialog, use the values saved " @@ -4667,11 +4749,11 @@ msgid "" "specified in the Preferences" msgstr "对于不能在此对话框中指定的选项,使用前一个转换(若存在)中存储的值,而非首选项中的默认设置。" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:70 msgid "Bulk Convert" msgstr "批量转换" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:83 #: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:185 msgid "Options specific to the output format." msgstr "设置输出格式选项" @@ -5118,7 +5200,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:333 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:336 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:377 msgid "&Author(s): " msgstr "作者(&A): " @@ -5134,7 +5216,7 @@ 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:342 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:345 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:388 msgid "&Publisher: " msgstr "出版商(&P): " @@ -5145,7 +5227,7 @@ msgid "Ta&gs: " msgstr "标签(&g): " #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:184 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:344 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:347 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:390 msgid "" "Tags categorize the book. This is particularly useful while searching. " @@ -5153,15 +5235,16 @@ msgid "" msgstr "电子书籍的分类标签. 此标签对于数字搜索非常有用. <br><br>该标签可以是词语或短语, 使用逗号分隔." #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:185 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:351 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:354 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:214 msgid "&Series:" msgstr "系列(&S):" #: /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:352 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:353 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:355 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:356 #: /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:395 msgid "List of known series. You can add new series." @@ -5340,7 +5423,7 @@ msgid "Options specific to the input format." msgstr "仅针对特定输入格式的选项。" #: /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/book_info_ui.py:76 #: /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" @@ -5533,8 +5616,8 @@ msgid "Force maximum line length" msgstr "约束最大行长" #: /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/book_info_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:78 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:46 #: /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 @@ -5673,7 +5756,7 @@ msgid "Automatically number books" msgstr "为书籍自动编号" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:499 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:364 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:367 msgid "Force numbers to start with " msgstr "从 强制开始编号 " @@ -5689,228 +5772,171 @@ msgstr "要添加的标签" msgid "tags to remove" msgstr "要移除的标签" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:44 #: /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:189 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:183 msgid "Device no longer connected." msgstr "设备未连接。" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:307 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:301 msgid "Get device information" msgstr "获取设备信息" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:318 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:312 msgid "Get list of books on device" msgstr "获取设备书籍列表" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:328 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:322 msgid "Get annotations from device" msgstr "从设备抓取注释" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:340 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:334 msgid "Send metadata to device" msgstr "传输元数据到设备上" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:345 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:339 msgid "Send collections to device" msgstr "发送收藏品到设备" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:374 msgid "Upload %d books to device" msgstr "上传 %d 本书到设备" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:389 msgid "Delete books from device" msgstr "从设备上删除书籍" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:412 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:406 msgid "Download books from device" msgstr "从设备上下载书籍" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:422 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:416 msgid "View book on device" msgstr "查看设备上的书籍" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:456 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:450 msgid "Set default send to device action" msgstr "设置传送到设备的默认动作" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:462 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:456 msgid "Send to main memory" msgstr "传送到主内存" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:464 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:458 msgid "Send to storage card A" msgstr "发送到存储卡 A" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:466 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:460 msgid "Send to storage card B" msgstr "发送到存储卡 B" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:471 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:480 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:465 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:474 msgid "Main Memory" msgstr "主内存" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:491 -msgid "Send and delete from library" -msgstr "发送并从书库中删除" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:492 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:486 msgid "Send specific format to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:487 +msgid "Send and delete from library" +msgstr "发送并从书库中删除" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:530 msgid "Eject device" msgstr "安全移除设备" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:646 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:594 msgid "Error communicating with device" msgstr "与设备通信发生错误" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:667 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:605 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1089 +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:296 +msgid "No suitable formats" +msgstr "无合适格式" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:623 msgid "Select folder to open as device" msgstr "选择一个将做为设备打开的文件夹" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:714 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:670 msgid "Error talking to device" msgstr "设备通讯错误。" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:715 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:671 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:758 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:714 msgid "Device: " msgstr "设备: " -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:760 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:716 msgid " detected." msgstr " 被检测到。" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:858 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:814 msgid "selected to send" msgstr "选择传送" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:863 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:819 msgid "Choose format to send to device" msgstr "选择传送到设备的格式" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:872 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:828 msgid "No device" msgstr "无设备" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:873 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:829 msgid "Cannot send: No device is connected" msgstr "无法传送:无连接设备" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:876 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:880 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:832 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:836 msgid "No card" msgstr "无卡" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:877 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:881 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:833 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:837 msgid "Cannot send: Device has no storage card" msgstr "无法传送:设备中无储存卡" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:922 -msgid "E-book:" -msgstr "电子书:" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:925 -msgid "Attached, you will find the e-book" -msgstr "已添加, 您可以从中获取电子书籍" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:926 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:107 -msgid "by" -msgstr "由" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:927 -msgid "in the %s format." -msgstr "使用 %s 格式." - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:940 -msgid "Sending email to" -msgstr "正在发送邮件至" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:970 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:978 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1071 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1156 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1275 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1283 -msgid "No suitable formats" -msgstr "无合适格式" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:971 -msgid "Auto convert the following books before sending via email?" -msgstr "在发送电子邮件之前自动转换下列书籍?" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:979 -msgid "" -"Could not email the following books as no suitable formats were found:" -msgstr "由于无法找到合适的文件格式无法通过电子邮件发送下列书籍:" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:997 -msgid "Failed to email books" -msgstr "发送电子书籍失败" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:998 -msgid "Failed to email the following books:" -msgstr "无法通过电子邮件发送以下书籍:" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1002 -msgid "Sent by email:" -msgstr "已通过邮件发送:" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1030 -msgid "News:" -msgstr "新闻:" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1031 -msgid "Attached is the" -msgstr "附加" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1042 -msgid "Sent news to" -msgstr "将新闻发送到" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1072 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1157 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1276 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:883 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:966 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1083 msgid "Auto convert the following books before uploading to the device?" msgstr "上传到设备之前自动转换如下书籍?" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1102 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:912 msgid "Sending catalogs to device." msgstr "正在发送类目到设备。" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1189 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:997 msgid "Sending news to device." msgstr "将新闻传送到设备." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1242 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1050 msgid "Sending books to device." msgstr "传送书籍到设备。" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1284 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1090 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:1348 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1154 msgid "No space on device" msgstr "设备存储空间不足" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1349 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1155 msgid "" "<p>Cannot upload books to device there is no more free space available " msgstr "<p>由于设备存储空间不足无法将书籍传送到设备上 " @@ -5953,25 +5979,26 @@ msgstr "按ISBN号添加书籍" msgid "" "<p>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 " -"metadata and covers for them.<p>Any invalid ISBNs in the list will be " -"ignored." +"metadata and covers for them.</p>\n" +"<p>Any invalid ISBNs in the list will be ignored.</p>\n" +"<p>You can also specify a file that will be added with each ISBN. To do this " +"enter the full path to the file after a <code>>></code>. For example:</p>\n" +"<p><code>9788842915232 >> %s</code></p>" msgstr "" -"<p>在左边的文本框中输入一组ISBN号,每行一个。calibre将为他们自动创建相应的书籍项,并从网络下载书籍元数据和封面。<p>错误的ISBN号会被忽" -"略。" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:53 msgid "&Paste from clipboard" msgstr "从剪贴板粘贴(&P)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:80 msgid "Fit &cover within view" msgstr "封面以适合屏幕大小显示(&C)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:81 msgid "&Previous" msgstr "上一个(&P)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:82 msgid "&Next" msgstr "下一个(&N)" @@ -6021,21 +6048,32 @@ msgstr "复到到剪贴板(&T)" msgid "Names to ignore:" msgstr "要忽略的名称:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:59 +msgid "" +"Enter comma-separated standard file name wildcards, such as synctoy*.dat" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:62 msgid "Extensions to ignore" msgstr "要忽略的扩展名" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:67 +msgid "" +"Enter comma-separated extensions without a leading dot. Used only in book " +"folders" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:119 msgid "Path from library" msgstr "书库的路径" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:119 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/bookmarkmanager.py:89 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:225 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:248 msgid "Name" msgstr "名称" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:136 msgid "" "The marked files and folders will be <b>permanently deleted</b>. Are you " "sure?" @@ -6082,7 +6120,7 @@ msgid "No location selected" msgstr "没有选择位置" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:84 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:635 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:654 msgid "Bad location" msgstr "错误的位置" @@ -6123,6 +6161,7 @@ msgid "Set options for converting %s" msgstr "设置转换 %s 的选项" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:211 msgid "&Title:" msgstr "标题(&T);" @@ -6158,7 +6197,7 @@ 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:932 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:925 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:31 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:294 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:569 @@ -6166,7 +6205,7 @@ 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:1123 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1116 msgid "Format" msgstr "格式" @@ -6179,12 +6218,12 @@ msgid "Author sort" msgstr "按作者排序" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:115 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:590 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:597 msgid "Invalid author name" msgstr "无效的作者名" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:591 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:598 msgid "Author names cannot contain & characters." msgstr "作者名中不能包含&符号" @@ -6329,59 +6368,58 @@ msgstr "查找/替换" msgid "Working" msgstr "执行中" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:186 #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:386 msgid "Lower Case" msgstr "小写" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:187 #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:385 msgid "Upper Case" msgstr "大写" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:188 #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:388 msgid "Title Case" msgstr "标题大写" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:191 msgid "Character match" msgstr "字符匹配" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:190 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:192 msgid "Regular Expression" msgstr "正则表达式" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:193 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:195 msgid "Replace field" msgstr "替换字段" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:194 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:196 msgid "Prepend to field" msgstr "前置到字段" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:195 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:197 msgid "Append to field" msgstr "追加到字段" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:208 msgid "Editing meta information for <b>%d books</b>" msgstr "正在为<b>%d本书</b>编辑元信息" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:261 msgid "Book %d:" msgstr "书籍%d:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:276 msgid "" "<b>You can destroy your library using this feature.</b> Changes are " -"permanent. There is no undo function. This feature is experimental, and " -"there may be bugs. You are strongly encouraged to back up your library " -"before proceeding.<p>Search and replace in text fields using character " -"matching or regular expressions. " +"permanent. There is no undo function. You are strongly encouraged to back up " +"your library before proceeding.<p>Search and replace in text fields using " +"character matching or regular expressions. " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:284 msgid "" "In character mode, the field is searched for the entered search text. The " "text is replaced by the specified replacement text everywhere it is found in " @@ -6391,7 +6429,7 @@ msgid "" "text will match both upper- and lower-case letters" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:295 msgid "" "In regular expression mode, the search text is an arbitrary python-" "compatible regular expression. The replacement text can contain " @@ -6406,30 +6444,30 @@ msgid "" "function." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:436 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:440 msgid "You must specify a destination when source is a composite field" msgstr "当源是复合域时,你必须指定一个目标。" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:528 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:536 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:627 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:532 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:540 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:635 msgid "Search/replace invalid" msgstr "查找/替换无效" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:529 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:533 msgid "" "Authors cannot be set to the empty string. Book title %s not processed" msgstr "作者处不能设置为空字串。标题为%s的书籍未作处理" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:537 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:541 msgid "Title cannot be set to the empty string. Book title %s not processed" msgstr "标题不能设置为空字串。标题为%s的书籍未作处理" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:628 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:636 msgid "Search pattern is invalid: %s" msgstr "以下搜索模式是无效的:%s" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:665 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:673 msgid "" "Applying changes to %d books.\n" "Phase {0} {1}%%." @@ -6437,81 +6475,81 @@ msgstr "" "正在应用更改到%d本书籍。\n" "暂停{0} {1}%%。" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:332 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:335 msgid "Edit Meta information" msgstr "编辑元信息" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:334 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:337 msgid "A&utomatically set author sort" msgstr "自动设置作者排序(&u)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:335 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:338 msgid "Author s&ort: " msgstr "作者排序(&O): " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:336 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:339 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles." msgstr "指定如何按书籍作者姓名排序。如 Charles Dickens 会被作为 Dickens, Charles 进行排序。" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:337 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:340 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384 msgid "&Rating:" msgstr "星级(&R):" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:338 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:339 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:342 #: /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 msgid "Rating of this book. 0-5 stars" msgstr "为该书评分。0-5 星" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:340 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:343 msgid "No change" msgstr "无变更" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:344 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:387 msgid " stars" msgstr " 星" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:343 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:346 msgid "Add ta&gs: " msgstr "添加标签(&G): " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:345 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:346 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:348 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:349 #: /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:392 msgid "Open Tag Editor" msgstr "打开标签编辑器" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:347 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:350 msgid "&Remove tags:" msgstr "移除标签(&R):" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:348 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:351 msgid "Comma separated list of tags to remove from the books. " msgstr "删除多个标签, 标签列表由逗号分割. " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:349 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:352 msgid "Check this box to remove all tags from the books." msgstr "勾选此框将从书籍中移除所有标签。" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:350 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:353 msgid "Remove all" msgstr "全部移除" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:354 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:357 msgid "If checked, the series will be cleared" msgstr "如果勾选了,系列将被清除" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:355 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:358 msgid "Clear series" msgstr "清除系列" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:356 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:359 msgid "" "If not checked, the series number for the books will be set to 1.\n" "If checked, selected books will be automatically numbered, in the order\n" @@ -6519,110 +6557,110 @@ 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:360 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:363 msgid "Automatically number books in this series" msgstr "为此系列自动数字排序" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:361 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:364 msgid "" "Series will normally be renumbered from the highest number in the database\n" "for that series. Checking this box will tell calibre to start numbering\n" "from the value in the box" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:365 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:368 msgid "Remove &format:" msgstr "移除格式(&F):" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:366 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:369 msgid "&Swap title and author" msgstr "对调作者和书名(&W)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:367 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:370 msgid "" "Force the title to be in title case. If both this and swap authors are " "checked,\n" "title and author are swapped before the title case is set" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:369 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:372 msgid "Change title to title case" msgstr "更改标题为大写标题" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:370 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:373 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:373 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:376 msgid "Remove &stored conversion settings for the selected books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:374 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:377 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:424 msgid "&Basic metadata" msgstr "基本元数据(&B)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:375 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:378 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:425 msgid "&Custom metadata" msgstr "自定义元数据(&C)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:379 msgid "Search &field:" msgstr "查找范围(&F):" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:377 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:380 msgid "The name of the field that you want to search" msgstr "你要进行查找的范围的名称" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:378 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:381 msgid "Search mode:" msgstr "查找模式:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:379 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:382 msgid "" "Choose whether to use basic text matching or advanced regular expression " "matching" msgstr "选择是否使用基本文本匹配或高级下面正则表达式匹配" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:383 msgid "&Search for:" msgstr "搜索(&S):" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:381 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:384 msgid "" "Enter the what you are looking for, either plain text or a regular " "expression, depending on the mode" msgstr "输入你要查找的内容,可以是纯文本或正则表达式,取决于你所用的模式" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:382 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:385 msgid "" "Check this box if the search string must match exactly upper and lower case. " "Uncheck it if case is to be ignored" msgstr "请勾选此框,如果你查找的字串需要精确区分大小写的话。不勾选则表示忽略大小写" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:383 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:386 msgid "Case sensitive" msgstr "区分大小写" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:387 msgid "&Replace with:" msgstr "替换为(&R):" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:385 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:388 msgid "" "The replacement text. The matched search text will be replaced with this " "string" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:386 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:389 msgid "Apply function after replace:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:387 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:390 msgid "" "Specify how the text is to be processed after matching and replacement. In " "character mode, the entire\n" @@ -6630,50 +6668,50 @@ msgid "" "processed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:389 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:392 msgid "&Destination field:" msgstr "目标区(&D):" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:390 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:393 msgid "" "The field that the text will be put into after all replacements. If blank, " "the source field is used." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:391 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:394 msgid "Mode:" msgstr "模式:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:392 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:395 msgid "Specify how the text should be copied into the destination." msgstr "指定文本要如何复制到目标。" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:393 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:396 msgid "" "If the replace mode is prepend or append, then this box indicates whether a " "comma or\n" "nothing should be put between the original text and the inserted text" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:398 msgid "use comma" msgstr "使用逗号" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:396 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:399 msgid "Test &text" msgstr "测试文本(&T)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:397 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:400 msgid "Test re&sult" msgstr "测试结果(&S)" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:398 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:401 msgid "Your test:" msgstr "测试内容:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:399 -msgid "&Search and replace (experimental)" -msgstr "查找和替换(&S)(实验功能)" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:402 +msgid "&Search and replace" +msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:91 msgid "Last modified: %s" @@ -6941,20 +6979,21 @@ msgstr "需要密码" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:63 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:217 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:125 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:133 msgid "&Username:" msgstr "用户名(&U):" #: /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:124 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:135 msgid "&Password:" msgstr "密码(&P):" #: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:167 msgid "&Show password" msgstr "显示密码(&S)" @@ -7182,56 +7221,52 @@ msgstr "<p>不符合此条件。即仅列出<b>不</b>符合该条件的项目 msgid "Negate" msgstr "条件否" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:198 msgid "Advanced Search" msgstr "高级搜索" -#: /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:120 -msgid "&All these words:" -msgstr "所有下列关键字(&A):" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:121 -msgid "This exact &phrase:" -msgstr "精确匹配关键字(&P):" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:122 -msgid "&One or more of these words:" -msgstr "包含一个或多个下列关键字(&O):" - -#: /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:124 -msgid "Any of these &unwanted words:" -msgstr "搜索结果不包含任何以下关键字(&U):" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:199 msgid "What kind of match to use:" msgstr "使用何种匹配:" -#: /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:200 +msgid "Contains: the word or phrase matches anywhere in the metadata field" +msgstr "" -#: /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:201 +msgid "Equals: the word or phrase must match the entire metadata field" +msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:202 msgid "" -"Regular expression: the expression must match anywhere in the metadata" -msgstr "正则表达式:表达式必须与元数据中所有内容寻求匹配" +"Regular expression: the expression must match anywhere in the metadata field" +msgstr "" -#: /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:203 +msgid "Find entries that have..." +msgstr "搜索包含..." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:204 +msgid "&All these words:" +msgstr "所有下列关键字(&A):" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:205 +msgid "This exact &phrase:" +msgstr "精确匹配关键字(&P):" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:206 +msgid "&One or more of these words:" +msgstr "包含一个或多个下列关键字(&O):" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:207 +msgid "But dont show entries that have..." +msgstr "搜索结果不包含..." + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:208 +msgid "Any of these &unwanted words:" +msgstr "搜索结果不包含任何以下关键字(&U):" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:209 msgid "" "See the <a href=\"http://calibre-ebook.com/user_manual/gui.html#the-search-" "interface\">User Manual</a> for more help" @@ -7239,6 +7274,47 @@ msgstr "" "参见<a href=\"http://calibre-ebook.com/user_manual/gui.html#the-search-" "interface\">用户手册</a>获取更多帮助" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:210 +msgid "A&dvanced Search" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:212 +msgid "Enter the title." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:213 +msgid "&Author:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:215 +msgid "Ta&gs:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:216 +msgid "Enter an author's name. Only one author can be used." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:217 +msgid "" +"Enter a series name, without an index. Only one series name can be used." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:218 +msgid "Enter tags separated by spaces" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:219 +msgid "&Clear" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:220 +msgid "Search only in specific fields:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:221 +msgid "Titl&e/Author/Series ..." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/select_formats.py:45 msgid "Choose formats" msgstr "选择格式" @@ -7366,12 +7442,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:580 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:587 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:581 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:588 msgid "An item cannot be set to nothing. Delete it instead." msgstr "项目不能设置为什么也没有。请删除之。" @@ -7452,7 +7528,7 @@ msgid "Discard changes" msgstr "放弃更改" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:60 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:225 msgid "&Cancel" msgstr "取消(&C)" @@ -7649,6 +7725,60 @@ msgstr "" msgid "Recipe source code (python)" msgstr "订阅清单源代码(python)" +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:145 +msgid "Email %s to %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:187 +msgid "News:" +msgstr "新闻:" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:189 +msgid "Attached is the %s periodical downloaded by calibre." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:242 +msgid "E-book:" +msgstr "电子书:" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:245 +msgid "Attached, you will find the e-book" +msgstr "已添加, 您可以从中获取电子书籍" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:246 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:107 +msgid "by" +msgstr "由" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:247 +msgid "in the %s format." +msgstr "使用 %s 格式." + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:260 +msgid "Sending email to" +msgstr "正在发送邮件至" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:290 +msgid "Auto convert the following books before sending via email?" +msgstr "在发送电子邮件之前自动转换下列书籍?" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:297 +msgid "" +"Could not email the following books as no suitable formats were found:" +msgstr "由于无法找到合适的文件格式无法通过电子邮件发送下列书籍:" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:303 +msgid "Failed to email book" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:306 +msgid "sent" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:329 +msgid "Sent news to" +msgstr "将新闻发送到" + #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:112 msgid "" "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" " @@ -7842,23 +7972,23 @@ msgstr "无法在与设备通信时中止任务" msgid "Job has already run" msgstr "任务已执行" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:251 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:262 msgid "Unavailable" msgstr "不可用" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:294 msgid "Jobs:" msgstr "任务:" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:296 msgid "Shift+Alt+J" msgstr "Shift+Alt+J" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:302 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:313 msgid "Click to see list of jobs" msgstr "点击查看任务列表" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:371 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:382 msgid " - Jobs" msgstr " - 任务" @@ -7884,7 +8014,7 @@ msgid "Show books in the main memory of the device" msgstr "显示设备主内存中的书籍" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:67 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:848 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:820 msgid "Card A" msgstr "存储卡A" @@ -7893,7 +8023,7 @@ msgid "Show books in storage card A" msgstr "显示存储卡A中的书籍" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:69 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:850 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:822 msgid "Card B" msgstr "存储卡B" @@ -7905,38 +8035,46 @@ msgstr "显示存储卡B中的书籍" msgid "available" msgstr "可用" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:159 msgid "" "Books display will be restricted to those matching the selected saved search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:170 +msgid "Shift+Ctrl+F" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:173 msgid "Advanced search" msgstr "高级搜索" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:173 -msgid "&Search:" -msgstr "搜索(&S):" - -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:178 msgid "" "<p>Search the list of books by title, author, publisher, tags, comments, " "etc.<br><br>Words separated by spaces are ANDed" msgstr "<p>用标题、作者、出版商、标签、注释等搜索书籍列表<br><br>空格间隔关键词视为且(AND)关系" +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:181 +msgid "&Go!" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:187 +msgid "Do Quick Search (you can also press the Enter key)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:193 msgid "Reset Quick Search" msgstr "重置快速搜索" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:199 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:205 msgid "Copy current search text (instead of search name)" msgstr "复制当前搜索结果列表项至搜索栏" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:205 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:211 msgid "Save current search under the name shown in the box" msgstr "保存当前搜索结果" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:217 msgid "Delete current saved search" msgstr "删除当前已存搜索" @@ -7958,79 +8096,82 @@ msgstr "" msgid "Size (MB)" msgstr "大小 (MB)" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:338 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1143 -msgid "Book <font face=\"serif\">%s</font> of %s." -msgstr "书籍 <font face=\"serif\">%s</font> 中 %s." +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:331 +msgid "Book %s of %s." +msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:700 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1243 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:407 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:693 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1236 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:414 msgid "The lookup/search name is \"{0}\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:706 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1245 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:699 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1238 msgid "This book's UUID is \"{0}\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:929 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:922 msgid "In Library" msgstr "在书库中" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:933 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:926 msgid "Size" msgstr "大小" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1223 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1136 +msgid "Book <font face=\"serif\">%s</font> of %s." +msgstr "书籍 <font face=\"serif\">%s</font> 中 %s." + +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1216 msgid "Marked for deletion" msgstr "为删除作的标记" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1226 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1219 msgid "Double click to <b>edit</b> me<br><br>" msgstr "双击<b>编辑</b>该项<br><br>" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:140 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:147 msgid "Hide column %s" msgstr "隐藏 %s 列" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:145 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:152 msgid "Sort on %s" msgstr "按%s排序" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:146 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:153 msgid "Ascending" msgstr "升序" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:156 msgid "Descending" msgstr "降序" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:168 msgid "Change text alignment for %s" msgstr "更改 %s 的文本对齐方式" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:163 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 msgid "Left" msgstr "左对齐" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:163 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 msgid "Right" msgstr "右键" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:171 msgid "Center" msgstr "居中" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:183 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:190 msgid "Show column" msgstr "显示列" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:195 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:202 msgid "Restore default layout" msgstr "恢复默认布局" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:735 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:743 msgid "" "Dropping onto a device is not supported. First add the book to the calibre " "library." @@ -8061,7 +8202,7 @@ msgid "<b>No matches</b> for the search phrase <i>%s</i> were found." msgstr "<b>无结果项</b> 匹配关键词 <i>%s</i> 被找到." #: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:160 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:442 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:446 msgid "No matches found" msgstr "无匹配项" @@ -8078,12 +8219,12 @@ msgid "LRF Viewer toolbar" msgstr "LRF 查看程序工具栏" #: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:131 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:487 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:503 msgid "Next Page" msgstr "下一页" #: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:132 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:488 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:504 msgid "Previous Page" msgstr "上一页" @@ -8127,7 +8268,7 @@ msgid "Do not check for updates" msgstr "不检测更新" #: /home/kovid/work/calibre/src/calibre/gui2/main.py:58 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:643 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:662 msgid "Calibre Library" msgstr "Calibre 书库" @@ -8254,37 +8395,37 @@ msgstr "书籍既没有标题也没有 ISBN 编号" msgid "No matches found for this book" msgstr "未找到匹配此书信息" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:190 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:191 msgid "Failed to download metadata" msgstr "下载元数据失败" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:224 msgid "cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:225 msgid "Downloaded" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:225 msgid "Failed to get" msgstr "无法获取" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:229 msgid "%s %s for: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:284 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:288 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:162 msgid "Done" msgstr "完成" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:289 msgid "Successfully downloaded metadata for %d out of %d books" msgstr "成功下载%d本书的元数据(共%d本)" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:287 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:622 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:291 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:659 msgid "Details" msgstr "" @@ -8780,39 +8921,39 @@ msgstr "在图标下显示文本(&T):" msgid "&Split the toolbar into two toolbars" msgstr "把工具栏分割成两栏(&S)" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:222 msgid "&Apply" msgstr "应用(&A)" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:229 msgid "Restore &defaults" msgstr "恢复默认值(&D)" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:230 msgid "Save changes" msgstr "保存改动" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:231 msgid "Cancel and return to overview" msgstr "取消并返回到上一页" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:269 msgid "Restoring to defaults not supported for" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:304 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 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:307 msgid "" "The changes you have made require calibre be restarted immediately. You will " "not be allowed set any more preferences, until you restart." msgstr "您所做的改动要求立即重启calibre。在重启之前,您不能再做其它任何设置。" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:302 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:312 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server.py:120 msgid "Restart needed" msgstr "需要重启" @@ -9122,7 +9263,7 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server.py:75 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:320 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:331 msgid "Failed to start content server" msgstr "无法启动内容服务器" @@ -9320,24 +9461,25 @@ msgid "&Current tweaks" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:97 -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:270 #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:574 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:272 msgid "Search" msgstr "搜索" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:315 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:322 msgid "The selected search will be <b>permanently deleted</b>. Are you sure?" msgstr "选定的搜索结果将被<b>永久删除</b>,你确定吗?" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:357 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:364 msgid "Search (For Advanced Search click the button to the left)" msgstr "搜索(点击左侧按钮进行高级搜索)" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:399 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:406 msgid "Saved Searches" msgstr "已存搜索" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:407 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:414 msgid "Choose saved search or enter name for new saved search" msgstr "选择已存搜索或输入新存入搜索名称" @@ -9418,26 +9560,22 @@ msgstr "清除" msgid "&Alternate shortcut:" msgstr "其它快捷键(&A):" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:200 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:202 msgid "Rename '%s'" msgstr "重命名'%s'" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:204 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:206 msgid "Edit sort for '%s'" msgstr "为 '%s'编辑排序" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:209 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:211 msgid "Hide category %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:214 msgid "Show category" msgstr "显示分类" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:216 -msgid "Show all categories" -msgstr "显示所有分类" - #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:223 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:227 msgid "Manage %s" @@ -9452,63 +9590,67 @@ msgstr "" msgid "Manage User Categories" msgstr "管理用户分类" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:451 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:248 +msgid "Show all categories" +msgstr "显示所有分类" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:458 msgid "" "Changing the authors for several books can take a while. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:456 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:463 msgid "" "Changing the metadata for that many books can take a while. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:512 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:320 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:519 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:296 msgid "Searches" msgstr "搜索" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:595 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:602 msgid "Duplicate search name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:596 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:603 msgid "The saved search name %s is already used." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:870 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:878 msgid "Sort by name" msgstr "按名字排序" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:870 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:878 msgid "Sort by popularity" msgstr "按欢迎度排序" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:879 msgid "Sort by average rating" msgstr "按平均评分排序" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:874 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:882 msgid "Set the sort order for entries in the Tag Browser" msgstr "设置标签浏览器中内容的排序规则" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:880 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:888 msgid "Match all" msgstr "匹配所有" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:880 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:888 msgid "Match any" msgstr "匹配任一" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:885 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:893 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:889 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:897 msgid "Manage &user categories" msgstr "管理用户分类(&U)" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:892 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:900 msgid "Add your own categories to the Tag Browser" msgstr "把你自定义的分类添加到标签浏览器" @@ -9551,53 +9693,53 @@ msgid "" "reconvert them?" msgstr "下列书籍已经被转换为 %s 格式。您希望转换它们么?" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:171 msgid "&Restore" msgstr "恢复(&R)" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:173 msgid "&Donate to support calibre" msgstr "捐款赞助 Calibre 项目(&D)" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:177 msgid "&Eject connected device" msgstr "弹出已连接设备(&E)" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:218 msgid "Calibre Quick Start Guide" msgstr "Calibre 快速上手指南" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:437 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:465 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:439 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:450 msgid "Conversion Error" msgstr "转换错误" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:438 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:451 msgid "" "<p>Could not convert: %s<p>It is a <a href=\"%s\">DRM</a>ed book. You must " "first remove the DRM using third party tools." msgstr "<p>无法转换:%s<p> 它是 <a href=\"%s\">DRM</a> 保护书籍。您需要首先使用第三方工具去除 DRM。" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:451 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:465 msgid "Recipe Disabled" msgstr "清单禁用" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:466 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:481 msgid "<b>Failed</b>" msgstr "<b>失败</b>" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:502 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:517 msgid "" "is the result of the efforts of many volunteers from all over the world. If " "you find it useful, please consider donating to support its development. " "Your donation helps keep calibre development going." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:543 msgid "There are active jobs. Are you sure you want to quit?" msgstr "仍有任务运行。您是否希望退出?" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:531 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:546 msgid "" " is communicating with the device!<br>\n" " Quitting may cause corruption on the device.<br>\n" @@ -9607,11 +9749,11 @@ msgstr "" " 退出可能导致设备损坏。<br>\n" " 确定退出么?" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:535 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:550 msgid "WARNING: Active jobs" msgstr "警告:正在运行任务" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:613 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:628 msgid "" "will keep running in the system tray. To close it, choose <b>Quit</b> in the " "context menu of the system tray." @@ -9783,96 +9925,96 @@ msgstr "键盘快捷键(&K)" msgid "No results found for:" msgstr "未找到结果:" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:35 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:36 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:703 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:43 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:711 msgid "Remember last used window size" msgstr "记住上次使用窗口大小" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:44 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:45 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:82 msgid "" "Set the user CSS stylesheet. This can be used to customize the look of all " "books." msgstr "设定用户 CSS 样式表。它将可以定制所有书籍外观。" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:47 msgid "Maximum width of the viewer window, in pixels." msgstr "查看器最大窗口宽度像素数。" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:48 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:49 msgid "Resize images larger than the viewer window to fit inside it" msgstr "调整查看器窗口中较大图像大小,使其适合显示在窗口中" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:50 msgid "Hyphenate text" msgstr "断词分行文本" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:51 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:52 msgid "Default language for hyphenation rules" msgstr "默认使用断词分行规则的语言" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:53 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:54 msgid "Font options" msgstr "字体选项" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:55 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:56 msgid "The serif font family" msgstr "衬线字体" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:57 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:58 msgid "The sans-serif font family" msgstr "Sans-serif 字体" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:59 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:60 msgid "The monospaced font family" msgstr "等宽字体" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:61 msgid "The standard font size in px" msgstr "标准字体大小 px 值" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:61 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:62 msgid "The monospaced font size in px" msgstr "等宽字体大小 px 值" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:62 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:63 msgid "The standard font type" msgstr "标准字体类型" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:463 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:479 msgid "&Lookup in dictionary" msgstr "词典查询(&L)" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:466 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:482 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:138 msgid "Go to..." msgstr "转到..." -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:478 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:494 msgid "Next Section" msgstr "下一节" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:479 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:495 msgid "Previous Section" msgstr "上一节" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:481 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:497 msgid "Document Start" msgstr "文档起始" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:482 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:498 msgid "Document End" msgstr "文档结尾" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:484 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:500 msgid "Section Start" msgstr "节起始" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:485 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:501 msgid "Section End" msgstr "节末尾" @@ -9940,85 +10082,85 @@ msgstr "转到引用。要找到引用编号,请使用引用模式。" msgid "Search for text in book" msgstr "书内文本搜索" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:275 msgid "Print Preview" msgstr "打印预览" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:309 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:312 msgid "Connecting to dict.org to lookup: <b>%s</b>…" msgstr "正在链接 dict.org 查询:<b>%s</b>" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:409 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:413 msgid "Choose ebook" msgstr "选择电子书" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:410 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:414 msgid "Ebooks" msgstr "电子书" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:443 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:447 msgid "No matches found for: %s" msgstr "未找到 %s 的匹配" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:480 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:488 msgid "Loading flow..." msgstr "正在加载流..." -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:524 msgid "Laying out %s" msgstr "正在排布流 %s..." -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:547 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:555 msgid "Bookmark #%d" msgstr "书签#%d" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:551 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:559 msgid "Add bookmark" msgstr "添加书签" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:552 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:560 msgid "Enter title for bookmark:" msgstr "编辑书签标题:" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:562 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:570 msgid "Manage Bookmarks" msgstr "管理书签" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:599 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:607 msgid "Loading ebook..." msgstr "正在加载电子书..." -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:607 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:615 msgid "DRM Error" msgstr "DRM 错误" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:608 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:616 msgid "<p>This book is protected by <a href=\"%s\">DRM</a>" msgstr "<p>此书被 <a href=\"%s\">DRM</a> 保护" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:612 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:620 msgid "Could not open ebook" msgstr "无法打开电子书" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:690 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:698 msgid "Options to control the ebook viewer" msgstr "电子书查看器控制选项" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:697 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:705 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:700 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:708 msgid "" "If specified, viewer window will try to open full screen when started." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:705 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:713 msgid "Print javascript alert and console messages to the console" msgstr "在控制台显示 javascript 警告以及控制台信息" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:711 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:719 msgid "" "%prog [options] file\n" "\n" @@ -10136,7 +10278,7 @@ msgstr "隐藏" msgid "Toggle" msgstr "触发器" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:385 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:400 msgid "" "If you use the WordPlayer e-book app on your Android phone, you can access " "your calibre book collection directly on the device. To do this you have to " @@ -10144,13 +10286,13 @@ msgid "" msgstr "" "若您使用 Android 手机上的 WordPlayer 电子书程序,您可以用设备直接访问您的 Calibre 书库。这需要您打开内容服务器。" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:389 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:404 msgid "" "Remember to leave calibre running as the server only runs as long as calibre " "is running." msgstr "请记住保持 Calibre 运行,如此它才能一直提供服务。" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:391 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:406 msgid "" "You have to add the URL http://myhostname:8080 as your calibre library in " "WordPlayer. Here myhostname should be the fully qualified hostname or the IP " @@ -10159,39 +10301,39 @@ msgstr "" "您需要将 URL http://myhostname:8080 添加到您 WordPlayer 中的 Calibre 书库。此处 myhostname " "应为有效主机名或者您运行 Calibre 电脑的 IP 地址。" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:468 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:483 msgid "Moving library..." msgstr "正在移动书库..." -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:484 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:485 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:499 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:500 msgid "Failed to move library" msgstr "移动书库错误" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:539 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:554 msgid "Invalid database" msgstr "无效数据库" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:540 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:555 msgid "" "<p>An invalid library already exists at %s, delete it before trying to move " "the existing library.<br>Error: %s" msgstr "<p>在 %s 已有无效书库,在试图移动现有书库前删除它。<br>错误:%s" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:551 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:566 msgid "Could not move library" msgstr "无法移动书库" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:622 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:641 msgid "Select location for books" msgstr "选择书籍位置" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:636 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:655 msgid "" "You must choose an empty folder for the calibre library. %s is not empty." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:710 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:729 msgid "welcome wizard" msgstr "欢迎向导" @@ -10268,9 +10410,9 @@ msgstr "选择您的语言(&L):" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/library_ui.py:58 msgid "" -"Choose a location for your books. When you add books to calibre, they will " -"be copied here:" -msgstr "为您的书籍选择位置。当您在 Calibre 中添加书籍,它们将被复制到这里:" +"<p>Choose a location for your books. When you add books to calibre, they " +"will be copied here. Use an <b>empty folder</b> for a new calibre library:" +msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/library_ui.py:59 msgid "&Change" @@ -10283,121 +10425,158 @@ msgid "" "will switch to using it." msgstr "如果您已有 Calibre 书库,它将被复制到新位置。若 Calibre 书库在新位置已经存在,Calibre 将直接使用它。" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:34 msgid "Using: %s:%s@%s:%s and %s encryption" msgstr "使用:%s:%s@%s:%s 和 %s 加密" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:37 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:39 msgid "Sending..." msgstr "正在发送..." -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:42 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:44 msgid "Mail successfully sent" msgstr "邮件已发出" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:124 -msgid "Finish gmail setup" -msgstr "完成 gmail 设定" - -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:136 msgid "" -"Dont forget to enter your gmail username and password. You can sign up for a " -"free gmail account at http://gmail.com" -msgstr "请勿忘记输入您的 gmail 用户名密码。您可于 http://gmail.com 注册免费账号" +"If you are setting up a new hotmail account, you must log in to it once " +"before you will be able to send mails." +msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:133 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:140 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:147 +msgid "" +"You can sign up for a free {name} email account at <a " +"href=\"http://{url}\">http://{url}</a>. {extra}" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:154 +msgid "Your %s &email address:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:155 +msgid "Your %s &username:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:156 +msgid "Your %s &password:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:174 +msgid "" +"If you plan to use email to send books to your Kindle, remember to add the " +"your %s email address to the allowed email addresses in your Amazon.com " +"Kindle management page." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:181 +msgid "Setup" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:196 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:203 msgid "Bad configuration" msgstr "错误配置" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:197 msgid "You must set the From email address" msgstr "您需要设置发信人电子邮件地址" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:204 msgid "You must set the username and password for the mail server." msgstr "您需要设置邮件服务器用户名和密码。" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:124 msgid "Send email &from:" msgstr "发信人地址(&f):" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:125 msgid "" "<p>This is what will be present in the From: field of emails sent by " "calibre.<br> Set it to your email address" msgstr "<p>邮件发件人栏中将填写:Calibre 发送的邮件。<br> 将其设为您的邮件地址" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:126 msgid "" "<p>A mail server is useful if the service you are sending mail to only " "accepts email from well know mail services." msgstr "<p>如果收件人的邮箱只能接收来自著名邮件服务的的邮件,使用邮件服务器则非常实用。" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:127 msgid "Mail &Server" msgstr "邮件服务器(&S)" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:128 msgid "calibre can <b>optionally</b> use a server to send mail" msgstr "Calibre 可<b>选择是否使用</b>邮件服务器以发送邮件" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:129 msgid "&Hostname:" msgstr "主机名(&H):" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:130 msgid "The hostname of your mail server. For e.g. smtp.gmail.com" msgstr "您的邮件服务器的主机名. 例如 smtp.gmail.com" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:131 msgid "&Port:" msgstr "端口(&P):" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:132 msgid "" "The port your mail server listens for connections on. The default is 25" msgstr "您的邮件服务器的侦听端口号。默认 25" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:134 msgid "Your username on the mail server" msgstr "您在邮件服务器上的用户名" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:136 msgid "Your password on the mail server" msgstr "您在邮件服务器上的密码" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:137 msgid "&Show" msgstr "显示(&S)" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:138 msgid "&Encryption:" msgstr "加密(&E):" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:139 msgid "" "Use TLS encryption when connecting to the mail server. This is the most " "common." msgstr "连接到邮件服务器时使用 TLS 加密,这是通常服务器使用的选项。" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:140 msgid "&TLS" msgstr "&TLS" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:141 msgid "Use SSL encryption when connecting to the mail server." msgstr "连接到邮件服务器时使用 SSL 加密。" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:131 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:142 msgid "&SSL" msgstr "&SSL" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:143 +msgid "WARNING: Using no encryption is highly insecure" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:144 +msgid "&None" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:145 msgid "Use Gmail" msgstr "使用 Gmail" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:146 +msgid "Use Hotmail" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:147 msgid "&Test email" msgstr "测试邮件发送(&T)" @@ -10463,7 +10642,7 @@ msgstr "空白" msgid "empty" msgstr "空的" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:48 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:50 msgid "" "The fields to output when cataloging books in the database. Should be a " "comma-separated list of fields.\n" @@ -10472,7 +10651,7 @@ msgid "" "Applies to: CSV, XML output formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:58 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:60 msgid "" "Output field to sort on.\n" "Available fields: author_sort, id, rating, size, timestamp, title.\n" @@ -10480,7 +10659,7 @@ msgid "" "Applies to: CSV, XML output formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:212 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:214 msgid "" "The fields to output when cataloging books in the database. Should be a " "comma-separated list of fields.\n" @@ -10489,7 +10668,7 @@ msgid "" "Applies to: BIBTEX output format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:222 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:224 msgid "" "Output field to sort on.\n" "Available fields: author_sort, id, rating, size, timestamp, title.\n" @@ -10497,7 +10676,7 @@ msgid "" "Applies to: BIBTEX output format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:231 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:233 msgid "" "Create a citation for BibTeX entries.\n" "Boolean value: True, False\n" @@ -10505,7 +10684,7 @@ msgid "" "Applies to: BIBTEX output format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:240 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:242 msgid "" "The template for citation creation from database fields.\n" " Should be a template with {} enclosed fields.\n" @@ -10514,7 +10693,7 @@ msgid "" "Applies to: BIBTEX output format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:250 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:252 msgid "" "BibTeX file encoding output.\n" "Available types: utf8, cp1252, ascii.\n" @@ -10522,7 +10701,7 @@ msgid "" "Applies to: BIBTEX output format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:259 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:261 msgid "" "BibTeX file encoding flag.\n" "Available types: strict, replace, ignore, backslashreplace.\n" @@ -10530,7 +10709,7 @@ msgid "" "Applies to: BIBTEX output format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:268 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:270 msgid "" "Entry type for BibTeX catalog.\n" "Available types: book, misc, mixed.\n" @@ -10538,14 +10717,14 @@ msgid "" "Applies to: BIBTEX output format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:536 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:540 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:543 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:547 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 " @@ -10554,14 +10733,14 @@ msgid "" "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:557 msgid "" "Regex describing tags to exclude as genres.\n" "Default: '%default' excludes bracketed tags, e.g. '[<tag>]'\n" "Applies to: ePub, MOBI output formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:559 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:563 msgid "" "Comma-separated list of tag words indicating book should be excluded from " "output. Case-insensitive.\n" @@ -10570,35 +10749,35 @@ msgid "" "Applies to: ePub, MOBI output formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:567 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:571 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:574 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:578 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 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:585 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:588 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:592 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:595 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:599 msgid "" "Sort titles with leading numbers as text, e.g.,\n" "'2001: A Space Odyssey' sorts as \n" @@ -10607,7 +10786,7 @@ msgid "" "Applies to: ePub, MOBI output formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:602 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:606 msgid "" "Specifies the output profile. In some cases, an output profile is required " "to optimize the catalog for the device. For example, 'kindle' or " @@ -10617,13 +10796,20 @@ msgid "" "Applies to: ePub, MOBI output formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:609 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:613 msgid "" "Tag indicating book has been read.\n" "Default: '%default'\n" "Applies to: ePub, MOBI output formats" msgstr "" +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:619 +msgid "" +"Tag indicating book to be displayed as wishlist item.\n" +"Default: '%default'\n" +"Applies to: ePub, MOBI output formats" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/library/check_library.py:17 msgid "Invalid titles" msgstr "无效的标题" @@ -10981,7 +11167,7 @@ msgid "" msgstr "为搜索查询过滤结果。搜索查询格式请参见用户手册中搜索相关内容。默认:不过滤" #: /home/kovid/work/calibre/src/calibre/library/cli.py:665 -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:505 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:499 msgid "Show detailed output information. Useful for debugging" msgstr "显示详细输出信息。有利调试" @@ -11219,35 +11405,35 @@ msgid "" "start with a letter" msgstr "标签必须只包含小写字母,数字及下划线,并且以字母开头。" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:82 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:57 msgid "%sAverage rating is %3.1f" msgstr "%s的平均星级是%3.1f" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:846 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:818 msgid "Main" msgstr "主" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2321 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2310 msgid "<p>Migrating old database to ebook library in %s<br><center>" msgstr "<p>正在将旧数据库转移到位于 %s 的新数据库<br><center>" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2350 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2339 msgid "Copying <b>%s</b>" msgstr "正在复制<b>%s</b>" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2367 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2356 msgid "Compacting database" msgstr "正在压缩数据库" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2460 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2449 msgid "Checking SQL integrity..." msgstr "正在检查" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2499 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2488 msgid "Checking for missing files." msgstr "正在检查缺失文件。" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2521 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2516 msgid "Checked id" msgstr "已检查 id" @@ -11438,120 +11624,129 @@ msgid "" "from Apache/nginx/etc." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/base.py:149 -msgid "Password to access your calibre library. Username is " -msgstr "密码以访问您的 Calibre 书库。用户名为 " - -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:51 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:401 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:59 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:437 msgid "Loading, please wait" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:80 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:85 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:106 +msgid "Go to" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:101 msgid "First" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:80 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:101 msgid "Last" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:80 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:101 msgid "Previous" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:81 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:102 msgid "Next" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:83 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:104 msgid "Browsing %d books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:99 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:224 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:121 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:247 msgid "Average rating" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:100 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:122 msgid "%s: %.1f stars" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:132 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:155 msgid "%d stars" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:225 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:248 msgid "Popularity" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:244 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:267 msgid "Sort by" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:308 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:512 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:270 +msgid "library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:271 +msgid "home" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:332 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:548 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:569 msgid "Newest" msgstr "最新" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:309 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:513 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:333 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:549 msgid "All books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:341 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:366 msgid "Browse books by" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:346 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:371 msgid "Choose a category to browse by:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:421 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:457 msgid "Browsing by" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:422 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:458 msgid "Up" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:543 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:579 msgid "in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:546 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:582 msgid "Books in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:597 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:634 msgid "Other formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:604 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:641 msgid "Read %s in the %s format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:609 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:646 msgid "Get" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:624 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:661 msgid "Permalink" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:625 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:662 msgid "A permanent link to this book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:636 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:673 msgid "This book has been deleted" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:720 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:757 msgid "in search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:722 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:759 msgid "Matching books" msgstr "" @@ -11582,6 +11777,12 @@ msgid "" "overrides any per-library settings specified in the GUI" msgstr "" +#: /home/kovid/work/calibre/src/calibre/library/server/main.py:62 +msgid "" +"Auto reload server when source code changes. May not work in all " +"environments." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:112 msgid "%d book" msgstr "%d本书" @@ -11862,7 +12063,7 @@ msgstr "开启 SSH 会话失败: " msgid "Failed to authenticate with server: %s" msgstr "服务器认证失败:%s" -#: /home/kovid/work/calibre/src/calibre/utils/smtp.py:234 +#: /home/kovid/work/calibre/src/calibre/utils/smtp.py:249 msgid "Control email delivery" msgstr "控制邮件传递" @@ -11906,93 +12107,93 @@ msgstr "不从 calire 服务器下载最新订阅清单" msgid "Unknown News Source" msgstr "未知新闻来源" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:614 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:628 msgid "The \"%s\" recipe needs a username and password." msgstr "订阅清单“%s”需要用户名与密码。" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:713 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:727 msgid "Download finished" msgstr "下载完成" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:715 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:729 msgid "Failed to download the following articles:" msgstr "下载下列文章失败:" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:721 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:735 msgid "Failed to download parts of the following articles:" msgstr "下载下列文章的某些部分失败:" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:723 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:737 msgid " from " msgstr " 自 " -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:725 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:739 msgid "\tFailed links:" msgstr "\t失败链接:" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:814 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:834 msgid "Could not fetch article. Run with -vv to see the reason" msgstr "无法抓取文章。使用 -vv 选项运行察看原因。" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:835 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:855 msgid "Fetching feeds..." msgstr "正在抓取源..." -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:840 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:860 msgid "Got feeds from index page" msgstr "从索引页面获取了源" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:849 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:869 msgid "Trying to download cover..." msgstr "正在尝试下载封面..." -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:851 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:871 msgid "Generating masthead..." msgstr "正在生成刊头..." -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:932 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:952 msgid "Starting download [%d thread(s)]..." msgstr "开始下载 [ %d 线程数]..." -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:948 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:968 msgid "Feeds downloaded to %s" msgstr "新闻源下载到 %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:957 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:977 msgid "Could not download cover: %s" msgstr "无法下载封面:%s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:964 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:986 msgid "Downloading cover from %s" msgstr "正在从 %s 下载封面" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1009 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1032 msgid "Masthead image downloaded" msgstr "已下载刊头图像" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1177 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1200 msgid "Untitled Article" msgstr "无标题文章" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1248 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1271 msgid "Article downloaded: %s" msgstr "已下载文章:%s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1259 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1282 msgid "Article download failed: %s" msgstr "下载失败文章:%s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1276 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1299 msgid "Fetching feed" msgstr "抓取源" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1423 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1446 msgid "" "Failed to log in, check your username and password for the calibre " "Periodicals service." msgstr "登录失败,检查您 calibre 期刊服务的用户名密码。" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1438 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1461 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." @@ -12013,7 +12214,7 @@ msgstr "已计划" msgid "Custom" msgstr "自定义" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:482 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:476 msgid "" "%prog URL\n" "\n" @@ -12023,48 +12224,48 @@ msgstr "" "\n" "URL 举例为 http://google.com" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:485 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:479 msgid "Base directory into which URL is saved. Default is %default" msgstr "URL 存储基目录。默认 %default" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:488 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:482 msgid "" "Timeout in seconds to wait for a response from the server. Default: %default " "s" msgstr "的带服务器响应的超时秒数。默认:%default s" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:491 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:485 msgid "" "Maximum number of levels to recurse i.e. depth of links to follow. Default " "%default" msgstr "递归级别最大值。如链接跟踪深度。默认:%default" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:494 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:488 msgid "" "The maximum number of files to download. This only applies to files from <a " "href> tags. Default is %default" msgstr "文件下载最大值。仅对来自于 <a href> 标签的文件有效。默认为 %default" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:496 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:490 msgid "" "Minimum interval in seconds between consecutive fetches. Default is %default " "s" msgstr "连续抓取最小间隔秒数。默认为 %default s" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:498 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:492 msgid "" "The character encoding for the websites you are trying to download. The " "default is to try and guess the encoding." msgstr "您下载内容来源网站的字符编码。默认是试图猜测编码。" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:500 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:494 msgid "" "Only links that match this regular expression will be followed. This option " "can be specified multiple times, in which case as long as a link matches any " "one regexp, it will be followed. By default all links are followed." msgstr "匹配此正则表达式的链接都会被跟进。此选项可被多次使用,此时只要任一正则表达式有匹配链接,都被跟进。默认情况,所有链接都被跟进。" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:502 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:496 msgid "" "Any link that matches this regular expression will be ignored. This option " "can be specified multiple times, in which case as long as any regexp matches " @@ -12075,7 +12276,7 @@ msgstr "" "任何匹配此正则表达式的链接都会被忽略。此选项可被多次使用,此时只要任一正则表达式有匹配链接,链接都被忽略。默认情况下,没有链接被忽略。如果 --" "filter-regexp 和 --match-regexp 均被使用,则优先应用 --filter-regexp。" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:504 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:498 msgid "Do not download CSS stylesheets." msgstr "不下载 CSS 样式表。" @@ -12148,6 +12349,18 @@ msgstr "不下载 CSS 样式表。" #~ msgid "Show ¬ifications in system tray" #~ msgstr "在系统托盘除显示和提醒" +#~ msgid "Failed to email books" +#~ msgstr "发送电子书籍失败" + +#~ msgid "Failed to email the following books:" +#~ msgstr "无法通过电子邮件发送以下书籍:" + +#~ msgid "Attached is the" +#~ msgstr "附加" + +#~ msgid "Sent by email:" +#~ msgstr "已通过邮件发送:" + #~ msgid "" #~ "Email\n" #~ "Delivery" @@ -12202,6 +12415,9 @@ msgstr "不下载 CSS 样式表。" #~ msgid "Alt+S" #~ msgstr "Alt+S" +#~ msgid "&Search:" +#~ msgstr "搜索(&S):" + #~ msgid "Sort by &popularity" #~ msgstr "按流行度排序(&P)" @@ -12214,6 +12430,9 @@ msgstr "不下载 CSS 样式表。" #~ msgid "Configure calibre" #~ msgstr "配置 Calibre" +#~ msgid "Finish gmail setup" +#~ msgstr "完成 gmail 设定" + #~ msgid "Send specific format to storage card A" #~ msgstr "发送指定格式到存储卡 A" @@ -12226,6 +12445,13 @@ msgstr "不下载 CSS 样式表。" #~ msgid "Read metadata only from &file name" #~ msgstr "从文件名读取元数据(&F)" +#~ 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 "下列书籍使用格式曾经在数据库中,现已不可用。格式项被移除。您需手动检查。这可能是由于您直接在 library 文件夹操作文件引起的。" + #~ msgid "&Check database integrity" #~ msgstr "检查数据库完整性(&C)" @@ -12313,6 +12539,16 @@ msgstr "不下载 CSS 样式表。" #~ msgid "Click to see the books available on your computer" #~ msgstr "点击查看电脑上可用书籍" +#~ msgid "" +#~ "Choose a location for your books. When you add books to calibre, they will " +#~ "be copied here:" +#~ msgstr "为您的书籍选择位置。当您在 Calibre 中添加书籍,它们将被复制到这里:" + +#~ msgid "" +#~ "Dont forget to enter your gmail username and password. You can sign up for a " +#~ "free gmail account at http://gmail.com" +#~ msgstr "请勿忘记输入您的 gmail 用户名密码。您可于 http://gmail.com 注册免费账号" + #~ msgid "" #~ "No metadata found, try adjusting the title and author or the ISBN key." #~ msgstr "未找到元数据,请修改标题作者或 ISBN 搜索条件后重试。" @@ -12339,6 +12575,9 @@ msgstr "不下载 CSS 样式表。" #~ "available books are saved." #~ msgstr "逗号分隔格式列表。默认保存所有可用书籍。" +#~ msgid "Password to access your calibre library. Username is " +#~ msgstr "密码以访问您的 Calibre 书库。用户名为 " + #~ msgid "" #~ "[options]\n" #~ "\n" @@ -12380,6 +12619,11 @@ msgstr "不下载 CSS 样式表。" #~ msgid "Force maximum line lenght" #~ msgstr "强制最大行宽" +#~ msgid "" +#~ "Average line length for line breaking if the HTML is from a previous partial " +#~ "conversion of a PDF file. Default is %default which disables this." +#~ msgstr "PDF 文件部分转换为 HTML,在此设定平均换行行宽。默认为 %default  即已禁用。" + #~ msgid "Stop &all jobs" #~ msgstr "停止所有任务(&A)" @@ -12425,6 +12669,13 @@ msgstr "不下载 CSS 样式表。" #~ msgid "Sending to &device" #~ msgstr "发送到设备(&D)" +#~ msgid "" +#~ "Regular expression: the expression must match anywhere in the metadata" +#~ msgstr "正则表达式:表达式必须与元数据中所有内容寻求匹配" + +#~ msgid " " +#~ msgstr " " + #~ msgid "<p>For help see the: <a href=\"%s\">User Manual</a><br>" #~ msgstr "<p>帮助参见:<a href=\"%s\">用户手册</a><br>" @@ -12494,6 +12745,12 @@ msgstr "不下载 CSS 样式表。" #~ "如果您选定书籍 A 之后选定书籍 B,\n" #~ "书籍 A 为 1 号,B 为 2 号。" +#~ msgid "Contains: the word or phrase matches anywhere in the metadata" +#~ msgstr "包含:短语或文字与原数据中任意位置匹配" + +#~ msgid "Equals: the word or phrase must match an entire metadata field" +#~ msgstr "等于:短语必须和一个元数据项完全匹配" + #~ msgid "Failed to create calibre library at: %r. Aborting." #~ msgstr "在 %r 创建 calibre 书库失败。放弃。" @@ -12518,14 +12775,51 @@ msgstr "不下载 CSS 样式表。" #~ msgid "You cannot change libraries when a device is connected." #~ msgstr "有设置连接时,你不能更改书库。" +#~ msgid "Click to open Book Details window" +#~ msgstr "点击打开书籍详情窗口" + +#~ msgid "" +#~ "Book formats and metadata from the selected books will be added to the " +#~ "<b>first selected book.</b> ISBN will <i>not</i> be merged.<br><br> The " +#~ "second and subsequently selected books will not be deleted or " +#~ "changed.<br><br>Please confirm you want to proceed." +#~ msgstr "" +#~ "选定书籍的格式和元数据将被添加到<b>第一本选定书籍。</b>ISBN<i>不会</i>被合并。<br><br> \r\n" +#~ "第二本和随后的选定书籍将不会被删除或更改。 <br><br>如果要继续的话请先确认。" + #~ msgid "Additional Information" #~ msgstr "附加信息" +#~ msgid "" +#~ "Book formats and metadata from the selected books will be merged into the " +#~ "<b>first selected book</b>. ISBN will <i>not</i> be merged.<br><br>After " +#~ "merger the second and subsequently selected books will be <b>deleted</b>. " +#~ "<br><br>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 <b>deleted</b> from your computer.<br><br> Are you <b>sure</b> " +#~ "you want to proceed?" +#~ msgstr "" +#~ "选定书籍的格式和元数据将会被合并进<b>第一本选定书籍</b>中。ISBN<i>不会</i> " +#~ "被合并。<br><br>合并后,选定的第二本书籍及随后的书籍将会被<b>删除</b>。<br><br>选定的第一本书籍的所有书籍格式都会被保留下来,而选定" +#~ "书籍的第二本和随后的书籍的重复格式都将从你电脑上永久<b>删除</b>。<br><br>你<b>确定</b>要继续吗?" + #~ msgid "Run the check" #~ msgstr "运行检查" +#~ msgid "&Search and replace (experimental)" +#~ msgstr "查找和替换(&S)(实验功能)" + #~ msgid "Cannot use tag editor" #~ msgstr "无法使用标签编辑器" #~ msgid "The tags editor cannot be used if you have modified the tags" #~ msgstr "如果你已经修改了标签,那么标签编辑器就无法使用" + +#~ msgid "" +#~ "<p>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 " +#~ "metadata and covers for them.<p>Any invalid ISBNs in the list will be " +#~ "ignored." +#~ msgstr "" +#~ "<p>在左边的文本框中输入一组ISBN号,每行一个。calibre将为他们自动创建相应的书籍项,并从网络下载书籍元数据和封面。<p>错误的ISBN号会被忽" +#~ "略。" From 2145a487d45904113dc922db1ae131eeff178041 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sun, 28 Nov 2010 11:47:36 +0000 Subject: [PATCH 171/375] Add check for valid has_cover to check_library --- src/calibre/gui2/dialogs/check_library.py | 89 ++++++++++++++++++----- src/calibre/library/check_library.py | 69 +++++++++++++----- src/calibre/library/database2.py | 8 ++ 3 files changed, 127 insertions(+), 39 deletions(-) diff --git a/src/calibre/gui2/dialogs/check_library.py b/src/calibre/gui2/dialogs/check_library.py index 55cd91dcd3..c00ee99cc0 100644 --- a/src/calibre/gui2/dialogs/check_library.py +++ b/src/calibre/gui2/dialogs/check_library.py @@ -32,23 +32,30 @@ class CheckLibraryDialog(QDialog): self.log.itemChanged.connect(self.item_changed) self._layout.addWidget(self.log) - self.check = QPushButton(_('&Run the check')) - self.check.setDefault(False) - self.check.clicked.connect(self.run_the_check) - self.copy = QPushButton(_('Copy &to clipboard')) - self.copy.setDefault(False) - self.copy.clicked.connect(self.copy_to_clipboard) - self.ok = QPushButton('&Done') - self.ok.setDefault(True) - self.ok.clicked.connect(self.accept) - self.delete = QPushButton('Delete &marked') - self.delete.setDefault(False) - self.delete.clicked.connect(self.delete_marked) + self.check_button = QPushButton(_('&Run the check')) + self.check_button.setDefault(False) + self.check_button.clicked.connect(self.run_the_check) + self.copy_button = QPushButton(_('Copy &to clipboard')) + self.copy_button.setDefault(False) + self.copy_button.clicked.connect(self.copy_to_clipboard) + self.ok_button = QPushButton('&Done') + self.ok_button.setDefault(True) + self.ok_button.clicked.connect(self.accept) + self.delete_button = QPushButton('Delete &marked') + self.delete_button.setToolTip(_('Delete marked files (checked subitems)')) + self.delete_button.setDefault(False) + self.delete_button.clicked.connect(self.delete_marked) + self.fix_button = QPushButton('&Fix marked') + self.fix_button.setDefault(False) + self.fix_button.setEnabled(False) + self.fix_button.setToolTip(_('Fix marked sections (checked fixable items)')) + self.fix_button.clicked.connect(self.fix_items) self.bbox = QDialogButtonBox(self) - self.bbox.addButton(self.check, QDialogButtonBox.ActionRole) - self.bbox.addButton(self.delete, QDialogButtonBox.ActionRole) - self.bbox.addButton(self.copy, QDialogButtonBox.ActionRole) - self.bbox.addButton(self.ok, QDialogButtonBox.AcceptRole) + self.bbox.addButton(self.check_button, QDialogButtonBox.ActionRole) + self.bbox.addButton(self.delete_button, QDialogButtonBox.ActionRole) + self.bbox.addButton(self.fix_button, QDialogButtonBox.ActionRole) + self.bbox.addButton(self.copy_button, QDialogButtonBox.ActionRole) + self.bbox.addButton(self.ok_button, QDialogButtonBox.AcceptRole) h = QHBoxLayout() ln = QLabel(_('Names to ignore:')) @@ -93,12 +100,19 @@ class CheckLibraryDialog(QDialog): plaintext = [] def builder(tree, checker, check): - attr, h, checkable = check + attr, h, checkable, fixable = check list = getattr(checker, attr, None) if list is None: return - tl = Item([h]) + tl = Item() + tl.setText(0, h) + if fixable: + tl.setText(1, _('(fixable)')) + tl.setFlags(Qt.ItemIsEnabled | Qt.ItemIsUserCheckable) + tl.setCheckState(1, False) + self.top_level_items[attr] = tl + for problem in list: it = Item() if checkable: @@ -107,6 +121,7 @@ class CheckLibraryDialog(QDialog): else: it.setFlags(Qt.ItemIsEnabled) it.setText(0, problem[0]) + it.setData(0, Qt.UserRole, problem[2]) it.setText(1, problem[1]) tl.addChild(it) self.all_items.append(it) @@ -118,18 +133,25 @@ class CheckLibraryDialog(QDialog): t.setColumnCount(2); t.setHeaderLabels([_('Name'), _('Path from library')]) self.all_items = [] + self.top_level_items = {} for check in CHECKS: builder(t, checker, check) t.setColumnWidth(0, 200) t.setColumnWidth(1, 400) - self.delete.setEnabled(False) + self.delete_button.setEnabled(False) self.text_results = '\n'.join(plaintext) def item_changed(self, item, column): + self.fix_button.setEnabled(False) + for it in self.top_level_items.values(): + if it.checkState(1): + self.fix_button.setEnabled(True) + + self.delete_button.setEnabled(False) for it in self.all_items: if it.checkState(1): - self.delete.setEnabled(True) + self.delete_button.setEnabled(True) return def delete_marked(self): @@ -157,6 +179,33 @@ class CheckLibraryDialog(QDialog): unicode(it.text(1)))) self.run_the_check() + def fix_missing_covers(self): + tl = self.top_level_items['missing_covers'] + child_count = tl.childCount() + for i in range(0, child_count): + item = tl.child(i); + id = item.data(0, Qt.UserRole).toInt()[0] + self.db.set_has_cover(id, False) + + def fix_extra_covers(self): + tl = self.top_level_items['extra_covers'] + child_count = tl.childCount() + for i in range(0, child_count): + item = tl.child(i); + id = item.data(0, Qt.UserRole).toInt()[0] + self.db.set_has_cover(id, True) + + def fix_items(self): + for check in CHECKS: + attr = check[0] + fixable = check[3] + tl = self.top_level_items[attr] + if fixable and tl.checkState(1): + func = getattr(self, 'fix_' + attr, None) + if func is not None and callable(func): + func() + self.run_the_check() + def copy_to_clipboard(self): QApplication.clipboard().setText(self.text_results) diff --git a/src/calibre/library/check_library.py b/src/calibre/library/check_library.py index b285da0006..b49330db3e 100644 --- a/src/calibre/library/check_library.py +++ b/src/calibre/library/check_library.py @@ -14,14 +14,25 @@ from calibre.ebooks import BOOK_EXTENSIONS EBOOK_EXTENSIONS = frozenset(BOOK_EXTENSIONS) NORMALS = frozenset(['metadata.opf', 'cover.jpg']) -CHECKS = [('invalid_titles', _('Invalid titles'), True), - ('extra_titles', _('Extra titles'), True), - ('invalid_authors', _('Invalid authors'), True), - ('extra_authors', _('Extra authors'), True), - ('missing_formats', _('Missing book formats'), False), - ('extra_formats', _('Extra book formats'), True), - ('extra_files', _('Unknown files in books'), True), - ('failed_folders', _('Folders raising exception'), False) +''' +Checks fields: +- name of array containing info +- user-readable name of info +- can be deleted (can be checked) +- can be fixed. In this case, the name of the fix method is derived from the + array name +''' + +CHECKS = [('invalid_titles', _('Invalid titles'), True, False), + ('extra_titles', _('Extra titles'), True, False), + ('invalid_authors', _('Invalid authors'), True, False), + ('extra_authors', _('Extra authors'), True, False), + ('missing_formats', _('Missing book formats'), False, False), + ('extra_formats', _('Extra book formats'), True, False), + ('extra_files', _('Unknown files in books'), True, False), + ('missing_covers', _('Missing covers in books'), False, True), + ('extra_covers', _('Extra covers in books'), True, True), + ('failed_folders', _('Folders raising exception'), False, False) ] @@ -57,6 +68,10 @@ class CheckLibrary(object): self.extra_formats = [] self.extra_files = [] + self.missing_covers = [] + self.extra_covers = [] + + self.failed_folders = [] def dbpath(self, id): return self.db.path(id, index_is_id=True) @@ -83,7 +98,7 @@ class CheckLibrary(object): auth_path = os.path.join(lib, auth_dir) # First check: author must be a directory if not os.path.isdir(auth_path): - self.invalid_authors.append((auth_dir, auth_dir)) + self.invalid_authors.append((auth_dir, auth_dir, 0)) continue self.potential_authors[auth_dir] = {} @@ -98,7 +113,7 @@ class CheckLibrary(object): m = self.db_id_regexp.search(title_dir) # Second check: title must have an ID and must be a directory if m is None or not os.path.isdir(title_path): - self.invalid_titles.append((auth_dir, db_path)) + self.invalid_titles.append((auth_dir, db_path, 0)) continue id = m.group(1) @@ -106,12 +121,12 @@ class CheckLibrary(object): if self.is_case_sensitive: if int(id) not in self.all_ids or \ db_path not in self.all_dbpaths: - self.extra_titles.append((title_dir, db_path)) + self.extra_titles.append((title_dir, db_path, 0)) continue else: if int(id) not in self.all_ids or \ db_path.lower() not in self.all_lc_dbpaths: - self.extra_titles.append((title_dir, db_path)) + self.extra_titles.append((title_dir, db_path, 0)) continue # Record the book to check its formats @@ -120,7 +135,7 @@ class CheckLibrary(object): # Fourth check: author directories that contain no titles if not found_titles: - self.extra_authors.append((auth_dir, auth_dir)) + self.extra_authors.append((auth_dir, auth_dir, 0)) for x in self.book_dirs: try: @@ -152,17 +167,20 @@ class CheckLibrary(object): unknowns = frozenset(filenames-formats-NORMALS) # Check: any books that aren't formats or normally there? for u in unknowns: - self.extra_files.append((title_dir, os.path.join(db_path, u))) + self.extra_files.append((title_dir, + os.path.join(db_path, u), book_id)) # Check: any book formats that should be there? missing = book_formats - formats for m in missing: - self.missing_formats.append((title_dir, os.path.join(db_path, m))) + self.missing_formats.append((title_dir, + os.path.join(db_path, m), book_id)) # Check: any book formats that shouldn't be there? extra = formats - book_formats - NORMALS for e in extra: - self.extra_formats.append((title_dir, os.path.join(db_path, e))) + self.extra_formats.append((title_dir, + os.path.join(db_path, e), book_id)) else: def lc_map(fnames, fset): m = {} @@ -175,15 +193,28 @@ class CheckLibrary(object): unknowns = frozenset(filenames_lc-formats_lc-NORMALS) # Check: any books that aren't formats or normally there? for f in lc_map(filenames, unknowns): - self.extra_files.append((title_dir, os.path.join(db_path, f))) + self.extra_files.append((title_dir, os.path.join(db_path, f), + book_id)) book_formats_lc = frozenset([f.lower() for f in book_formats]) # Check: any book formats that should be there? missing = book_formats_lc - formats_lc for m in lc_map(book_formats, missing): - self.missing_formats.append((title_dir, os.path.join(db_path, m))) + self.missing_formats.append((title_dir, + os.path.join(db_path, m), book_id)) # Check: any book formats that shouldn't be there? extra = formats_lc - book_formats_lc - NORMALS for e in lc_map(formats, extra): - self.extra_formats.append((title_dir, os.path.join(db_path, e))) + self.extra_formats.append((title_dir, os.path.join(db_path, e), + book_id)) + + # check cached has_cover + if self.db.has_cover(book_id): + if 'cover.jpg' not in filenames: + self.missing_covers.append((title_dir, + os.path.join(db_path, title_dir, 'cover.jpg'), book_id)) + else: + if 'cover.jpg' in filenames: + self.extra_covers.append((title_dir, + os.path.join(db_path, title_dir, 'cover.jpg'), book_id)) diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 47c575386b..a07e46577e 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -801,6 +801,14 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): if notify: self.notify('cover', [id]) + def has_cover(self, id): + return self.data.get(id, self.FIELD_MAP['cover'], row_is_id=True) + + def set_has_cover(self, id, val): + dval = 1 if val else 0 + self.conn.execute('UPDATE books SET has_cover=? WHERE id=?', (dval, id,)) + self.data.set(id, self.FIELD_MAP['cover'], val, row_is_id=True) + def book_on_device(self, id): if callable(self.book_on_device_func): return self.book_on_device_func(id) From 07d93425da6b5800e76798ffbe1b3469846f8fa6 Mon Sep 17 00:00:00 2001 From: Sengian <sengian1@gmail.com> Date: Sun, 28 Nov 2010 14:02:30 +0100 Subject: [PATCH 172/375] Amazon modification & integration of german metadata --- src/calibre/ebooks/metadata/amazonfr.py | 73 +++++++++++++++++++------ 1 file changed, 56 insertions(+), 17 deletions(-) diff --git a/src/calibre/ebooks/metadata/amazonfr.py b/src/calibre/ebooks/metadata/amazonfr.py index 7091719f30..9512fc0c3f 100644 --- a/src/calibre/ebooks/metadata/amazonfr.py +++ b/src/calibre/ebooks/metadata/amazonfr.py @@ -36,6 +36,23 @@ class AmazonFr(MetadataSource): self.exception = e self.tb = traceback.format_exc() +class AmazonDe(MetadataSource): + + name = 'Amazon german' + description = _('Downloads social metadata from amazon.de') + supported_platforms = ['windows', 'osx', 'linux'] + author = 'Sengian' + version = (1, 0, 0) + has_html_comments = True + + def fetch(self): + try: + self.results = search(self.title, self.book_author, self.publisher, + self.isbn, max_results=10, verbose=self.verbose, lang='de') + except Exception, e: + self.exception = e + self.tb = traceback.format_exc() + class Amazon(MetadataSource): name = 'Amazon' @@ -59,8 +76,8 @@ def report(verbose): import traceback traceback.print_exc() -def replace_monthsfr(datefr): - # Replace french months by english equivalent for parse_date +def replace_months(datez, clang): + # Replace months by english equivalent for parse_date frtoen = { u'[jJ]anvier': u'jan', u'[fF].vrier': u'feb', @@ -74,15 +91,38 @@ def replace_monthsfr(datefr): u'[Oo]ctobre': u'oct', u'[nN]ovembre': u'nov', u'[dD].cembre': u'dec' } - for k in frtoen.iterkeys(): - tmp = re.sub(k, frtoen[k], datefr) - if tmp <> datefr: break + detoen = { + u'[jJ]anuar': u'jan', + u'[fF]ebruar': u'feb', + u'[mM].rz': u'mar', + u'[aA]pril': u'apr', + u'[mM]ai': u'may', + u'[jJ]uni': u'jun', + u'[jJ]uli': u'jul', + u'[aA]ugust': u'aug', + u'[sS]eptember': u'sep', + u'[Oo]ktober': u'oct', + u'[nN]ovember': u'nov', + u'[dD]ezember': u'dec' } + + if clang == 'fr': + dictoen = frtoen + elif clang == 'de': + dictoen = detoen + else: + return datez + + for k in dictoen.iterkeys(): + tmp = re.sub(k, dictoen[k], datez) + if tmp != datez: break return tmp + class Query(object): BASE_URL_FR = 'http://www.amazon.fr' BASE_URL_EN = 'http://www.amazon.com' + BASE_URL_DE = 'http://www.amazon.de' def __init__(self, title=None, author=None, publisher=None, isbn=None, keywords=None, max_results=20, rlang='en'): @@ -119,6 +159,9 @@ class Query(object): elif rlang =='fr': q['sort'] = 'relevancerank' self.urldata = self.BASE_URL_FR + elif rlang =='de': + q['sort'] = 'relevancerank' + self.urldata = self.BASE_URL_DE self.baseurl = self.urldata if isbn is not None: @@ -203,11 +246,11 @@ class ResultList(list): self.reattr = re.compile(r'<([a-zA-Z0-9]+)\s[^>]+>') self.reoutp = re.compile(r'(?s)<em>--This text ref.*?</em>') self.recom = re.compile(r'(?s)<!--.*?-->') - self.republi = re.compile(u'(Editeur|Publisher)', re.I) + self.republi = re.compile(u'(Editeur|Publisher|Verlag)', re.I) self.reisbn = re.compile(u'(ISBN-10|ISBN-10|ASIN)', re.I) - self.relang = re.compile(u'(Language|Langue)', re.I) - self.reratelt = re.compile(u'(Average\s*Customer\s*Review|Moyenne\s*des\s*commentaires\s*client)', re.I) - self.reprod = re.compile(u'(Product\s*Details|D.tails\s*sur\s*le\s*produit)', re.I) + self.relang = re.compile(u'(Language|Langue|Sprache)', re.I) + self.reratelt = re.compile(u'(Average\s*Customer\s*Review|Moyenne\s*des\s*commentaires\s*client|Durchschnittliche\s*Kundenbewertung)', re.I) + self.reprod = re.compile(u'(Product\s*Details|D.tails\s*sur\s*le\s*produit|Produktinformation)', re.I) def strip_tags_etree(self, etreeobj, invalid_tags): for (itag, rmv) in invalid_tags.iteritems(): @@ -315,8 +358,8 @@ class ResultList(list): d = d.group(1) try: default = utcnow().replace(day=15) - if self.lang == 'fr': - d = replace_monthsfr(d) + if self.lang != 'en': + d = replace_months(d, self.lang) d = parse_date(d, assume_utc=True, default=default) mi.pubdate = d except: @@ -415,7 +458,7 @@ def option_parser(): Fetch book metadata from Amazon. You must specify one of title, author, ISBN, publisher or keywords. Will fetch a maximum of 10 matches, so you should make your query as specific as possible. - You can chose the language for metadata retrieval (french & american). + You can chose the language for metadata retrieval (french & american & german). ''' )) parser.add_option('-t', '--title', help='Book title') @@ -423,14 +466,10 @@ def option_parser(): parser.add_option('-p', '--publisher', help='Book publisher') parser.add_option('-i', '--isbn', help='Book ISBN') parser.add_option('-k', '--keywords', help='Keywords') - parser.add_option('-c', '--covers', default=0, - help='Covers: 1-Check/ 2-Download') - parser.add_option('-p', '--coverspath', default='', - help='Covers files path') parser.add_option('-m', '--max-results', default=10, help='Maximum number of results to fetch') parser.add_option('-l', '--lang', default='en', - help='Chosen language for metadata search') + help='Chosen language for metadata search (fr, en , de)') parser.add_option('-v', '--verbose', default=0, action='count', help='Be more verbose about errors') return parser From 61db7b02b6a065a8727955ac5de8d2235d121e27 Mon Sep 17 00:00:00 2001 From: Sengian <sengian1@gmail.com> Date: Sun, 28 Nov 2010 15:11:55 +0100 Subject: [PATCH 173/375] Add language options to amazon & move replace_months to utils.date.py --- src/calibre/ebooks/metadata/amazonfr.py | 108 ++++++++++++------------ src/calibre/utils/date.py | 41 +++++++++ 2 files changed, 96 insertions(+), 53 deletions(-) diff --git a/src/calibre/ebooks/metadata/amazonfr.py b/src/calibre/ebooks/metadata/amazonfr.py index 9512fc0c3f..a77ea16d9c 100644 --- a/src/calibre/ebooks/metadata/amazonfr.py +++ b/src/calibre/ebooks/metadata/amazonfr.py @@ -9,7 +9,7 @@ from math import ceil from lxml import html from lxml.html import soupparser -from calibre.utils.date import parse_date, utcnow +from calibre.utils.date import parse_date, utcnow, replace_months from calibre import browser, preferred_encoding from calibre.ebooks.chardet import xml_to_unicode from calibre.ebooks.metadata import MetaInformation, check_isbn, \ @@ -36,6 +36,40 @@ class AmazonFr(MetadataSource): self.exception = e self.tb = traceback.format_exc() +class AmazonEs(MetadataSource): + + name = 'Amazon spanish' + description = _('Downloads social metadata from amazon.com in spanish') + supported_platforms = ['windows', 'osx', 'linux'] + author = 'Sengian' + version = (1, 0, 0) + has_html_comments = True + + def fetch(self): + try: + self.results = search(self.title, self.book_author, self.publisher, + self.isbn, max_results=10, verbose=self.verbose, lang='es') + except Exception, e: + self.exception = e + self.tb = traceback.format_exc() + +class AmazonUS(MetadataSource): + + name = 'Amazon US english' + description = _('Downloads social metadata from amazon.com in english') + supported_platforms = ['windows', 'osx', 'linux'] + author = 'Sengian' + version = (1, 0, 0) + has_html_comments = True + + def fetch(self): + try: + self.results = search(self.title, self.book_author, self.publisher, + self.isbn, max_results=10, verbose=self.verbose, lang='us') + except Exception, e: + self.exception = e + self.tb = traceback.format_exc() + class AmazonDe(MetadataSource): name = 'Amazon german' @@ -65,7 +99,7 @@ class Amazon(MetadataSource): def fetch(self): try: self.results = search(self.title, self.book_author, self.publisher, - self.isbn, max_results=10, verbose=self.verbose, lang='en') + self.isbn, max_results=10, verbose=self.verbose, lang='all') except Exception, e: self.exception = e self.tb = traceback.format_exc() @@ -76,56 +110,15 @@ def report(verbose): import traceback traceback.print_exc() -def replace_months(datez, clang): - # Replace months by english equivalent for parse_date - frtoen = { - u'[jJ]anvier': u'jan', - u'[fF].vrier': u'feb', - u'[mM]ars': u'mar', - u'[aA]vril': u'apr', - u'[mM]ai': u'may', - u'[jJ]uin': u'jun', - u'[jJ]uillet': u'jul', - u'[aA]o.t': u'aug', - u'[sS]eptembre': u'sep', - u'[Oo]ctobre': u'oct', - u'[nN]ovembre': u'nov', - u'[dD].cembre': u'dec' } - detoen = { - u'[jJ]anuar': u'jan', - u'[fF]ebruar': u'feb', - u'[mM].rz': u'mar', - u'[aA]pril': u'apr', - u'[mM]ai': u'may', - u'[jJ]uni': u'jun', - u'[jJ]uli': u'jul', - u'[aA]ugust': u'aug', - u'[sS]eptember': u'sep', - u'[Oo]ktober': u'oct', - u'[nN]ovember': u'nov', - u'[dD]ezember': u'dec' } - - if clang == 'fr': - dictoen = frtoen - elif clang == 'de': - dictoen = detoen - else: - return datez - - for k in dictoen.iterkeys(): - tmp = re.sub(k, dictoen[k], datez) - if tmp != datez: break - return tmp - class Query(object): BASE_URL_FR = 'http://www.amazon.fr' - BASE_URL_EN = 'http://www.amazon.com' + BASE_URL_ALL = 'http://www.amazon.com' BASE_URL_DE = 'http://www.amazon.de' def __init__(self, title=None, author=None, publisher=None, isbn=None, keywords=None, - max_results=20, rlang='en'): + max_results=20, rlang='all'): assert not(title is None and author is None and publisher is None \ and isbn is None and keywords is None) assert (max_results < 21) @@ -153,9 +146,17 @@ class Query(object): #many options available } - if rlang =='en': + if rlang =='all': q['sort'] = 'relevanceexprank' - self.urldata = self.BASE_URL_EN + self.urldata = self.BASE_URL_ALL + elif rlang =='es': + q['sort'] = 'relevanceexprank' + q['field-language'] = 'Spanish' + self.urldata = self.BASE_URL_ALL + elif rlang =='us': + q['sort'] = 'relevanceexprank' + q['field-language'] = 'English' + self.urldata = self.BASE_URL_ALL elif rlang =='fr': q['sort'] = 'relevancerank' self.urldata = self.BASE_URL_FR @@ -238,7 +239,7 @@ class Query(object): class ResultList(list): - def __init__(self, baseurl, lang = 'en'): + def __init__(self, baseurl, lang = 'all'): self.baseurl = baseurl self.lang = lang self.repub = re.compile(u'\((.*)\)') @@ -358,7 +359,7 @@ class ResultList(list): d = d.group(1) try: default = utcnow().replace(day=15) - if self.lang != 'en': + if self.lang != 'all': d = replace_months(d, self.lang) d = parse_date(d, assume_utc=True, default=default) mi.pubdate = d @@ -437,7 +438,7 @@ class ResultList(list): def search(title=None, author=None, publisher=None, isbn=None, - max_results=5, verbose=False, keywords=None, lang='en'): + max_results=5, verbose=False, keywords=None, lang='all'): br = browser() entries, baseurl = Query(title=title, author=author, isbn=isbn, publisher=publisher, keywords=keywords, max_results=max_results,rlang=lang)(br, verbose) @@ -458,7 +459,8 @@ def option_parser(): Fetch book metadata from Amazon. You must specify one of title, author, ISBN, publisher or keywords. Will fetch a maximum of 10 matches, so you should make your query as specific as possible. - You can chose the language for metadata retrieval (french & american & german). + You can chose the language for metadata retrieval: + All & US english & french & german & spanish ''' )) parser.add_option('-t', '--title', help='Book title') @@ -468,8 +470,8 @@ def option_parser(): parser.add_option('-k', '--keywords', help='Keywords') parser.add_option('-m', '--max-results', default=10, help='Maximum number of results to fetch') - parser.add_option('-l', '--lang', default='en', - help='Chosen language for metadata search (fr, en , de)') + parser.add_option('-l', '--lang', default='all', + help='Chosen language for metadata search (all, us, fr, es , de)') parser.add_option('-v', '--verbose', default=0, action='count', help='Be more verbose about errors') return parser diff --git a/src/calibre/utils/date.py b/src/calibre/utils/date.py index ec58c49628..1ea8a2c4a0 100644 --- a/src/calibre/utils/date.py +++ b/src/calibre/utils/date.py @@ -151,3 +151,44 @@ def format_date(dt, format, assume_utc=False, as_utc=False): format = re.sub('d{1,4}', format_day, format) format = re.sub('M{1,4}', format_month, format) return re.sub('yyyy|yy', format_year, format) + +def replace_months(datez, clang): + # Replace months by english equivalent for parse_date + frtoen = { + u'[jJ]anvier': u'jan', + u'[fF].vrier': u'feb', + u'[mM]ars': u'mar', + u'[aA]vril': u'apr', + u'[mM]ai': u'may', + u'[jJ]uin': u'jun', + u'[jJ]uillet': u'jul', + u'[aA]o.t': u'aug', + u'[sS]eptembre': u'sep', + u'[Oo]ctobre': u'oct', + u'[nN]ovembre': u'nov', + u'[dD].cembre': u'dec' } + detoen = { + u'[jJ]anuar': u'jan', + u'[fF]ebruar': u'feb', + u'[mM].rz': u'mar', + u'[aA]pril': u'apr', + u'[mM]ai': u'may', + u'[jJ]uni': u'jun', + u'[jJ]uli': u'jul', + u'[aA]ugust': u'aug', + u'[sS]eptember': u'sep', + u'[Oo]ktober': u'oct', + u'[nN]ovember': u'nov', + u'[dD]ezember': u'dec' } + + if clang == 'fr': + dictoen = frtoen + elif clang == 'de': + dictoen = detoen + else: + return datez + + for k in dictoen.iterkeys(): + tmp = re.sub(k, dictoen[k], datez) + if tmp != datez: break + return tmp From 56e38290df6125f34ae8f6a18ae75b4bf7e7724e Mon Sep 17 00:00:00 2001 From: Hiroshi Miura <miurahr@linux.com> Date: Sun, 28 Nov 2010 23:41:46 +0900 Subject: [PATCH 174/375] recipes: fix minor bugs, add yomiuri news - remove wrong #!(hash-bang) - add yomiuri online news --- resources/recipes/endgadget_ja.recipe | 2 - resources/recipes/jijinews.recipe | 2 - resources/recipes/mainichi.recipe | 2 - resources/recipes/nikkei_free.recipe | 6 +- resources/recipes/nikkei_sub.recipe | 6 +- resources/recipes/nikkei_sub_economy.recipe | 2 - resources/recipes/nikkei_sub_industry.recipe | 1 - resources/recipes/nikkei_sub_life.recipe | 2 - resources/recipes/nikkei_sub_main.recipe | 2 - resources/recipes/nikkei_sub_sports.recipe | 1 - resources/recipes/yomiuri.recipe | 66 ++++++++++++++++++++ 11 files changed, 71 insertions(+), 21 deletions(-) create mode 100644 resources/recipes/yomiuri.recipe diff --git a/resources/recipes/endgadget_ja.recipe b/resources/recipes/endgadget_ja.recipe index 443a85905d..891e6720a5 100644 --- a/resources/recipes/endgadget_ja.recipe +++ b/resources/recipes/endgadget_ja.recipe @@ -1,5 +1,3 @@ -#!/usr/bin/env python - __license__ = 'GPL v3' __copyright__ = '2010, Hiroshi Miura <miurahr@linux.com>' ''' diff --git a/resources/recipes/jijinews.recipe b/resources/recipes/jijinews.recipe index fe52e76aaf..4f768ce7ee 100644 --- a/resources/recipes/jijinews.recipe +++ b/resources/recipes/jijinews.recipe @@ -1,5 +1,3 @@ -#!/usr/bin/env python - __license__ = 'GPL v3' __copyright__ = '2010, Hiroshi Miura <miurahr@linux.com>' ''' diff --git a/resources/recipes/mainichi.recipe b/resources/recipes/mainichi.recipe index 47dc7d0ebc..2a44fa0980 100644 --- a/resources/recipes/mainichi.recipe +++ b/resources/recipes/mainichi.recipe @@ -1,5 +1,3 @@ -#!/usr/bin/env python - __license__ = 'GPL v3' __copyright__ = '2010, Hiroshi Miura <miurahr@linux.com>' ''' diff --git a/resources/recipes/nikkei_free.recipe b/resources/recipes/nikkei_free.recipe index d84aaa279b..adc596104b 100644 --- a/resources/recipes/nikkei_free.recipe +++ b/resources/recipes/nikkei_free.recipe @@ -1,5 +1,3 @@ -#!/usr/bin/env python - __license__ = 'GPL v3' __copyright__ = '2010, Hiroshi Miura <miurahr@linux.com>' ''' @@ -9,9 +7,9 @@ www.nikkei.com from calibre.web.feeds.news import BasicNewsRecipe class NikkeiNet(BasicNewsRecipe): - title = u'\u65e5\u7d4c\u65b0\u805e\u96fb\u5b50\u7248(Free)' + title = u'\u65e5\u7d4c\u65b0\u805e\u96fb\u5b50\u7248(Free, MAX)' __author__ = 'Hiroshi Miura' - description = 'News and current market affairs from Japan' + description = 'News and current market affairs from Japan, no subscription and getting max feed.' cover_url = 'http://parts.nikkei.com/parts/ds/images/common/logo_r1.svg' masthead_url = 'http://parts.nikkei.com/parts/ds/images/common/logo_r1.svg' oldest_article = 2 diff --git a/resources/recipes/nikkei_sub.recipe b/resources/recipes/nikkei_sub.recipe index 95b0017339..18f324009a 100644 --- a/resources/recipes/nikkei_sub.recipe +++ b/resources/recipes/nikkei_sub.recipe @@ -5,12 +5,12 @@ from calibre.ptempfile import PersistentTemporaryFile class NikkeiNet_subscription(BasicNewsRecipe): - title = u'\u65e5\u7d4c\u65b0\u805e\u96fb\u5b50\u7248' + title = u'\u65e5\u7d4c\u65b0\u805e\u96fb\u5b50\u7248(MAX)' __author__ = 'Hiroshi Miura' - description = 'News and current market affairs from Japan' + description = 'News and current market affairs from Japan, gather MAX articles' needs_subscription = True oldest_article = 2 - max_articles_per_feed = 20 + max_articles_per_feed = 10 language = 'ja' remove_javascript = False temp_files = [] diff --git a/resources/recipes/nikkei_sub_economy.recipe b/resources/recipes/nikkei_sub_economy.recipe index d762f505d1..2dd8f1add8 100644 --- a/resources/recipes/nikkei_sub_economy.recipe +++ b/resources/recipes/nikkei_sub_economy.recipe @@ -1,5 +1,3 @@ -#!/usr/bin/env python - __license__ = 'GPL v3' __copyright__ = '2010, Hiroshi Miura <miurahr@linux.com>' ''' diff --git a/resources/recipes/nikkei_sub_industry.recipe b/resources/recipes/nikkei_sub_industry.recipe index da04bbb5f3..81e86767d0 100644 --- a/resources/recipes/nikkei_sub_industry.recipe +++ b/resources/recipes/nikkei_sub_industry.recipe @@ -1,4 +1,3 @@ -#!/usr/bin/env python __license__ = 'GPL v3' __copyright__ = '2010, Hiroshi Miura <miurahr@linux.com>' diff --git a/resources/recipes/nikkei_sub_life.recipe b/resources/recipes/nikkei_sub_life.recipe index 2da5b13834..1bfa08a55f 100644 --- a/resources/recipes/nikkei_sub_life.recipe +++ b/resources/recipes/nikkei_sub_life.recipe @@ -1,5 +1,3 @@ -#!/usr/bin/env python - __license__ = 'GPL v3' __copyright__ = '2010, Hiroshi Miura <miurahr@linux.com>' ''' diff --git a/resources/recipes/nikkei_sub_main.recipe b/resources/recipes/nikkei_sub_main.recipe index 37fc8964c4..485d2f32c0 100644 --- a/resources/recipes/nikkei_sub_main.recipe +++ b/resources/recipes/nikkei_sub_main.recipe @@ -1,5 +1,3 @@ -#!/usr/bin/env python - __license__ = 'GPL v3' __copyright__ = '2010, Hiroshi Miura <miurahr@linux.com>' ''' diff --git a/resources/recipes/nikkei_sub_sports.recipe b/resources/recipes/nikkei_sub_sports.recipe index 6e5a1c6bb2..644b0aa252 100644 --- a/resources/recipes/nikkei_sub_sports.recipe +++ b/resources/recipes/nikkei_sub_sports.recipe @@ -1,4 +1,3 @@ -#!/usr/bin/env python __license__ = 'GPL v3' __copyright__ = '2010, Hiroshi Miura <miurahr@linux.com>' diff --git a/resources/recipes/yomiuri.recipe b/resources/recipes/yomiuri.recipe new file mode 100644 index 0000000000..6335b99e32 --- /dev/null +++ b/resources/recipes/yomiuri.recipe @@ -0,0 +1,66 @@ +__license__ = 'GPL v3' +__copyright__ = '2010, Hiroshi Miura <miurahr@linux.com>' +''' +www.yomiuri.co.jp +''' + +from calibre.web.feeds.news import BasicNewsRecipe +import re + +class YOLNews(BasicNewsRecipe): + title = u'YOMIURI ONLINE' + __author__ = 'Hiroshi Miura' + oldest_article = 1 + max_articles_per_feed = 50 + description = 'Japanese traditional newspaper Yomiuri Online News' + publisher = 'Yomiuri Online News' + category = 'news, japan' + language = 'ja' + encoding = 'Shift_JIS' + index = 'http://www.yomiuri.co.jp/latestnews/' + remove_javascript = True + + remove_tags_before = {'class':"article-def"} + remove_tags = [{'class':"RelatedArticle"}, + {'class:"sbtns"} + ] + remove_tags_after = {'class':"date-def"} + + def parse_feeds(self): + + feeds = BasicNewsRecipe.parse_feeds(self) + + for curfeed in feeds: + delList = [] + for a,curarticle in enumerate(curfeed.articles): + if re.search(r'rssad.jp', curarticle.url): + delList.append(curarticle) + if len(delList)>0: + for d in delList: + index = curfeed.articles.index(d) + curfeed.articles[index:index+1] = [] + + return feeds + + def parse_index(self): + feeds = [] + soup = self.index_to_soup(self.index) + topstories = soup.find('ul',attrs={'class':'list-def'}) + if topstories: + newsarticles = [] + for itt in topstories.findAll('li'): + itema = itt.find('a',href=True) + if itema: + itd1 = itema.findNextSibling(text = True) + itd2 = itd1.findNextSibling(text = True) + itd3 = itd2.findNextSibling(text = True) + newsarticles.append({ + 'title' :itema.string + ,'date' :''.join([itd1, itd2, itd3]) + ,'url' :'http://www.yomiuri.co.jp' + itema['href'] + ,'description':'' + }) + feeds.append(('News', newsarticles)) + + return feeds + From 2b2a8a1edcc789010e928ae29b3d079d79de3ec6 Mon Sep 17 00:00:00 2001 From: Hiroshi Miura <miurahr@linux.com> Date: Sun, 28 Nov 2010 23:43:35 +0900 Subject: [PATCH 175/375] recipes: fix typo --- resources/recipes/yomiuri.recipe | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/recipes/yomiuri.recipe b/resources/recipes/yomiuri.recipe index 6335b99e32..39a085bf83 100644 --- a/resources/recipes/yomiuri.recipe +++ b/resources/recipes/yomiuri.recipe @@ -22,7 +22,7 @@ class YOLNews(BasicNewsRecipe): remove_tags_before = {'class':"article-def"} remove_tags = [{'class':"RelatedArticle"}, - {'class:"sbtns"} + {'class':"sbtns"} ] remove_tags_after = {'class':"date-def"} From 5f5c41e495a50a30bb7cec0055decb0eb1156305 Mon Sep 17 00:00:00 2001 From: Hiroshi Miura <miurahr@linux.com> Date: Sun, 28 Nov 2010 23:53:46 +0900 Subject: [PATCH 176/375] recipes: add icons and yomiuri online variant --- resources/images/news/cnetjapan_digital.png | Bin 0 -> 892 bytes resources/images/news/cnetjapan_release.png | Bin 0 -> 892 bytes resources/images/news/yomiuri.png | Bin 0 -> 660 bytes resources/recipes/yomiuri.recipe | 9 +-- resources/recipes/yomiuri_world.recipe | 63 ++++++++++++++++++++ 5 files changed, 66 insertions(+), 6 deletions(-) create mode 100644 resources/images/news/cnetjapan_digital.png create mode 100644 resources/images/news/cnetjapan_release.png create mode 100644 resources/images/news/yomiuri.png create mode 100644 resources/recipes/yomiuri_world.recipe diff --git a/resources/images/news/cnetjapan_digital.png b/resources/images/news/cnetjapan_digital.png new file mode 100644 index 0000000000000000000000000000000000000000..9a0dcc8f7fa7645db5f97ef0b5e2978133e05732 GIT binary patch literal 892 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b zK-vS0-A-oPfdtD69Mgd`SU*F|v9*U87?_rNx;TbdoKBs5HhW6A$g%qG_pTQj9XoPS zgUd~N@st@t=De*<J61@C=Y_Zkv|JKnSsAd9B}R1Dr6BQlSt2Y8176GzSj%|u(V`2j z3m%JW)g4KBHh1Rt*ZaQTyL@!D;$^$p#c~$UZP@1(i~MhVGk2asvHQtCj-Ge*-tXCT z%ieFw|HbR?=I?&A^xCT`(+huIp83vE%p$4!*<*i8p65%MmETHyZ)Rs#7kb{7-yd=6 z?<t0vcb9j5vEeQ5GG$xSe#9|nVwvNMNTateUrtKRt<3I<uRb;3=Fhs4U6a!K+)BDW z<{H?t-afV<aY5dKGzaZ18e1}a1h#M=m;J=tz!!XZvcmIDk(@g$*6Im|*)Cj7G2~)> zacN=G@pZC`V(gs?9`1fEy;#%tp}*Ix>$`Wk&56!=&G>S*>#pqU6K6<iX`k4me9zKv z;`5%<2JG|oCmDxqcHDQ+eEa>%ir>>}4qV!Kd6U%X$;Qn!IYp}f_bzlv?~~pAUA{rt zJu!*>^=(atyg!Ri&9Y#8@Nc6qb6I?^7PF}Y?}fTwQok29zZPMbvi?zH+gkJgi}qH2 z=kl)+EuDBoKbpJ#(w^-OYu{YzZCk}#v*OXdy$mMe(Li*^OP;yFZHd*A^ux3DuN0N9 z+n3H?wZgID6OW<PbhR6$rCn>>?VH@oX5I){wfOzj_lxQS|M!^K8!q~{E;65oOVqVR zpkU&$wn<kwYGq`n3rZ_qZHs&P(!y!gm2|Fz#F8J+Icm)&@t3Pk;b`Sra_VyUynPi$ zjV2D)xi?PNp3ePKi|K`i`SXX#Yb}-pu&}fT2%Hcs68yvv*)UIhmt$Vk!#4+v?`Eu9 zxm>7D=tq<S7ZcwGCNl@A78QX>3fJd+cw3`+^8Y@;2bVf#Zap-8>51olH<DPVvfq2A zRL=eIm8f=k*!BP1HmfF|O-@zb4NSeNC9V-ADTyViR>?)FK#IZ0z`#=1&`8(FG{nf* z$^?ikbPdd{3=Fup)uf?l$jwj5OshoGU~FM!XaLc0!9Hs(Py>UftDnm{r-UW|`oMrT literal 0 HcmV?d00001 diff --git a/resources/images/news/cnetjapan_release.png b/resources/images/news/cnetjapan_release.png new file mode 100644 index 0000000000000000000000000000000000000000..9a0dcc8f7fa7645db5f97ef0b5e2978133e05732 GIT binary patch literal 892 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b zK-vS0-A-oPfdtD69Mgd`SU*F|v9*U87?_rNx;TbdoKBs5HhW6A$g%qG_pTQj9XoPS zgUd~N@st@t=De*<J61@C=Y_Zkv|JKnSsAd9B}R1Dr6BQlSt2Y8176GzSj%|u(V`2j z3m%JW)g4KBHh1Rt*ZaQTyL@!D;$^$p#c~$UZP@1(i~MhVGk2asvHQtCj-Ge*-tXCT z%ieFw|HbR?=I?&A^xCT`(+huIp83vE%p$4!*<*i8p65%MmETHyZ)Rs#7kb{7-yd=6 z?<t0vcb9j5vEeQ5GG$xSe#9|nVwvNMNTateUrtKRt<3I<uRb;3=Fhs4U6a!K+)BDW z<{H?t-afV<aY5dKGzaZ18e1}a1h#M=m;J=tz!!XZvcmIDk(@g$*6Im|*)Cj7G2~)> zacN=G@pZC`V(gs?9`1fEy;#%tp}*Ix>$`Wk&56!=&G>S*>#pqU6K6<iX`k4me9zKv z;`5%<2JG|oCmDxqcHDQ+eEa>%ir>>}4qV!Kd6U%X$;Qn!IYp}f_bzlv?~~pAUA{rt zJu!*>^=(atyg!Ri&9Y#8@Nc6qb6I?^7PF}Y?}fTwQok29zZPMbvi?zH+gkJgi}qH2 z=kl)+EuDBoKbpJ#(w^-OYu{YzZCk}#v*OXdy$mMe(Li*^OP;yFZHd*A^ux3DuN0N9 z+n3H?wZgID6OW<PbhR6$rCn>>?VH@oX5I){wfOzj_lxQS|M!^K8!q~{E;65oOVqVR zpkU&$wn<kwYGq`n3rZ_qZHs&P(!y!gm2|Fz#F8J+Icm)&@t3Pk;b`Sra_VyUynPi$ zjV2D)xi?PNp3ePKi|K`i`SXX#Yb}-pu&}fT2%Hcs68yvv*)UIhmt$Vk!#4+v?`Eu9 zxm>7D=tq<S7ZcwGCNl@A78QX>3fJd+cw3`+^8Y@;2bVf#Zap-8>51olH<DPVvfq2A zRL=eIm8f=k*!BP1HmfF|O-@zb4NSeNC9V-ADTyViR>?)FK#IZ0z`#=1&`8(FG{nf* z$^?ikbPdd{3=Fup)uf?l$jwj5OshoGU~FM!XaLc0!9Hs(Py>UftDnm{r-UW|`oMrT literal 0 HcmV?d00001 diff --git a/resources/images/news/yomiuri.png b/resources/images/news/yomiuri.png new file mode 100644 index 0000000000000000000000000000000000000000..4a197f888f076f9801d3fd8cfd3fb2479af6520a GIT binary patch literal 660 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v_d#0*}aI zAngIhZYQ(tK!Rljj_E*J0gT&!&6&%<z_{1b#W5t}@Z0d+d50VX<{0NG1tyhqWc}c{ zvuyk88m>QHS-aIkQ~omtsC%VrC@<Y)&MH&BkG;-qNrKjfobzwqyqR~VLH1!^!8^}? z0v`lE=(Fs|tU8pnbyr+M&id6owIU14KhN7XBe(hU?grVDEZe3F>l%9XX)LZ0NMiU= z<9D8k!J*7a)N#w3*qy?^XY`4OC-F`H&(Xx$apdftAoXw6lRvN8zmI=bvrpX7Wnnkg zJU_$`aeL9N+$Qb+nu}!=-g|v`Cu_oVua9emR+O4qXm05N7p3t0(@k&g{PFeaUi&JF zaa-7o6IatW={O7cWOerHzF@Mvd*Gvy=UL|49t`|<G%Ul`t=?;9d1C(Nrwb-CUtLwX z-nHSW!FApBVN6{Y4%cXRycW90(#vu}G&A&jOPSQFzsgaEI%`uR*%&Hny?P!`U8c_P z)_mDB2g#=i0@)Q-aS2vzadi#--lsZOx%`m{biU=u&_1Ui&+@R`Y~QA@RcmvPtV?e# z6kPd4CfDgW>$X`;rF%ly+c@T)33b~kkg$5!NxSz>aV>HZdQ3h~YCE1T-o;^?+rqdp z^k$Cr%9IECTKibVCDIm`vR2p3xfgvv|Nr)PSK9A})dOQxwZt`|BqgyV)hf9t6-Y4{ z85kPq8XD>vS%erFTbY;uk+y-Qm4QLK$Jd1@8glbfGSe!tXfT9mSfZP>3#fs?)78&q Iol`;+00UkKJpcdz literal 0 HcmV?d00001 diff --git a/resources/recipes/yomiuri.recipe b/resources/recipes/yomiuri.recipe index 39a085bf83..b3df1b58aa 100644 --- a/resources/recipes/yomiuri.recipe +++ b/resources/recipes/yomiuri.recipe @@ -8,7 +8,7 @@ from calibre.web.feeds.news import BasicNewsRecipe import re class YOLNews(BasicNewsRecipe): - title = u'YOMIURI ONLINE' + title = u'YOMIURI ONLINE(Latest)' __author__ = 'Hiroshi Miura' oldest_article = 1 max_articles_per_feed = 50 @@ -19,6 +19,7 @@ class YOLNews(BasicNewsRecipe): encoding = 'Shift_JIS' index = 'http://www.yomiuri.co.jp/latestnews/' remove_javascript = True + masthead_title = u'YOMIURI ONLINE' remove_tags_before = {'class':"article-def"} remove_tags = [{'class':"RelatedArticle"}, @@ -27,9 +28,7 @@ class YOLNews(BasicNewsRecipe): remove_tags_after = {'class':"date-def"} def parse_feeds(self): - feeds = BasicNewsRecipe.parse_feeds(self) - for curfeed in feeds: delList = [] for a,curarticle in enumerate(curfeed.articles): @@ -39,7 +38,6 @@ class YOLNews(BasicNewsRecipe): for d in delList: index = curfeed.articles.index(d) curfeed.articles[index:index+1] = [] - return feeds def parse_index(self): @@ -60,7 +58,6 @@ class YOLNews(BasicNewsRecipe): ,'url' :'http://www.yomiuri.co.jp' + itema['href'] ,'description':'' }) - feeds.append(('News', newsarticles)) - + feeds.append(('latest', newsarticles)) return feeds diff --git a/resources/recipes/yomiuri_world.recipe b/resources/recipes/yomiuri_world.recipe new file mode 100644 index 0000000000..0146ffa330 --- /dev/null +++ b/resources/recipes/yomiuri_world.recipe @@ -0,0 +1,63 @@ +__license__ = 'GPL v3' +__copyright__ = '2010, Hiroshi Miura <miurahr@linux.com>' +''' +www.yomiuri.co.jp +''' + +from calibre.web.feeds.news import BasicNewsRecipe +import re + +class YOLNews(BasicNewsRecipe): + title = u'YOMIURI ONLINE(World)' + __author__ = 'Hiroshi Miura' + oldest_article = 2 + max_articles_per_feed = 50 + description = 'Japanese traditional newspaper Yomiuri Online News/world news' + publisher = 'Yomiuri Online News' + category = 'news, japan' + language = 'ja' + encoding = 'Shift_JIS' + index = 'http://www.yomiuri.co.jp/world/' + remove_javascript = True + masthead_title = u"YOMIURI ONLINE" + + remove_tags_before = {'class':"article-def"} + remove_tags = [{'class':"RelatedArticle"}, + {'class':"sbtns"} + ] + remove_tags_after = {'class':"date-def"} + + def parse_feeds(self): + feeds = BasicNewsRecipe.parse_feeds(self) + for curfeed in feeds: + delList = [] + for a,curarticle in enumerate(curfeed.articles): + if re.search(r'rssad.jp', curarticle.url): + delList.append(curarticle) + if len(delList)>0: + for d in delList: + index = curfeed.articles.index(d) + curfeed.articles[index:index+1] = [] + return feeds + + def parse_index(self): + feeds = [] + soup = self.index_to_soup(self.index) + topstories = soup.find('ul',attrs={'class':'list-def'}) + if topstories: + newsarticles = [] + for itt in topstories.findAll('li'): + itema = itt.find('a',href=True) + if itema: + itd1 = itema.findNextSibling(text = True) + itd2 = itd1.findNextSibling(text = True) + itd3 = itd2.findNextSibling(text = True) + newsarticles.append({ + 'title' :itema.string + ,'date' :''.join([itd1, itd2, itd3]) + ,'url' :'http://www.yomiuri.co.jp' + itema['href'] + ,'description':'' + }) + feeds.append(('World', newsarticles)) + return feeds + From 21969e157cf02059bcab8a35849321d720007602 Mon Sep 17 00:00:00 2001 From: Hiroshi Miura <miurahr@linux.com> Date: Sun, 28 Nov 2010 23:58:20 +0900 Subject: [PATCH 177/375] recipe: yomiuri_world: fix for fetching date field --- resources/recipes/yomiuri_world.recipe | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/resources/recipes/yomiuri_world.recipe b/resources/recipes/yomiuri_world.recipe index 0146ffa330..eae5a2a40a 100644 --- a/resources/recipes/yomiuri_world.recipe +++ b/resources/recipes/yomiuri_world.recipe @@ -50,11 +50,9 @@ class YOLNews(BasicNewsRecipe): itema = itt.find('a',href=True) if itema: itd1 = itema.findNextSibling(text = True) - itd2 = itd1.findNextSibling(text = True) - itd3 = itd2.findNextSibling(text = True) newsarticles.append({ 'title' :itema.string - ,'date' :''.join([itd1, itd2, itd3]) + ,'date' :''.join([itd1]) ,'url' :'http://www.yomiuri.co.jp' + itema['href'] ,'description':'' }) From af98ebf24decbf35966eb3c0f69da418f4acb824 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Sun, 28 Nov 2010 12:36:33 -0700 Subject: [PATCH 178/375] Animal Politico by leamsi --- resources/recipes/animal_politico.recipe | 111 +++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 resources/recipes/animal_politico.recipe diff --git a/resources/recipes/animal_politico.recipe b/resources/recipes/animal_politico.recipe new file mode 100644 index 0000000000..f48587ea94 --- /dev/null +++ b/resources/recipes/animal_politico.recipe @@ -0,0 +1,111 @@ +#!/usr/bin/python +# encoding: utf-8 + +from calibre.web.feeds.news import BasicNewsRecipe + +class AdvancedUserRecipe1290663986(BasicNewsRecipe): + title = u'Animal Pol\u00EDtico' + publisher = u'Animal Pol\u00EDtico' + category = u'News, Mexico' + description = u'Noticias Pol\u00EDticas' + __author__ = 'leamsi' + masthead_url = 'http://www.animalpolitico.com/wp-content/themes/animal_mu/images/logo.png' + oldest_article = 1 + max_articles_per_feed = 100 + language = 'es' + + #feeds = [(u'Animal Politico', u'http://www.animalpolitico.com/feed/')] + + remove_tags_before = dict(name='div', id='main') + remove_tags = [dict(name='div', attrs={'class':'fb-like-button'})] + keep_only_tags = [dict(name='h1', attrs={'class':'entry-title'}), + dict(name='div', attrs={'class':'entry-content'})] + remove_javascript = True + INDEX = 'http://www.animalpolitico.com/' + + def generic_parse(self, soup): + articles = [] + for entry in soup.findAll(lambda tag: tag.name == 'li' and tag.has_key('class') and tag['class'].find('hentry') != -1): #soup.findAll('li', 'hentry'): + article_url = entry.a['href'] + '?print=yes' + article_title= entry.find('h3', 'entry-title') + article_title= self.tag_to_string(article_title) + article_date = entry.find('span', 'the-time') + article_date = self.tag_to_string(article_date) + article_desc = self.tag_to_string(entry.find('p')) + + #print 'Article:',article_title, article_date,article_url + #print entry['class'] + + articles.append({'title' : article_title, + 'date' : article_date, + 'description' : article_desc, + 'url' : article_url}) + # Avoid including the multimedia stuff. + if entry['class'].find('last') != -1: + break + + return articles + + def plumaje_parse(self, soup): + articles = [] + blogs_soup = soup.find(lambda tag: tag.name == 'ul' and tag.has_key('class') and tag['class'].find('bloglist-fecha') != -1) + for entry in blogs_soup.findAll('li'): + article_title = entry.p + article_url = article_title.a['href'] + '?print=yes' + article_date = article_title.nextSibling + article_title = self.tag_to_string(article_title) + article_date = self.tag_to_string(article_date).replace(u'Last Updated: ', '') + article_desc = self.tag_to_string(entry.find('h4')) + + #print 'Article:',article_title, article_date,article_url + articles.append({'title' : article_title, + 'date' : article_date, + 'description' : article_desc, + 'url' : article_url}) + + return articles + + def boca_parse(self, soup): + articles = [] + for entry in soup.findAll(lambda tag: tag.name == 'div' and tag.has_key('class') and tag['class'].find('hentry') != -1): #soup.findAll('li', 'hentry'): + article_title= entry.find('h2', 'entry-title') + article_url = article_title.a['href'] + '?print=yes' + article_title= self.tag_to_string(article_title) + article_date = entry.find('span', 'entry-date') + article_date = self.tag_to_string(article_date) + article_desc = self.tag_to_string(entry.find('div', 'entry-content')) + + #print 'Article:',article_title, article_date,article_url + #print entry['class'] + + articles.append({'title' : article_title, + 'date' : article_date, + 'description' : article_desc, + 'url' : article_url}) + # Avoid including the multimedia stuff. + if entry['class'].find('last') != -1: + break + + return articles + + + + + def parse_index(self): + gobierno_soup = self.index_to_soup(self.INDEX+'gobierno/') + congreso_soup = self.index_to_soup(self.INDEX+'congreso/') + seguridad_soup = self.index_to_soup(self.INDEX+'seguridad/') + comunidad_soup = self.index_to_soup(self.INDEX+'comunidad/') + plumaje_soup = self.index_to_soup(self.INDEX+'plumaje/') + la_boca_del_lobo_soup = self.index_to_soup(self.INDEX+'category/la-boca-del-lobo/') + + gobierno_articles = self.generic_parse(gobierno_soup) + congreso_articles = self.generic_parse(congreso_soup) + seguridad_articles = self.generic_parse(seguridad_soup) + comunidad_articles = self.generic_parse(comunidad_soup) + plumaje_articles = self.plumaje_parse(plumaje_soup) + la_boca_del_lobo_articles = self.boca_parse(la_boca_del_lobo_soup) + + + return [ (u'Gobierno', gobierno_articles), (u'Congreso', congreso_articles), (u'Seguridad', seguridad_articles), + (u'Comunidad', comunidad_articles), (u'Plumaje', plumaje_articles), (u'La Boca del Lobo', la_boca_del_lobo_articles), ] From f6d70a1cd27bda0270b6b99e346eb0723bed999c Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Sun, 28 Nov 2010 14:54:36 -0700 Subject: [PATCH 179/375] Nook Color profile: Reduce screen height to 900px --- src/calibre/customize/profiles.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/calibre/customize/profiles.py b/src/calibre/customize/profiles.py index 2318c6724e..74a79689d9 100644 --- a/src/calibre/customize/profiles.py +++ b/src/calibre/customize/profiles.py @@ -683,8 +683,8 @@ class NookColorOutput(NookOutput): short_name = 'nook_color' description = _('This profile is intended for the B&N Nook Color.') - screen_size = (600, 980) - comic_screen_size = (584, 980) + screen_size = (600, 900) + comic_screen_size = (584, 900) dpi = 169 class BambookOutput(OutputProfile): From 8af48a9d0678c533b98158877a912422460d68f5 Mon Sep 17 00:00:00 2001 From: Sengian <sengian1@gmail.com> Date: Sun, 28 Nov 2010 23:07:33 +0100 Subject: [PATCH 180/375] Various fix in amazon metadata, add german site for german users Add a clean ascii trial: this should be corrected everytime soupparser is used from lxml.html due to problems with xml_to_unicode output --- src/calibre/ebooks/metadata/amazonfr.py | 56 ++++++++++++++++--------- src/calibre/utils/cleantext.py | 15 +++++++ 2 files changed, 52 insertions(+), 19 deletions(-) create mode 100644 src/calibre/utils/cleantext.py diff --git a/src/calibre/ebooks/metadata/amazonfr.py b/src/calibre/ebooks/metadata/amazonfr.py index a77ea16d9c..5df962d8f5 100644 --- a/src/calibre/ebooks/metadata/amazonfr.py +++ b/src/calibre/ebooks/metadata/amazonfr.py @@ -10,6 +10,7 @@ from lxml import html from lxml.html import soupparser from calibre.utils.date import parse_date, utcnow, replace_months +from calibre.utils.cleantext import clean_ascii_char from calibre import browser, preferred_encoding from calibre.ebooks.chardet import xml_to_unicode from calibre.ebooks.metadata import MetaInformation, check_isbn, \ @@ -53,9 +54,9 @@ class AmazonEs(MetadataSource): self.exception = e self.tb = traceback.format_exc() -class AmazonUS(MetadataSource): +class AmazonEn(MetadataSource): - name = 'Amazon US english' + name = 'Amazon english' description = _('Downloads social metadata from amazon.com in english') supported_platforms = ['windows', 'osx', 'linux'] author = 'Sengian' @@ -65,7 +66,7 @@ class AmazonUS(MetadataSource): def fetch(self): try: self.results = search(self.title, self.book_author, self.publisher, - self.isbn, max_results=10, verbose=self.verbose, lang='us') + self.isbn, max_results=10, verbose=self.verbose, lang='en') except Exception, e: self.exception = e self.tb = traceback.format_exc() @@ -97,24 +98,29 @@ class Amazon(MetadataSource): has_html_comments = True def fetch(self): + # if not self.site_customization: + # return try: self.results = search(self.title, self.book_author, self.publisher, self.isbn, max_results=10, verbose=self.verbose, lang='all') except Exception, e: self.exception = e self.tb = traceback.format_exc() + + # @property + # def string_customization_help(self): + # return _('You can select here the language for metadata search with amazon.com') def report(verbose): if verbose: - import traceback traceback.print_exc() class Query(object): - BASE_URL_FR = 'http://www.amazon.fr' BASE_URL_ALL = 'http://www.amazon.com' + BASE_URL_FR = 'http://www.amazon.fr' BASE_URL_DE = 'http://www.amazon.de' def __init__(self, title=None, author=None, publisher=None, isbn=None, keywords=None, @@ -153,7 +159,7 @@ class Query(object): q['sort'] = 'relevanceexprank' q['field-language'] = 'Spanish' self.urldata = self.BASE_URL_ALL - elif rlang =='us': + elif rlang =='en': q['sort'] = 'relevanceexprank' q['field-language'] = 'English' self.urldata = self.BASE_URL_ALL @@ -197,24 +203,25 @@ class Query(object): return raw = xml_to_unicode(raw, strip_encoding_pats=True, resolve_entities=True)[0] + try: feed = soupparser.fromstring(raw) except: - return None, self.urldata + try: + #remove ASCII invalid chars + return soupparser.fromstring(clean_ascii_char(raw)) + except: + return None, self.urldata #nb of page try: nbresults = self.renbres.findall(feed.xpath("//*[@class='resultCount']")[0].text) - rpp = 0 - if len(nbresults) > 1: - rpp = int(nbresults[1]) - nbresults = int(nbresults[2]) except: return None, self.urldata pages =[feed] - if rpp: - nbpagetoquery = int(ceil(float(min(nbresults, self.max_results))/ rpp)) + if len(nbresults) > 1: + nbpagetoquery = int(ceil(float(min(int(nbresults[2]), self.max_results))/ int(nbresults[1]))) for i in xrange(2, nbpagetoquery + 1): try: urldata = self.urldata + '&page=' + str(i) @@ -228,7 +235,11 @@ class Query(object): try: feed = soupparser.fromstring(raw) except: - continue + try: + #remove ASCII invalid chars + return soupparser.fromstring(clean_ascii_char(raw)) + except: + continue pages.append(feed) results = [] @@ -416,7 +427,12 @@ class ResultList(list): try: return soupparser.fromstring(raw) except: - return + try: + #remove ASCII invalid chars + return soupparser.fromstring(clean_ascii_char(raw)) + except: + report(verbose) + return def populate(self, entries, browser, verbose=False): for x in entries: @@ -433,6 +449,8 @@ class ResultList(list): if verbose: print 'Failed to get all details for an entry' print e + print 'URL who failed:', x + report(verbose) continue self.append(self.fill_MI(entry, title, authors, browser, verbose)) @@ -453,16 +471,16 @@ def search(title=None, author=None, publisher=None, isbn=None, def option_parser(): parser = OptionParser(textwrap.dedent(\ - '''\ + _('''\ %prog [options] Fetch book metadata from Amazon. You must specify one of title, author, ISBN, publisher or keywords. Will fetch a maximum of 10 matches, so you should make your query as specific as possible. You can chose the language for metadata retrieval: - All & US english & french & german & spanish + All & english & french & german & spanish ''' - )) + ))) parser.add_option('-t', '--title', help='Book title') parser.add_option('-a', '--author', help='Book author(s)') parser.add_option('-p', '--publisher', help='Book publisher') @@ -471,7 +489,7 @@ def option_parser(): parser.add_option('-m', '--max-results', default=10, help='Maximum number of results to fetch') parser.add_option('-l', '--lang', default='all', - help='Chosen language for metadata search (all, us, fr, es , de)') + help='Chosen language for metadata search (all, en, fr, es, de)') parser.add_option('-v', '--verbose', default=0, action='count', help='Be more verbose about errors') return parser diff --git a/src/calibre/utils/cleantext.py b/src/calibre/utils/cleantext.py new file mode 100644 index 0000000000..6655129c15 --- /dev/null +++ b/src/calibre/utils/cleantext.py @@ -0,0 +1,15 @@ +from __future__ import with_statement +__license__ = 'GPL 3' +__copyright__ = '2010, sengian <sengian1@gmail.com>' +__docformat__ = 'restructuredtext en' + +import re + +def clean_ascii_char(txt, charlist = None): + #remove ASCII invalid chars : 0 to 8 and 11-14 to 24-26-27 by default + chars = list(range(8)) + [0x0B, 0x0E, 0x0F] + list(range(0x10, 0x19)) \ + + [0x1A, 0x1B] + if charlist is not None: + chars = charlist + illegal_chars = re.compile(u'|'.join(map(unichr, chars))) + return illegal_chars.sub('', txt) \ No newline at end of file From ddbd7449b539277a1401a7d13a44006b8c332fcb Mon Sep 17 00:00:00 2001 From: Timothy Legge <timlegge@gmail.com> Date: Sun, 28 Nov 2010 21:10:51 -0400 Subject: [PATCH 181/375] Change the method used to determine the firmware revision --- src/calibre/devices/kobo/driver.py | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/calibre/devices/kobo/driver.py b/src/calibre/devices/kobo/driver.py index 174441c276..0eddf26549 100644 --- a/src/calibre/devices/kobo/driver.py +++ b/src/calibre/devices/kobo/driver.py @@ -25,6 +25,8 @@ class KOBO(USBMS): version = (1, 0, 7) dbversion = 0 + fwversion = 0 + has_kepubs = False supported_platforms = ['windows', 'osx', 'linux'] @@ -75,6 +77,14 @@ class KOBO(USBMS): self._card_b_prefix if oncard == 'cardb' \ else self._main_prefix + # Determine the firmware version + f = open(self.normalize_path(self._main_prefix + '.kobo/version'), 'r') + fwversion = f.readline().split(',')[2] + f.close() + if fwversion != '1.0' and fwversion != '1.4': + self.has_kepubs = True + debug_print('Version of firmware: ', fwversion, 'Has kepubs:', self.has_kepubs) + self.booklist_class.rebuild_collections = self.rebuild_collections # get the metadata cache @@ -114,7 +124,7 @@ class KOBO(USBMS): #print "Image name Normalized: " + imagename if imagename is not None: bl[idx].thumbnail = ImageWrapper(imagename) - if (ContentType != '6'and self.dbversion < 8) or (self.dbversion >= 8): + if (ContentType != '6'and self.has_kepubs == False) or (self.has_kepubs == True): if self.update_metadata_item(bl[idx]): # print 'update_metadata_item returned true' changed = True @@ -122,7 +132,7 @@ class KOBO(USBMS): playlist_map[lpath] not in bl[idx].device_collections: bl[idx].device_collections.append(playlist_map[lpath]) else: - if ContentType == '6' and self.dbversion < 8: + if ContentType == '6' and self.has_kepubs == False: book = Book(prefix, lpath, title, authors, mime, date, ContentType, ImageID, size=1048576) else: try: @@ -142,7 +152,7 @@ class KOBO(USBMS): traceback.print_exc() return changed - connection = sqlite.connect(self._main_prefix + '.kobo/KoboReader.sqlite') + connection = sqlite.connect(self.normalize_path(self._main_prefix + '.kobo/KoboReader.sqlite')) cursor = connection.cursor() #query = 'select count(distinct volumeId) from volume_shortcovers' @@ -210,7 +220,7 @@ class KOBO(USBMS): # 2) volume_shorcover # 2) content - connection = sqlite.connect(self._main_prefix + '.kobo/KoboReader.sqlite') + connection = sqlite.connect(self.normalize_path(self._main_prefix + '.kobo/KoboReader.sqlite')) cursor = connection.cursor() t = (ContentID,) cursor.execute('select ImageID from content where ContentID = ?', t) @@ -352,7 +362,7 @@ class KOBO(USBMS): def contentid_from_path(self, path, ContentType): if ContentType == 6: - if self.dbversion < 8: + if self.has_kepubs == False: ContentID = os.path.splitext(path)[0] # Remove the prefix on the file. it could be either ContentID = ContentID.replace(self._main_prefix, '') @@ -403,13 +413,13 @@ class KOBO(USBMS): path = path.replace("file:///mnt/sd/", self._card_a_prefix) # print "SD Card: " + path else: - if ContentType == "6" and self.dbversion < 8: + if ContentType == "6" and self.has_kepubs == False: # This is a hack as the kobo files do not exist # but the path is required to make a unique id # for calibre's reference path = self._main_prefix + path + '.kobo' # print "Path: " + path - elif (ContentType == "6" or ContentType == "10") and self.dbversion >= 8: + elif (ContentType == "6" or ContentType == "10") and self.has_kepubs == True: path = self._main_prefix + '.kobo/kepub/' + path # print "Internal: " + path else: @@ -476,7 +486,7 @@ class KOBO(USBMS): # 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') + connection = sqlite.connect(self.normalize_path(self._main_prefix + '.kobo/KoboReader.sqlite')) cursor = connection.cursor() From bd9ab0808ef79b3b25ff7e5b673223754e0effc6 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Sun, 28 Nov 2010 20:42:08 -0700 Subject: [PATCH 182/375] ... --- src/calibre/customize/profiles.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/customize/profiles.py b/src/calibre/customize/profiles.py index 74a79689d9..2ca3bb0c54 100644 --- a/src/calibre/customize/profiles.py +++ b/src/calibre/customize/profiles.py @@ -684,7 +684,7 @@ class NookColorOutput(NookOutput): description = _('This profile is intended for the B&N Nook Color.') screen_size = (600, 900) - comic_screen_size = (584, 900) + comic_screen_size = (594, 900) dpi = 169 class BambookOutput(OutputProfile): From c4bc2ba4753e5a3737af88de7a319ab3f0f287a8 Mon Sep 17 00:00:00 2001 From: Translators <> Date: Mon, 29 Nov 2010 04:49:01 +0000 Subject: [PATCH 183/375] Launchpad automatic translations update. --- src/calibre/translations/ca.po | 54 +- src/calibre/translations/cs.po | 101 ++- src/calibre/translations/da.po | 52 +- src/calibre/translations/de.po | 1360 ++++++++++++++++------------- src/calibre/translations/es.po | 25 +- src/calibre/translations/fr.po | 8 +- src/calibre/translations/gl.po | 1013 +++++++++++---------- src/calibre/translations/it.po | 8 +- src/calibre/translations/zh_CN.po | 2 +- 9 files changed, 1479 insertions(+), 1144 deletions(-) diff --git a/src/calibre/translations/ca.po b/src/calibre/translations/ca.po index a4dc332e77..dd61705cd2 100644 --- a/src/calibre/translations/ca.po +++ b/src/calibre/translations/ca.po @@ -11,13 +11,13 @@ msgstr "" "Project-Id-Version: ca\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-11-27 20:21+0000\n" -"PO-Revision-Date: 2010-11-28 01:00+0000\n" +"PO-Revision-Date: 2010-11-28 12:13+0000\n" "Last-Translator: FerranRius <frius64@hotmail.com>\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-11-28 04:46+0000\n" +"X-Launchpad-Export-Date: 2010-11-29 04:46+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -3834,7 +3834,7 @@ msgstr "<b>Localització %d • %s</b><br />" #: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:20 #: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:34 msgid "Create catalog of books in your calibre library" -msgstr "Crea un catàleg de llibres de la vostra biblioteca" +msgstr "Crea un catàleg dels llibres de la biblioteca" #: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:31 msgid "No books selected to generate catalog for" @@ -4045,7 +4045,7 @@ 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 " +"No hi ha cap biblioteca del calibre a %s. Se suprimirà de la llista de " "biblioteques conegudes." #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:391 @@ -4068,11 +4068,11 @@ msgstr "Converteix llibres" #: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:28 msgid "Convert individually" -msgstr "Converteix individualment" +msgstr "Converteix-los individualment" #: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:30 msgid "Bulk convert" -msgstr "Converteix tots" +msgstr "Converteix-los en grup" #: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:86 msgid "Cannot convert" @@ -4215,7 +4215,7 @@ msgid "" "from your calibre library. Are you sure?" msgstr "" "Els llibres seleccionats se suprimiran <b>permanentment</b> i els fitxers es " -"suprimiran de la vostra llibreria del calibre. N'esteu segur?" +"trauran de la biblioteca del calibre. N'esteu segur?" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:185 msgid "" @@ -4506,8 +4506,8 @@ msgid "" "calibre library elsewhere." 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." +"corrupció a la biblioteca. Desar al disc està fet per exportar fitxers des " +"de la biblioteca del calibre a un altre lloc." #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:136 msgid "Error while saving" @@ -4785,8 +4785,8 @@ msgstr "" "importació de la vostra col·lecció de llibres.</p>\n" "<p>Trieu una carpeta arrel. Només es cercaran llibres dins d'aquesta carpeta " "i de les seves subcarpetes.</p>\n" -"<p>Assegureu-vos que la carpeta escollida per a la vostra biblioteca del " -"calibre <b>no està</b> dins de la carpeta arrel que heu triat.</p>" +"<p>Assegureu-vos que la carpeta escollida per a la biblioteca del calibre " +"<b>no està</b> dins de la carpeta arrel que heu triat.</p>" #: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:68 msgid "&Root folder:" @@ -5179,7 +5179,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:70 msgid "Bulk Convert" -msgstr "Convertir en massa" +msgstr "Conversió en grup" #: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:83 #: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:185 @@ -6576,7 +6576,7 @@ msgstr "Trieu format" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:38 msgid "Choose location for calibre library" -msgstr "Tria la localització de la biblioteca del calibre" +msgstr "Localització de la biblioteca del calibre" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:45 msgid "Same as current" @@ -6584,7 +6584,7 @@ msgstr "Igual que l'actual" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:46 msgid "The location %s contains the current calibre library" -msgstr "La localització %s conté la biblioteca del calibre actual" +msgstr "La biblioteca actual del calibre és a %s" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:51 msgid "No existing library found" @@ -6621,11 +6621,11 @@ msgstr "La carpeta %s no existeix" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:71 msgid "Choose your calibre library" -msgstr "Trieu la vostra biblioteca del calibre" +msgstr "Trieu la biblioteca del calibre" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:72 msgid "Your calibre library is currently located at {0}" -msgstr "La vostra biblioteca del calibre està actualment situada a {0}" +msgstr "La biblioteca del calibre està actualment situada a {0}" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library_ui.py:73 msgid "New &Location:" @@ -8098,7 +8098,7 @@ msgid "" "then remove it from the database." msgstr "" "Suprimeix l'element de la base de dades. Això traurà l'element de tots els " -"llibre i després el suprimirà de la base de dades." +"llibres i després el suprimirà de la base de dades." #: /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." @@ -8160,7 +8160,7 @@ msgstr "" "aleshores «Obre amb...» i trieu l'editor. Quan acabeu amb els ajustos, " "tanqueu la finestra del gestor de fitxers <b>i les finestres de l'editor que " "hagueu fet servir per modificar-ne les dades</b>.</p><p>Reconstrueix l'ePub " -"i actualitza la vostra biblioteca del calibre.</p>" +"i actualitza la biblioteca del calibre.</p>" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:132 msgid "No recipe selected" @@ -8637,7 +8637,7 @@ msgstr "Biblioteca" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:64 msgid "Show books in calibre library" -msgstr "Mostra els llibres a la biblioteca del calibre" +msgstr "Mostra els llibres de la biblioteca del calibre" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:65 msgid "Device" @@ -8967,9 +8967,9 @@ msgid "" "and repair it automatically? If you say No, a new empty calibre library will " "be created." msgstr "" -"Sembla que la vostra base de dades del calibre està malmesa. Voleu que el " -"calibre intenti reparar-la automàticament? Si dieu 'No', es crearà una nova " -"biblioteca del calibre buida." +"Sembla que la base de dades del calibre està malmesa. Voleu que el calibre " +"intenti reparar-la automàticament? Si dieu «No», es crearà una nova " +"biblioteca buida." #: /home/kovid/work/calibre/src/calibre/gui2/main.py:214 msgid "" @@ -8987,7 +8987,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/main.py:237 msgid "Starting %s: Loading books..." -msgstr "S'està iniciant %s: Carregant llibres..." +msgstr "S'està iniciant el %s: s'està carregant els llibres..." #: /home/kovid/work/calibre/src/calibre/gui2/main.py:282 msgid "If you are sure it is not running" @@ -12891,10 +12891,10 @@ msgstr "" "[opcions]\n" "\n" "Inicia el servidor de continguts del calibre. El servidor de continguts\n" -"del calibre mostra la vostra biblioteca per internet. La interfície per\n" -"defecte permet navegar per la biblioteca per categories. També podeu\n" -"accedir una interfície optimitzada per a navegadors mòbils a /mobile i \n" -"una interfície basada en OPDS en aplicacions de lectura a /opds.\n" +"del calibre mostra la biblioteca per internet. La interfície per defecte\n" +"permet navegar per la biblioteca per categories. També podeu accedir\n" +"a una interfície optimitzada per a navegadors mòbils a /mobile i una\n" +"interfície basada en OPDS en aplicacions de lectura a /opds.\n" "\n" "La interfície OPDS es publicita automàticament fent servir el BonJour.\n" diff --git a/src/calibre/translations/cs.po b/src/calibre/translations/cs.po index 52e5d861dd..108a4e0e16 100644 --- a/src/calibre/translations/cs.po +++ b/src/calibre/translations/cs.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" "POT-Creation-Date: 2010-11-27 20:21+0000\n" -"PO-Revision-Date: 2010-11-27 20:34+0000\n" -"Last-Translator: Aleš Bajtalon <Unknown>\n" +"PO-Revision-Date: 2010-11-28 20:16+0000\n" +"Last-Translator: Marek Sušický <Unknown>\n" "Language-Team: Czech <cs@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-28 04:46+0000\n" +"X-Launchpad-Export-Date: 2010-11-29 04:47+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -1725,6 +1725,10 @@ msgid "" "books with hard line breaks, but should be reduced if the line length is " "variable." msgstr "" +"Měřítko použité k určení délky, při které se rozbalí řádek, pokud je povolen " +"preproces. Platné hodnoty jsou desetinná čísla mezi 0 a 1. Výchozí je 0.40, " +"hned pod mediánem délky řádků. Toto typicky rozbalí knihy s pevným zalomením " +"řádku, ale počet řádků může být omezena, pokud je délka řádku proměnlivá." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:380 msgid "" @@ -1920,6 +1924,14 @@ msgid "" "By default, no fixing is done and messages are printed out for each error " "detected. Use the options to control which errors are automatically fixed." msgstr "" +"%prog [options] file.epub\n" +"\n" +"Opravit běžné problémy v souborech EPUB, které mohou způsobit, že budou " +"zamítnuty špatně navrženými vydavatelskými službami.\n" +"\n" +"Ve výchozím nastavení není provedena oprava a při každé zjištěné chybě se " +"zobrazí zpráva. Využijte volby, abyste ovlivnili, které chyby budou " +"automaticky opraveny." #: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/main.py:52 msgid "You must specify an epub file" @@ -2808,7 +2820,7 @@ msgstr "Zakázat kompresi obsahu souboru." #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/output.py:40 msgid "Tag marking book to be filed with Personal Docs" -msgstr "" +msgstr "Doplnit do označených knih Personal Docs" #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/output.py:107 msgid "All articles" @@ -2940,6 +2952,8 @@ msgid "" "Normally calibre treats blank lines as paragraph markers. With this option " "it will assume that every line represents a paragraph instead." msgstr "" +"Calibre běžně řeší prázdné řádky jako ukončení odstavců. S touto volbou se " +"bude předpokládat, že každý řádek je odstavec." #: /home/kovid/work/calibre/src/calibre/ebooks/pdb/input.py:27 #: /home/kovid/work/calibre/src/calibre/ebooks/tcr/input.py:27 @@ -2950,6 +2964,10 @@ msgid "" "spaces) represents a paragraph. Paragraphs end when the next line that " "starts with an indent is reached." msgstr "" +"Calibre běžně řeší prázdné řádky jako ukončení odstavců. S touto volbou se " +"bude předpokládat, že každý řádek začínající odrážkou (tabulátor, nebo 2+ " +"mezery) je odstavec. Odstavec končí, když je nalezen řádek začínající " +"odrážkou." #: /home/kovid/work/calibre/src/calibre/ebooks/pdb/output.py:23 msgid "Format to use inside the pdb container. Choices are:" @@ -2973,6 +2991,9 @@ msgid "" "Valid values are a decimal between 0 and 1. The default is 0.45, just below " "the median line length." msgstr "" +"Měřítko použité k určení délky, při které se řádek rozbalí. Platné hodnoty " +"jsou desetinná čísla mezi 0 a 1. Výchozí je 0.45, hned pod mediánem délky " +"řádku." #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/input.py:30 msgid "Use the new PDF conversion engine." @@ -3308,6 +3329,8 @@ msgid "" "Normally extra spaces are condensed into a single space. With this option " "all spaces will be displayed." msgstr "" +"Běžně jsou mezery navíc nahrazeny pouze jednou. S touto volbou budou " +"zobrazeny všechny." #: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:37 msgid "" @@ -4234,6 +4257,12 @@ msgid "" "books will be permanently <b>deleted</b> from your computer.<br><br> Are " "you <b>sure</b> you want to proceed?" msgstr "" +"Knižní formáty a metadata z vybraných knih budou sloučeny do <b>první " +"vybrané knihy</b> (%s). ISBN <i>nebude</ i>sloučeno.<br><br>Po sloučení " +"druhé a následně vybraných knih budou <b>odstraněny</b>. <br><br>Všechny " +"knižní formáty první vybrané knihy budou uloženy a případné duplicitní " +"formáty ve druhé a následně vybraných knihách budou trvale <b>odstraněny</b> " +"z Vašeho počítače.<br><br> Jste si <b>jisti</b>, že chcete pokračovat?" #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:222 msgid "" @@ -4620,6 +4649,14 @@ msgid "" "<p>Make sure that the folder you chose for your calibre library <b>is " "not</b> under the root folder you choose.</p>" msgstr "" +"<p>Calibre může automaticky vyhledávat knihy ve Vašem počítači. Tyto knihy " +"budou poté <b>nakopírovány</b> do Calibre knihovny. Tento průvodce Vám " +"pomůže přizpůsobit vyhledávání a proces importu pro Vaši existující sbírku " +"knih.</p>\n" +"<p>Vyberte kořenovou složku. Knihy budou vyhledávány pouze v rámci této " +"složky a všech podsložkách.</p>\n" +"<p>Ujistěte se, že složka kterou jste vybrali pro Vaši Calibre knihovnu " +"<b>není</b> pod kořenovou složkou, kterou vybíráte.</p>" #: /home/kovid/work/calibre/src/calibre/gui2/add_wizard/welcome_ui.py:68 msgid "&Root folder:" @@ -4936,7 +4973,7 @@ msgstr "Doplňující prefix tag pro poznámku:" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:86 msgid "Regex pattern describing tags to exclude as genres:" -msgstr "" +msgstr "Regulární výraz použitý k popsání tagů k vynechání žánrů:" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:87 msgid "" @@ -4969,7 +5006,7 @@ msgstr "Tag pro přání" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_tab_template_ui.py:33 msgid "Tab template for catalog.ui" -msgstr "" +msgstr "Tab template pro catalog.ui" #: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:25 msgid "Bold" @@ -4990,6 +5027,9 @@ msgid "" "in a previous conversion (if they exist) instead of using the defaults " "specified in the Preferences" msgstr "" +"Pro nastavení, které nemohou být nastaveny v tomto dialogu, použít hodnoty " +"uložené v předchozí konverzi (pokud existují), místo použití výchozích " +"hodnot napsaných v Nastavení" #: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:70 msgid "Bulk Convert" @@ -5110,6 +5150,9 @@ msgid "" "of the conversion process. This HTML can sometimes serve as a good starting " "point for hand editing a conversion." msgstr "" +"Proces ladění výstupů průběžně generovaného HTML v různých fázích procesu " +"konverze. Toto HTML může někdy sloužit jako dobrý výchozí bod pro ruční " +"editaci konverze." #: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output.py:15 msgid "EPUB Output" @@ -5335,7 +5378,7 @@ msgstr "&Wordspace:" #: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:124 msgid "Minimum para. &indent:" -msgstr "" +msgstr "Nejmenší para. &odrážka:" #: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:126 msgid "Render &tables as images" @@ -5343,7 +5386,7 @@ msgstr "Vyrenderovat &tabulky jako obrázky" #: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:127 msgid "Text size multiplier for text in rendered tables:" -msgstr "" +msgstr "Násobič velikosti textu pro vyrenderované tabulky:" #: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:128 msgid "Add &header" @@ -5538,7 +5581,7 @@ msgstr "Kindle volby" #: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:78 msgid "Periodical masthead font:" -msgstr "" +msgstr "Font pro tiráž v novinách:" #: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:79 msgid "Personal Doc tag:" @@ -5608,7 +5651,7 @@ msgstr "PDF Vstup" #: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_input_ui.py:44 msgid "Line &Un-Wrapping Factor:" -msgstr "" +msgstr "Řádkový rozbalovací faktor:" #: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_input_ui.py:45 msgid "No &Images" @@ -5773,7 +5816,7 @@ msgstr "Odstranit &záhlaví" #: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:86 msgid "Line &un-wrap factor during preprocess:" -msgstr "" +msgstr "Řádkový rozbalovací faktor během preprocesu:" #: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:87 msgid "&Preprocess input file to possibly improve structure detection" @@ -6240,6 +6283,13 @@ msgid "" "enter the full path to the file after a <code>>></code>. For example:</p>\n" "<p><code>9788842915232 >> %s</code></p>" msgstr "" +"<p>Zadat seznam ISBN do pole vlevo, každé na jeden řádek. Calibre " +"automaticky vytvoří položky pro knihy na základě ISBN a stáhne pro ně " +"metadata a obálky.</p>\n" +"<p>Jakékoliv neplatné ISBN v tomto seznamu bude ignorováno.</p>\n" +"<p>Můžete také zadat soubor, který bude přidán ke každému ISBN. Pokud toto " +"chcete, zadejte plnou cestu k souboru po <code>>></code>. Například:</p>\n" +"<p><code>9788842915232 >> %s</code></p>" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:53 msgid "&Paste from clipboard" @@ -6702,6 +6752,11 @@ msgid "" "checked, the search text must match exactly. If it is unchecked, the search " "text will match both upper- and lower-case letters" msgstr "" +"Ve znakovém módu je pole prohledáno na zadaný text. Text je nahrazen textem " +"pro náhradu, kdekoliv je v poli nalezeno. Když je náhrada dokončena, text " +"může být změněn na velká, malá nebo \"title\" písmena. Pokud je zaškrtnuto " +"políčko case sensitive, hledaný text se musí shodovat přesně. Pokud " +"zaškrtnuto není, text se vyhledá nezávisle na velikosti písma." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:295 msgid "" @@ -6967,6 +7022,8 @@ msgid "" "The field that the text will be put into after all replacements. If blank, " "the source field is used." msgstr "" +"Pole, do kterého bude vložen text po všech nahrazeních. Pokud je prázdné, " +"použije se zdrojové pole." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:394 msgid "Mode:" @@ -6982,6 +7039,9 @@ msgid "" "comma or\n" "nothing should be put between the original text and the inserted text" msgstr "" +"Pokud je mód nahrazení předřadit, nebo přidat, pak toto pole určuje, jestli " +"bude čárka\n" +"nebo prázdný znak vložen mezi vkládaný a originální text." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:398 msgid "use comma" @@ -7518,6 +7578,8 @@ msgid "" "<p>Negate this match. That is, only return results that <b>do not</b> match " "this query." msgstr "" +"<p>Negovat tuto shodu. Tzn. vrátí výsledky, které <b>nesplňují</b> tento " +"dotaz." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:44 msgid "Negate" @@ -8051,7 +8113,7 @@ msgstr "Zprávy:" #: /home/kovid/work/calibre/src/calibre/gui2/email.py:189 msgid "Attached is the %s periodical downloaded by calibre." -msgstr "" +msgstr "Přiložen je %s časopis stažený calibre." #: /home/kovid/work/calibre/src/calibre/gui2/email.py:242 msgid "E-book:" @@ -8972,7 +9034,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:22 msgid "Comma separated text, like tags, shown in the tag browser" -msgstr "" +msgstr "Čarkami oddělený text, jako tagy, zobrazen v prohlížeči tagů" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:25 msgid "Long text, like comments, not shown in the tag browser" @@ -9034,11 +9096,11 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:126 msgid "No column heading was provided" -msgstr "" +msgstr "Nebyl poskytnutý popis sloupců" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:133 msgid "The lookup name %s is already used" -msgstr "" +msgstr "Lookup name %s je již použito" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:145 msgid "The heading %s is already used" @@ -9055,7 +9117,7 @@ msgstr "Vytvořit nebo editovat uživatelsky definované sloupce" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:128 msgid "&Lookup name" -msgstr "" +msgstr "&Lookup name" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:129 msgid "Column &heading" @@ -9118,7 +9180,7 @@ msgstr "<p>Pole šablony. Používá stejnou syntaxi jako ukládání šablon." #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:144 msgid "Similar to save templates. For example, {title} {isbn}" -msgstr "" +msgstr "Podobné k uložení šablon. Například, {title} {isbn}" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:145 msgid "Default: (nothing)" @@ -10039,6 +10101,8 @@ msgstr "Najít kterékoliv" msgid "" "When selecting multiple entries in the Tag Browser match any or all of them" msgstr "" +"Když se označí více záznamů v Prohlížeči tagů, najdi libovolný, nebo všechny " +"z nich" #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:897 msgid "Manage &user categories" @@ -10144,6 +10208,9 @@ msgid "" " Quitting may cause corruption on the device.<br>\n" " Are you sure you want to quit?" msgstr "" +" komunikuje se zařízením!<br>\n" +" Ukončení může způsobit poškození v zařízení.<br>\n" +" Jste si jisti?" #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:550 msgid "WARNING: Active jobs" diff --git a/src/calibre/translations/da.po b/src/calibre/translations/da.po index 5c5d004b18..3efb08fbb9 100644 --- a/src/calibre/translations/da.po +++ b/src/calibre/translations/da.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" -"POT-Creation-Date: 2010-11-26 19:04+0000\n" -"PO-Revision-Date: 2010-11-26 21:06+0000\n" -"Last-Translator: Kovid Goyal <Unknown>\n" +"POT-Creation-Date: 2010-11-27 20:21+0000\n" +"PO-Revision-Date: 2010-11-28 07:28+0000\n" +"Last-Translator: Glenn <Unknown>\n" "Language-Team: Danish <da@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-27 04:48+0000\n" +"X-Launchpad-Export-Date: 2010-11-29 04:47+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -605,7 +605,7 @@ msgstr "Denne profil er beregnet til Amazon Kindle DX." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:684 msgid "This profile is intended for the B&N Nook Color." -msgstr "" +msgstr "Denne profil er forbeholdt B&N Nook Color." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:695 msgid "This profile is intended for the Sanda Bambook." @@ -828,7 +828,7 @@ msgstr "Kommunikér med PocketBook 301 læseren." #: /home/kovid/work/calibre/src/calibre/devices/eb600/driver.py:233 msgid "Communicate with the PocketBook 602 reader." -msgstr "" +msgstr "Kommunikér med PocketBook 602 reader." #: /home/kovid/work/calibre/src/calibre/devices/edge/driver.py:17 msgid "Entourage Edge" @@ -1042,7 +1042,7 @@ msgstr "Kommunikér med GM2000" #: /home/kovid/work/calibre/src/calibre/devices/misc.py:180 msgid "Communicate with the Acer Lumiread" -msgstr "" +msgstr "Kommunikér med Acer Lumiread" #: /home/kovid/work/calibre/src/calibre/devices/nokia/driver.py:17 msgid "Communicate with the Nokia 770 internet tablet." @@ -2808,19 +2808,19 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:25 msgid "Downloads metadata from french Nicebooks" -msgstr "" +msgstr "Hent metadata fra franske Nicebooks" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:41 msgid "Downloads covers from french Nicebooks" -msgstr "" +msgstr "Hent omslag fra franske Nicebooks" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:332 msgid "Nicebooks timed out. Try again later." -msgstr "" +msgstr "Nicebooks timede ud. Prøv igen senere." #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:337 msgid "An errror occured with Nicebooks cover fetcher" -msgstr "" +msgstr "Der skete en fejl under Nicebooks omslagshentning" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1308 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 @@ -3831,6 +3831,11 @@ msgid "" "removed. You should check them manually. This can happen if you manipulate " "the files in the library folder directly." msgstr "" +"Følgende bøger havde referencer/indgange til formater eller omslag i " +"databasen som ikke er tilgængelig. Indgangene til formaterne/omslagene er " +"blevet fjernet. Du opfordres at checke dem manuelt. De fejlende indgange kan " +"opstå, hvis du udenom calibre har ændret og/eller fjernet filer i " +"biblioteksmappen." #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:148 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:51 @@ -4015,7 +4020,7 @@ msgstr "Starter konvertering af %d bog/bøger" #: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:170 msgid "Empty output file, probably the conversion process crashed" -msgstr "" +msgstr "Tom output-fil, sandsynligvis gik konverteringsprocessen ned" #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:83 msgid "Copy to library" @@ -6380,6 +6385,14 @@ msgid "" "enter the full path to the file after a <code>>></code>. For example:</p>\n" "<p><code>9788842915232 >> %s</code></p>" msgstr "" +"<p>Indtast en liste af ISBN i tekstboksen til venstre, én per linje. Calibre " +"vil automatisk oprette indgange til bøgerne baseret på ISBN og hente " +"metadata og omslag til dem.</p>\n" +"<p>Enhver ugyldig ISBN i listen vil blive ignoreret.</p>\n" +"<p>Du kan også angive en fil, som vil blive tilføjet til hver ISBN. For at " +"gøre dette indtastes den fulde sti til filnavnet efter <code>>></code>. For " +"eksempel:</p>\n" +"<p><code>9788842915232 >> %s</code></p>" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:53 msgid "&Paste from clipboard" @@ -8244,7 +8257,7 @@ msgstr "Opskriftskildekode (python)" #: /home/kovid/work/calibre/src/calibre/gui2/email.py:145 msgid "Email %s to %s" -msgstr "" +msgstr "Email %s til %s" #: /home/kovid/work/calibre/src/calibre/gui2/email.py:187 msgid "News:" @@ -8252,7 +8265,7 @@ msgstr "Nyheder:" #: /home/kovid/work/calibre/src/calibre/gui2/email.py:189 msgid "Attached is the %s periodical downloaded by calibre." -msgstr "" +msgstr "Som bilag er %s tidsskriftet hentet af calibre." #: /home/kovid/work/calibre/src/calibre/gui2/email.py:242 msgid "E-book:" @@ -8287,11 +8300,11 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/email.py:303 msgid "Failed to email book" -msgstr "" +msgstr "Emailsending af bog fejlede" #: /home/kovid/work/calibre/src/calibre/gui2/email.py:306 msgid "sent" -msgstr "" +msgstr "sendt" #: /home/kovid/work/calibre/src/calibre/gui2/email.py:329 msgid "Sent news to" @@ -11098,6 +11111,9 @@ msgid "" "<p>Choose a location for your books. When you add books to calibre, they " "will be copied here. Use an <b>empty folder</b> for a new calibre library:" msgstr "" +"<p>Vælg en placering til dine bøger. Når du tilføjer bøger til calibre, " +"bliver de kopieret hertil. Anvend en <b>tom mappe</b> til et nyt calibre-" +"bibliotek:" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/library_ui.py:59 msgid "&Change" @@ -11266,11 +11282,11 @@ msgstr "&SSL" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:143 msgid "WARNING: Using no encryption is highly insecure" -msgstr "" +msgstr "ADVARSEL: Det er meget usikkert at udelade kryptering" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:144 msgid "&None" -msgstr "" +msgstr "&Ingen" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:145 msgid "Use Gmail" diff --git a/src/calibre/translations/de.po b/src/calibre/translations/de.po index 4d16a386fa..8eaba806fe 100644 --- a/src/calibre/translations/de.po +++ b/src/calibre/translations/de.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: de\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-11-12 23:11+0000\n" -"PO-Revision-Date: 2010-11-12 22:46+0000\n" -"Last-Translator: Kovid Goyal <Unknown>\n" +"POT-Creation-Date: 2010-11-27 20:21+0000\n" +"PO-Revision-Date: 2010-11-28 12:13+0000\n" +"Last-Translator: Manichean <Unknown>\n" "Language-Team: American English <kde-i18n-doc@lists.kde.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-13 04:53+0000\n" +"X-Launchpad-Export-Date: 2010-11-29 04:48+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Generated-By: pygettext.py 1.5\n" @@ -28,11 +28,11 @@ msgstr "Macht absolut gar nichts" #: /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/books.py:24 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:444 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:448 #: /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:650 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:657 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:401 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 @@ -41,8 +41,8 @@ msgstr "Macht absolut gar nichts" #: /home/kovid/work/calibre/src/calibre/ebooks/epub/periodical.py:124 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:93 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:95 -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:343 -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:346 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:338 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:341 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1894 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1896 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:24 @@ -56,7 +56,7 @@ msgstr "Macht absolut gar nichts" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:36 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:61 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:50 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:354 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:357 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:36 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:64 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:66 @@ -75,9 +75,9 @@ msgstr "Macht absolut gar nichts" #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:78 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:119 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:153 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:620 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:826 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:828 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:627 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:833 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:835 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:913 @@ -90,7 +90,7 @@ msgstr "Macht absolut gar nichts" #: /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 +#: /home/kovid/work/calibre/src/calibre/ebooks/pdb/input.py:40 #: /home/kovid/work/calibre/src/calibre/ebooks/pdb/palmdoc/writer.py:29 #: /home/kovid/work/calibre/src/calibre/ebooks/pdb/ztxt/writer.py:27 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/crop.py:82 @@ -110,10 +110,10 @@ msgstr "Macht absolut gar nichts" #: /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:239 -#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:241 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:356 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:363 +#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:304 +#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:306 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:355 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:362 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:279 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:282 #: /home/kovid/work/calibre/src/calibre/gui2/add.py:137 @@ -122,15 +122,15 @@ msgstr "Macht absolut gar nichts" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:114 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:139 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:141 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:927 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:936 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1249 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1252 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1039 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1042 #: /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:571 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:244 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:376 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:395 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:918 @@ -138,14 +138,14 @@ msgstr "Macht absolut gar nichts" #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:112 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:189 #: /home/kovid/work/calibre/src/calibre/library/cli.py:215 -#: /home/kovid/work/calibre/src/calibre/library/database.py:913 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:399 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:411 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1283 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1387 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2161 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2163 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2295 +#: /home/kovid/work/calibre/src/calibre/library/database.py:914 +#: /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:1254 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1355 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2151 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2153 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2284 #: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:229 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:139 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:142 @@ -186,9 +186,9 @@ msgstr "Benutzeroberflächenaktion" #: /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: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/preferences/main.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:283 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:206 msgid "Preferences" msgstr "Einstellungen" @@ -268,101 +268,101 @@ msgstr "Geben Sie die Metadaten in %s-Dateien an" msgid "Set metadata from %s files" msgstr "Geben Sie die Metadaten von %s-Dateien an" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:712 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:717 msgid "Look and Feel" msgstr "Erscheinungsbild" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:714 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:726 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:737 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:748 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:719 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:731 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:742 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:753 msgid "Interface" msgstr "Bedienungsoberfläche" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:718 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:723 msgid "Adjust the look and feel of the calibre interface to suit your tastes" msgstr "Passen Sie das Erscheinungsbild von Calibre ihren Bedürfnissen an." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:729 msgid "Behavior" msgstr "Verhalten" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:730 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:735 msgid "Change the way calibre behaves" msgstr "Ändern Sie das Verhalten von Calibre." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:735 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:740 #: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:209 msgid "Add your own columns" msgstr "Eigene Spalten hinzufügen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:741 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:746 msgid "Add/remove your own columns to the calibre book list" msgstr "Hinzufügen/Entfernen eigener Spalten in der Calibre Buchliste" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:746 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:751 msgid "Customize the toolbar" msgstr "Werkzeugleiste anpassen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:752 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:757 msgid "" "Customize the toolbars and context menus, changing which actions are " "available in each" msgstr "Passt individuell Werkzeugleiste und Kontextmenus an." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:763 msgid "Input Options" msgstr "Eingabeoptionen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:760 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:771 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:782 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:765 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:776 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:787 msgid "Conversion" msgstr "Konvertierung" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:764 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 msgid "Set conversion options specific to each input format" msgstr "Stellt Eingabeoptionen für jedes einzelne Eingabeformat ein." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:774 msgid "Common Options" msgstr "Allgemeine Einstellungen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:775 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:780 msgid "Set conversion options common to all formats" msgstr "Gemeinsame Konvertierungsoptionen für alle Formate einstellen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:780 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:785 msgid "Output Options" msgstr "Ausgabeoptionen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:786 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:791 msgid "Set conversion options specific to each output format" msgstr "" "Konvertierungsoptionen für jedes Ausgabeformat individuell einstellen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:791 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:796 msgid "Adding books" msgstr "Bücher hinzufügen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:817 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:829 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:798 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:810 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:822 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:834 msgid "Import/Export" msgstr "Import/Export" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:797 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:802 msgid "Control how calibre reads metadata from files when adding books" msgstr "" "Stellt ein, wie Calibre mit den Metadaten aus den Dateien beim Einlesen von " "Büchern verfährt." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:803 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:808 msgid "Saving books to disk" msgstr "Bücher auf Datenträger speichern" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:809 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:814 msgid "" "Control how calibre exports files from its database to disk when using Save " "to disk" @@ -370,32 +370,32 @@ msgstr "" "Stellt ein, wie Calibre Dateien aus der Datenbank exportiert, wenn \"Bücher " "auf Datenträger speichern\" gewählt wird." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:815 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:820 msgid "Sending books to devices" msgstr "Übertragen der Bücher an Geräte" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:821 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:826 msgid "Control how calibre transfers files to your ebook reader" msgstr "Stellt ein, wie Calibre die Dateien an den eBook-Reader sendet." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:827 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:832 msgid "Metadata plugboards" msgstr "Metadaten- Schalttafel" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:833 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:838 msgid "Change metadata fields before saving/sending" msgstr "Ändere Metadaten-Felder vor dem Speichern/Senden" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:838 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:843 msgid "Sharing books by email" msgstr "Bücherversand per Email" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:840 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:852 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:845 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:857 msgid "Sharing" msgstr "Versand" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:844 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:849 msgid "" "Setup sharing of books via email. Can be used for automatic sending of " "downloaded news to your devices" @@ -403,11 +403,11 @@ msgstr "" "Setup für Bücherversand per Email. Kann für den automatischen Versand von " "heruntergeladenen Nachrichten an Ihr Gerät genutzt werden." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:850 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:855 msgid "Sharing over the net" msgstr "Versand über Netzwerk" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:856 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:861 msgid "" "Setup the calibre Content Server which will give you access to your calibre " "library from anywhere, on any device, over the internet" @@ -415,34 +415,34 @@ msgstr "" "Einrichten des Calibre Servers, der Zugriff auf die Bibliothek von überall, " "mit jedem Gerät, via Internet ermöglicht." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:863 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:868 msgid "Plugins" msgstr "Plugins" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:865 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:877 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:888 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:870 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:882 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:893 msgid "Advanced" msgstr "Erweitert" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:869 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:874 msgid "Add/remove/customize various bits of calibre functionality" msgstr "Hinzufügen/Entfernen/Einstellen von verschiedenen Calibre-Funktionen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:875 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:880 msgid "Tweaks" msgstr "Kniffe" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:881 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:886 msgid "Fine tune how calibre behaves in various contexts" msgstr "" "Feineinstellungen für das Verhalten von Calibre in verschiedenen Situationen" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:886 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:891 msgid "Miscellaneous" msgstr "Verschiedenes" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:892 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:897 msgid "Miscellaneous advanced configuration" msgstr "Konfiguration verschiedener fortgeschrittener Parameter" @@ -608,7 +608,11 @@ msgstr "" msgid "This profile is intended for the Amazon Kindle DX." msgstr "Dieses Profil ist geeignet für den Amazon Kindle DX." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:686 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:684 +msgid "This profile is intended for the B&N Nook Color." +msgstr "Dieses Profil ist geeignet für den B&N Nook Color" + +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:695 msgid "This profile is intended for the Sanda Bambook." msgstr "Dieses Profil ist geeignet für den Sanda Bambook" @@ -773,18 +777,18 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:888 #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:918 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:257 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:212 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:225 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2021 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:187 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:200 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2015 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:149 msgid "News" msgstr "Nachrichten" #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2554 #: /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:1984 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2002 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:560 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1978 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1996 msgid "Catalog" msgstr "Katalog" @@ -810,6 +814,10 @@ msgstr "Kovid Goyal" msgid "Communicate with the Cybook Gen 3 / Opus eBook reader." msgstr "Kommunikation mit dem Cybook Gen 3 / Opus eBook Reader." +#: /home/kovid/work/calibre/src/calibre/devices/cybook/driver.py:64 +msgid "Communicate with the Cybook Orizon eBook reader." +msgstr "Kommunikation mit dem Cybook Orizon." + #: /home/kovid/work/calibre/src/calibre/devices/eb600/driver.py:24 msgid "Communicate with the EB600 eBook reader." msgstr "Kommunikation mit dem EB600 eBook Reader." @@ -822,6 +830,10 @@ msgstr "Kommunikation mit dem Astak Mentor EB600" msgid "Communicate with the PocketBook 301 reader." msgstr "Kommunikation mit dem PocketBook 301 Reader." +#: /home/kovid/work/calibre/src/calibre/devices/eb600/driver.py:233 +msgid "Communicate with the PocketBook 602 reader." +msgstr "Kommunikation mit dem PocketBook 602." + #: /home/kovid/work/calibre/src/calibre/devices/edge/driver.py:17 msgid "Entourage Edge" msgstr "Entourage Edge" @@ -882,8 +894,8 @@ msgstr "Kommunikation mit dem SpringDesign Alex eBook Reader." #: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:102 #: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:113 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:264 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:296 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:268 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:300 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:256 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:274 msgid "Removing books from device..." @@ -972,26 +984,26 @@ msgstr "" msgid "Getting list of books on device..." msgstr "Die Liste der Bücher auf dem Gerät beziehen ..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:300 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:307 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:304 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:311 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:281 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:286 msgid "Removing books from device metadata listing..." msgstr "Bücher von der Metadaten-Liste des Geräts entfernen ..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:312 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:347 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:316 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:351 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:219 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:250 msgid "Adding books to device metadata listing..." msgstr "Bücher zur Metadaten-Liste des Geräts hinzufügen ..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:424 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:258 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:428 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:262 msgid "Not Implemented" msgstr "Nicht implementiert" -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:425 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:429 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." @@ -1033,6 +1045,10 @@ msgstr "Kommuniziere mit dem VelocityMicro" msgid "Communicate with the GM2000" msgstr "Kommunikation mit dem GM2000" +#: /home/kovid/work/calibre/src/calibre/devices/misc.py:180 +msgid "Communicate with the Acer Lumiread" +msgstr "Kommunikation mit dem Acer Lumiread" + #: /home/kovid/work/calibre/src/calibre/devices/nokia/driver.py:17 msgid "Communicate with the Nokia 770 internet tablet." msgstr "Kommunikation mit dem Nokia 770 Internet Tablet." @@ -1055,11 +1071,11 @@ msgstr "Kommunikation mit dem Nook eBook Reader." #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:85 msgid "Nook Color" -msgstr "" +msgstr "Nook Color" #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:86 msgid "Communicate with the Nook Color eBook reader." -msgstr "" +msgstr "Kommunikation mit dem Nook Color." #: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:17 msgid "Communicate with the Nuut2 eBook reader." @@ -2137,15 +2153,6 @@ msgstr "" "wenn Sie wissen, was Sie tun, denn es kann verschiedene nervige " "Nebenwirkungen beim Rest des Konvertierungsprozesses zur Folge haben." -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:273 -msgid "" -"Average line length for line breaking if the HTML is from a previous partial " -"conversion of a PDF file. Default is %default which disables this." -msgstr "" -"Durchschnittliche Zeilenlänge für den Zeilenumbruch falls das HTML von einer " -"zuvor nur teilweise konvertierten PDF-Datei stammt. Voreinstellung ist " -"%default was dies ausschaltet." - #: /home/kovid/work/calibre/src/calibre/ebooks/html/output.py:33 msgid "CSS file used for the output instead of the default file" msgstr "Zur Ausgabe statt der Standarddatei verwendete CSS- Datei" @@ -2312,7 +2319,7 @@ msgid "Path to output file" msgstr "Pfad zur Zieldatei" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:290 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:128 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:126 msgid "Verbose processing" msgstr "Ausführlicher fortfahren" @@ -2550,7 +2557,7 @@ msgstr "Bemerkung" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:313 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1127 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:160 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:623 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:655 msgid "Tags" msgstr "Etiketten (Tags)" @@ -2706,6 +2713,7 @@ msgid "No cover found" msgstr "Kein Umschlagbild gefunden" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:28 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:44 msgid "Cover download" msgstr "Umschlagbild laden" @@ -2773,19 +2781,19 @@ msgstr "Beschreibung/Bewertungen" msgid "Download %s from %s" msgstr "Lade %s von %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:149 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:150 msgid "Convert comments downloaded from %s to plain text" msgstr "Konvertiere von %s heruntergeladene Komentare in Klartext" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:175 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:178 msgid "Downloads metadata from Google Books" msgstr "Lädt Metadaten von Google Books" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:192 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:195 msgid "Downloads metadata from isbndb.com" msgstr "Lädt Metadaten von isbndb.com" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:220 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:223 msgid "" "To use isbndb.com you must sign up for a %sfree account%s and enter your " "access key below." @@ -2793,15 +2801,15 @@ msgstr "" "Zur Verwendung von isbndb.com müssen Sie einen %skostenlosen Account%s " "erstellen und Ihren Zugangsschlüssel unten eingeben." -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:230 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:233 msgid "Downloads social metadata from amazon.com" msgstr "Lädt soziale Metadaten von amazon.com" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:251 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:254 msgid "Downloads series/tags/rating information from librarything.com" msgstr "Lädt Reihe/Etiketten/Bewertung von librarything.com" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:109 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:107 msgid "" "\n" "%prog [options] key\n" @@ -2826,23 +2834,24 @@ msgstr "" "bei isbndb.com erstellt werden kann.\n" "\n" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:120 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:118 msgid "The ISBN ID of the book you want metadata for." msgstr "Die ISBN des Buches, für das Sie Metadaten abrufen möchten." -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:122 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:120 msgid "The author whose book to search for." msgstr "Der Autor des gesuchten Buches." -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:124 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:122 msgid "The title of the book to search for." msgstr "Der Titel des gesuchten Buches." -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:126 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:124 msgid "The publisher of the book to search for." msgstr "Der Herausgeber des gesuchten Buches." #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:77 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:336 msgid " not found." msgstr " nicht gefunden." @@ -2860,6 +2869,22 @@ msgstr "" "Umschlagbild/soziale Metadaten für das durch ISBN identifizierte Buch von " "LibraryThing.com laden.\n" +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:25 +msgid "Downloads metadata from french Nicebooks" +msgstr "Lädt Metadaten vom französischen Nicebooks" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:41 +msgid "Downloads covers from french Nicebooks" +msgstr "Lädt Umschlagbilder vom französischen Nicebooks" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:332 +msgid "Nicebooks timed out. Try again later." +msgstr "Timeout von Nicebooks. Bitte versuchen Sie es später nochmal." + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:337 +msgid "An errror occured with Nicebooks cover fetcher" +msgstr "Fehler im Nicebooks Umschlagbild- Downloader aufgetreten" + #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1308 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 msgid "Cover" @@ -2973,7 +2998,7 @@ msgstr "Haupttext" msgid "%s format books are not supported" msgstr "Bücher im %s Format werden nicht unterstützt" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/cover.py:103 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/cover.py:98 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:156 msgid "Book %s of %s" msgstr "Buch %s von %s" @@ -2984,7 +3009,7 @@ msgstr "Einstellungen zur Erstellung von HTML-Inhaltsverzeichnissen." #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:159 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:71 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:621 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:653 msgid "Rating" msgstr "Bewertung" @@ -3018,7 +3043,7 @@ msgstr "Fußnoten" msgid "Sidebar" msgstr "Seitenleiste" -#: /home/kovid/work/calibre/src/calibre/ebooks/pdb/input.py:22 +#: /home/kovid/work/calibre/src/calibre/ebooks/pdb/input.py:23 #: /home/kovid/work/calibre/src/calibre/ebooks/tcr/input.py:23 #: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:24 msgid "" @@ -3029,7 +3054,7 @@ msgstr "" "Einstellung wird dagegen davon ausgegangen, dass jede Zeile einen Absatz " "darstellt." -#: /home/kovid/work/calibre/src/calibre/ebooks/pdb/input.py:26 +#: /home/kovid/work/calibre/src/calibre/ebooks/pdb/input.py:27 #: /home/kovid/work/calibre/src/calibre/ebooks/tcr/input.py:27 #: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:28 msgid "" @@ -3352,7 +3377,7 @@ msgstr "" "Geben Sie die Zeichenkodierung des Ausgabe-Dokuments an. Voreinstellung ist " "cp1252." -#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:196 +#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:256 msgid "" "This RTF file has a feature calibre does not support. Convert it to HTML " "first and then try it.\n" @@ -3600,7 +3625,7 @@ msgid "Disable UI animations" msgstr "Keine Benutzeroberflächen-Animationen" #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:183 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:494 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:509 msgid "Copied" msgstr "Kopiert" @@ -3612,7 +3637,7 @@ msgstr "Kopieren" msgid "Copy to Clipboard" msgstr "In die Zwischenablage kopieren" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:467 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:466 msgid "Choose Files" msgstr "Dateien wählen" @@ -3667,90 +3692,90 @@ msgstr "Wie viele leere Bücher?" msgid "How many empty books should be added?" msgstr "Wie viele leere Bücher sollen hinzugefügt werden?" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:143 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:202 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:147 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:206 msgid "Uploading books to device." msgstr "Lade Bücher auf das Gerät." -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:164 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:170 msgid "Books" msgstr "Bücher" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:165 msgid "EPUB Books" msgstr "EPUB Bücher" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:162 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:166 msgid "LRF Books" msgstr "LRF Bücher" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:163 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:167 msgid "HTML Books" msgstr "HTML Bücher" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:168 msgid "LIT Books" msgstr "LIT Bücher" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:169 msgid "MOBI Books" msgstr "MOBI Bücher" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:170 msgid "Topaz books" msgstr "Topaz Bücher" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:171 msgid "Text books" msgstr "Text Bücher" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:172 msgid "PDF Books" msgstr "PDF Bücher" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:173 msgid "SNB Books" msgstr "SNB- Bücher" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:174 msgid "Comics" msgstr "Comics" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:175 msgid "Archives" msgstr "Archive" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:179 msgid "Supported books" msgstr "Unterstützte Bücher" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:215 msgid "Merged some books" msgstr "Einige Bücher zusammenfügen" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:216 msgid "" "Some duplicates were found and merged into the following existing books:" msgstr "" "Es wurden einige Duplikate gefunden und mit den folgenden, schon vorhandenen " "Büchern zusammengefügt:" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:225 msgid "Failed to read metadata" msgstr "Lesen der Metadaten schlug fehl" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:226 msgid "Failed to read metadata from the following" msgstr "Lesen der Metadaten schlug fehl bei folgenden" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:241 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:246 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:245 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:250 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:269 msgid "Add to library" msgstr "Zur Bibliothek hinzufügen" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:246 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:250 #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:56 #: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:28 #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:94 @@ -3758,14 +3783,14 @@ msgstr "Zur Bibliothek hinzufügen" msgid "No book selected" msgstr "Kein Buch ausgewählt" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:263 msgid "" "The following books are virtual and cannot be added to the calibre library:" msgstr "" "Folgende Bücher sind virtuell und können nicht zur Calibre-Bibliothek " "hinzugefügt werden:" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:269 msgid "No book files found" msgstr "Keine Buch-Dateien gefunden" @@ -3779,7 +3804,7 @@ msgstr "" "Bücher aus dem angeschlossenen Gerät zur Calibre Bibliothek hinzufügen" #: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:548 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:542 msgid "Fetch annotations (experimental)" msgstr "Anmerkungen abrufen (experimentell)" @@ -3874,7 +3899,7 @@ msgid "Checking database integrity" msgstr "Überprüfe Vollständigkeit der Datenbank" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:128 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:657 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:593 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:41 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:54 msgid "Error" @@ -3890,19 +3915,15 @@ msgstr "Einige Inkonsistenzen gefunden." #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:135 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." +"The following books had formats or covers listed in the database that are " +"not actually available. The entries for the formats/covers have been " +"removed. You should check them manually. This can happen if you manipulate " +"the files in the library folder directly." msgstr "" -"Die folgenden Bücher hatten Formate in der Datenbank angegeben, die " -"tatsächlich nicht verfügbar waren. Die Einträge der Formate wurden entfernt. " -"Sie sollten diese manuell überprüfen. Dies kann passieren, wenn Sie die " -"Dateien direkt im Bibliotheksverzeichnis verändern." #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:148 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:51 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:140 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:162 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:112 msgid "%d books" msgstr "%d Bücher" @@ -4085,6 +4106,10 @@ msgstr "Konvertierung nicht möglich" msgid "Starting conversion of %d book(s)" msgstr "Starte Konvertierung von %d Büchern" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:170 +msgid "Empty output file, probably the conversion process crashed" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:83 msgid "Copy to library" msgstr "In Bibliothek kopieren" @@ -4119,9 +4144,9 @@ msgid "Could not copy books: " msgstr "Konnte Bücher nicht kopieren: " #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:147 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:720 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:685 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:664 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:687 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:190 msgid "Failed" msgstr "Fehlgeschlagen" @@ -4182,14 +4207,14 @@ msgid "Main memory" msgstr "Hauptspeicher" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:473 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:482 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:467 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:476 msgid "Storage Card A" msgstr "Speicherkarte A" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:475 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:484 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:469 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:478 msgid "Storage Card B" msgstr "Speicherkarte B" @@ -4334,7 +4359,7 @@ msgid "covers" msgstr "Umschlagbilder" #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:96 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:224 msgid "metadata" msgstr "Metadaten" @@ -4437,6 +4462,7 @@ msgid "Ctrl+P" msgstr "Ctrl+P" #: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:23 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:200 msgid "Run welcome wizard" msgstr "Willkommens-Assistenten ausführen" @@ -4528,7 +4554,7 @@ msgstr "" "Klicken Sie auf die Schaltfläche Details zeigen, um zu sehen, welche es gibt." #: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:16 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:628 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:660 msgid "Show book details" msgstr "Zeige Buchdetails" @@ -4671,7 +4697,7 @@ msgid "The specified directory could not be processed." msgstr "Das angegebene Verzeichnis konnte nicht bearbeitet werden." #: /home/kovid/work/calibre/src/calibre/gui2/add.py:229 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:869 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:813 msgid "No books" msgstr "Keine Bücher" @@ -4970,7 +4996,7 @@ msgstr "Ausgabe" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:86 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml_ui.py:42 -#: /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:82 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_tab_template_ui.py:32 #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:93 #: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:54 @@ -5013,7 +5039,7 @@ msgstr "Ausgabe" #: /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:112 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:123 msgid "Form" msgstr "Art" @@ -5100,23 +5126,23 @@ msgstr "CSV/XML Einstellungen" msgid "E-book options" msgstr "eBook Einstellungen" -#: /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:83 msgid "'Don't include this book' tag:" msgstr "'Dieses Buch nicht einschließen' Etikett:" -#: /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:84 msgid "'Mark this book as read' tag:" msgstr "'Buch als gelesen markieren' Etikett:" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:79 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:85 msgid "Additional note tag prefix:" msgstr "Zusätzliches Etiketten-Präfix für Anmerkungen:" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:86 msgid "Regex pattern describing tags to exclude as genres:" msgstr "Regex Ausdruck für Etiketten, die als Genres ausgeschlossen werden:" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:87 msgid "" "Regex tips:\n" "- The default regex - \\[.+\\] - excludes genre tags of the form [tag], " @@ -5130,22 +5156,26 @@ msgstr "" "- Ein einfacher Punkt als Regex schließt alle Genre- Etiketten aus und " "erstellt keinen Genre- Abschnitt" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:90 msgid "Include 'Titles' Section" msgstr "Im Abschnitt 'Titel' einschließen" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:91 msgid "Include 'Recently Added' Section" msgstr "Im Abschnitt 'Zuletzt hinzugefügt' einschließen" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:92 msgid "Sort numbers as text" msgstr "Zahlen als Text sortieren" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:87 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:93 msgid "Include 'Series' Section" msgstr "'Serien'- Abschnitt hinzufügen" +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:94 +msgid "Wishlist tag:" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_tab_template_ui.py:33 msgid "Tab template for catalog.ui" msgstr "Tab-Template für catalog.ui" @@ -5656,7 +5686,7 @@ msgid "Change the title of this book" msgstr "Titel dieses Buches ändern" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:179 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:335 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:336 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:377 msgid "&Author(s): " msgstr "&Autor(en): " @@ -5674,7 +5704,7 @@ msgstr "" "werden" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:182 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:344 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:345 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:388 msgid "&Publisher: " msgstr "&Herausgeber: " @@ -5685,7 +5715,7 @@ msgid "Ta&gs: " msgstr "&Etiketten: " #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:184 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:346 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:347 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:390 msgid "" "Tags categorize the book. This is particularly useful while searching. " @@ -5696,7 +5726,7 @@ msgstr "" "oder Sätze verwenden." #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:185 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:353 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:354 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:214 msgid "&Series:" @@ -5704,8 +5734,8 @@ msgstr "&Reihen:" #: /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:354 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:355 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:356 #: /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:395 msgid "List of known series. You can add new series." @@ -6230,7 +6260,7 @@ msgid "Automatically number books" msgstr "Bücher automatisch nummerieren" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:499 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:366 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:367 msgid "Force numbers to start with " msgstr "Start der Nummerierung erzwingen bei " @@ -6246,97 +6276,103 @@ msgstr "Etiketten hinzufügen" msgid "tags to remove" msgstr "Etiketten entfernen" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:44 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:136 msgid "No details available." msgstr "Keine weiteren Informationen verfügbar." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:183 msgid "Device no longer connected." msgstr "Gerät ist nicht mehr verbunden." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:307 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:301 msgid "Get device information" msgstr "Geräteinformationen erstellen" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:318 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:312 msgid "Get list of books on device" msgstr "Liste der Bücher auf dem Gerät erstellen" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:328 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:322 msgid "Get annotations from device" msgstr "Anmerkungen vom Gerät laden" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:340 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:334 msgid "Send metadata to device" msgstr "Metadaten zum Gerät senden" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:345 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:339 msgid "Send collections to device" msgstr "Sammlungen zum Gerät schicken" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:374 msgid "Upload %d books to device" msgstr "%d Bücher auf das Gerät laden" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:389 msgid "Delete books from device" msgstr "Bücher vom Gerät löschen" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:412 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:406 msgid "Download books from device" msgstr "Bücher vom Gerät herunterladen" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:422 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:416 msgid "View book on device" msgstr "Buch auf dem Gerät ansehen" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:456 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:450 msgid "Set default send to device action" msgstr "Geben Sie die voreingestellte Übertragungsart an" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:462 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:456 msgid "Send to main memory" msgstr "An Hauptspeicher senden" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:464 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:458 msgid "Send to storage card A" msgstr "An Speicherkarte A senden" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:466 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:460 msgid "Send to storage card B" msgstr "An Speicherkarte B senden" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:471 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:480 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:465 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:474 msgid "Main Memory" msgstr "Hauptspeicher" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:492 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:486 msgid "Send specific format to" msgstr "Schicke spezifisches Format an" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:493 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:487 msgid "Send and delete from library" msgstr "Übertragen und aus der Bibliothek löschen" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:536 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:530 msgid "Eject device" msgstr "Gerät auswerfen" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:658 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:594 msgid "Error communicating with device" msgstr "Fehler bei der Kommunikation mit dem Gerät" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:679 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:605 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1089 +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:296 +msgid "No suitable formats" +msgstr "Keine geeigneten Formate" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:623 msgid "Select folder to open as device" msgstr "Verzeichnis wählen, das als Gerät geöffnet werden soll" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:726 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:670 msgid "Error talking to device" msgstr "Fehler in der Kommunikation zum Gerät" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:727 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:671 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." @@ -6344,125 +6380,60 @@ msgstr "" "Es trat ein Fehler in der Kommunikation mit dem Gerät auf. Bitte entfernen " "und schließen Sie das Gerät wieder an und - oder starten Sie neu." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:770 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:714 msgid "Device: " msgstr "Gerät: " -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:772 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:716 msgid " detected." msgstr " gefunden." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:870 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:814 msgid "selected to send" msgstr "zum Übertragen ausgewählt" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:875 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:819 msgid "Choose format to send to device" msgstr "Format wählen, das ans Gerät geschickt wird" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:884 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:828 msgid "No device" msgstr "Kein Gerät" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:885 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:829 msgid "Cannot send: No device is connected" msgstr "Übertragung schlug fehl: Kein Gerät verbunden" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:888 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:892 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:832 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:836 msgid "No card" msgstr "Keine Speicherkarte" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:889 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:893 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:833 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:837 msgid "Cannot send: Device has no storage card" msgstr "Übertragung schlug fehl: Keine Speicherkarte im Gerät" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:934 -msgid "E-book:" -msgstr "eBook:" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:937 -msgid "Attached, you will find the e-book" -msgstr "Im Anhang finden Sie das eBook" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:938 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:107 -msgid "by" -msgstr "von" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:939 -msgid "in the %s format." -msgstr "im %s Format." - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:952 -msgid "Sending email to" -msgstr "Sende eMail an" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:982 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:990 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1089 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1174 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1293 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1301 -msgid "No suitable formats" -msgstr "Keine geeigneten Formate" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:983 -msgid "Auto convert the following books before sending via email?" -msgstr "" -"Die folgenden Bücher vor dem Versenden per eMail automatisch konvertieren?" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:991 -msgid "" -"Could not email the following books as no suitable formats were found:" -msgstr "" -"Konnte die folgenden Bücher nicht versenden, da geeignete Formate fehlen:" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1009 -msgid "Failed to email books" -msgstr "Senden der Bücher schlug fehl" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1010 -msgid "Failed to email the following books:" -msgstr "Senden der folgenden Bücher schlug fehl:" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1014 -msgid "Sent by email:" -msgstr "Per eMail versendet:" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1048 -msgid "News:" -msgstr "Nachrichten:" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1049 -msgid "Attached is the" -msgstr "Im Anhang ist" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1060 -msgid "Sent news to" -msgstr "Nachrichten senden an" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1090 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1175 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1294 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:883 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:966 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1083 msgid "Auto convert the following books before uploading to the device?" msgstr "" "Die folgenden Bücher vor dem Laden auf das Gerät automatisch konvertieren?" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1120 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:912 msgid "Sending catalogs to device." msgstr "Sende Kataloge ans Gerät." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1207 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:997 msgid "Sending news to device." msgstr "Sende Nachrichten an das Gerät." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1260 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1050 msgid "Sending books to device." msgstr "Sende Bücher an das Gerät." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1302 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1090 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." @@ -6471,11 +6442,11 @@ msgstr "" "fehlen. Konvertieren Sie die Bücher zuerst in ein von Ihrem Gerät " "unterstütztes Format." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1366 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1154 msgid "No space on device" msgstr "Gerätespeicher voll" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1367 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1155 msgid "" "<p>Cannot upload books to device there is no more free space available " msgstr "" @@ -6520,15 +6491,14 @@ msgstr "Bücher nach ISBN hinzufügen" msgid "" "<p>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 " -"metadata and covers for them.<p>Any invalid ISBNs in the list will be " -"ignored." +"metadata and covers for them.</p>\n" +"<p>Any invalid ISBNs in the list will be ignored.</p>\n" +"<p>You can also specify a file that will be added with each ISBN. To do this " +"enter the full path to the file after a <code>>></code>. For example:</p>\n" +"<p><code>9788842915232 >> %s</code></p>" msgstr "" -"<p>Geben Sie eine Liste von ISBNs in die linke Box ein (eine ISBN pro " -"Zeile). Calibre wird automatisch Bucheinträge basierend auf den ISBNs " -"anlegen und sowohl Metadaten als auch Buchumschläge für diese Einträge " -"herunterladen.<p>Alle ungültigen ISBNs in der Liste werden ignoriert." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:53 msgid "&Paste from clipboard" msgstr "Aus Zwischenablage einfügen" @@ -6615,7 +6585,7 @@ msgstr "Pfad der Bibliothek" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:119 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/bookmarkmanager.py:89 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:226 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:248 msgid "Name" msgstr "Name" @@ -6669,7 +6639,7 @@ msgid "No location selected" msgstr "Kein Ort ausgewählt" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:84 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:635 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:654 msgid "Bad location" msgstr "Ungültiger Ort" @@ -6770,12 +6740,12 @@ msgid "Author sort" msgstr "Autorensortierung" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:115 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:590 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:597 msgid "Invalid author name" msgstr "Ungültiger Autorenname" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:591 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:598 msgid "Author names cannot contain & characters." msgstr "Autorennamen dürfen nicht das Zeichen & enthalten." @@ -6934,50 +6904,50 @@ msgstr "Suchen/Ersetzen" msgid "Working" msgstr "Bei der Arbeit..." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:186 #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:386 msgid "Lower Case" msgstr "Kleinschreibung" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:187 #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:385 msgid "Upper Case" msgstr "Großschreibung" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:188 #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:388 msgid "Title Case" msgstr "Wortanfänge groß schreiben" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:191 msgid "Character match" msgstr "Wortsuche" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:190 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:192 msgid "Regular Expression" msgstr "Regulärer Ausdruck" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:193 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:195 msgid "Replace field" msgstr "Feld ersetzen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:194 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:196 msgid "Prepend to field" msgstr "Vorne an das Feld anfügen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:195 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:197 msgid "Append to field" msgstr "Hinten an das Feld anhängen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:208 msgid "Editing meta information for <b>%d books</b>" msgstr "Meta-Informationen für <b>%d Bücher</b> editieren" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:261 msgid "Book %d:" msgstr "Buch %d:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:276 msgid "" "<b>You can destroy your library using this feature.</b> Changes are " "permanent. There is no undo function. You are strongly encouraged to back up " @@ -6989,7 +6959,7 @@ msgstr "" "empfehlenswert, die Bibliothek vorher zu sichern.<p>Suchen und Ersetzen in " "Textfeldern via Textsuche oder reguläre Ausdrücke. " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:284 msgid "" "In character mode, the field is searched for the entered search text. The " "text is replaced by the specified replacement text everywhere it is found in " @@ -7006,7 +6976,7 @@ msgstr "" "ist sie nicht ausgewählt, werden sowohl groß- als auch kleingeschriebene " "Vorkommen gefunden." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:293 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:295 msgid "" "In regular expression mode, the search text is an arbitrary python-" "compatible regular expression. The replacement text can contain " @@ -7033,36 +7003,36 @@ msgstr "" "Sie weitere Informationen über Pythons reguläre Ausdrücke, insbesondere die " "'sub'- Funktion." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:438 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:440 msgid "You must specify a destination when source is a composite field" msgstr "" "Sie müssen ein Zielfeld auswählen, wenn die Quelle ein zusammengesetztes " "Feld ist." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:530 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:538 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:633 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:532 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:540 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:635 msgid "Search/replace invalid" msgstr "Suchen/ersetzen ungültig" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:531 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:533 msgid "" "Authors cannot be set to the empty string. Book title %s not processed" msgstr "" "Das Autorenfeld darf nicht leer sein. Buch mit dem Titel %s wurde nicht " "verarbeitet." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:539 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:541 msgid "Title cannot be set to the empty string. Book title %s not processed" msgstr "" "Das Titelfeld darf nicht leer sein. Buch mit dem Titel %s wurde nicht " "verarbeitet." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:634 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:636 msgid "Search pattern is invalid: %s" msgstr "Suchmuster ungültig: %s" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:671 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:673 msgid "" "Applying changes to %d books.\n" "Phase {0} {1}%%." @@ -7070,19 +7040,19 @@ msgstr "" "Wende Änderungen bei %d Büchern an.\n" "Phase {0} {1}%%." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:334 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:335 msgid "Edit Meta information" msgstr "Meta-Informationen bearbeiten" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:336 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:337 msgid "A&utomatically set author sort" msgstr "Automatisch Sortierung nach Autor setzen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:337 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:338 msgid "Author s&ort: " msgstr "S&ortierung nach Autor: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:338 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:339 msgid "" "Specify how the author(s) of this book should be sorted. For example Charles " "Dickens should be sorted as Dickens, Charles." @@ -7090,65 +7060,65 @@ msgstr "" "Geben Sie an, wie der Autor dieses Buches sortiert werden soll. \"Charles " "Dickens\" zum Beispiel als \"Dickens, Charles\"." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:339 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:340 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384 msgid "&Rating:" msgstr "&Bewertung:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:340 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:342 #: /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 msgid "Rating of this book. 0-5 stars" msgstr "Bewertung dieses Buches: 0-5 Sterne" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:342 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:343 msgid "No change" msgstr "Keine Änderung" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:343 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:344 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:387 msgid " stars" msgstr " Sterne" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:345 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:346 msgid "Add ta&gs: " msgstr "Etiketten hinzufü&gen: " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:347 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:348 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:349 #: /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:392 msgid "Open Tag Editor" msgstr "Etiketten-Editor öffnen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:349 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:350 msgid "&Remove tags:" msgstr "Etiketten entfe&rnen:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:350 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:351 msgid "Comma separated list of tags to remove from the books. " msgstr "" "Durch Kommata getrennte Liste der Etiketten, die von den Büchern entfernt " "werden. " -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:351 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:352 msgid "Check this box to remove all tags from the books." msgstr "Auswählen, um alle Etiketten des Buches zu entfernen." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:352 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:353 msgid "Remove all" msgstr "Alle entfernen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:356 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:357 msgid "If checked, the series will be cleared" msgstr "Wenn ausgewählt, wird der Serien- Eintrag entfernt." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:357 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:358 msgid "Clear series" msgstr "Serie löschen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:358 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:359 msgid "" "If not checked, the series number for the books will be set to 1.\n" "If checked, selected books will be automatically numbered, in the order\n" @@ -7160,11 +7130,11 @@ msgstr "" "sie ausgewählt wurden, nummeriert. Wenn Sie also zuerst Buch A und dann\n" "Buch B ausgewählt haben, wird A die Nummer 1 und B die Nummer 2 haben." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:362 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:363 msgid "Automatically number books in this series" msgstr "Bücher in dieser Reihe automatisch nummerieren" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:363 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:364 msgid "" "Series will normally be renumbered from the highest number in the database\n" "for that series. Checking this box will tell calibre to start numbering\n" @@ -7174,15 +7144,15 @@ msgstr "" "Datenbank ausgehend nummeriert. Bei Wahl dieser Option wird Calibre die\n" "Nummerierung vom Wert des Eingabefeldes aus starten." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:367 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:368 msgid "Remove &format:" msgstr "&Format entfernen:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:368 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:369 msgid "&Swap title and author" msgstr "Titel und Autor vertau&schen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:369 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:370 msgid "" "Force the title to be in title case. If both this and swap authors are " "checked,\n" @@ -7192,11 +7162,11 @@ msgstr "" "Titel und \n" "Autoren tauschen ausgewählt wird, wird die Vertauschung zuerst durchgeführt." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:371 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:372 msgid "Change title to title case" msgstr "Titel in Titelschreibweise setzen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:372 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:373 msgid "" "Remove stored conversion settings for the selected books.\n" "\n" @@ -7208,34 +7178,34 @@ msgstr "" "Für zukünftige Konvertierungen dieser Bücher werden die Voreinstellungen " "verwendet." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:375 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:376 msgid "Remove &stored conversion settings for the selected books" msgstr "" "Ge&speicherte Konvertierungs-Einstellungen für die gewählten Bücher löschen" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:377 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:424 msgid "&Basic metadata" msgstr "&Basis-Metadaten" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:377 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:378 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:425 msgid "&Custom metadata" msgstr "Ben&utzerdefinierte Metadaten" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:378 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:379 msgid "Search &field:" msgstr "Such&feld:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:379 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:380 msgid "The name of the field that you want to search" msgstr "Name des zu durchsuchenden Feldes" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:381 msgid "Search mode:" msgstr "Suchmodus:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:381 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:382 msgid "" "Choose whether to use basic text matching or advanced regular expression " "matching" @@ -7243,11 +7213,11 @@ msgstr "" "Auswählen, ob Wortsuche oder Suche mittels regulären Ausdrücken angewandt " "werden soll." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:382 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:383 msgid "&Search for:" msgstr "&Suchen nach:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:383 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:384 msgid "" "Enter the what you are looking for, either plain text or a regular " "expression, depending on the mode" @@ -7255,7 +7225,7 @@ msgstr "" "Hier Text, nach dem gesucht werden soll, eingeben, je nach Modus einfacher " "Text oder einen regulären Ausdruck" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:385 msgid "" "Check this box if the search string must match exactly upper and lower case. " "Uncheck it if case is to be ignored" @@ -7263,15 +7233,15 @@ msgstr "" "Auswählen, wenn der Suchtext auf Groß/Kleinschreibung achten soll, abwählen, " "wenn dies ignoriert werden soll" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:385 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:386 msgid "Case sensitive" msgstr "Groß/Kleinschreibung" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:386 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:387 msgid "&Replace with:" msgstr "E&rsetzen durch:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:387 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:388 msgid "" "The replacement text. The matched search text will be replaced with this " "string" @@ -7279,11 +7249,11 @@ msgstr "" "Der Ersetzungstext. Die Vorkommen des Suchtextes werden durch diesen Text " "ersetzt" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:388 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:389 msgid "Apply function after replace:" msgstr "Funktion nach Ersetzung anwenden:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:389 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:390 msgid "" "Specify how the text is to be processed after matching and replacement. In " "character mode, the entire\n" @@ -7295,11 +7265,11 @@ msgstr "" "wird das gesamte Feld verarbeitet, im Modus regulärer Ausdruck wird nur der " "gefundene Text verarbeitet." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:391 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:392 msgid "&Destination field:" msgstr "&Zielfeld:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:392 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:393 msgid "" "The field that the text will be put into after all replacements. If blank, " "the source field is used." @@ -7307,15 +7277,15 @@ msgstr "" "Das Feld, in das der Text nach allen Ersetzungen geschrieben wird. Wenn " "leer, wird das Ursprungsfeld benutzt." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:393 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:394 msgid "Mode:" msgstr "Modus:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:394 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:395 msgid "Specify how the text should be copied into the destination." msgstr "Bestimmen Sie, wie der Text in das Zielfeld geschrieben wird." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:396 msgid "" "If the replace mode is prepend or append, then this box indicates whether a " "comma or\n" @@ -7325,23 +7295,23 @@ msgstr "" "Box, ob ein\n" "Komma oder nichts zwischen dem Originaltext und dem eingefügten Text steht." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:397 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:398 msgid "use comma" msgstr "Komma benutzen." -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:398 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:399 msgid "Test &text" msgstr "Test &text" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:399 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:400 msgid "Test re&sult" msgstr "Te&stergebnis" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:401 msgid "Your test:" msgstr "Ihr Test:" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:401 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:402 msgid "&Search and replace" msgstr "&Suchen und Ersetzen" @@ -7632,20 +7602,21 @@ msgstr "Passwort erforderlich" #: /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:122 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:133 msgid "&Username:" msgstr "Ben&utzername:" #: /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:124 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:135 msgid "&Password:" msgstr "&Passwort:" #: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:167 msgid "&Show password" msgstr "Pa&sswort anzeigen" @@ -8119,12 +8090,12 @@ msgid "%s (was %s)" msgstr "%s (war %s)" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:74 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:580 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:587 msgid "Item is blank" msgstr "Eintrag ist leer" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:75 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:581 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:588 msgid "An item cannot be set to nothing. Delete it instead." msgstr "" "Ein Element kann nicht auf nichts eingestellt werden. Löschen Sie es " @@ -8210,7 +8181,7 @@ msgid "Discard changes" msgstr "Änderungen verwerfen" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:60 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:225 msgid "&Cancel" msgstr "&Abbruch" @@ -8420,6 +8391,62 @@ msgstr "" msgid "Recipe source code (python)" msgstr "Source Code (Python) des Schemas" +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:145 +msgid "Email %s to %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:187 +msgid "News:" +msgstr "Nachrichten:" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:189 +msgid "Attached is the %s periodical downloaded by calibre." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:242 +msgid "E-book:" +msgstr "eBook:" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:245 +msgid "Attached, you will find the e-book" +msgstr "Im Anhang finden Sie das eBook" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:246 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:107 +msgid "by" +msgstr "von" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:247 +msgid "in the %s format." +msgstr "im %s Format." + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:260 +msgid "Sending email to" +msgstr "Sende eMail an" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:290 +msgid "Auto convert the following books before sending via email?" +msgstr "" +"Die folgenden Bücher vor dem Versenden per eMail automatisch konvertieren?" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:297 +msgid "" +"Could not email the following books as no suitable formats were found:" +msgstr "" +"Konnte die folgenden Bücher nicht versenden, da geeignete Formate fehlen:" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:303 +msgid "Failed to email book" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:306 +msgid "sent" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:329 +msgid "Sent news to" +msgstr "Nachrichten senden an" + #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:112 msgid "" "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" " @@ -8617,23 +8644,23 @@ msgstr "Kann Aufträge, die mit dem Gerät kommunizieren, nicht abbrechen" msgid "Job has already run" msgstr "Auftrag wird schon ausgeführt" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:251 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:262 msgid "Unavailable" msgstr "Nicht verfügbar" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:294 msgid "Jobs:" msgstr "Aufträge:" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:296 msgid "Shift+Alt+J" msgstr "Shift+Alt+J" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:302 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:313 msgid "Click to see list of jobs" msgstr "Klicken, um Jobliste anzuzeigen" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:371 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:382 msgid " - Jobs" msgstr " - Aufträge" @@ -8659,7 +8686,7 @@ msgid "Show books in the main memory of the device" msgstr "Zeige Bücher im Hauptspeicher des Geräts" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:67 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:848 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:820 msgid "Card A" msgstr "Karte A" @@ -8668,7 +8695,7 @@ msgid "Show books in storage card A" msgstr "Zeige Bücher auf Speicherkarte A" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:69 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:850 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:822 msgid "Card B" msgstr "Karte B" @@ -8752,7 +8779,7 @@ msgstr "Buch %s von %s" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:693 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1236 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:407 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:414 msgid "The lookup/search name is \"{0}\"" msgstr "Der Such-Name ist \"{0}\"" @@ -8854,7 +8881,7 @@ msgid "<b>No matches</b> for the search phrase <i>%s</i> were found." msgstr "<b>Keine Treffer</b> für die Suchworte <i>%s</i> gefunden." #: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:160 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:443 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:446 msgid "No matches found" msgstr "Keine Treffer gefunden" @@ -8871,12 +8898,12 @@ msgid "LRF Viewer toolbar" msgstr "LRF Viewer Symbolleiste" #: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:131 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:487 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:503 msgid "Next Page" msgstr "Nächste Seite" #: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:132 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:488 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:504 msgid "Previous Page" msgstr "Vorherige Seite" @@ -8920,7 +8947,7 @@ msgid "Do not check for updates" msgstr "Nicht nach Updates suchen" #: /home/kovid/work/calibre/src/calibre/gui2/main.py:58 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:643 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:662 msgid "Calibre Library" msgstr "Calibre Bibliothek" @@ -9059,37 +9086,37 @@ msgstr "Buch hat weder Titel noch ISBN" msgid "No matches found for this book" msgstr "Keine Treffer für dieses Buch" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:190 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:191 msgid "Failed to download metadata" msgstr "Download der Metadaten fehlgeschlagen" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:224 msgid "cover" msgstr "Umschlagbild" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:225 msgid "Downloaded" msgstr "Heruntergeladen" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:225 msgid "Failed to get" msgstr "Herunterladen fehlgeschlagen" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:229 msgid "%s %s for: %s" msgstr "%s %s für: %s" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:284 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:288 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:162 msgid "Done" msgstr "Fertig" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:289 msgid "Successfully downloaded metadata for %d out of %d books" msgstr "Erfolgreich Metadaten heruntergeladen für %d von %d Büchern" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:287 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:627 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:291 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:659 msgid "Details" msgstr "Einzelheiten" @@ -9647,27 +9674,27 @@ msgstr "&Text unter Symbolen anzeigen:" msgid "&Split the toolbar into two toolbars" msgstr "&Werkzeugleiste in zwei Leisten teilen" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:222 msgid "&Apply" msgstr "&Anwenden" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:229 msgid "Restore &defaults" msgstr "Voreinstellungen wie&derherstellen" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:230 msgid "Save changes" msgstr "Änderungen speichern" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:231 msgid "Cancel and return to overview" msgstr "Abbrechen und zur Übersicht zurückkehren" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:269 msgid "Restoring to defaults not supported for" msgstr "Voreinstellungen wiederherstellen wird nicht unterstützt für" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:304 msgid "" "Some of the changes you made require a restart. Please restart calibre as " "soon as possible." @@ -9675,7 +9702,7 @@ msgstr "" "Einige Ihrer Änderungen erfordern einen Neustart. Bitte starten Sie Calibre " "so früh wie möglich neu." -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:297 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:307 msgid "" "The changes you have made require calibre be restarted immediately. You will " "not be allowed set any more preferences, until you restart." @@ -9683,7 +9710,7 @@ msgstr "" "Ihre Änderungen erfordern einen sofortigen Neustart von Calibre. Sie können " "keine Einstellungen mehr ändern, bevor Sie neu starten." -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:302 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:312 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server.py:120 msgid "Restart needed" msgstr "Neustart erforderlich" @@ -10043,7 +10070,7 @@ msgstr "" "überschrieben werden." #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server.py:75 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:320 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:331 msgid "Failed to start content server" msgstr "Content Server konnte nicht gestartet werden" @@ -10264,7 +10291,7 @@ msgstr "Aktuelle &Optimierungen" #: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:97 #: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:270 #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:574 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:250 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:272 msgid "Search" msgstr "Suche" @@ -10362,26 +10389,22 @@ msgstr "Löschen" msgid "&Alternate shortcut:" msgstr "&Alternatives Tastenkürzel:" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:200 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:202 msgid "Rename '%s'" msgstr "Benenne '%s' um" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:204 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:206 msgid "Edit sort for '%s'" msgstr "Sortierung nach '%s' bearbeiten" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:209 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:211 msgid "Hide category %s" msgstr "Kategorie %s ausblenden" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:214 msgid "Show category" msgstr "Kategorie anzeigen" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:216 -msgid "Show all categories" -msgstr "Alle Kategorien anzeigen" - #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:223 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:227 msgid "Manage %s" @@ -10396,58 +10419,62 @@ msgstr "Gespeicherte Suchen verwalten" msgid "Manage User Categories" msgstr "Benutzer-Kategorien verwalten" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:451 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:248 +msgid "Show all categories" +msgstr "Alle Kategorien anzeigen" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:458 msgid "" "Changing the authors for several books can take a while. Are you sure?" msgstr "" "Das Ändern der Autoren für mehrere Bücher kann einige Zeit dauern. Sind Sie " "sicher?" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:456 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:463 msgid "" "Changing the metadata for that many books can take a while. Are you sure?" msgstr "" "Das Ändern der Metadaten für so viele Bücher kann einige Zeit dauern. Sind " "Sie sicher?" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:512 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:320 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:519 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:296 msgid "Searches" msgstr "Suchergebnisse" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:595 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:602 msgid "Duplicate search name" msgstr "Such-Name duplizieren" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:596 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:603 msgid "The saved search name %s is already used." msgstr "Der gespeicherte Such-Name %s wird schon verwendet." -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:878 msgid "Sort by name" msgstr "Nach Name sortieren" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:878 msgid "Sort by popularity" msgstr "Nach Beliebtheit sortieren" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:872 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:879 msgid "Sort by average rating" msgstr "Nach Bewertungsdurchschnitt sortieren" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:875 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:882 msgid "Set the sort order for entries in the Tag Browser" msgstr "Reihenfolge der Einträge im Etiketten- Browser einstellen" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:881 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:888 msgid "Match all" msgstr "Übereinstimmung mit allen" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:881 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:888 msgid "Match any" msgstr "Übereinstimmung mit irgendeinem" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:886 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:893 msgid "" "When selecting multiple entries in the Tag Browser match any or all of them" msgstr "" @@ -10455,11 +10482,11 @@ msgstr "" "entweder Bücher, bei denen mindestens ein Eintrag paßt, oder aber Bücher, " "bei denen alle Einträge passen" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:890 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:897 msgid "Manage &user categories" msgstr "Ben&utzer-Kategorien verwalten" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:893 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:900 msgid "Add your own categories to the Tag Browser" msgstr "Eigene Kategorien zum Etiketten- Browser hinzufügen" @@ -10506,28 +10533,28 @@ msgstr "" "Die folgenden Bücher wurden schon in das %s Format konvertiert. Möchten Sie " "sie erneut konvertieren?" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:171 msgid "&Restore" msgstr "&Wiederherstellen" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:173 msgid "&Donate to support calibre" msgstr "Spen&den Sie, um Calibre zu unterstützen" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:177 msgid "&Eject connected device" msgstr "Verbundenes Gerät ausw&erfen" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:218 msgid "Calibre Quick Start Guide" msgstr "Calibre Quick-Start-Guide" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:437 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:465 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:439 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:450 msgid "Conversion Error" msgstr "Konvertierungsfehler" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:438 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:451 msgid "" "<p>Could not convert: %s<p>It is a <a href=\"%s\">DRM</a>ed book. You must " "first remove the DRM using third party tools." @@ -10536,15 +10563,15 @@ msgstr "" "href=\"%s\">DRM</a> geschütztes Buch. Sie müssen zuerst das DRM mit Hilfe " "anderer Programme entfernen." -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:451 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:465 msgid "Recipe Disabled" msgstr "Downloadschema ausgeschalten" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:466 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:481 msgid "<b>Failed</b>" msgstr "<b>Misslungen</b>" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:502 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:517 msgid "" "is the result of the efforts of many volunteers from all over the world. If " "you find it useful, please consider donating to support its development. " @@ -10555,12 +10582,12 @@ msgstr "" "Unterstützung der weiteren Entwicklung. Ihre Spende hilft, die Entwicklung " "von Calibre am Laufen zu halten." -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:543 msgid "There are active jobs. Are you sure you want to quit?" msgstr "" "Es bestehen aktive Aufträge. Sind Sie sicher, dass sie es beenden wollen?" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:531 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:546 msgid "" " is communicating with the device!<br>\n" " Quitting may cause corruption on the device.<br>\n" @@ -10571,11 +10598,11 @@ msgstr "" "verursachen.<br>\n" " Sind Sie sicher, dass sie beenden möchten?" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:535 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:550 msgid "WARNING: Active jobs" msgstr "WARNUNG: Aktive Aufträge" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:613 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:628 msgid "" "will keep running in the system tray. To close it, choose <b>Quit</b> in the " "context menu of the system tray." @@ -10756,17 +10783,17 @@ msgstr "Tasten&kürzel" msgid "No results found for:" msgstr "Kein Ergebnis gefunden für:" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:35 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:36 msgid "Options to customize the ebook viewer" msgstr "Einstellungen zum Anpassen des eBook Viewers" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:42 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:708 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:43 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:711 msgid "Remember last used window size" msgstr "Zuletzt verwendete Fenstergröße merken" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:44 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:45 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:82 msgid "" "Set the user CSS stylesheet. This can be used to customize the look of all " "books." @@ -10774,80 +10801,80 @@ msgstr "" "Geben Sie das Benutzerlayout als CSS an. Verwenden Sie dies zur Anpassung " "des Aussehens aller Bücher." -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:47 msgid "Maximum width of the viewer window, in pixels." msgstr "Maximale Bildschirmbreite in Punkt." -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:48 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:49 msgid "Resize images larger than the viewer window to fit inside it" msgstr "Bilder, die größer als das Viewer-Fenster sind, passend verkleinern" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:50 msgid "Hyphenate text" msgstr "Silbentrennung" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:51 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:52 msgid "Default language for hyphenation rules" msgstr "Voreingestellte Sprache für die Regeln der Silbentrennung" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:53 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:54 msgid "Font options" msgstr "Schrifteinstellungen" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:55 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:56 msgid "The serif font family" msgstr "Serife Schriftartfamilie" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:57 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:58 msgid "The sans-serif font family" msgstr "Serifenlose Schriftartfamilie" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:59 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:60 msgid "The monospaced font family" msgstr "Nichtproportionale Schriftartfamilie" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:61 msgid "The standard font size in px" msgstr "Standardschriftgröße in Punkt" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:61 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:62 msgid "The monospaced font size in px" msgstr "Nichtproportionale Schriftgröße in Punkt" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:62 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:63 msgid "The standard font type" msgstr "Standardschriftart" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:463 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:479 msgid "&Lookup in dictionary" msgstr "Im Wörterbuch nachsch&lagen" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:466 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:482 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:138 msgid "Go to..." msgstr "Gehe zu..." -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:478 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:494 msgid "Next Section" msgstr "Nächster Abschnitt" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:479 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:495 msgid "Previous Section" msgstr "Vorheriger Abschnitt" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:481 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:497 msgid "Document Start" msgstr "Beginn des Dokuments" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:482 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:498 msgid "Document End" msgstr "Ende des Dokuments" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:484 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:500 msgid "Section Start" msgstr "Beginn des Abschnitts" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:485 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:501 msgid "Section End" msgstr "Ende des Abschnitts" @@ -10917,89 +10944,89 @@ msgstr "" msgid "Search for text in book" msgstr "Suche nach Text im Buch" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:275 msgid "Print Preview" msgstr "Druckvorschau" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:309 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:312 msgid "Connecting to dict.org to lookup: <b>%s</b>…" msgstr "Verbinde mit dict.org zum Nachschlagen von: <b>%s</b>…" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:410 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:413 msgid "Choose ebook" msgstr "eBook wählen" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:411 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:414 msgid "Ebooks" msgstr "eBooks" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:444 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:447 msgid "No matches found for: %s" msgstr "Keine Treffer gefunden für: %s" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:485 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:488 msgid "Loading flow..." msgstr "Lade Ablauf..." -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:521 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:524 msgid "Laying out %s" msgstr "Lege %s an" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:552 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:555 msgid "Bookmark #%d" msgstr "#%d zu Lesezeichen hinzufügen" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:556 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:559 msgid "Add bookmark" msgstr "Lesezeichen hinzufügen" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:557 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:560 msgid "Enter title for bookmark:" msgstr "Titel für Lesezeichen eingeben:" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:567 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:570 msgid "Manage Bookmarks" msgstr "Lesezeichen verwalten" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:604 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:607 msgid "Loading ebook..." msgstr "Lade eBook..." -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:612 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:615 msgid "DRM Error" msgstr "DRM Fehler" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:613 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:616 msgid "<p>This book is protected by <a href=\"%s\">DRM</a>" msgstr "<p>Dieses Buch ist geschützt durch <a href=\"%s\">DRM</a>" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:617 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:620 msgid "Could not open ebook" msgstr "Konnte eBook nicht öffnen" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:695 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:698 msgid "Options to control the ebook viewer" msgstr "Einstellungen zur Kontrolle des eBook Viewers" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:702 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:705 msgid "" "If specified, viewer window will try to come to the front when started." msgstr "" "Falls angegeben, dann wird das Viewer Fenster beim Start im Vordergrund " "angezeigt." -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:705 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:708 msgid "" "If specified, viewer window will try to open full screen when started." msgstr "" "Wenn ausgewählt, wird das Betrachter- Fenster nach Möglichkeit im " "Vollbildmodus geöffnet." -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:710 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:713 msgid "Print javascript alert and console messages to the console" msgstr "Javascript Alarme und Konsolennachrichten auf der Konsole ausgeben" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:716 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:719 msgid "" "%prog [options] file\n" "\n" @@ -11117,7 +11144,7 @@ msgstr "Ausblenden" msgid "Toggle" msgstr "Umschalten" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:385 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:400 msgid "" "If you use the WordPlayer e-book app on your Android phone, you can access " "your calibre book collection directly on the device. To do this you have to " @@ -11127,7 +11154,7 @@ msgstr "" "können Sie auf ihre Calibre Büchersammlung direkt vom Gerät aus zugreifen. " "Dazu müssen Sie den Calibre Content Server einschalten." -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:389 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:404 msgid "" "Remember to leave calibre running as the server only runs as long as calibre " "is running." @@ -11135,7 +11162,7 @@ msgstr "" "Denken Sie daran, Calibre gestartet zu lassen, da der Server nur solange " "läuft, wie auch Calibre läuft." -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:391 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:406 msgid "" "You have to add the URL http://myhostname:8080 as your calibre library in " "WordPlayer. Here myhostname should be the fully qualified hostname or the IP " @@ -11145,20 +11172,20 @@ msgstr "" "WordPlayer hinzufügen. Dabei sollte myhostname der vollständige Servername " "oder die IP-Adresse des Rechners sein, auf dem Calibre läuft." -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:468 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:483 msgid "Moving library..." msgstr "Verschiebe Bibliothek..." -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:484 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:485 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:499 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:500 msgid "Failed to move library" msgstr "Verschieben der Bibliothek schlug fehl" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:539 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:554 msgid "Invalid database" msgstr "Ungültige Datenbank" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:540 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:555 msgid "" "<p>An invalid library already exists at %s, delete it before trying to move " "the existing library.<br>Error: %s" @@ -11166,22 +11193,22 @@ msgstr "" "<p>Eine ungültige Bibliothek ist schon in %s vorhanden, löschen Sie sie " "bevor Sie die aktuelle Bibliothek verschieben.<br>Fehler: %s" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:551 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:566 msgid "Could not move library" msgstr "Konnte Bibliothek nicht verschieben" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:622 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:641 msgid "Select location for books" msgstr "Speicherort für Bücher wählen" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:636 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:655 msgid "" "You must choose an empty folder for the calibre library. %s is not empty." msgstr "" "Sie müssen für die Calibre- Bibliothek einen leeren Ordner wählen. %s ist " "nicht leer." -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:710 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:729 msgid "welcome wizard" msgstr "Willkommens-Assistent" @@ -11268,11 +11295,9 @@ msgstr "Wäh&len Sie Ihre Sprache:" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/library_ui.py:58 msgid "" -"Choose a location for your books. When you add books to calibre, they will " -"be copied here:" +"<p>Choose a location for your books. When you add books to calibre, they " +"will be copied here. Use an <b>empty folder</b> for a new calibre library:" msgstr "" -"Wählen Sie einen Speicherort für Ihre Bücher. Wenn Sie Bücher zu Calibre " -"hinzufügen, werden sie hierhin kopiert:" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/library_ui.py:59 msgid "&Change" @@ -11288,50 +11313,72 @@ msgstr "" "Speicherort kopiert. Falls am neuen Speicherort schon eine Calibre " "Bibliothek besteht, wird Calibre diese verwenden." -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:34 msgid "Using: %s:%s@%s:%s and %s encryption" msgstr "Gebrauch von: %s:%s@%s:%s und %s Verschlüsselung" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:37 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:39 msgid "Sending..." msgstr "Übermittlung läuft..." -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:42 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:44 msgid "Mail successfully sent" msgstr "eMail erfolgreich verschickt" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:124 -msgid "Finish gmail setup" -msgstr "Googlemail Setup abschließen" - -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:136 msgid "" -"Dont forget to enter your gmail username and password. You can sign up for a " -"free gmail account at http://gmail.com" +"If you are setting up a new hotmail account, you must log in to it once " +"before you will be able to send mails." msgstr "" -"Vergessen Sie nicht, Ihren Googlemail Benutzernamen und Ihr Passwort " -"einzugeben. Sie können ein kostenloses Konto bei http://mail.google.com " -"erstellen." -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:133 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:140 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:147 +msgid "" +"You can sign up for a free {name} email account at <a " +"href=\"http://{url}\">http://{url}</a>. {extra}" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:154 +msgid "Your %s &email address:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:155 +msgid "Your %s &username:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:156 +msgid "Your %s &password:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:174 +msgid "" +"If you plan to use email to send books to your Kindle, remember to add the " +"your %s email address to the allowed email addresses in your Amazon.com " +"Kindle management page." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:181 +msgid "Setup" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:196 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:203 msgid "Bad configuration" msgstr "Schlechte Einstellung" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:197 msgid "You must set the From email address" msgstr "Sie müssen die eMail-Adresse des Absenders angeben" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:204 msgid "You must set the username and password for the mail server." msgstr "" "Sie müssen den Benutzernamen und das Passwort für den Mailserver angeben." -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:124 msgid "Send email &from:" msgstr "eMail senden &von:" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:125 msgid "" "<p>This is what will be present in the From: field of emails sent by " "calibre.<br> Set it to your email address" @@ -11339,7 +11386,7 @@ msgstr "" "<p>Dies steht im \"Von\" Feld (Absender) von mit Calibre versendeten " "eMails.<br> Geben Sie Ihre eMail-Adresse an" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:126 msgid "" "<p>A mail server is useful if the service you are sending mail to only " "accepts email from well know mail services." @@ -11347,52 +11394,52 @@ msgstr "" "<p>Ein Mailserver ist nützlich, wenn der Diensteanbieter, an den Sie die " "eMail senden, nur eMails von bekannten eMail-Diensteanbietern annimmt." -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:127 msgid "Mail &Server" msgstr "Mail&server" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:128 msgid "calibre can <b>optionally</b> use a server to send mail" msgstr "" "Calibre kann <b>wahlweise</b> einen Server zum Versenden von Nachrichten " "verwenden" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:129 msgid "&Hostname:" msgstr "&Rechnername:" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:130 msgid "The hostname of your mail server. For e.g. smtp.gmail.com" msgstr "Der Servername Ihres Mailservers. Z.B. smtp.gmail.com" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:131 msgid "&Port:" msgstr "&Port:" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:132 msgid "" "The port your mail server listens for connections on. The default is 25" msgstr "" "Der Anschluss (Port) auf dem Ihr Mailserver auf Verbindungen wartet. " "Voreinstellung ist 25" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:134 msgid "Your username on the mail server" msgstr "Ihr Benutzername auf dem Mailserver" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:136 msgid "Your password on the mail server" msgstr "Ihr Passwort auf dem Mailserver" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:137 msgid "&Show" msgstr "An&zeigen" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:138 msgid "&Encryption:" msgstr "V&erschlüsselung:" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:139 msgid "" "Use TLS encryption when connecting to the mail server. This is the most " "common." @@ -11400,23 +11447,35 @@ msgstr "" "TLS-Verschlüsselung für die Verbindung zum Mailserver verwenden. Dies trifft " "meistens zu." -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:140 msgid "&TLS" msgstr "&TLS" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:141 msgid "Use SSL encryption when connecting to the mail server." msgstr "SSL Verschlüsselung für die Verbindung zum Mailserver verwenden." -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:131 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:142 msgid "&SSL" msgstr "&SSL" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:143 +msgid "WARNING: Using no encryption is highly insecure" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:144 +msgid "&None" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:145 msgid "Use Gmail" msgstr "Googlemail verwenden" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:146 +msgid "Use Hotmail" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:147 msgid "&Test email" msgstr "Email &testen" @@ -11483,7 +11542,7 @@ msgstr "leer" msgid "empty" msgstr "leer" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:48 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:50 msgid "" "The fields to output when cataloging books in the database. Should be a " "comma-separated list of fields.\n" @@ -11497,7 +11556,7 @@ msgstr "" "Standard: '%%default'\n" "Betrifft: CSV und XML Ausgabeformate" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:58 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:60 msgid "" "Output field to sort on.\n" "Available fields: author_sort, id, rating, size, timestamp, title.\n" @@ -11509,7 +11568,7 @@ msgstr "" "Voreinstellung: '%default'\n" "Wird angewendet auf: CSV, XML Ausgabeformate" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:212 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:214 msgid "" "The fields to output when cataloging books in the database. Should be a " "comma-separated list of fields.\n" @@ -11523,7 +11582,7 @@ msgstr "" "Standard: '%%default'\n" "Betrifft: BibTeX Ausgabeformat" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:222 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:224 msgid "" "Output field to sort on.\n" "Available fields: author_sort, id, rating, size, timestamp, title.\n" @@ -11535,7 +11594,7 @@ msgstr "" "Standard: '%default'\n" "Angewendet bei: BibTeX- Ausgabeformat" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:231 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:233 msgid "" "Create a citation for BibTeX entries.\n" "Boolean value: True, False\n" @@ -11547,7 +11606,7 @@ msgstr "" "Standard: '%default'\n" "Angewendet bei: BibTeX- Ausgabeformat" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:240 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:242 msgid "" "The template for citation creation from database fields.\n" " Should be a template with {} enclosed fields.\n" @@ -11561,7 +11620,7 @@ msgstr "" "Standard: '%%default'\n" "Angewendet bei: BibTeX- Ausgabeformat" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:250 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:252 msgid "" "BibTeX file encoding output.\n" "Available types: utf8, cp1252, ascii.\n" @@ -11573,7 +11632,7 @@ msgstr "" "Voreingestellt: '%default'\n" "Betrifft: BIBTEX Ausgabe-Format" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:259 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:261 msgid "" "BibTeX file encoding flag.\n" "Available types: strict, replace, ignore, backslashreplace.\n" @@ -11585,7 +11644,7 @@ msgstr "" "Standard: '%default'\n" "Angewendet bei: BibTeX- Ausgabeformat" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:268 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:270 msgid "" "Entry type for BibTeX catalog.\n" "Available types: book, misc, mixed.\n" @@ -11597,7 +11656,7 @@ msgstr "" "Standard: '%default'\n" "Angewendet bei: BibTeX- Ausgabeformat" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:536 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:540 msgid "" "Title of generated catalog used as title in metadata.\n" "Default: '%default'\n" @@ -11607,7 +11666,7 @@ msgstr "" "Standard: '%default'\n" "Betrifft: ePub und MOBI Ausgabeformate" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:543 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:547 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 " @@ -11621,7 +11680,7 @@ msgstr "" "Standard: '%default'Nirgends\n" "Betrifft: ePub und MOBI Ausgabeformate" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:553 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:557 msgid "" "Regex describing tags to exclude as genres.\n" "Default: '%default' excludes bracketed tags, e.g. '[<tag>]'\n" @@ -11632,7 +11691,7 @@ msgstr "" "'[<tag>]'\n" "Betrifft: ePub und MOBI Ausgabeformate" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:559 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:563 msgid "" "Comma-separated list of tag words indicating book should be excluded from " "output. Case-insensitive.\n" @@ -11648,7 +11707,7 @@ msgstr "" "Voreinstellung: '%default'\n" "Betrifft: ePub und MOBI Ausgabeformate" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:567 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:571 msgid "" "Include 'Titles' section in catalog.\n" "Default: '%default'\n" @@ -11658,7 +11717,7 @@ msgstr "" "Standard: '%default'\n" "Betrifft: ePub und MOBI Ausgabeformate" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:574 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:578 msgid "" "Include 'Series' section in catalog.\n" "Default: '%default'\n" @@ -11668,7 +11727,7 @@ msgstr "" "Standard: '%default'\n" "Angewendet bei: ePub-, MOBI- Ausgabeformaten" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:581 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:585 msgid "" "Include 'Recently Added' section in catalog.\n" "Default: '%default'\n" @@ -11678,7 +11737,7 @@ msgstr "" "Standard: '%default'\n" "Betrifft: ePub und MOBI Ausgabeformate" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:588 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:592 msgid "" "Tag prefix for user notes, e.g. '*Jeff might enjoy reading this'.\n" "Default: '%default'\n" @@ -11689,7 +11748,7 @@ msgstr "" "Standard: '%default'\n" "Betrifft: ePub und MOBI Ausgabeformate" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:595 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:599 msgid "" "Sort titles with leading numbers as text, e.g.,\n" "'2001: A Space Odyssey' sorts as \n" @@ -11703,7 +11762,7 @@ msgstr "" "Voreinstellung: '%default'\n" "Gilt für: ePub, MOBI Ausgabeformate" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:602 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:606 msgid "" "Specifies the output profile. In some cases, an output profile is required " "to optimize the catalog for the device. For example, 'kindle' or " @@ -11719,7 +11778,7 @@ msgstr "" "Standard: '%default'\n" "Betrifft: ePub und MOBI Ausgabeformate" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:609 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:613 msgid "" "Tag indicating book has been read.\n" "Default: '%default'\n" @@ -11729,6 +11788,13 @@ msgstr "" "Voreinstellung: '%default'\n" "Gilt für: ePub, MOBI Ausgabeformate" +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:619 +msgid "" +"Tag indicating book to be displayed as wishlist item.\n" +"Default: '%default'\n" +"Applies to: ePub, MOBI output formats" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/library/check_library.py:17 msgid "Invalid titles" msgstr "Ungültige Titel" @@ -12458,35 +12524,35 @@ msgstr "" "Der Suchname darf ausschließlich Kleinbuchstaben, Zahlen und Unterstriche " "enthalten und muß mit einem Buchstaben anfangen." -#: /home/kovid/work/calibre/src/calibre/library/database2.py:82 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:57 msgid "%sAverage rating is %3.1f" msgstr "%sdie durchschnittliche Bewertung ist %3.1f" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:846 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:818 msgid "Main" msgstr "Haupt" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2321 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2310 msgid "<p>Migrating old database to ebook library in %s<br><center>" msgstr "<p>Migriere alte Datenbank zu eBook Bibliothek in %s<br><center>" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2350 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2339 msgid "Copying <b>%s</b>" msgstr "Kopiere <b>%s</b>" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2367 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2356 msgid "Compacting database" msgstr "Komprimiere Datenbank" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2460 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2449 msgid "Checking SQL integrity..." msgstr "Überprüfe SQL Vollständigkeit..." -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2499 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2488 msgid "Checking for missing files." msgstr "Überprüfe fehlende Dateien." -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2521 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2516 msgid "Checked id" msgstr "Überprüfte ID" @@ -12715,129 +12781,129 @@ msgstr "" "Vor alle URLs angehängter Prefix. Nützlich für reverse proxy- Anwendung des " "Servers von Apache/ngingx/etc. aus." -#: /home/kovid/work/calibre/src/calibre/library/server/base.py:150 -msgid "Password to access your calibre library. Username is " -msgstr "" -"Kennwort für den Zugriff auf die Calibre Bibliothek. Benutzername ist " - -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:51 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:405 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:59 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:437 msgid "Loading, please wait" msgstr "Lade, bitte warten" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:80 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:85 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:106 +msgid "Go to" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:101 msgid "First" msgstr "Erste" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:80 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:101 msgid "Last" msgstr "Letzte" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:80 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:101 msgid "Previous" msgstr "Vorherige" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:81 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:102 msgid "Next" msgstr "Nächste" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:83 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:104 msgid "Browsing %d books" msgstr "Zeige %d Bücher" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:99 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:225 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:121 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:247 msgid "Average rating" msgstr "Durchschnittliche Bewertung" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:100 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:122 msgid "%s: %.1f stars" msgstr "%s: %.1f Sterne" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:133 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:155 msgid "%d stars" msgstr "%d Sterne" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:226 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:248 msgid "Popularity" msgstr "Beliebtheit" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:245 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:267 msgid "Sort by" msgstr "Sortieren nach" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:248 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:270 msgid "library" msgstr "Bibliothek" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:249 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:271 msgid "home" msgstr "Startseite" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:310 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:516 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:332 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:548 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:569 msgid "Newest" msgstr "Neuestes" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:311 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:517 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:333 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:549 msgid "All books" msgstr "Alle Bücher" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:344 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:366 msgid "Browse books by" msgstr "Zeige Bücher nach" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:349 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:371 msgid "Choose a category to browse by:" msgstr "Kategorie zum Anzeigen wählen:" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:425 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:457 msgid "Browsing by" msgstr "Zeige nach" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:426 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:458 msgid "Up" msgstr "Hoch" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:547 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:579 msgid "in" msgstr "in" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:550 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:582 msgid "Books in" msgstr "Bücher in" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:602 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:634 msgid "Other formats" msgstr "Andere Formate" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:609 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:641 msgid "Read %s in the %s format" msgstr "Lese %s im %s Format" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:614 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:646 msgid "Get" msgstr "Holen" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:629 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:661 msgid "Permalink" msgstr "Permalink" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:630 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:662 msgid "A permanent link to this book" msgstr "Ein permanenter Link zu diesem Buch" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:641 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:673 msgid "This book has been deleted" msgstr "Dieses Buch wurde gelöscht" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:725 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:757 msgid "in search" msgstr "in Suche" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:727 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:759 msgid "Matching books" msgstr "Passende Bücher" @@ -13177,7 +13243,7 @@ msgstr "Konnte SSH Sitzung nicht abschließen: " msgid "Failed to authenticate with server: %s" msgstr "Authentifizierung schlug fehl am Server: %s" -#: /home/kovid/work/calibre/src/calibre/utils/smtp.py:234 +#: /home/kovid/work/calibre/src/calibre/utils/smtp.py:249 msgid "Control email delivery" msgstr "eMail Versand kontrollieren" @@ -15382,6 +15448,18 @@ msgstr "CSS-Stylesheets nicht herunterladen." #~ "Konnte die folgenden Bücher nicht versenden, da keine passenden Formate " #~ "vorhanden:<br><ul>%s</ul>" +#~ msgid "Failed to email books" +#~ msgstr "Senden der Bücher schlug fehl" + +#~ msgid "Failed to email the following books:" +#~ msgstr "Senden der folgenden Bücher schlug fehl:" + +#~ msgid "Sent by email:" +#~ msgstr "Per eMail versendet:" + +#~ msgid "Attached is the" +#~ msgstr "Im Anhang ist" + #~ msgid "" #~ "Email\n" #~ "Delivery" @@ -15389,6 +15467,9 @@ msgstr "CSS-Stylesheets nicht herunterladen." #~ "eMail\n" #~ "Versand" +#~ msgid "Finish gmail setup" +#~ msgstr "Googlemail Setup abschließen" + #~ msgid "Dont forget to enter your gmail username and password" #~ msgstr "" #~ "Vergessen Sie nicht, Ihren Googlemail Benutzernamen und Ihr Passwort " @@ -15746,6 +15827,13 @@ msgstr "CSS-Stylesheets nicht herunterladen." #~ msgid "Click to see the books available on your computer" #~ msgstr "Liste der auf dem Computer vorhandenen Bücher anzeigen" +#~ msgid "" +#~ "Choose a location for your books. When you add books to calibre, they will " +#~ "be copied here:" +#~ msgstr "" +#~ "Wählen Sie einen Speicherort für Ihre Bücher. Wenn Sie Bücher zu Calibre " +#~ "hinzufügen, werden sie hierhin kopiert:" + #~ msgid "Catalan" #~ msgstr "Katalanisch" @@ -15825,6 +15913,14 @@ msgstr "CSS-Stylesheets nicht herunterladen." #~ "href=\"http://calibre.kovidgoyal.net/user_manual/gui.html#the-search-" #~ "interface\">Benutzer Handbuch</a> für weitere Hilfe" +#~ msgid "" +#~ "Dont forget to enter your gmail username and password. You can sign up for a " +#~ "free gmail account at http://gmail.com" +#~ msgstr "" +#~ "Vergessen Sie nicht, Ihren Googlemail Benutzernamen und Ihr Passwort " +#~ "einzugeben. Sie können ein kostenloses Konto bei http://mail.google.com " +#~ "erstellen." + #~ msgid "Communicate with the Cybook Opus eBook reader." #~ msgstr "Kommunikation mit dem Cybook Opus eBook Reader." @@ -15834,6 +15930,17 @@ msgstr "CSS-Stylesheets nicht herunterladen." #~ msgid "Add/Save" #~ msgstr "Hinzufügen/Speichern" +#~ 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 "" +#~ "Die folgenden Bücher hatten Formate in der Datenbank angegeben, die " +#~ "tatsächlich nicht verfügbar waren. Die Einträge der Formate wurden entfernt. " +#~ "Sie sollten diese manuell überprüfen. Dies kann passieren, wenn Sie die " +#~ "Dateien direkt im Bibliotheksverzeichnis verändern." + #~ msgid "TabWidget" #~ msgstr "TabWidget" @@ -15924,6 +16031,10 @@ msgstr "CSS-Stylesheets nicht herunterladen." #~ msgid "calibre" #~ msgstr "Calibre" +#~ msgid "Password to access your calibre library. Username is " +#~ msgstr "" +#~ "Kennwort für den Zugriff auf die Calibre Bibliothek. Benutzername ist " + #~ msgid "" #~ "[options]\n" #~ "\n" @@ -16043,6 +16154,14 @@ msgstr "CSS-Stylesheets nicht herunterladen." #~ msgid "English (TH)" #~ msgstr "Englisch (TH)" +#~ msgid "" +#~ "Average line length for line breaking if the HTML is from a previous partial " +#~ "conversion of a PDF file. Default is %default which disables this." +#~ msgstr "" +#~ "Durchschnittliche Zeilenlänge für den Zeilenumbruch falls das HTML von einer " +#~ "zuvor nur teilweise konvertierten PDF-Datei stammt. Voreinstellung ist " +#~ "%default was dies ausschaltet." + #~ msgid "Options to control e-book conversion." #~ msgstr "Einstellungen zur Kontrolle der eBook-Konvertierung." @@ -16454,6 +16573,17 @@ msgstr "CSS-Stylesheets nicht herunterladen." #~ msgid "Run the check" #~ msgstr "Überprüfung starten" +#~ msgid "" +#~ "<p>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 " +#~ "metadata and covers for them.<p>Any invalid ISBNs in the list will be " +#~ "ignored." +#~ msgstr "" +#~ "<p>Geben Sie eine Liste von ISBNs in die linke Box ein (eine ISBN pro " +#~ "Zeile). Calibre wird automatisch Bucheinträge basierend auf den ISBNs " +#~ "anlegen und sowohl Metadaten als auch Buchumschläge für diese Einträge " +#~ "herunterladen.<p>Alle ungültigen ISBNs in der Liste werden ignoriert." + #~ msgid "" #~ "Book formats and metadata from the selected books will be merged into the " #~ "<b>first selected book</b>. ISBN will <i>not</i> be merged.<br><br>After " diff --git a/src/calibre/translations/es.po b/src/calibre/translations/es.po index bf383dd5f5..df742bfe80 100644 --- a/src/calibre/translations/es.po +++ b/src/calibre/translations/es.po @@ -11,13 +11,13 @@ msgstr "" "Project-Id-Version: es\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-11-27 20:21+0000\n" -"PO-Revision-Date: 2010-11-27 17:43+0000\n" -"Last-Translator: DiegoJ <diegojromerolopez@gmail.com>\n" +"PO-Revision-Date: 2010-11-29 04:44+0000\n" +"Last-Translator: Fitoschido <Unknown>\n" "Language-Team: Spanish\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-28 04:47+0000\n" +"X-Launchpad-Export-Date: 2010-11-29 04:48+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:502 @@ -3902,6 +3902,10 @@ msgid "" "removed. You should check them manually. This can happen if you manipulate " "the files in the library folder directly." msgstr "" +"Los siguientes libros tenían formatos o portadas en la base de datos que no " +"estaban disponibles en realidad. Las entradas de los formatos o portadas se " +"han eliminado. Debería comprobarlos manualmente. Esto puede suceder si " +"manipula directamente los ficheros en la carpeta de la biblioteca." #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:148 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:51 @@ -6468,6 +6472,14 @@ msgid "" "enter the full path to the file after a <code>>></code>. For example:</p>\n" "<p><code>9788842915232 >> %s</code></p>" msgstr "" +"<p>Introduzca una lista de ISBN en el cuadro de la izquierda, uno por línea. " +"calibre creará automáticamente entradas para libros basándose en el ISBN y " +"descargará sus metadatos y portadas.</p>\n" +"<p>Cualquier ISBN no válido en la lista se omitirá.</p>\n" +"<p>También puede especificar un fichero para añadir con cada ISBN. Para ello " +"introduzca la ruta completa al fichero después de <code>>></code>. Por " +"ejemplo:</p>\n" +"<p><code>9788842915232 >> %s</code></p>" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:53 msgid "&Paste from clipboard" @@ -8375,7 +8387,7 @@ msgstr "Noticias:" #: /home/kovid/work/calibre/src/calibre/gui2/email.py:189 msgid "Attached is the %s periodical downloaded by calibre." -msgstr "" +msgstr "Se adjunta el fichero de %s descargado por calibre." #: /home/kovid/work/calibre/src/calibre/gui2/email.py:242 msgid "E-book:" @@ -11272,6 +11284,9 @@ msgid "" "<p>Choose a location for your books. When you add books to calibre, they " "will be copied here. Use an <b>empty folder</b> for a new calibre library:" msgstr "" +"<p>Elija una ubicación para sus libros. Cuando añada libros en calibre, se " +"copiarán aquí. Use una <b>carpeta vacía</b> para una biblioteca de calibre " +"nueva:" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/library_ui.py:59 msgid "&Change" @@ -11484,7 +11499,7 @@ msgstr "today" #: /home/kovid/work/calibre/src/calibre/library/caches.py:368 msgid "yesterday" -msgstr "yesterday" +msgstr "ayer" #: /home/kovid/work/calibre/src/calibre/library/caches.py:371 msgid "thismonth" diff --git a/src/calibre/translations/fr.po b/src/calibre/translations/fr.po index fda8edd7c0..565d894183 100644 --- a/src/calibre/translations/fr.po +++ b/src/calibre/translations/fr.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: calibre 0.4.22\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-11-27 20:21+0000\n" -"PO-Revision-Date: 2010-11-27 11:43+0000\n" +"PO-Revision-Date: 2010-11-28 08:41+0000\n" "Last-Translator: sengian <Unknown>\n" "Language-Team: Français <kde-i18n-doc@kde.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-28 04:47+0000\n" +"X-Launchpad-Export-Date: 2010-11-29 04:47+0000\n" "X-Generator: Launchpad (build Unknown)\n" "X-Poedit-Bookmarks: 1177,1104,-1,-1,-1,-1,-1,-1,-1,-1\n" "Generated-By: pygettext.py 1.5\n" @@ -8493,7 +8493,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/email.py:306 msgid "sent" -msgstr "" +msgstr "envoyé" #: /home/kovid/work/calibre/src/calibre/gui2/email.py:329 msgid "Sent news to" @@ -11552,7 +11552,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:144 msgid "&None" -msgstr "" +msgstr "Aucu&n" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:145 msgid "Use Gmail" diff --git a/src/calibre/translations/gl.po b/src/calibre/translations/gl.po index 6f7e15661f..012822b6d8 100644 --- a/src/calibre/translations/gl.po +++ b/src/calibre/translations/gl.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" -"POT-Creation-Date: 2010-11-19 21:23+0000\n" -"PO-Revision-Date: 2010-11-19 23:41+0000\n" +"POT-Creation-Date: 2010-11-27 20:21+0000\n" +"PO-Revision-Date: 2010-11-28 21:19+0000\n" "Last-Translator: Antón Méixome <meixome@gmail.com>\n" "Language-Team: Galician <gl@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-21 04:47+0000\n" +"X-Launchpad-Export-Date: 2010-11-29 04:48+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -27,7 +27,7 @@ msgstr "Non facer nada" #: /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/books.py:24 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:444 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:448 #: /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 @@ -55,7 +55,7 @@ msgstr "Non facer nada" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:36 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:61 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:50 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:354 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:357 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:36 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:64 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:66 @@ -74,9 +74,9 @@ msgstr "Non facer nada" #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:78 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:119 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:153 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:620 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:826 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:828 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:627 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:833 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:835 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:913 @@ -89,7 +89,7 @@ msgstr "Non facer nada" #: /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 +#: /home/kovid/work/calibre/src/calibre/ebooks/pdb/input.py:40 #: /home/kovid/work/calibre/src/calibre/ebooks/pdb/palmdoc/writer.py:29 #: /home/kovid/work/calibre/src/calibre/ebooks/pdb/ztxt/writer.py:27 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/crop.py:82 @@ -109,8 +109,8 @@ msgstr "Non facer nada" #: /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:300 -#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:302 +#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:304 +#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:306 #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:355 #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:362 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:279 @@ -121,15 +121,15 @@ msgstr "Non facer nada" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:114 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:139 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:141 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:936 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:945 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1252 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1255 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1039 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1042 #: /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:571 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:244 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:376 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:395 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:918 @@ -138,13 +138,13 @@ msgstr "Non facer nada" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:189 #: /home/kovid/work/calibre/src/calibre/library/cli.py:215 #: /home/kovid/work/calibre/src/calibre/library/database.py:914 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:374 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:386 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1255 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1359 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2145 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2147 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2279 +#: /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:1254 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1355 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2151 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2153 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2284 #: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:229 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:139 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:142 @@ -185,9 +185,9 @@ msgstr "Acción da interface de usuario" #: /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: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/preferences/main.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:283 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:206 msgid "Preferences" msgstr "Preferencias" @@ -267,45 +267,45 @@ msgstr "Define os metadatos nos ficheiros %s" msgid "Set metadata from %s files" msgstr "Define os metadatos desde os ficheiros %s" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:713 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:717 msgid "Look and Feel" msgstr "Aparencia e comportamento" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:715 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:727 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:738 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:749 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:719 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:731 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:742 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:753 msgid "Interface" msgstr "Interface" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:719 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:723 msgid "Adjust the look and feel of the calibre interface to suit your tastes" msgstr "" "Axuste a aparencia e comportamento da interface do Calibre para que se " "adapte aos seus gustos" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:725 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:729 msgid "Behavior" msgstr "Comportamento" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:731 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:735 msgid "Change the way calibre behaves" msgstr "Cambiar o modo en que se comporta o Calibre" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:736 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:740 #: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:209 msgid "Add your own columns" msgstr "Engadir as súas propias columnas" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:742 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:746 msgid "Add/remove your own columns to the calibre book list" msgstr "Engadir/retirar as columnas propias da lista de libros do Calibre" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:747 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:751 msgid "Customize the toolbar" msgstr "Personalizar a barra de ferramentas" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:753 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:757 msgid "" "Customize the toolbars and context menus, changing which actions are " "available in each" @@ -313,60 +313,60 @@ msgstr "" "Personalizar as barras de ferramentas e os menús de contexto, cambiando as " "accións que estarán dispoñíbeis en cada un" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:759 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:763 msgid "Input Options" msgstr "Opcións de entrada" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:761 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:772 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:783 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:765 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:776 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:787 msgid "Conversion" msgstr "Conversión" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:765 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 msgid "Set conversion options specific to each input format" msgstr "" "Estabelecer as opcións de conversión específicas para cada formato de entrada" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:770 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:774 msgid "Common Options" msgstr "Opcións comúns" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:776 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:780 msgid "Set conversion options common to all formats" msgstr "Estabelecer as opcións de conversión comúns para todos os formatos" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:781 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:785 msgid "Output Options" msgstr "Opcións de saída" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:787 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:791 msgid "Set conversion options specific to each output format" msgstr "" "Estabelece as opcións específicas de conversión para cada formato de saída" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:792 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:796 msgid "Adding books" msgstr "Adición de libros" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:794 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:806 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:818 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:830 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:798 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:810 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:822 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:834 msgid "Import/Export" msgstr "Importar/exportar" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:798 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:802 msgid "Control how calibre reads metadata from files when adding books" msgstr "" "Controla o modo como Calibre le os metadatos dos ficheiros na proceso de " "adición de libros" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:804 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:808 msgid "Saving books to disk" msgstr "Gardado de libros no disco" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:810 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:814 msgid "" "Control how calibre exports files from its database to disk when using Save " "to disk" @@ -374,33 +374,33 @@ msgstr "" "Controla o modo como Calibre exporta ficheiros da súa base de datos no " "disco no proceso de Gardado no disco" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:816 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:820 msgid "Sending books to devices" msgstr "Envío de libros a dispositivos" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:822 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:826 msgid "Control how calibre transfers files to your ebook reader" msgstr "" "Controla cando Calibre transfere os ficheiros ao seu lector de libros" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:828 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:832 msgid "Metadata plugboards" msgstr "Plugboards de metadatos" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:834 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:838 msgid "Change metadata fields before saving/sending" msgstr "Cambiar campos de metadatos antes do gardado/envío" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:839 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:843 msgid "Sharing books by email" msgstr "Compartición de libros por correo" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:841 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:853 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:845 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:857 msgid "Sharing" msgstr "Compartición" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:845 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:849 msgid "" "Setup sharing of books via email. Can be used for automatic sending of " "downloaded news to your devices" @@ -408,11 +408,11 @@ msgstr "" "Configura a compartición de libros por correo electrónico. Pódese usar para " "enviar automticamente as noticias descargadas aos seus dispositivos" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:851 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:855 msgid "Sharing over the net" msgstr "Compartición na rede" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:857 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:861 msgid "" "Setup the calibre Content Server which will give you access to your calibre " "library from anywhere, on any device, over the internet" @@ -421,33 +421,33 @@ msgstr "" "biblioteca do Calibre en calquera lugar, con calquera dispositivo, a través " "da Internet." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:864 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:868 msgid "Plugins" msgstr "Complementos" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:866 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:878 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:889 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:870 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:882 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:893 msgid "Advanced" msgstr "Avanzado" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:870 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:874 msgid "Add/remove/customize various bits of calibre functionality" msgstr "Engadir/eliminar/configurar diversas funcións do Calibre" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:876 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:880 msgid "Tweaks" msgstr "Axustes" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:882 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:886 msgid "Fine tune how calibre behaves in various contexts" msgstr "Axuste fino de como se comporta o Calibre en diversos contextos" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:887 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:891 msgid "Miscellaneous" msgstr "Miscelánea" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:893 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:897 msgid "Miscellaneous advanced configuration" msgstr "Configuración miscelánea avanzada" @@ -611,7 +611,11 @@ msgstr "" msgid "This profile is intended for the Amazon Kindle DX." msgstr "Este perfil é o propio o Amazon Kindle DX." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:686 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:684 +msgid "This profile is intended for the B&N Nook Color." +msgstr "Este perfil está orientado a B&N Nook Color." + +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:695 msgid "This profile is intended for the Sanda Bambook." msgstr "Este perfil está pensado para o Sandra Bambook." @@ -779,16 +783,16 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:257 #: /home/kovid/work/calibre/src/calibre/library/database2.py:187 #: /home/kovid/work/calibre/src/calibre/library/database2.py:200 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2005 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2015 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:149 msgid "News" msgstr "Noticias" #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2554 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:20 -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:558 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1968 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1986 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:560 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1978 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1996 msgid "Catalog" msgstr "Catálogo" @@ -816,7 +820,7 @@ msgstr "Comunicarse co lector de libros electrónico Cybook Gen 3 / Opus." #: /home/kovid/work/calibre/src/calibre/devices/cybook/driver.py:64 msgid "Communicate with the Cybook Orizon eBook reader." -msgstr "" +msgstr "Comunicar co lector Cybook Orizon." #: /home/kovid/work/calibre/src/calibre/devices/eb600/driver.py:24 msgid "Communicate with the EB600 eBook reader." @@ -830,6 +834,10 @@ msgstr "Conectar co Astak Mentor EB600" msgid "Communicate with the PocketBook 301 reader." msgstr "Conectar co lector PocketBook 301." +#: /home/kovid/work/calibre/src/calibre/devices/eb600/driver.py:233 +msgid "Communicate with the PocketBook 602 reader." +msgstr "Comunicar co lector PocketBook 602." + #: /home/kovid/work/calibre/src/calibre/devices/edge/driver.py:17 msgid "Entourage Edge" msgstr "Entourage Edge" @@ -890,8 +898,8 @@ msgstr "Comunicar co lector SpringDesign Alex eBook." #: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:102 #: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:113 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:264 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:296 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:268 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:300 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:256 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:274 msgid "Removing books from device..." @@ -980,26 +988,26 @@ msgstr "" msgid "Getting list of books on device..." msgstr "Obtendo a lista de libros do dispositivo..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:300 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:307 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:304 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:311 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:281 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:286 msgid "Removing books from device metadata listing..." msgstr "Eliminando libros da lista de metatados do dispositivo..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:312 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:347 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:316 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:351 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:219 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:250 msgid "Adding books to device metadata listing..." msgstr "Engadindo libros á lista de metatados do dispositivo..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:424 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:258 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:428 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:262 msgid "Not Implemented" msgstr "Non implementado" -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:425 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:429 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." @@ -1040,6 +1048,10 @@ msgstr "Comunicar con VelocityMono" msgid "Communicate with the GM2000" msgstr "Comunicar co GM2000" +#: /home/kovid/work/calibre/src/calibre/devices/misc.py:180 +msgid "Communicate with the Acer Lumiread" +msgstr "Comunicar co Acer Lumiread" + #: /home/kovid/work/calibre/src/calibre/devices/nokia/driver.py:17 msgid "Communicate with the Nokia 770 internet tablet." msgstr "Comunicar coa táboa de internet Nokia 770." @@ -2286,7 +2298,7 @@ msgid "Path to output file" msgstr "Camiño do ficheiro de saída" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:290 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:128 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:126 msgid "Verbose processing" msgstr "Procesado por petición" @@ -2517,7 +2529,7 @@ msgstr "Comentarios" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:313 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1127 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:160 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:645 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:655 msgid "Tags" msgstr "Etiquetas" @@ -2668,6 +2680,7 @@ msgid "No cover found" msgstr "Non se achou capa ningunha" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:28 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:44 msgid "Cover download" msgstr "Descarga de portada" @@ -2737,19 +2750,19 @@ msgstr "descrición/críticas" msgid "Download %s from %s" msgstr "Descargar %s desde %s" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:149 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:150 msgid "Convert comments downloaded from %s to plain text" msgstr "Coverter os comentarios descargados de %s a texto simple" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:175 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:178 msgid "Downloads metadata from Google Books" msgstr "Descarga os metadatos do Google Books" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:192 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:195 msgid "Downloads metadata from isbndb.com" msgstr "Descara os metadatos de isbndb.com" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:220 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:223 msgid "" "To use isbndb.com you must sign up for a %sfree account%s and enter your " "access key below." @@ -2757,16 +2770,16 @@ msgstr "" "Para empregar o isbndb.com, é preciso ter unha %sconta gratuíta%s e escribir " "a súa chave de acceso abaixo." -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:230 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:233 msgid "Downloads social metadata from amazon.com" msgstr "Descarga os metadatos de amazon.com" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:251 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:254 msgid "Downloads series/tags/rating information from librarything.com" msgstr "" "Descargar a información de series, etiquetas e puntuación de librarything.com" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:109 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:107 msgid "" "\n" "%prog [options] key\n" @@ -2790,23 +2803,24 @@ msgstr "" "Isbndb.com.\n" "\n" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:120 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:118 msgid "The ISBN ID of the book you want metadata for." msgstr "O ISBN do libro cuxos metatados se precisan." -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:122 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:120 msgid "The author whose book to search for." msgstr "O autor cuxo libro se pretende procurar." -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:124 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:122 msgid "The title of the book to search for." msgstr "O título do libro polo que procurar." -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:126 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:124 msgid "The publisher of the book to search for." msgstr "A editorial do libro polo que procurar." #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:77 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:336 msgid " not found." msgstr " non se achou." @@ -2824,6 +2838,23 @@ msgstr "" "Obtén metadatos sociais ou imaxes para o libro identificado polo ISBN a " "través de LibraryThing.com\n" +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:25 +msgid "Downloads metadata from french Nicebooks" +msgstr "Descarga metadatos en francés de Nicebooks" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:41 +msgid "Downloads covers from french Nicebooks" +msgstr "Descarga portadas en francés de Nicebooks" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:332 +msgid "Nicebooks timed out. Try again later." +msgstr "" +"O tempo de conexión con Nicebooks esgotouse. Ténteo de máis tarde de novo." + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:337 +msgid "An errror occured with Nicebooks cover fetcher" +msgstr "Produciuse un erro ao tentar obter as portadas de Nicebooks" + #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1308 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 msgid "Cover" @@ -2951,7 +2982,7 @@ msgstr "Opcións da xeración HTM TOC" #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:159 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:71 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:643 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:653 msgid "Rating" msgstr "Avaliación" @@ -2984,7 +3015,7 @@ msgstr "Notas a rodapé." msgid "Sidebar" msgstr "Barra lateral" -#: /home/kovid/work/calibre/src/calibre/ebooks/pdb/input.py:22 +#: /home/kovid/work/calibre/src/calibre/ebooks/pdb/input.py:23 #: /home/kovid/work/calibre/src/calibre/ebooks/tcr/input.py:23 #: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:24 msgid "" @@ -2995,7 +3026,7 @@ msgstr "" "parágrafo. Con esta opción interprétase que cada liña representa un " "parágrafo." -#: /home/kovid/work/calibre/src/calibre/ebooks/pdb/input.py:26 +#: /home/kovid/work/calibre/src/calibre/ebooks/pdb/input.py:27 #: /home/kovid/work/calibre/src/calibre/ebooks/tcr/input.py:27 #: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:28 msgid "" @@ -3556,7 +3587,7 @@ msgid "Disable UI animations" msgstr "Desactivar as animacións UI" #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:183 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:499 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:509 msgid "Copied" msgstr "Copiado" @@ -3624,89 +3655,89 @@ msgstr "Cantos libros baleiros?" msgid "How many empty books should be added?" msgstr "Cantos libros baleiros deben ser engadidos?" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:143 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:202 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:147 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:206 msgid "Uploading books to device." msgstr "Subindo libros ao dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:164 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:170 msgid "Books" msgstr "Libros" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:165 msgid "EPUB Books" msgstr "Libros de EPUB" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:162 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:166 msgid "LRF Books" msgstr "Libros de LRF" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:163 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:167 msgid "HTML Books" msgstr "Libros de HTML" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:168 msgid "LIT Books" msgstr "Libros de LIT" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:169 msgid "MOBI Books" msgstr "Libros de MOBI" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:170 msgid "Topaz books" msgstr "Libros de Topaz" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:171 msgid "Text books" msgstr "Libros de Text" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:172 msgid "PDF Books" msgstr "Libros de PDF" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:173 msgid "SNB Books" msgstr "Libros SNB" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:174 msgid "Comics" msgstr "Comics" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:175 msgid "Archives" msgstr "Arquivos" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:179 msgid "Supported books" msgstr "Libros compatibles" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:215 msgid "Merged some books" msgstr "Combinar varios libros" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:216 msgid "" "Some duplicates were found and merged into the following existing books:" msgstr "" "Acháronse algúns libros duplicados e uníronse as seguintes libros existentes:" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:225 msgid "Failed to read metadata" msgstr "Fallou ao ler os metadatos" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:226 msgid "Failed to read metadata from the following" msgstr "Fallouse ao ler os metadatos dos libros seguintes" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:241 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:246 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:245 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:250 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:269 msgid "Add to library" msgstr "Engadir á biblioteca" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:246 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:250 #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:56 #: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:28 #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:94 @@ -3714,14 +3745,14 @@ msgstr "Engadir á biblioteca" msgid "No book selected" msgstr "Non se seleccionou ningún libro" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:263 msgid "" "The following books are virtual and cannot be added to the calibre library:" msgstr "" "Os seguintes libros son virtuais e non se poden engadir á biblioteca de " "Calibre:" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:269 msgid "No book files found" msgstr "Non se achou ningún ficheiro de libro" @@ -3734,7 +3765,7 @@ msgid "Add books to your calibre library from the connected device" msgstr "Engadir libros á biblioteca do Calibre desde o dispositivo conectado" #: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:547 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:542 msgid "Fetch annotations (experimental)" msgstr "Obter anotacións (experimental)" @@ -3831,7 +3862,7 @@ msgid "Checking database integrity" msgstr "A comprobar a integridade da base de datos" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:128 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:656 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:593 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:41 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:54 msgid "Error" @@ -3847,15 +3878,15 @@ msgstr "Atopáronse algunhas incosistencias" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:135 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." +"The following books had formats or covers listed in the database that are " +"not actually available. The entries for the formats/covers have been " +"removed. You should check them manually. This can happen if you manipulate " +"the files in the library folder directly." msgstr "" -"Os libros seguintes teñen formatos especificados na base de datos que non " -"están actualmente dispoñíbeis. Elimináronse as entradas para os formatos e, " -"por tanto, debe comprobalos manualmente. Isto adoita acontecer ao manipular " -"directamente os ficheiros na biblioteca." +"Os seguintes libros tiñan formatos ou portadas na base de datos que non " +"estaban dispoñíbeis en realidade. As entradas dos formatos ou portadas " +"elimináronse. Debería comprobalos manualmente. Isto pode suceder se manipula " +"directamente os ficheiros no cartafol da biblioteca." #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:148 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:51 @@ -4038,6 +4069,12 @@ msgstr "Non se pode converter" msgid "Starting conversion of %d book(s)" msgstr "Esta a comezar a conversión de %d libros(s)" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:170 +msgid "Empty output file, probably the conversion process crashed" +msgstr "" +"O ficheiro de saída está baleiro, probablemente o proceso de conversión " +"fallou" + #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:83 msgid "Copy to library" msgstr "Copiar á biblioteca" @@ -4072,7 +4109,7 @@ msgid "Could not copy books: " msgstr "No se puideron copiar estes libros: " #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:147 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:729 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:664 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:687 #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:190 msgid "Failed" @@ -4135,14 +4172,14 @@ msgid "Main memory" msgstr "Memoria principal" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:472 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:481 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:467 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:476 msgid "Storage Card A" msgstr "Tarxeta de almacenaxe A" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:474 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:483 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:469 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:478 msgid "Storage Card B" msgstr "Tarxeta de almacenaxe B" @@ -4387,6 +4424,7 @@ msgid "Ctrl+P" msgstr "Ctrl + P" #: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:23 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:200 msgid "Run welcome wizard" msgstr "Lanzar o asistente de benvida" @@ -4475,7 +4513,7 @@ msgid "Click the show details button to see which ones." msgstr "Prema o botón de amosar detalles para os ver." #: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:16 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:650 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:660 msgid "Show book details" msgstr "Amosar os detalles do libro" @@ -4617,7 +4655,7 @@ msgid "The specified directory could not be processed." msgstr "Non se puido procesar o directorio especificado." #: /home/kovid/work/calibre/src/calibre/gui2/add.py:229 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:878 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:813 msgid "No books" msgstr "Sen libros" @@ -4959,7 +4997,7 @@ msgstr "saída" #: /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:120 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:123 msgid "Form" msgstr "Formulario" @@ -4994,7 +5032,7 @@ msgstr "ignorar" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:94 msgid "backslashreplace" -msgstr "" +msgstr "substituirbarradeitadadereita" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:95 msgid "BibTeX entry type:" @@ -5095,7 +5133,7 @@ msgstr "Incluír a sección \"Serie\"" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:94 msgid "Wishlist tag:" -msgstr "" +msgstr "Etiqueta de desexo:" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_tab_template_ui.py:33 msgid "Tab template for catalog.ui" @@ -5857,11 +5895,11 @@ msgstr "Non amosar o número de capítulo" #: /home/kovid/work/calibre/src/calibre/gui2/convert/snb_output_ui.py:41 msgid "Insert space before the first line for each paragraph" -msgstr "" +msgstr "Insira un espazo antes da primeira liña de cada parágrafo" #: /home/kovid/work/calibre/src/calibre/gui2/convert/snb_output_ui.py:42 msgid "Insert empty line between paragraphs" -msgstr "" +msgstr "Inserir unha liña baleira entre parágrafos" #: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:17 msgid "" @@ -6190,103 +6228,103 @@ msgstr "etiquetas para engadir" msgid "tags to remove" msgstr "etiquetas para borrar" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:44 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:136 msgid "No details available." msgstr "Non hai detalles dispoñíbeis" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:188 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:183 msgid "Device no longer connected." msgstr "O dispositivo non está conectado." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:306 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:301 msgid "Get device information" msgstr "Obter a información do dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:317 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:312 msgid "Get list of books on device" msgstr "Obter unha relación de libros do dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:327 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:322 msgid "Get annotations from device" msgstr "Obter as anotacións do dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:339 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:334 msgid "Send metadata to device" msgstr "Enviar os metadatos ao dispostivo" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:344 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:339 msgid "Send collections to device" msgstr "Enviar as coleccións ao dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:379 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:374 msgid "Upload %d books to device" msgstr "Cargar %d libros do dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:394 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:389 msgid "Delete books from device" msgstr "Borrar libros do dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:411 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:406 msgid "Download books from device" msgstr "Descargar libros do dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:421 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:416 msgid "View book on device" msgstr "Ver libro no dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:455 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:450 msgid "Set default send to device action" msgstr "Establecer a acción de enviar ao dispositivo por defecto" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:461 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:456 msgid "Send to main memory" msgstr "Enviar á memoria principal" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:463 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:458 msgid "Send to storage card A" msgstr "Enviar á tarxeta de almacenaxe A" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:465 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:460 msgid "Send to storage card B" msgstr "Enviar á tarxeta de almacenaxe B" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:470 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:479 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:465 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:474 msgid "Main Memory" msgstr "Memoria principal" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:491 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:486 msgid "Send specific format to" -msgstr "" +msgstr "Enviar o formato especifico para" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:492 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:487 msgid "Send and delete from library" msgstr "Enviar e borrar da biblioteca" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:535 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:530 msgid "Eject device" msgstr "Extraer dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:657 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:594 msgid "Error communicating with device" msgstr "Erro ao conectar co dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:670 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:997 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1302 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:605 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1089 +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:296 msgid "No suitable formats" msgstr "Non hai formatos axeitados" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:688 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:623 msgid "Select folder to open as device" msgstr "Escoller o cartafol para abrir co como dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:735 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:670 msgid "Error talking to device" msgstr "Erro ao conectar co dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:736 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:671 msgid "" "There was a temporary error talking to the device. Please unplug and " "reconnect the device and or reboot." @@ -6294,118 +6332,60 @@ msgstr "" "Produciuse un erro temporal na comunicación co dispositivo. Desconecte e " "volva conectar o dispositovo e/ou reinícieo." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:779 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:714 msgid "Device: " msgstr "Dispositivo: " -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:781 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:716 msgid " detected." msgstr " detectado" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:879 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:814 msgid "selected to send" msgstr "seleccionado para enviar" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:884 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:819 msgid "Choose format to send to device" msgstr "Elixa formato para enviar ao dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:893 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:828 msgid "No device" msgstr "Sen dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:894 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:829 msgid "Cannot send: No device is connected" msgstr "Non se pode enviar: non hai ningún dispositivo conectado" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:897 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:901 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:832 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:836 msgid "No card" msgstr "Sen tarxeta" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:898 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:902 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:833 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:837 msgid "Cannot send: Device has no storage card" msgstr "Non de pode enviar: o dispositivo non ten tarxeta de memoria" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:943 -msgid "E-book:" -msgstr "Libro electrónico:" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:946 -msgid "Attached, you will find the e-book" -msgstr "O libro electrónico está anexo" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:947 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:107 -msgid "by" -msgstr "por" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:948 -msgid "in the %s format." -msgstr "no formato %s." - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:961 -msgid "Sending email to" -msgstr "Enviando correo a" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:991 -msgid "Auto convert the following books before sending via email?" -msgstr "" -"Desexa converter automaticamente os seguintes libros antes de os enviar por " -"correo?" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:998 -msgid "" -"Could not email the following books as no suitable formats were found:" -msgstr "" -"Non se puideron enviar por correo os libros seguintes xa que non se achou ou " -"formato correcto." - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1016 -msgid "Failed to email books" -msgstr "Fallou ao enviar por correo os libros" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1017 -msgid "Failed to email the following books:" -msgstr "Fallou ao enviar por correo os libros seguintes:" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1021 -msgid "Sent by email:" -msgstr "Enviar por correo:" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1055 -msgid "News:" -msgstr "Novas:" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1056 -msgid "Attached is the" -msgstr "Anexo está o" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1067 -msgid "Sent news to" -msgstr "Enviar novas a" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1096 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1179 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1296 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:883 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:966 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1083 msgid "Auto convert the following books before uploading to the device?" msgstr "" "Desexa converter os libros seguintes antes de os enviar ao dispositivo?" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1125 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:912 msgid "Sending catalogs to device." msgstr "A enviar catálogos ao dispositivo." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1210 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:997 msgid "Sending news to device." msgstr "A enviar novas ao dispositivo." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1263 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1050 msgid "Sending books to device." msgstr "A enviar libros ao dispositivo." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1303 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1090 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." @@ -6414,11 +6394,11 @@ msgstr "" "atoparon formatos compatíbeis. Converta o ou os libros a un formato " "compatíbel co dispositivo." -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1367 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1154 msgid "No space on device" msgstr "Non hai espazo no dispositivo" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1368 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1155 msgid "" "<p>Cannot upload books to device there is no more free space available " msgstr "" @@ -6463,15 +6443,22 @@ msgstr "Engadir libros polo ISBN" msgid "" "<p>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 " -"metadata and covers for them.<p>Any invalid ISBNs in the list will be " -"ignored." +"metadata and covers for them.</p>\n" +"<p>Any invalid ISBNs in the list will be ignored.</p>\n" +"<p>You can also specify a file that will be added with each ISBN. To do this " +"enter the full path to the file after a <code>>></code>. For example:</p>\n" +"<p><code>9788842915232 >> %s</code></p>" msgstr "" -"<p>Introduza unha lista de ISBN no cadro da esquerda, un por liña. Calibre " +"<p>Introduza unha lista de ISBN no cadro da esquerda, un por liña. O Calibre " "creará automaticamente entradas para os libros baseándose no ISBN e " -"descargará os metadatos e portadas.<p>Os ISBN da lista que non sexan válidos " -"serán ignorados." +"descargará os seus metadatos e portadas.</p>\n" +"<p>Calquera ISBN incorrecto na lista omitirase.</p>\n" +"<p>Tamén pode especificar un ficheiro para engadir con cada ISBN. Para iso " +"introduza a ruta completa do ficheiro tras <code>>></code>. Por " +"exemplo:</p>\n" +"<p><code>9788842915232 >> %s</code></p>" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:53 msgid "&Paste from clipboard" msgstr "&Pegar do portapapeis" @@ -6538,6 +6525,8 @@ msgstr "Nombres para ignorar:" msgid "" "Enter comma-separated standard file name wildcards, such as synctoy*.dat" msgstr "" +"Introduza nomes de ficheiro estándares como comodín, separados por coma, tal " +"como synctoy*.dat" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:62 msgid "Extensions to ignore" @@ -6548,6 +6537,8 @@ msgid "" "Enter comma-separated extensions without a leading dot. Used only in book " "folders" msgstr "" +"Introduza as extensións separadas por comas, sen o punto. Úsase unicamente " +"en cartafoles de libros" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:119 msgid "Path from library" @@ -6608,7 +6599,7 @@ msgid "No location selected" msgstr "Non seleccionou unha localización" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:84 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:640 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:654 msgid "Bad location" msgstr "Localización incorrecta" @@ -6708,12 +6699,12 @@ msgid "Author sort" msgstr "Ordenar por autoría" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:115 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:590 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:597 msgid "Invalid author name" msgstr "Nombre de autor incorrecto" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:591 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:598 msgid "Author names cannot contain & characters." msgstr "Os nombres de autores non poden conter caracteres \"&\"." @@ -6919,6 +6910,11 @@ msgid "" "your library before proceeding.<p>Search and replace in text fields using " "character matching or regular expressions. " msgstr "" +"<b>Pode destruír a súa biblioteca usando esta funcionalidade.</b> Os cambios " +"son permanentes. Non hai función de desfacer. Recoméndaselle fortemente " +"realizar unha copia de seguranza da súa biblioteca antes de " +"continuar.<p>Buscar e substituír en campos de texto usando ocorrencias de " +"caracteres ou expresións regulares. " #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:284 msgid "" @@ -7117,10 +7113,14 @@ msgid "" "checked,\n" "title and author are swapped before the title case is set" msgstr "" +"Fai que o título teña a inicial maiúscula. Se tanto esta caixa como a de " +"intercambiar\n" +"autor e título están marcadas, primeiro intercámbianse e logo cámbiase o " +"título." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:372 msgid "Change title to title case" -msgstr "" +msgstr "Cambiar o título a inicial maiúscula" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:373 msgid "" @@ -7149,45 +7149,52 @@ msgstr "Metadatos &personalizados" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:379 msgid "Search &field:" -msgstr "" +msgstr "Campo de &busca:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:380 msgid "The name of the field that you want to search" -msgstr "" +msgstr "O nome do campo no que buscar" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:381 msgid "Search mode:" -msgstr "" +msgstr "Modo de busca:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:382 msgid "" "Choose whether to use basic text matching or advanced regular expression " "matching" msgstr "" +"Escolla se quere usar o modo básico de busca de texto ou o modo avanzado de " +"expresións regulares" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:383 msgid "&Search for:" -msgstr "" +msgstr "&Buscar de:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:384 msgid "" "Enter the what you are looking for, either plain text or a regular " "expression, depending on the mode" msgstr "" +"Introduza o que quere buscar, xa sexa un texto sinxelo o unha expresión " +"regular, segundo o modo escollido" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:385 msgid "" "Check this box if the search string must match exactly upper and lower case. " "Uncheck it if case is to be ignored" msgstr "" +"Marque esta caixa se o texto de busca debe coincidir exactamente en " +"maiúsculas ou minúsculas. Desmárquea se as maiúsculas ou minúsculas son " +"indiferentes." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:386 msgid "Case sensitive" -msgstr "" +msgstr "Distinguir maiúsculas de minúsculas" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:387 msgid "&Replace with:" -msgstr "" +msgstr "&Substituír con:" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:388 msgid "" @@ -7522,14 +7529,14 @@ msgstr "Precísase contrasinal" #: /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:130 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:133 msgid "&Username:" msgstr "Nome de &usuario:" #: /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:132 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:135 msgid "&Password:" msgstr "&Contrasinal" @@ -8004,12 +8011,12 @@ msgid "%s (was %s)" msgstr "%s (era %s)" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:74 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:580 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:587 msgid "Item is blank" msgstr "O elemento está en branco" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:75 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:581 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:588 msgid "An item cannot be set to nothing. Delete it instead." msgstr "Un elemento non se pode deixar en branco. Bórreo no seu lugar." @@ -8092,7 +8099,7 @@ msgid "Discard changes" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:60 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:225 msgid "&Cancel" msgstr "" @@ -8292,6 +8299,64 @@ msgstr "" msgid "Recipe source code (python)" msgstr "Código fonte das receitas (pytom)" +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:145 +msgid "Email %s to %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:187 +msgid "News:" +msgstr "Novas:" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:189 +msgid "Attached is the %s periodical downloaded by calibre." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:242 +msgid "E-book:" +msgstr "Libro electrónico:" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:245 +msgid "Attached, you will find the e-book" +msgstr "O libro electrónico está anexo" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:246 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:107 +msgid "by" +msgstr "por" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:247 +msgid "in the %s format." +msgstr "no formato %s." + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:260 +msgid "Sending email to" +msgstr "Enviando correo a" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:290 +msgid "Auto convert the following books before sending via email?" +msgstr "" +"Desexa converter automaticamente os seguintes libros antes de os enviar por " +"correo?" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:297 +msgid "" +"Could not email the following books as no suitable formats were found:" +msgstr "" +"Non se puideron enviar por correo os libros seguintes xa que non se achou ou " +"formato correcto." + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:303 +msgid "Failed to email book" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:306 +msgid "sent" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:329 +msgid "Sent news to" +msgstr "Enviar novas a" + #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:112 msgid "" "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" " @@ -8489,23 +8554,23 @@ msgstr "Non se poden deter as tarefas que comunican co dispositivo" msgid "Job has already run" msgstr "A tarefa xa se está a executar" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:251 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:262 msgid "Unavailable" msgstr "Non dispoñíbel" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:294 msgid "Jobs:" msgstr "Tarefas:" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:296 msgid "Shift+Alt+J" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:302 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:313 msgid "Click to see list of jobs" msgstr "Faga clic para ver a lista de traballos" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:371 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:382 msgid " - Jobs" msgstr " - Tarefas" @@ -8531,7 +8596,7 @@ msgid "Show books in the main memory of the device" msgstr "Amosar os libros na memoria principal do dispositivo" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:67 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:823 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:820 msgid "Card A" msgstr "Tarxeta A" @@ -8540,7 +8605,7 @@ msgid "Show books in storage card A" msgstr "Amosar os libros almacenados na tarxeta A" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:69 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:825 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:822 msgid "Card B" msgstr "Tarxeta B" @@ -8623,7 +8688,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:693 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1236 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:407 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:414 msgid "The lookup/search name is \"{0}\"" msgstr "O nome de busca é \"{0}\"" @@ -8725,7 +8790,7 @@ msgid "<b>No matches</b> for the search phrase <i>%s</i> were found." msgstr "<b>Sen coincidencias</b> para a frase de busca <i>%s</i>." #: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:160 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:443 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:446 msgid "No matches found" msgstr "Non se atopou ningunha coincidencia" @@ -8742,12 +8807,12 @@ msgid "LRF Viewer toolbar" msgstr "Barra de ferramentas do visor de LRF" #: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:131 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:495 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:503 msgid "Next Page" msgstr "Páxina seguinte" #: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:132 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:496 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:504 msgid "Previous Page" msgstr "Páxina anterior" @@ -8791,7 +8856,7 @@ msgid "Do not check for updates" msgstr "Non comprobar se hai actualizacións" #: /home/kovid/work/calibre/src/calibre/gui2/main.py:58 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:648 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:662 msgid "Calibre Library" msgstr "Biblioteca do Calibre" @@ -8959,7 +9024,7 @@ msgid "Successfully downloaded metadata for %d out of %d books" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:291 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:649 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:659 msgid "Details" msgstr "" @@ -9499,39 +9564,39 @@ msgstr "Amosar &texto debaixo das iconas" msgid "&Split the toolbar into two toolbars" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:222 msgid "&Apply" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:229 msgid "Restore &defaults" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:230 msgid "Save changes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:231 msgid "Cancel and return to overview" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:269 msgid "Restoring to defaults not supported for" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:304 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 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:307 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/main.py:312 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server.py:120 msgid "Restart needed" msgstr "" @@ -9849,7 +9914,7 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server.py:75 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:329 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:331 msgid "Failed to start content server" msgstr "Fallou ao iniciar o servidor de contido" @@ -10152,26 +10217,22 @@ msgstr "Limpar" msgid "&Alternate shortcut:" msgstr "Atallo &alternativo:" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:200 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:202 msgid "Rename '%s'" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:204 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:206 msgid "Edit sort for '%s'" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:209 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:211 msgid "Hide category %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:214 msgid "Show category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:216 -msgid "Show all categories" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:223 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:227 msgid "Manage %s" @@ -10186,63 +10247,67 @@ msgstr "" msgid "Manage User Categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:451 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:248 +msgid "Show all categories" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:458 msgid "" "Changing the authors for several books can take a while. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:456 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:463 msgid "" "Changing the metadata for that many books can take a while. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:512 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:519 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:296 msgid "Searches" msgstr "Buscas" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:595 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:602 msgid "Duplicate search name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:596 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:603 msgid "The saved search name %s is already used." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:878 msgid "Sort by name" msgstr "Ordenar polo nome" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:878 msgid "Sort by popularity" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:872 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:879 msgid "Sort by average rating" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:875 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:882 msgid "Set the sort order for entries in the Tag Browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:881 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:888 msgid "Match all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:881 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:888 msgid "Match any" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:886 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:893 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:890 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:897 msgid "Manage &user categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:893 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:900 msgid "Add your own categories to the Tag Browser" msgstr "" @@ -10286,42 +10351,42 @@ msgid "" msgstr "" "Os seguintes libros xa foron convertidos ao formato %s. Desexa reconvertelos?" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:171 msgid "&Restore" msgstr "&Restabelecer" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:173 msgid "&Donate to support calibre" msgstr "&Doar para axudar ao calibre" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:177 msgid "&Eject connected device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:218 msgid "Calibre Quick Start Guide" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:448 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:478 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:439 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:450 msgid "Conversion Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:449 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:451 msgid "" "<p>Could not convert: %s<p>It is a <a href=\"%s\">DRM</a>ed book. You must " "first remove the DRM using third party tools." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:463 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:465 msgid "Recipe Disabled" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:479 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:481 msgid "<b>Failed</b>" msgstr "<b>Fallou</b>" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:517 msgid "" "is the result of the efforts of many volunteers from all over the world. If " "you find it useful, please consider donating to support its development. " @@ -10332,22 +10397,22 @@ msgstr "" "desenvolvemento. A súa contribución axudará a continuar co desenvolvemento " "do calibre." -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:541 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:543 msgid "There are active jobs. Are you sure you want to quit?" msgstr "Hai traballos en activo. Está seguro de querer saír?" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:544 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:546 msgid "" " is communicating with the device!<br>\n" " Quitting may cause corruption on the device.<br>\n" " Are you sure you want to quit?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:548 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:550 msgid "WARNING: Active jobs" msgstr "Aviso: traballos en activo" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:626 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:628 msgid "" "will keep running in the system tray. To close it, choose <b>Quit</b> in the " "context menu of the system tray." @@ -10523,96 +10588,96 @@ msgstr "&Atallos do teclado" msgid "No results found for:" msgstr "Non se encontraron resultados para:" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:35 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:36 msgid "Options to customize the ebook viewer" msgstr "Opcións para personalizar o visualizador de libros" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:42 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:708 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:43 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:711 msgid "Remember last used window size" msgstr "Lembrar o tamaño da última xanela usada" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:44 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:45 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:82 msgid "" "Set the user CSS stylesheet. This can be used to customize the look of all " "books." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:47 msgid "Maximum width of the viewer window, in pixels." msgstr "Largura máxima da xanela do visualizador, en píxeles." -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:48 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:49 msgid "Resize images larger than the viewer window to fit inside it" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:50 msgid "Hyphenate text" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:51 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:52 msgid "Default language for hyphenation rules" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:53 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:54 msgid "Font options" msgstr "Opcións de tipo de letra" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:55 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:56 msgid "The serif font family" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:57 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:58 msgid "The sans-serif font family" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:59 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:60 msgid "The monospaced font family" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:61 msgid "The standard font size in px" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:61 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:62 msgid "The monospaced font size in px" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:62 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:63 msgid "The standard font type" msgstr "O tipo de letra estándar" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:471 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:479 msgid "&Lookup in dictionary" msgstr "&Buscar no dicionario" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:474 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:482 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:138 msgid "Go to..." msgstr "Ir a..." -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:486 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:494 msgid "Next Section" msgstr "Sección seguinte" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:487 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:495 msgid "Previous Section" msgstr "Sección anterior" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:489 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:497 msgid "Document Start" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:490 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:498 msgid "Document End" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:492 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:500 msgid "Section Start" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:493 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:501 msgid "Section End" msgstr "" @@ -10680,85 +10745,85 @@ msgstr "" msgid "Search for text in book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:275 msgid "Print Preview" msgstr "Previsualización da impresión" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:309 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:312 msgid "Connecting to dict.org to lookup: <b>%s</b>…" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:410 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:413 msgid "Choose ebook" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:411 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:414 msgid "Ebooks" msgstr "Libros electrónicos" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:444 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:447 msgid "No matches found for: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:485 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:488 msgid "Loading flow..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:521 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:524 msgid "Laying out %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:552 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:555 msgid "Bookmark #%d" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:556 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:559 msgid "Add bookmark" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:557 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:560 msgid "Enter title for bookmark:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:567 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:570 msgid "Manage Bookmarks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:604 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:607 msgid "Loading ebook..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:612 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:615 msgid "DRM Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:613 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:616 msgid "<p>This book is protected by <a href=\"%s\">DRM</a>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:617 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:620 msgid "Could not open ebook" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:695 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:698 msgid "Options to control the ebook viewer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:702 -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:705 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:708 +msgid "" "If specified, viewer window will try to open full screen when started." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:710 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:713 msgid "Print javascript alert and console messages to the console" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:716 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:719 msgid "" "%prog [options] file\n" "\n" @@ -10873,59 +10938,59 @@ msgstr "" msgid "Toggle" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:390 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:400 msgid "" "If you use the WordPlayer e-book app on your Android phone, you can access " "your calibre book collection directly on the device. To do this you have to " "turn on the content server." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:394 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:404 msgid "" "Remember to leave calibre running as the server only runs as long as calibre " "is running." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:396 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:406 msgid "" "You have to add the URL http://myhostname:8080 as your calibre library in " "WordPlayer. 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/wizard/__init__.py:473 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:483 msgid "Moving library..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:489 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:490 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:499 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:500 msgid "Failed to move library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:544 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:554 msgid "Invalid database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:545 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:555 msgid "" "<p>An invalid library already exists at %s, delete it before trying to move " "the existing library.<br>Error: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:556 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:566 msgid "Could not move library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:627 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:641 msgid "Select location for books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:641 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:655 msgid "" "You must choose an empty folder for the calibre library. %s is not empty." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:715 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:729 msgid "welcome wizard" msgstr "" @@ -10997,8 +11062,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/library_ui.py:58 msgid "" -"Choose a location for your books. When you add books to calibre, they will " -"be copied here:" +"<p>Choose a location for your books. When you add books to calibre, they " +"will be copied here. Use an <b>empty folder</b> for a new calibre library:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/library_ui.py:59 @@ -11072,90 +11137,98 @@ msgstr "" msgid "You must set the username and password for the mail server." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:124 msgid "Send email &from:" msgstr "Enviar correos &desde:" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:125 msgid "" "<p>This is what will be present in the From: field of emails sent by " "calibre.<br> Set it to your email address" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:126 msgid "" "<p>A mail server is useful if the service you are sending mail to only " "accepts email from well know mail services." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:127 msgid "Mail &Server" msgstr "&Servidor de Correo" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:128 msgid "calibre can <b>optionally</b> use a server to send mail" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:129 msgid "&Hostname:" msgstr "Nome do &host:" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:130 msgid "The hostname of your mail server. For e.g. smtp.gmail.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:131 msgid "&Port:" msgstr "&Porto:" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:132 msgid "" "The port your mail server listens for connections on. The default is 25" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:131 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:134 msgid "Your username on the mail server" msgstr "O seu nome de usuario/a no servidor de correo" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:136 msgid "Your password on the mail server" msgstr "O seu contrasinal no servidor de correo" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:137 msgid "&Show" msgstr "&Amosar" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:135 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:138 msgid "&Encryption:" msgstr "&Cifrado:" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:136 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:139 msgid "" "Use TLS encryption when connecting to the mail server. This is the most " "common." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:140 msgid "&TLS" msgstr "&TLS" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:141 msgid "Use SSL encryption when connecting to the mail server." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:142 msgid "&SSL" msgstr "&SSL" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:140 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:143 +msgid "WARNING: Using no encryption is highly insecure" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:144 +msgid "&None" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:145 msgid "Use Gmail" msgstr "Usar Gmail" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:146 msgid "Use Hotmail" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:142 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:147 msgid "&Test email" msgstr "&Probar o correo" @@ -11293,14 +11366,14 @@ msgid "" "Applies to: BIBTEX output format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:538 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:540 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:545 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:547 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 " @@ -11309,14 +11382,14 @@ msgid "" "Applies to: ePub, MOBI output formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:555 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:557 msgid "" "Regex describing tags to exclude as genres.\n" "Default: '%default' excludes bracketed tags, e.g. '[<tag>]'\n" "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:563 msgid "" "Comma-separated list of tag words indicating book should be excluded from " "output. Case-insensitive.\n" @@ -11325,35 +11398,35 @@ msgid "" "Applies to: ePub, MOBI output formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:569 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:571 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:576 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:578 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:583 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:585 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:590 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:592 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:597 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:599 msgid "" "Sort titles with leading numbers as text, e.g.,\n" "'2001: A Space Odyssey' sorts as \n" @@ -11362,7 +11435,7 @@ msgid "" "Applies to: ePub, MOBI output formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:604 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:606 msgid "" "Specifies the output profile. In some cases, an output profile is required " "to optimize the catalog for the device. For example, 'kindle' or " @@ -11372,14 +11445,14 @@ msgid "" "Applies to: ePub, MOBI output formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:611 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:613 msgid "" "Tag indicating book has been read.\n" "Default: '%default'\n" "Applies to: ePub, MOBI output formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:617 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:619 msgid "" "Tag indicating book to be displayed as wishlist item.\n" "Default: '%default'\n" @@ -11931,31 +12004,31 @@ msgstr "" msgid "%sAverage rating is %3.1f" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:821 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:818 msgid "Main" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2305 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2310 msgid "<p>Migrating old database to ebook library in %s<br><center>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2334 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2339 msgid "Copying <b>%s</b>" msgstr "A copiar <b>%s</b>" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2351 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2356 msgid "Compacting database" msgstr "A compactar a base de datos" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2444 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2449 msgid "Checking SQL integrity..." msgstr "A comprobar a integridade SQL..." -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2483 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2488 msgid "Checking for missing files." msgstr "A comprobar os ficheiros perdidos." -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2505 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2516 msgid "Checked id" msgstr "id comprobada" @@ -12146,7 +12219,7 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:59 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:427 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:437 msgid "Loading, please wait" msgstr "" @@ -12205,13 +12278,13 @@ msgid "home" msgstr "" #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:332 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:538 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:548 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:569 msgid "Newest" msgstr "" #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:333 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:539 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:549 msgid "All books" msgstr "" @@ -12223,51 +12296,51 @@ msgstr "" msgid "Choose a category to browse by:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:447 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:457 msgid "Browsing by" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:448 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:458 msgid "Up" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:569 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:579 msgid "in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:572 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:582 msgid "Books in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:624 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:634 msgid "Other formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:631 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:641 msgid "Read %s in the %s format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:636 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:646 msgid "Get" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:651 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:661 msgid "Permalink" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:652 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:662 msgid "A permanent link to this book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:663 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:673 msgid "This book has been deleted" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:747 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:757 msgid "in search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:749 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:759 msgid "Matching books" msgstr "" @@ -12584,7 +12657,7 @@ msgstr "" msgid "Failed to authenticate with server: %s" msgstr "Erro ao se autenticar no servidor: %s" -#: /home/kovid/work/calibre/src/calibre/utils/smtp.py:238 +#: /home/kovid/work/calibre/src/calibre/utils/smtp.py:249 msgid "Control email delivery" msgstr "Controlar o envío de correo" @@ -13003,6 +13076,18 @@ msgstr "Non descargar follas de estilo CSS" #~ msgid "Send specific format" #~ msgstr "Enviar un formato específico" +#~ msgid "Failed to email books" +#~ msgstr "Fallou ao enviar por correo os libros" + +#~ msgid "Failed to email the following books:" +#~ msgstr "Fallou ao enviar por correo os libros seguintes:" + +#~ msgid "Sent by email:" +#~ msgstr "Enviar por correo:" + +#~ msgid "Attached is the" +#~ msgstr "Anexo está o" + #~ msgid "Fit &cover to view" #~ msgstr "Axustar a &capa á xanela" @@ -13051,6 +13136,17 @@ msgstr "Non descargar follas de estilo CSS" #~ "As mudanzas que fixo requiren que reinicie o Calibre. Reinicie cando lle for " #~ "máis práctico." +#~ 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 "" +#~ "Os libros seguintes teñen formatos especificados na base de datos que non " +#~ "están actualmente dispoñíbeis. Elimináronse as entradas para os formatos e, " +#~ "por tanto, debe comprobalos manualmente. Isto adoita acontecer ao manipular " +#~ "directamente os ficheiros na biblioteca." + #~ msgid "TabWidget" #~ msgstr "TabWidget" @@ -13261,6 +13357,17 @@ msgstr "Non descargar follas de estilo CSS" #~ "libro e os seguintes non se borrarán nin se alterarán.<br><br>Confirme que " #~ "desexa continuar." +#~ msgid "" +#~ "<p>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 " +#~ "metadata and covers for them.<p>Any invalid ISBNs in the list will be " +#~ "ignored." +#~ msgstr "" +#~ "<p>Introduza unha lista de ISBN no cadro da esquerda, un por liña. Calibre " +#~ "creará automaticamente entradas para os libros baseándose no ISBN e " +#~ "descargará os metadatos e portadas.<p>Os ISBN da lista que non sexan válidos " +#~ "serán ignorados." + #~ msgid "Run the check" #~ msgstr "Excutar a comprobación" diff --git a/src/calibre/translations/it.po b/src/calibre/translations/it.po index 5b939669a6..390c3459cc 100644 --- a/src/calibre/translations/it.po +++ b/src/calibre/translations/it.po @@ -9,13 +9,13 @@ msgstr "" "Project-Id-Version: calibre_calibre-it\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-11-27 20:21+0000\n" -"PO-Revision-Date: 2010-11-27 14:56+0000\n" -"Last-Translator: Enrico Battocchi <Unknown>\n" +"PO-Revision-Date: 2010-11-28 19:45+0000\n" +"Last-Translator: MeltingShell <Unknown>\n" "Language-Team: italiano\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-28 04:47+0000\n" +"X-Launchpad-Export-Date: 2010-11-29 04:48+0000\n" "X-Generator: Launchpad (build Unknown)\n" "X-Poedit-Bookmarks: -1,-1,-1,-1,-1,1105,-1,1312,-1,-1\n" "Generated-By: pygettext.py 1.5\n" @@ -318,7 +318,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:763 msgid "Input Options" -msgstr "Opzioni di digitazione" +msgstr "Opzioni di input" #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:765 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:776 diff --git a/src/calibre/translations/zh_CN.po b/src/calibre/translations/zh_CN.po index 0f64cb6def..ee6a1bea51 100644 --- a/src/calibre/translations/zh_CN.po +++ b/src/calibre/translations/zh_CN.po @@ -14,7 +14,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-28 04:48+0000\n" +"X-Launchpad-Export-Date: 2010-11-29 04:49+0000\n" "X-Generator: Launchpad (build Unknown)\n" "X-Poedit-Country: CHINA\n" "X-Poedit-Language: Chinese\n" From 84833cf430590cd347c409cfc7a1345000384954 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Sun, 28 Nov 2010 22:51:19 -0700 Subject: [PATCH 184/375] All new linux binary build. With updated dependencies and replacing cx_Freeze with my own C python launcher. If you are running calibre using CALIBRE_DEVELOP_FROM with a linux binary build, do not update the calibre source until after 0.7.32 is released. --- setup/installer/cx_Freeze/HISTORY.txt | 244 -------- setup/installer/cx_Freeze/LICENSE.txt | 53 -- setup/installer/cx_Freeze/MANIFEST.in | 6 - setup/installer/cx_Freeze/PKG-INFO | 22 - setup/installer/cx_Freeze/README.txt | 12 - .../installer/cx_Freeze/cx_Freeze/__init__.py | 14 - setup/installer/cx_Freeze/cx_Freeze/dist.py | 279 --------- setup/installer/cx_Freeze/cx_Freeze/finder.py | 455 --------------- .../installer/cx_Freeze/cx_Freeze/freezer.py | 550 ------------------ setup/installer/cx_Freeze/cx_Freeze/hooks.py | 281 --------- setup/installer/cx_Freeze/cx_Freeze/main.py | 171 ------ .../installer/cx_Freeze/cx_Freeze/windist.py | 337 ----------- setup/installer/cx_Freeze/cxfreeze | 6 - .../cx_Freeze/initscripts/Console.py | 35 -- .../cx_Freeze/initscripts/ConsoleKeepPath.py | 19 - .../initscripts/ConsoleSetLibPath.py | 38 -- .../cx_Freeze/initscripts/SharedLib.py | 20 - .../cx_Freeze/initscripts/SharedLibSource.py | 23 - .../cx_Freeze/samples/advanced/advanced_1.py | 7 - .../cx_Freeze/samples/advanced/advanced_2.py | 7 - .../samples/advanced/modules/testfreeze_1.py | 1 - .../samples/advanced/modules/testfreeze_2.py | 1 - .../cx_Freeze/samples/advanced/setup.py | 31 - .../cx_Freeze/samples/matplotlib/setup.py | 27 - .../samples/matplotlib/test_matplotlib.py | 48 -- .../samples/relimport/pkg1/__init__.py | 3 - .../samples/relimport/pkg1/pkg2/__init__.py | 3 - .../samples/relimport/pkg1/pkg2/sub3.py | 3 - .../samples/relimport/pkg1/pkg2/sub5.py | 1 - .../cx_Freeze/samples/relimport/pkg1/sub1.py | 2 - .../cx_Freeze/samples/relimport/pkg1/sub2.py | 1 - .../cx_Freeze/samples/relimport/pkg1/sub4.py | 1 - .../cx_Freeze/samples/relimport/pkg1/sub6.py | 1 - .../cx_Freeze/samples/relimport/relimport.py | 1 - .../cx_Freeze/samples/relimport/setup.py | 16 - .../cx_Freeze/samples/simple/hello.py | 19 - .../cx_Freeze/samples/simple/setup.py | 18 - setup/installer/cx_Freeze/samples/wx/setup.py | 25 - setup/installer/cx_Freeze/samples/wx/wxapp.py | 42 -- setup/installer/cx_Freeze/setup.py | 197 ------- .../installer/cx_Freeze/source/bases/Common.c | 262 --------- .../cx_Freeze/source/bases/Console.c | 72 --- .../cx_Freeze/source/bases/ConsoleKeepPath.c | 60 -- .../cx_Freeze/source/bases/Win32GUI.c | 242 -------- .../installer/cx_Freeze/source/bases/dummy.rc | 5 - .../cx_Freeze/source/bases/manifest.rc | 3 - setup/installer/cx_Freeze/source/util.c | 418 ------------- setup/installer/linux/__init__.py | 3 +- setup/installer/linux/freeze.py | 1 - setup/installer/linux/freeze2.py | 194 ++++-- setup/installer/linux/util.c | 81 ++- setup/installer/windows/notes.rst | 3 +- src/calibre/devices/usbms/device.py | 12 +- src/calibre/ebooks/pdf/pdftohtml.py | 4 +- src/calibre/gui2/__init__.py | 2 +- src/calibre/libunrar.py | 2 +- src/calibre/utils/ipc/launch.py | 43 +- 57 files changed, 209 insertions(+), 4218 deletions(-) delete mode 100644 setup/installer/cx_Freeze/HISTORY.txt delete mode 100644 setup/installer/cx_Freeze/LICENSE.txt delete mode 100644 setup/installer/cx_Freeze/MANIFEST.in delete mode 100644 setup/installer/cx_Freeze/PKG-INFO delete mode 100644 setup/installer/cx_Freeze/README.txt delete mode 100644 setup/installer/cx_Freeze/cx_Freeze/__init__.py delete mode 100644 setup/installer/cx_Freeze/cx_Freeze/dist.py delete mode 100644 setup/installer/cx_Freeze/cx_Freeze/finder.py delete mode 100644 setup/installer/cx_Freeze/cx_Freeze/freezer.py delete mode 100644 setup/installer/cx_Freeze/cx_Freeze/hooks.py delete mode 100644 setup/installer/cx_Freeze/cx_Freeze/main.py delete mode 100644 setup/installer/cx_Freeze/cx_Freeze/windist.py delete mode 100755 setup/installer/cx_Freeze/cxfreeze delete mode 100755 setup/installer/cx_Freeze/initscripts/Console.py delete mode 100755 setup/installer/cx_Freeze/initscripts/ConsoleKeepPath.py delete mode 100755 setup/installer/cx_Freeze/initscripts/ConsoleSetLibPath.py delete mode 100755 setup/installer/cx_Freeze/initscripts/SharedLib.py delete mode 100755 setup/installer/cx_Freeze/initscripts/SharedLibSource.py delete mode 100644 setup/installer/cx_Freeze/samples/advanced/advanced_1.py delete mode 100644 setup/installer/cx_Freeze/samples/advanced/advanced_2.py delete mode 100644 setup/installer/cx_Freeze/samples/advanced/modules/testfreeze_1.py delete mode 100644 setup/installer/cx_Freeze/samples/advanced/modules/testfreeze_2.py delete mode 100644 setup/installer/cx_Freeze/samples/advanced/setup.py delete mode 100644 setup/installer/cx_Freeze/samples/matplotlib/setup.py delete mode 100644 setup/installer/cx_Freeze/samples/matplotlib/test_matplotlib.py delete mode 100644 setup/installer/cx_Freeze/samples/relimport/pkg1/__init__.py delete mode 100644 setup/installer/cx_Freeze/samples/relimport/pkg1/pkg2/__init__.py delete mode 100644 setup/installer/cx_Freeze/samples/relimport/pkg1/pkg2/sub3.py delete mode 100644 setup/installer/cx_Freeze/samples/relimport/pkg1/pkg2/sub5.py delete mode 100644 setup/installer/cx_Freeze/samples/relimport/pkg1/sub1.py delete mode 100644 setup/installer/cx_Freeze/samples/relimport/pkg1/sub2.py delete mode 100644 setup/installer/cx_Freeze/samples/relimport/pkg1/sub4.py delete mode 100644 setup/installer/cx_Freeze/samples/relimport/pkg1/sub6.py delete mode 100644 setup/installer/cx_Freeze/samples/relimport/relimport.py delete mode 100644 setup/installer/cx_Freeze/samples/relimport/setup.py delete mode 100644 setup/installer/cx_Freeze/samples/simple/hello.py delete mode 100644 setup/installer/cx_Freeze/samples/simple/setup.py delete mode 100644 setup/installer/cx_Freeze/samples/wx/setup.py delete mode 100644 setup/installer/cx_Freeze/samples/wx/wxapp.py delete mode 100755 setup/installer/cx_Freeze/setup.py delete mode 100644 setup/installer/cx_Freeze/source/bases/Common.c delete mode 100644 setup/installer/cx_Freeze/source/bases/Console.c delete mode 100644 setup/installer/cx_Freeze/source/bases/ConsoleKeepPath.c delete mode 100644 setup/installer/cx_Freeze/source/bases/Win32GUI.c delete mode 100644 setup/installer/cx_Freeze/source/bases/dummy.rc delete mode 100644 setup/installer/cx_Freeze/source/bases/manifest.rc delete mode 100644 setup/installer/cx_Freeze/source/util.c diff --git a/setup/installer/cx_Freeze/HISTORY.txt b/setup/installer/cx_Freeze/HISTORY.txt deleted file mode 100644 index acf9ad0dfe..0000000000 --- a/setup/installer/cx_Freeze/HISTORY.txt +++ /dev/null @@ -1,244 +0,0 @@ -Changes from 4.0 to 4.0.1 - 1) Added support for Python 2.6. On Windows a manifest file is now required - because of the switch to using the new Microsoft C runtime. - 2) Ensure that hooks are run for builtin modules. - -Changes from 4.0b1 to 4.0 - 1) Added support for copying files to the target directory. - 2) Added support for a hook that runs when a module is missing. - 3) Added support for binary path includes as well as excludes; use sequences - rather than dictionaries as a more convenient API; exclude the standard - locations for 32-bit and 64-bit libaries in multi-architecture systems. - 4) Added support for searching zip files (egg files) for modules. - 5) Added support for handling system exit exceptions similarly to what Python - does itself as requested by Sylvain. - 6) Added code to wait for threads to shut down like the normal Python - interpreter does. Thanks to Mariano Disanzo for discovering this - discrepancy. - 7) Hooks added or modified based on feedback from many people. - 8) Don't include the version name in the display name of the MSI. - 9) Use the OS dependent path normalization routines rather than simply use the - lowercase value as on Unix case is important; thanks to Artie Eoff for - pointing this out. -10) Include a version attribute in the cx_Freeze package and display it in the - output for the --version option to the script. -11) Include build instructions as requested by Norbert Sebok. -12) Add support for copying files when modules are included which require data - files to operate properly; add support for copying the necessary files for - the Tkinter and matplotlib modules. -13) Handle deferred imports recursively as needed; ensure that from lists do - not automatically indicate that they are part of the module or the deferred - import processing doesn't actually work! -14) Handle the situation where a module imports everything from a package and - the __all__ variable has been defined but the package has not actually - imported everything in the __all__ variable during initialization. -15) Modified license text to more closely match the Python Software Foundation - license as was intended. -16) Added sample script for freezing an application using matplotlib. -17) Renamed freeze to cxfreeze to avoid conflict with another package that uses - that executable as requested by Siegfried Gevatter. - -Changes from 3.0.3 to 4.0b1 - 1) Added support for placing modules in library.zip or in a separate zip file - for each executable that is produced. - 2) Added support for copying binary dependent files (DLLs and shared - libraries) - 3) Added support for including all submodules in a package - 4) Added support for including icons in Windows executables - 5) Added support for constants module which can be used for determining - certain build constants at runtime - 6) Added support for relative imports available in Python 2.5 and up - 7) Added support for building Windows installers (Python 2.5 and up) and - RPM packages - 8) Added support for distutils configuration scripts - 9) Added support for hooks which can force inclusion or exclusion of modules - when certain modules are included -10) Added documentation and samples -11) Added setup.py for building the cx_Freeze package instead of a script - used to build only the frozen bases -12) FreezePython renamed to a script called freeze in the Python distribution -13) On Linux and other platforms that support it set LD_RUN_PATH to include - the directory in which the executable is located - -Changes from 3.0.2 to 3.0.3 - 1) In Common.c, used MAXPATHLEN defined in the Python OS independent include - file rather than the PATH_MAX define which is OS dependent and is not - available on IRIX as noted by Andrew Jones. - 2) In the initscript ConsoleSetLibPath.py, added lines from initscript - Console.py that should have been there since the only difference between - that script and this one is the automatic re-execution of the executable. - 3) Added an explicit "import encodings" to the initscripts in order to handle - Unicode encodings a little better. Thanks to Ralf Schmitt for pointing out - the problem and its solution. - 4) Generated a meaningful name for the extension loader script so that it is - clear which particular extension module is being loaded when an exception - is being raised. - 5) In MakeFrozenBases.py, use distutils to figure out a few more - platform-dependent linker flags as suggested by Ralf Schmitt. - -Changes from 3.0.1 to 3.0.2 - 1) Add support for compressing the byte code in the zip files that are - produced. - 2) Add better support for the win32com package as requested by Barry Scott. - 3) Prevent deletion of target file if it happens to be identical to the - source file. - 4) Include additional flags for local modifications to a Python build as - suggested by Benjamin Rutt. - 5) Expanded instructions for building cx_Freeze from source based on a - suggestion from Gregg Lind. - 6) Fix typo in help string. - -Changes from 3.0 to 3.0.1 - 1) Added option --default-path which is used to specify the path used when - finding modules. This is particularly useful when performing cross - compilations (such as for building a frozen executable for Windows CE). - 2) Added option --shared-lib-name which can be used to specify the name of - the shared library (DLL) implementing the Python runtime that is required - for the frozen executable to work. This option is also particularly useful - when cross compiling since the normal method for determining this - information cannot be used. - 3) Added option --zip-include which allows for additional files to be added - to the zip file that contains the modules that implement the Python - script. Thanks to Barray Warsaw for providing the initial patch. - 4) Added support for handling read-only files properly. Thanks to Peter - Grayson for pointing out the problem and providing a solution. - 5) Added support for a frozen executable to be a symbolic link. Thanks to - Robert Kiendl for providing the initial patch. - 6) Enhanced the support for running a frozen executable that uses an existing - Python installation to locate modules it requires. This is primarily of - use for embedding Python where the interface is C but the ability to run - from source is still desired. - 7) Modified the documentation to indicate that building from source on - Windows currently requires the mingw compiler (http://www.mingw.org). - 8) Workaround the problem in Python 2.3 (fixed in Python 2.4) which causes a - broken module to be left in sys.modules if an ImportError takes place - during the execution of the code in that module. Thanks to Roger Binns - for pointing this out. - -Changes from 3.0 beta3 to 3.0 - 1) Ensure that ldd is only run on extension modules. - 2) Allow for using a compiler other than gcc for building the frozen base - executables by setting the environment variable CC. - 3) Ensure that the import lock is not held while executing the main script; - otherwise, attempts to import a module within a thread will hang that - thread as noted by Roger Binns. - 4) Added support for replacing the paths in all frozen modules with something - else (so that for example the path of the machine on which the freezing - was done is not displayed in tracebacks) - -Changes from 3.0 beta2 to 3.0 beta3 - 1) Explicitly include the warnings module so that at runtime warnings are - suppressed as when running Python normally. - 2) Improve the extension loader so that an ImportError is raised when the - dynamic module is not located; otherwise an error about missing attributes - is raised instead. - 3) Extension loaders are only created when copying dependencies since the - normal module should be loadable in the situation where a Python - installation is available. - 4) Added support for Python 2.4. - 5) Fixed the dependency checking for wxPython to be a little more - intelligent. - -Changes from 3.0 beta1 to 3.0 beta2 - 1) Fix issues with locating the initscripts and bases relative to the - directory in which the executable was started. - 2) Added new base executable ConsoleKeepPath which is used when an existing - Python installation is required (such as for FreezePython itself). - 3) Forced the existence of a Python installation to be ignored when using the - standard Console base executable. - 4) Remove the existing file when copying dependent files; otherwise, an error - is raised when attempting to overwrite read-only files. - 5) Added option -O (or -OO) to FreezePython to set the optimization used when - generating bytecode. - -Changes from 2.2 to 3.0 beta1 - 1) cx_Freeze now requires Python 2.3 or higher since it takes advantage of - the ability of Python 2.3 and higher to import modules from zip files. - This makes the freezing process considerably simpler and also allows for - the execution of multiple frozen packages (such as found in COM servers or - shared libraries) without requiring modification to the Python modules. - 2) All external dependencies have been removed. cx_Freeze now only requires - a standard Python distribution to do its work. - 3) Added the ability to define the initialization scripts that cx_Freeze uses - on startup of the frozen program. Previously, these scripts were written - in C and could not easily be changed; now they are written in Python and - can be found in the initscripts directory (and chosen with the - new --init-script option to FreezePython). - 4) The base executable ConsoleSetLibPath has been removed and replaced with - the initscript ConsoleSetLibPath. - 5) Removed base executables for Win32 services and Win32 COM servers. This - functionality will be restored in the future but it is not currently in a - state that is ready for release. If this functionality is required, please - use py2exe or contact me for my work in progress. - 6) The attribute sys.frozen is now set so that more recent pywin32 modules - work as expected when frozen. - 7) Added option --include-path to FreezePython to allow overriding of - sys.path without modifying the environment variable PYTHONPATH. - 8) Added option --target-dir/--install-dir to specify the directory in which - the frozen executable and its dependencies will be placed. - 9) Removed the option --shared-lib since it was used for building shared - libraries and can be managed with the initscript SharedLib.py. -10) MakeFrozenBases.py now checks the platform specific include directory as - requested by Michael Partridge. - - -Changes from 2.1 to 2.2 - 1) Add option (--ext-list-file) to FreezePython to write the list of - extensions copied to the installation directory to a file. This option is - useful in cases where multiple builds are performed into the same - installation directory. - 2) Pass the arguments on the command line through to Win32 GUI applications. - Thanks to Michael Porter for pointing this out. - 3) Link directly against the python DLL when building the frozen bases on - Windows, thus eliminating the need for building an import library. - 4) Force sys.path to include the directory in which the script to be frozen - is found. - 5) Make sure that the installation directory exists before attempting to - copy the target binary into it. - 6) The Win32GUI base has been modified to display fatal errors in message - boxes, rather than printing errors to stderr, since on Windows the - standard file IO handles are all closed. - -Changes from 2.0 to 2.1 - 1) Remove dependency on Python 2.2. Thanks to Paul Moore for not only - pointing it out but providing patches. - 2) Set up the list of frozen modules in advance, rather than doing it after - Python is initialized so that implicit imports done by Python can be - satisfied. The bug in Python 2.3 that demonstrated this issue has been - fixed in the first release candidate. Thanks to Thomas Heller for pointing - out the obvious in this instance! - 3) Added additional base executable (ConsoleSetLibPath) to support setting - the LD_LIBRARY_PATH variable on Unix platforms and restarting the - executable to put the new setting into effect. This is primarily of use - in distributing wxPython applications on Unix where the shared library - has an embedded RPATH value which can cause problems. - 4) Small improvements of documentation based on feedback from several people. - 5) Print information about the files written or copied during the freezing - process. - 6) Do not copy extensions when freezing if the path is being overridden since - it is expected that a full Python installation is available to the target - users of the frozen binary. - 7) Provide meaningful error message when the wxPython library cannot be - found during the freezing process. - -Changes from 1.1 to 2.0 - 1) Added support for in process (DLL) COM servers using PythonCOM. - 2) Ensured that the frozen flag is set prior to determining the full path for - the program in order to avoid warnings about Python not being found on - some platforms. - 3) Added include file and resource file to the source tree to avoid the - dependency on the Wine message compiler for Win32 builds. - 4) Dropped the option --copy-extensions; this now happens automatically since - the resulting binary is useless without them. - 5) Added a sample for building a Win32 service. - 6) Make use of improved modules from Python 2.3 (which function under 2.2) - -Changes from 1.0 to 1.1 - 1) Fixed import error with C extensions in packages; thanks to Thomas Heller - for pointing out the solution to this problem. - 2) Added options to FreezePython to allow for the inclusion of modules which - will not be found by the module finder (--include-modules) and the - exclusion of modules which will be found by the module finder but should - not be included (--exclude-modules). - 3) Fixed typo in README.txt. - diff --git a/setup/installer/cx_Freeze/LICENSE.txt b/setup/installer/cx_Freeze/LICENSE.txt deleted file mode 100644 index cb9ee05a8a..0000000000 --- a/setup/installer/cx_Freeze/LICENSE.txt +++ /dev/null @@ -1,53 +0,0 @@ -Copyright 2007-2008, Colt Engineering, Edmonton, Alberta, Canada. -Copyright 2001-2006, Computronix (Canada) Ltd., Edmonton, Alberta, Canada. -All rights reserved. - -NOTE: this license is derived from the Python Software Foundation License -which can be found at http://www.python.org/psf/license - -License for cx_Freeze 4.0.1 ---------------------------- - -1. This LICENSE AGREEMENT is between the copyright holders and the Individual - or Organization ("Licensee") accessing and otherwise using cx_Freeze - software in source or binary form and its associated documentation. - -2. Subject to the terms and conditions of this License Agreement, the - copyright holders hereby grant Licensee a nonexclusive, royalty-free, - world-wide license to reproduce, analyze, test, perform and/or display - publicly, prepare derivative works, distribute, and otherwise use cx_Freeze - alone or in any derivative version, provided, however, that this License - Agreement and this notice of copyright are retained in cx_Freeze alone or in - any derivative version prepared by Licensee. - -3. In the event Licensee prepares a derivative work that is based on or - incorporates cx_Freeze or any part thereof, and wants to make the derivative - work available to others as provided herein, then Licensee hereby agrees to - include in any such work a brief summary of the changes made to cx_Freeze. - -4. The copyright holders are making cx_Freeze available to Licensee on an - "AS IS" basis. THE COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, - EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, THE COPYRIGHT - HOLDERS MAKE NO AND DISCLAIM ANY REPRESENTATION OR WARRANTY OF - MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF - CX_FREEZE WILL NOT INFRINGE ANY THIRD PARTY RIGHTS. - -5. THE COPYRIGHT HOLDERS SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF - CX_FREEZE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS - A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING CX_FREEZE, OR ANY - DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -6. This License Agreement will automatically terminate upon a material breach - of its terms and conditions. - -7. Nothing in this License Agreement shall be deemed to create any relationship - of agency, partnership, or joint venture between the copyright holders and - Licensee. This License Agreement does not grant permission to use - copyright holder's trademarks or trade name in a trademark sense to endorse - or promote products or services of Licensee, or any third party. - -8. By copying, installing or otherwise using cx_Freeze, Licensee agrees to be - bound by the terms and conditions of this License Agreement. - -Computronix is a registered trademark of Computronix (Canada) Ltd. - diff --git a/setup/installer/cx_Freeze/MANIFEST.in b/setup/installer/cx_Freeze/MANIFEST.in deleted file mode 100644 index 2348a66973..0000000000 --- a/setup/installer/cx_Freeze/MANIFEST.in +++ /dev/null @@ -1,6 +0,0 @@ -include MANIFEST.in -include *.txt -recursive-include doc *.html -recursive-include initscripts *.py -recursive-include samples *.py -recursive-include source *.c *.rc diff --git a/setup/installer/cx_Freeze/PKG-INFO b/setup/installer/cx_Freeze/PKG-INFO deleted file mode 100644 index aa53b57914..0000000000 --- a/setup/installer/cx_Freeze/PKG-INFO +++ /dev/null @@ -1,22 +0,0 @@ -Metadata-Version: 1.0 -Name: cx_Freeze -Version: 4.0.1 -Summary: create standalone executables from Python scripts -Home-page: http://cx-freeze.sourceforge.net -Author: Anthony Tuininga -Author-email: anthony.tuininga@gmail.com -License: Python Software Foundation License -Description: create standalone executables from Python scripts -Keywords: freeze -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: Python Software Foundation License -Classifier: Natural Language :: English -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: C -Classifier: Programming Language :: Python -Classifier: Topic :: Software Development :: Build Tools -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Classifier: Topic :: System :: Software Distribution -Classifier: Topic :: Utilities diff --git a/setup/installer/cx_Freeze/README.txt b/setup/installer/cx_Freeze/README.txt deleted file mode 100644 index 1ac67dc749..0000000000 --- a/setup/installer/cx_Freeze/README.txt +++ /dev/null @@ -1,12 +0,0 @@ -Please see cx_Freeze.html for documentation on how to use cx_Freeze. - -To build: - -python setup.py build -python setup.py install - -On Windows I have used the MinGW compiler (http://www.mingw.org) - -python setup.py build --compiler=mingw32 -python setup.py build --compiler=mingw32 install - diff --git a/setup/installer/cx_Freeze/cx_Freeze/__init__.py b/setup/installer/cx_Freeze/cx_Freeze/__init__.py deleted file mode 100644 index 545883eb3e..0000000000 --- a/setup/installer/cx_Freeze/cx_Freeze/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -version = "4.0.1" - -import sys -from dist import * -if sys.platform == "win32" and sys.version_info[:2] >= (2, 5): - from windist import * -from finder import * -from freezer import * -from main import * - -del dist -del finder -del freezer - diff --git a/setup/installer/cx_Freeze/cx_Freeze/dist.py b/setup/installer/cx_Freeze/cx_Freeze/dist.py deleted file mode 100644 index c2af2ac623..0000000000 --- a/setup/installer/cx_Freeze/cx_Freeze/dist.py +++ /dev/null @@ -1,279 +0,0 @@ -import distutils.command.bdist_rpm -import distutils.command.build -import distutils.command.install -import distutils.core -import distutils.dir_util -import distutils.dist -import distutils.util -import distutils.version -import os -import sys - -import cx_Freeze - -__all__ = [ "bdist_rpm", "build", "build_exe", "install", "install_exe", - "setup" ] - -class Distribution(distutils.dist.Distribution): - - def __init__(self, attrs): - self.executables = [] - distutils.dist.Distribution.__init__(self, attrs) - - -class bdist_rpm(distutils.command.bdist_rpm.bdist_rpm): - - def finalize_options(self): - distutils.command.bdist_rpm.bdist_rpm.finalize_options(self) - self.use_rpm_opt_flags = 1 - - def _make_spec_file(self): - contents = distutils.command.bdist_rpm.bdist_rpm._make_spec_file(self) - return [c for c in contents if c != 'BuildArch: noarch'] - - -class build(distutils.command.build.build): - user_options = distutils.command.build.build.user_options + [ - ('build-exe=', None, 'build directory for executables') - ] - - def get_sub_commands(self): - subCommands = distutils.command.build.build.get_sub_commands(self) - if self.distribution.executables: - subCommands.append("build_exe") - return subCommands - - def initialize_options(self): - distutils.command.build.build.initialize_options(self) - self.build_exe = None - - def finalize_options(self): - distutils.command.build.build.finalize_options(self) - if self.build_exe is None: - dirName = "exe.%s-%s" % \ - (distutils.util.get_platform(), sys.version[0:3]) - self.build_exe = os.path.join(self.build_base, dirName) - - -class build_exe(distutils.core.Command): - description = "build executables from Python scripts" - user_options = [ - ('build-exe=', 'b', - 'directory for built executables'), - ('optimize=', 'O', - 'optimization level: -O1 for "python -O", ' - '-O2 for "python -OO" and -O0 to disable [default: -O0]'), - ('excludes=', 'e', - 'comma-separated list of modules to exclude'), - ('includes=', 'i', - 'comma-separated list of modules to include'), - ('packages=', 'p', - 'comma-separated list of packages to include'), - ('replace-paths=', None, - 'comma-separated list of paths to replace in included modules'), - ('path=', None, - 'comma-separated list of paths to search'), - ('init-script=', 'i', - 'name of script to use during initialization'), - ('base=', None, - 'name of base executable to use'), - ('compressed', 'c', - 'create a compressed zipfile'), - ('copy-dependent-files', None, - 'copy all dependent files'), - ('create-shared-zip', None, - 'create a shared zip file containing shared modules'), - ('append-script-to-exe', None, - 'append the script module to the exe'), - ('include-in-shared-zip', None, - 'include the script module in the shared zip file'), - ('icon', None, - 'include the icon along with the frozen executable(s)'), - ('constants=', None, - 'comma-separated list of constants to include'), - ('include-files=', 'f', - 'list of tuples of additional files to include in distribution'), - ('bin-includes', None, - 'list of names of files to include when determining dependencies'), - ('bin-excludes', None, - 'list of names of files to exclude when determining dependencies') - ] - boolean_options = ["compressed", "copy_dependent_files", - "create_shared_zip", "append_script_to_exe", - "include_in_shared_zip"] - - def _normalize(self, attrName): - value = getattr(self, attrName) - if value is None: - normalizedValue = [] - elif isinstance(value, basestring): - normalizedValue = value.split() - else: - normalizedValue = list(value) - setattr(self, attrName, normalizedValue) - - def initialize_options(self): - self.optimize = 0 - self.build_exe = None - self.excludes = [] - self.includes = [] - self.packages = [] - self.replace_paths = [] - self.compressed = None - self.copy_dependent_files = None - self.init_script = None - self.base = None - self.path = None - self.create_shared_zip = None - self.append_script_to_exe = None - self.include_in_shared_zip = None - self.icon = None - self.constants = [] - self.include_files = [] - self.bin_excludes = [] - self.bin_includes = [] - - def finalize_options(self): - self.set_undefined_options('build', ('build_exe', 'build_exe')) - self.optimize = int(self.optimize) - self._normalize("excludes") - self._normalize("includes") - self._normalize("packages") - self._normalize("constants") - - def run(self): - metadata = self.distribution.metadata - constantsModule = cx_Freeze.ConstantsModule(metadata.version) - for constant in self.constants: - parts = constant.split("=") - if len(parts) == 1: - name = constant - value = None - else: - name, stringValue = parts - value = eval(stringValue) - constantsModule.values[name] = value - freezer = cx_Freeze.Freezer(self.distribution.executables, - [constantsModule], self.includes, self.excludes, self.packages, - self.replace_paths, self.compressed, self.optimize, - self.copy_dependent_files, self.init_script, self.base, - self.path, self.create_shared_zip, self.append_script_to_exe, - self.include_in_shared_zip, self.build_exe, icon = self.icon, - includeFiles = self.include_files, - binIncludes = self.bin_includes, - binExcludes = self.bin_excludes) - freezer.Freeze() - - -class install(distutils.command.install.install): - user_options = distutils.command.install.install.user_options + [ - ('install-exe=', None, - 'installation directory for executables') - ] - - def expand_dirs(self): - distutils.command.install.install.expand_dirs(self) - self._expand_attrs(['install_exe']) - - def get_sub_commands(self): - subCommands = distutils.command.install.install.get_sub_commands(self) - if self.distribution.executables: - subCommands.append("install_exe") - return [s for s in subCommands if s != "install_egg_info"] - - def initialize_options(self): - distutils.command.install.install.initialize_options(self) - self.install_exe = None - - def finalize_options(self): - if self.prefix is None and sys.platform == "win32": - import _winreg - key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, - r"Software\Microsoft\Windows\CurrentVersion") - prefix = str(_winreg.QueryValueEx(key, "ProgramFilesDir")[0]) - metadata = self.distribution.metadata - dirName = "%s-%s" % (metadata.name, metadata.version) - self.prefix = "%s/%s" % (prefix, dirName) - distutils.command.install.install.finalize_options(self) - self.convert_paths('exe') - if self.root is not None: - self.change_roots('exe') - - def select_scheme(self, name): - distutils.command.install.install.select_scheme(self, name) - if self.install_exe is None: - if sys.platform == "win32": - self.install_exe = '$base' - else: - metadata = self.distribution.metadata - dirName = "%s-%s" % (metadata.name, metadata.version) - self.install_exe = '$base/lib/%s' % dirName - - -class install_exe(distutils.core.Command): - description = "install executables built from Python scripts" - user_options = [ - ('install-dir=', 'd', 'directory to install executables to'), - ('build-dir=', 'b', 'build directory (where to install from)'), - ('force', 'f', 'force installation (overwrite existing files)'), - ('skip-build', None, 'skip the build steps') - ] - - def initialize_options(self): - self.install_dir = None - self.force = 0 - self.build_dir = None - self.skip_build = None - - def finalize_options(self): - self.set_undefined_options('build', ('build_exe', 'build_dir')) - self.set_undefined_options('install', - ('install_exe', 'install_dir'), - ('force', 'force'), - ('skip_build', 'skip_build')) - - def run(self): - if not self.skip_build: - self.run_command('build_exe') - self.outfiles = self.copy_tree(self.build_dir, self.install_dir) - if sys.platform != "win32": - baseDir = os.path.dirname(os.path.dirname(self.install_dir)) - binDir = os.path.join(baseDir, "bin") - if not os.path.exists(binDir): - os.makedirs(binDir) - sourceDir = os.path.join("..", self.install_dir[len(baseDir) + 1:]) - for executable in self.distribution.executables: - name = os.path.basename(executable.targetName) - source = os.path.join(sourceDir, name) - target = os.path.join(binDir, name) - if os.path.exists(target): - os.unlink(target) - os.symlink(source, target) - self.outfiles.append(target) - - def get_inputs(self): - return self.distribution.executables or [] - - def get_outputs(self): - return self.outfiles or [] - - -def _AddCommandClass(commandClasses, name, cls): - if name not in commandClasses: - commandClasses[name] = cls - - -def setup(**attrs): - attrs["distclass"] = Distribution - commandClasses = attrs.setdefault("cmdclass", {}) - if sys.platform == "win32": - if sys.version_info[:2] >= (2, 5): - _AddCommandClass(commandClasses, "bdist_msi", cx_Freeze.bdist_msi) - else: - _AddCommandClass(commandClasses, "bdist_rpm", cx_Freeze.bdist_rpm) - _AddCommandClass(commandClasses, "build", build) - _AddCommandClass(commandClasses, "build_exe", build_exe) - _AddCommandClass(commandClasses, "install", install) - _AddCommandClass(commandClasses, "install_exe", install_exe) - distutils.core.setup(**attrs) - diff --git a/setup/installer/cx_Freeze/cx_Freeze/finder.py b/setup/installer/cx_Freeze/cx_Freeze/finder.py deleted file mode 100644 index f815db97be..0000000000 --- a/setup/installer/cx_Freeze/cx_Freeze/finder.py +++ /dev/null @@ -1,455 +0,0 @@ -""" -Base class for finding modules. -""" - -import dis -import imp -import marshal -import new -import opcode -import os -import sys -import zipfile - -import cx_Freeze.hooks - -BUILD_LIST = opcode.opmap["BUILD_LIST"] -INPLACE_ADD = opcode.opmap["INPLACE_ADD"] -LOAD_CONST = opcode.opmap["LOAD_CONST"] -IMPORT_NAME = opcode.opmap["IMPORT_NAME"] -IMPORT_FROM = opcode.opmap["IMPORT_FROM"] -STORE_NAME = opcode.opmap["STORE_NAME"] -STORE_GLOBAL = opcode.opmap["STORE_GLOBAL"] -STORE_OPS = (STORE_NAME, STORE_GLOBAL) - -__all__ = [ "Module", "ModuleFinder" ] - -class ModuleFinder(object): - - def __init__(self, includeFiles, excludes, path, replacePaths): - self.includeFiles = includeFiles - self.excludes = dict.fromkeys(excludes) - self.replacePaths = replacePaths - self.path = path or sys.path - self.modules = [] - self.aliases = {} - self._modules = dict.fromkeys(excludes) - self._builtinModules = dict.fromkeys(sys.builtin_module_names) - self._badModules = {} - self._zipFileEntries = {} - self._zipFiles = {} - cx_Freeze.hooks.initialize(self) - - def _AddModule(self, name): - """Add a module to the list of modules but if one is already found, - then return it instead; this is done so that packages can be - handled properly.""" - module = self._modules.get(name) - if module is None: - module = self._modules[name] = Module(name) - self.modules.append(module) - if name in self._badModules: - del self._badModules[name] - return module - - def _DetermineParent(self, caller): - """Determine the parent to use when searching packages.""" - if caller is not None: - if caller.path is not None: - return caller - return self._GetParentByName(caller.name) - - def _EnsureFromList(self, caller, packageModule, fromList, - deferredImports): - """Ensure that the from list is satisfied. This is only necessary for - package modules. If the caller is the package itself, actually - attempt to import right then since it must be a submodule; otherwise - defer until after all global names are defined in order to avoid - spurious complaints about missing modules.""" - if caller is not packageModule: - deferredImports.append((packageModule, fromList)) - else: - if fromList == ("*",): - fromList = packageModule.allNames - for name in fromList: - if name in packageModule.globalNames: - continue - subModuleName = "%s.%s" % (packageModule.name, name) - self._ImportModule(subModuleName, deferredImports, caller) - - def _FindModule(self, name, path): - try: - return imp.find_module(name, path) - except ImportError: - if not path: - path = [] - for location in path: - if name in self._zipFileEntries: - break - if location in self._zipFiles: - continue - if os.path.isdir(location) or not zipfile.is_zipfile(location): - self._zipFiles[location] = None - continue - zip = zipfile.ZipFile(location) - for archiveName in zip.namelist(): - baseName, ext = os.path.splitext(archiveName) - if ext not in ('.pyc', '.pyo'): - continue - moduleName = ".".join(baseName.split("/")) - if moduleName in self._zipFileEntries: - continue - self._zipFileEntries[moduleName] = (zip, archiveName) - self._zipFiles[location] = None - info = self._zipFileEntries.get(name) - if info is not None: - zip, archiveName = info - fp = zip.read(archiveName) - info = (".pyc", "rb", imp.PY_COMPILED) - return fp, os.path.join(zip.filename, archiveName), info - raise - - def _GetParentByName(self, name): - """Return the parent module given the name of a module.""" - pos = name.rfind(".") - if pos > 0: - parentName = name[:pos] - return self._modules[parentName] - - def _ImportAllSubModules(self, module, deferredImports, recursive = True): - """Import all sub modules to the given package.""" - suffixes = dict.fromkeys([s[0] for s in imp.get_suffixes()]) - for dir in module.path: - try: - fileNames = os.listdir(dir) - except os.error: - continue - for fileName in fileNames: - name, ext = os.path.splitext(fileName) - if ext not in suffixes: - continue - if name == "__init__": - continue - subModuleName = "%s.%s" % (module.name, name) - subModule, returnError = \ - self._InternalImportModule(subModuleName, - deferredImports) - if returnError and subModule is None: - raise ImportError, "No module named %s" % subModuleName - module.globalNames[name] = None - if subModule.path and recursive: - self._ImportAllSubModules(subModule, deferredImports, - recursive) - - def _ImportDeferredImports(self, deferredImports): - """Import any sub modules that were deferred, if applicable.""" - while deferredImports: - newDeferredImports = [] - for packageModule, subModuleNames in deferredImports: - self._EnsureFromList(packageModule, packageModule, - subModuleNames, newDeferredImports) - deferredImports = newDeferredImports - - def _ImportModule(self, name, deferredImports, caller = None, - relativeImportIndex = 0): - """Attempt to find the named module and return it or None if no module - by that name could be found.""" - - # absolute import (available in Python 2.5 and up) - # the name given is the only name that will be searched - if relativeImportIndex == 0: - module, returnError = self._InternalImportModule(name, - deferredImports) - - # old style relative import (only possibility in Python 2.4 and prior) - # the name given is tried in all parents until a match is found and if - # no match is found, the global namespace is searched - elif relativeImportIndex < 0: - parent = self._DetermineParent(caller) - while parent is not None: - fullName = "%s.%s" % (parent.name, name) - module, returnError = self._InternalImportModule(fullName, - deferredImports) - if module is not None: - parent.globalNames[name] = None - return module - parent = self._GetParentByName(parent.name) - module, returnError = self._InternalImportModule(name, - deferredImports) - - # new style relative import (available in Python 2.5 and up) - # the index indicates how many levels to traverse and only that level - # is searched for the named module - elif relativeImportIndex > 0: - parent = caller - if parent.path is not None: - relativeImportIndex -= 1 - while parent is not None and relativeImportIndex > 0: - parent = self._GetParentByName(parent.name) - relativeImportIndex -= 1 - if parent is None: - module = None - returnError = True - elif not name: - module = parent - else: - name = "%s.%s" % (parent.name, name) - module, returnError = self._InternalImportModule(name, - deferredImports) - - # if module not found, track that fact - if module is None: - if caller is None: - raise ImportError, "No module named %s" % name - self._RunHook("missing", name, caller) - if returnError and name not in caller.ignoreNames: - callers = self._badModules.setdefault(name, {}) - callers[caller.name] = None - - return module - - def _InternalImportModule(self, name, deferredImports): - """Internal method used for importing a module which assumes that the - name given is an absolute name. None is returned if the module - cannot be found.""" - try: - return self._modules[name], False - except KeyError: - pass - if name in self._builtinModules: - module = self._AddModule(name) - self._RunHook("load", module.name, module) - return module, False - pos = name.rfind(".") - if pos < 0: - path = self.path - searchName = name - parentModule = None - else: - parentName = name[:pos] - parentModule, returnError = \ - self._InternalImportModule(parentName, deferredImports) - if parentModule is None: - return None, returnError - path = parentModule.path - searchName = name[pos + 1:] - if name in self.aliases: - actualName = self.aliases[name] - module, returnError = \ - self._InternalImportModule(actualName, deferredImports) - self._modules[name] = module - return module, returnError - try: - fp, path, info = self._FindModule(searchName, path) - except ImportError: - self._modules[name] = None - return None, True - module = self._LoadModule(name, fp, path, info, deferredImports, - parentModule) - return module, False - - def _LoadModule(self, name, fp, path, info, deferredImports, - parent = None): - """Load the module, given the information acquired by the finder.""" - suffix, mode, type = info - if type == imp.PKG_DIRECTORY: - return self._LoadPackage(name, path, parent, deferredImports) - module = self._AddModule(name) - module.file = path - module.parent = parent - if type == imp.PY_SOURCE: - module.code = compile(fp.read() + "\n", path, "exec") - elif type == imp.PY_COMPILED: - if isinstance(fp, str): - magic = fp[:4] - else: - magic = fp.read(4) - if magic != imp.get_magic(): - raise ImportError, "Bad magic number in %s" % path - if isinstance(fp, str): - module.code = marshal.loads(fp[8:]) - module.inZipFile = True - else: - fp.read(4) - module.code = marshal.load(fp) - self._RunHook("load", module.name, module) - if module.code is not None: - if self.replacePaths: - topLevelModule = module - while topLevelModule.parent is not None: - topLevelModule = topLevelModule.parent - module.code = self._ReplacePathsInCode(topLevelModule, - module.code) - self._ScanCode(module.code, module, deferredImports) - return module - - def _LoadPackage(self, name, path, parent, deferredImports): - """Load the package, given its name and path.""" - module = self._AddModule(name) - module.path = [path] - fp, path, info = imp.find_module("__init__", module.path) - self._LoadModule(name, fp, path, info, deferredImports, parent) - return module - - def _ReplacePathsInCode(self, topLevelModule, co): - """Replace paths in the code as directed, returning a new code object - with the modified paths in place.""" - origFileName = newFileName = os.path.normpath(co.co_filename) - for searchValue, replaceValue in self.replacePaths: - if searchValue == "*": - searchValue = os.path.dirname(topLevelModule.file) - if topLevelModule.path: - searchValue = os.path.dirname(searchValue) - if searchValue: - searchValue = searchValue + os.pathsep - elif not origFileName.startswith(searchValue): - continue - newFileName = replaceValue + origFileName[len(searchValue):] - break - constants = list(co.co_consts) - for i, value in enumerate(constants): - if isinstance(value, type(co)): - constants[i] = self._ReplacePathsInCode(topLevelModule, value) - return new.code(co.co_argcount, co.co_nlocals, co.co_stacksize, - co.co_flags, co.co_code, tuple(constants), co.co_names, - co.co_varnames, newFileName, co.co_name, co.co_firstlineno, - co.co_lnotab, co.co_freevars, co.co_cellvars) - - def _RunHook(self, hookName, moduleName, *args): - """Run hook for the given module if one is present.""" - name = "%s_%s" % (hookName, moduleName.replace(".", "_")) - method = getattr(cx_Freeze.hooks, name, None) - if method is not None: - method(self, *args) - - def _ScanCode(self, co, module, deferredImports): - """Scan code, looking for imported modules and keeping track of the - constants that have been created in order to better tell which - modules are truly missing.""" - opIndex = 0 - arguments = [] - code = co.co_code - numOps = len(code) - while opIndex < numOps: - op = ord(code[opIndex]) - opIndex += 1 - if op >= dis.HAVE_ARGUMENT: - opArg = ord(code[opIndex]) + ord(code[opIndex + 1]) * 256 - opIndex += 2 - if op == LOAD_CONST: - arguments.append(co.co_consts[opArg]) - elif op == IMPORT_NAME: - name = co.co_names[opArg] - if len(arguments) == 2: - relativeImportIndex, fromList = arguments - else: - relativeImportIndex = -1 - fromList, = arguments - if name not in module.excludeNames: - subModule = self._ImportModule(name, deferredImports, - module, relativeImportIndex) - if subModule is not None: - module.globalNames.update(subModule.globalNames) - if fromList and subModule.path is not None: - self._EnsureFromList(module, subModule, fromList, - deferredImports) - elif op == IMPORT_FROM: - opIndex += 3 - elif op not in (BUILD_LIST, INPLACE_ADD): - if op in STORE_OPS: - name = co.co_names[opArg] - if name == "__all__": - module.allNames.extend(arguments) - module.globalNames[name] = None - arguments = [] - for constant in co.co_consts: - if isinstance(constant, type(co)): - self._ScanCode(constant, module, deferredImports) - - def AddAlias(self, name, aliasFor): - """Add an alias for a particular module; when an attempt is made to - import a module using the alias name, import the actual name - instead.""" - self.aliases[name] = aliasFor - - def ExcludeModule(self, name): - """Exclude the named module from the resulting frozen executable.""" - self.excludes[name] = None - self._modules[name] = None - - def IncludeFile(self, path, moduleName = None): - """Include the named file as a module in the frozen executable.""" - name, ext = os.path.splitext(os.path.basename(path)) - if moduleName is None: - moduleName = name - info = (ext, "r", imp.PY_SOURCE) - deferredImports = [] - module = self._LoadModule(moduleName, file(path, "U"), path, info, - deferredImports) - self._ImportDeferredImports(deferredImports) - return module - - def IncludeFiles(self, sourcePath, targetPath): - """Include the files in the given directory in the target build.""" - self.includeFiles.append((sourcePath, targetPath)) - - def IncludeModule(self, name): - """Include the named module in the frozen executable.""" - deferredImports = [] - module = self._ImportModule(name, deferredImports) - self._ImportDeferredImports(deferredImports) - return module - - def IncludePackage(self, name): - """Include the named package and any submodules in the frozen - executable.""" - deferredImports = [] - module = self._ImportModule(name, deferredImports) - if module.path: - self._ImportAllSubModules(module, deferredImports) - self._ImportDeferredImports(deferredImports) - return module - - def ReportMissingModules(self): - if self._badModules: - print "Missing modules:" - names = self._badModules.keys() - names.sort() - for name in names: - callers = self._badModules[name].keys() - callers.sort() - print "?", name, "imported from", ", ".join(callers) - print - - -class Module(object): - - def __init__(self, name): - self.name = name - self.file = None - self.path = None - self.code = None - self.parent = None - self.globalNames = {} - self.excludeNames = {} - self.ignoreNames = {} - self.allNames = [] - self.inZipFile = False - - def __repr__(self): - parts = ["name=%s" % repr(self.name)] - if self.file is not None: - parts.append("file=%s" % repr(self.file)) - if self.path is not None: - parts.append("path=%s" % repr(self.path)) - return "<Module %s>" % ", ".join(parts) - - def AddGlobalName(self, name): - self.globalNames[name] = None - - def ExcludeName(self, name): - self.excludeNames[name] = None - - def IgnoreName(self, name): - self.ignoreNames[name] = None - diff --git a/setup/installer/cx_Freeze/cx_Freeze/freezer.py b/setup/installer/cx_Freeze/cx_Freeze/freezer.py deleted file mode 100644 index e0739e8a4e..0000000000 --- a/setup/installer/cx_Freeze/cx_Freeze/freezer.py +++ /dev/null @@ -1,550 +0,0 @@ -""" -Base class for freezing scripts into executables. -""" - -import datetime -import distutils.sysconfig -import imp -import marshal -import os -import shutil -import socket -import stat -import struct -import sys -import time -import zipfile - -import cx_Freeze -import cx_Freeze.util - -__all__ = [ "ConfigError", "ConstantsModule", "Executable", "Freezer" ] - -if sys.platform == "win32": - pythonDll = "python%s%s.dll" % sys.version_info[:2] - GLOBAL_BIN_PATH_EXCLUDES = [cx_Freeze.util.GetSystemDir()] - GLOBAL_BIN_INCLUDES = [ - pythonDll, - "gdiplus.dll", - "mfc71.dll", - "msvcp71.dll", - "msvcr71.dll" - ] - GLOBAL_BIN_EXCLUDES = [ - "comctl32.dll", - "oci.dll", - "cx_Logging.pyd" - ] -else: - extension = distutils.sysconfig.get_config_var("SO") - pythonSharedLib = "libpython%s.%s%s" % \ - (sys.version_info[:2] + (extension,)) - GLOBAL_BIN_INCLUDES = [pythonSharedLib] - GLOBAL_BIN_EXCLUDES = [ - "libclntsh.so", - "libwtc9.so" - ] - GLOBAL_BIN_PATH_EXCLUDES = ["/lib", "/lib32", "/lib64", "/usr/lib", - "/usr/lib32", "/usr/lib64"] - - -# NOTE: the try: except: block in this code is not necessary under Python 2.4 -# and higher and can be removed once support for Python 2.3 is no longer needed -EXTENSION_LOADER_SOURCE = \ -""" -import imp, os, sys - -found = False -for p in sys.path: - if not os.path.isdir(p): - continue - f = os.path.join(p, "%s") - if not os.path.exists(f): - continue - try: - m = imp.load_dynamic(__name__, f) - except ImportError: - del sys.modules[__name__] - raise - sys.modules[__name__] = m - found = True - break -if not found: - del sys.modules[__name__] - raise ImportError, "No module named %%s" %% __name__ -""" - - -class Freezer(object): - - def __init__(self, executables, constantsModules = [], includes = [], - excludes = [], packages = [], replacePaths = [], compress = None, - optimizeFlag = 0, copyDependentFiles = None, initScript = None, - base = None, path = None, createLibraryZip = None, - appendScriptToExe = None, appendScriptToLibrary = None, - targetDir = None, binIncludes = [], binExcludes = [], - binPathIncludes = [], binPathExcludes = [], icon = None, - includeFiles = []): - self.executables = executables - self.constantsModules = constantsModules - self.includes = includes - self.excludes = excludes - self.packages = packages - self.replacePaths = replacePaths - self.compress = compress - self.optimizeFlag = optimizeFlag - self.copyDependentFiles = copyDependentFiles - self.initScript = initScript - self.base = base - self.path = path - self.createLibraryZip = createLibraryZip - self.appendScriptToExe = appendScriptToExe - self.appendScriptToLibrary = appendScriptToLibrary - self.targetDir = targetDir - self.binIncludes = [os.path.normcase(n) \ - for n in GLOBAL_BIN_INCLUDES + binIncludes] - self.binExcludes = [os.path.normcase(n) \ - for n in GLOBAL_BIN_EXCLUDES + binExcludes] - self.binPathIncludes = [os.path.normcase(n) for n in binPathIncludes] - self.binPathExcludes = [os.path.normcase(n) \ - for n in GLOBAL_BIN_PATH_EXCLUDES + binPathExcludes] - self.icon = icon - self.includeFiles = includeFiles - self._VerifyConfiguration() - - def _CopyFile(self, source, target, copyDependentFiles, - includeMode = False): - normalizedSource = os.path.normcase(os.path.normpath(source)) - normalizedTarget = os.path.normcase(os.path.normpath(target)) - if normalizedTarget in self.filesCopied: - return - if normalizedSource == normalizedTarget: - return - self._RemoveFile(target) - targetDir = os.path.dirname(target) - self._CreateDirectory(targetDir) - print "copying", source, "->", target - shutil.copyfile(source, target) - if includeMode: - shutil.copymode(source, target) - self.filesCopied[normalizedTarget] = None - if copyDependentFiles: - for source in self._GetDependentFiles(source): - target = os.path.join(targetDir, os.path.basename(source)) - self._CopyFile(source, target, copyDependentFiles) - - def _CreateDirectory(self, path): - if not os.path.isdir(path): - print "creating directory", path - os.makedirs(path) - - def _FreezeExecutable(self, exe): - if self.createLibraryZip: - finder = self.finder - else: - finder = self._GetModuleFinder(exe) - if exe.script is None: - scriptModule = None - else: - scriptModule = finder.IncludeFile(exe.script, exe.moduleName) - self._CopyFile(exe.base, exe.targetName, exe.copyDependentFiles, - includeMode = True) - if exe.icon is not None: - if sys.platform == "win32": - cx_Freeze.util.AddIcon(exe.targetName, exe.icon) - else: - targetName = os.path.join(os.path.dirname(exe.targetName), - os.path.basename(exe.icon)) - self._CopyFile(exe.icon, targetName, - copyDependentFiles = False) - if not os.access(exe.targetName, os.W_OK): - mode = os.stat(exe.targetName).st_mode - os.chmod(exe.targetName, mode | stat.S_IWUSR) - if not exe.appendScriptToLibrary: - if exe.appendScriptToExe: - fileName = exe.targetName - else: - baseFileName, ext = os.path.splitext(exe.targetName) - fileName = baseFileName + ".zip" - self._RemoveFile(fileName) - if not self.createLibraryZip and exe.copyDependentFiles: - scriptModule = None - self._WriteModules(fileName, exe.initScript, finder, exe.compress, - exe.copyDependentFiles, scriptModule) - - def _GetBaseFileName(self, argsSource = None): - if argsSource is None: - argsSource = self - name = argsSource.base - if name is None: - if argsSource.copyDependentFiles: - name = "Console" - else: - name = "ConsoleKeepPath" - argsSource.base = self._GetFileName("bases", name) - if argsSource.base is None: - raise ConfigError("no base named %s", name) - - def _GetDependentFiles(self, path): - dependentFiles = self.dependentFiles.get(path) - if dependentFiles is None: - if sys.platform == "win32": - origPath = os.environ["PATH"] - os.environ["PATH"] = origPath + os.pathsep + \ - os.pathsep.join(sys.path) - dependentFiles = cx_Freeze.util.GetDependentFiles(path) - os.environ["PATH"] = origPath - else: - dependentFiles = [] - for line in os.popen('ldd "%s"' % path): - parts = line.strip().split(" => ") - if len(parts) != 2: - continue - dependentFile = parts[1] - if dependentFile == "not found": - print "WARNING: cannot find", parts[0] - continue - pos = dependentFile.find(" (") - if pos >= 0: - dependentFile = dependentFile[:pos].strip() - if dependentFile: - dependentFiles.append(dependentFile) - dependentFiles = self.dependentFiles[path] = \ - [f for f in dependentFiles if self._ShouldCopyFile(f)] - return dependentFiles - - def _GetFileName(self, dir, name): - if os.path.isabs(name): - return name - name = os.path.normcase(name) - fullDir = os.path.join(os.path.dirname(cx_Freeze.__file__), dir) - if os.path.isdir(fullDir): - for fileName in os.listdir(fullDir): - if name == os.path.splitext(os.path.normcase(fileName))[0]: - return os.path.join(fullDir, fileName) - - def _GetInitScriptFileName(self, argsSource = None): - if argsSource is None: - argsSource = self - name = argsSource.initScript - if name is None: - if argsSource.copyDependentFiles: - name = "Console" - else: - name = "ConsoleKeepPath" - argsSource.initScript = self._GetFileName("initscripts", name) - if argsSource.initScript is None: - raise ConfigError("no initscript named %s", name) - - def _GetModuleFinder(self, argsSource = None): - if argsSource is None: - argsSource = self - finder = cx_Freeze.ModuleFinder(self.includeFiles, argsSource.excludes, - argsSource.path, argsSource.replacePaths) - if argsSource.copyDependentFiles: - finder.IncludeModule("imp") - finder.IncludeModule("os") - finder.IncludeModule("sys") - if argsSource.compress: - finder.IncludeModule("zlib") - for name in argsSource.includes: - finder.IncludeModule(name) - for name in argsSource.packages: - finder.IncludePackage(name) - return finder - - def _PrintReport(self, fileName, modules): - print "writing zip file", fileName - print - print " %-25s %s" % ("Name", "File") - print " %-25s %s" % ("----", "----") - for module in modules: - if module.path: - print "P", - else: - print "m", - print "%-25s" % module.name, module.file or "" - print - - def _RemoveFile(self, path): - if os.path.exists(path): - os.chmod(path, 0777) - os.remove(path) - - def _ShouldCopyFile(self, path): - dir, name = os.path.split(os.path.normcase(path)) - parts = name.split(".") - tweaked = False - while True: - if not parts[-1].isdigit(): - break - parts.pop(-1) - tweaked = True - if tweaked: - name = ".".join(parts) - if name in self.binIncludes: - return True - if name in self.binExcludes: - return False - for path in self.binPathIncludes: - if dir.startswith(path): - return True - for path in self.binPathExcludes: - if dir.startswith(path): - return False - return True - - def _VerifyCanAppendToLibrary(self): - if not self.createLibraryZip: - raise ConfigError("script cannot be appended to library zip if " - "one is not being created") - - def _VerifyConfiguration(self): - if self.compress is None: - self.compress = True - if self.copyDependentFiles is None: - self.copyDependentFiles = True - if self.createLibraryZip is None: - self.createLibraryZip = True - if self.appendScriptToExe is None: - self.appendScriptToExe = False - if self.appendScriptToLibrary is None: - self.appendScriptToLibrary = \ - self.createLibraryZip and not self.appendScriptToExe - if self.targetDir is None: - self.targetDir = os.path.abspath("dist") - self._GetInitScriptFileName() - self._GetBaseFileName() - if self.path is None: - self.path = sys.path - if self.appendScriptToLibrary: - self._VerifyCanAppendToLibrary() - for sourceFileName, targetFileName in self.includeFiles: - if not os.path.exists(sourceFileName): - raise ConfigError("cannot find file/directory named %s", - sourceFileName) - if os.path.isabs(targetFileName): - raise ConfigError("target file/directory cannot be absolute") - for executable in self.executables: - executable._VerifyConfiguration(self) - - def _WriteModules(self, fileName, initScript, finder, compress, - copyDependentFiles, scriptModule = None): - initModule = finder.IncludeFile(initScript, "cx_Freeze__init__") - if scriptModule is None: - for module in self.constantsModules: - module.Create(finder) - modules = [m for m in finder.modules \ - if m.name not in self.excludeModules] - else: - modules = [initModule, scriptModule] - self.excludeModules[initModule.name] = None - self.excludeModules[scriptModule.name] = None - itemsToSort = [(m.name, m) for m in modules] - itemsToSort.sort() - modules = [m for n, m in itemsToSort] - self._PrintReport(fileName, modules) - if scriptModule is None: - finder.ReportMissingModules() - targetDir = os.path.dirname(fileName) - self._CreateDirectory(targetDir) - filesToCopy = [] - if os.path.exists(fileName): - mode = "a" - else: - mode = "w" - outFile = zipfile.PyZipFile(fileName, mode, zipfile.ZIP_DEFLATED) - for module in modules: - if module.code is None and module.file is not None: - fileName = os.path.basename(module.file) - baseFileName, ext = os.path.splitext(fileName) - if baseFileName != module.name and module.name != "zlib": - if "." in module.name: - fileName = module.name + ext - generatedFileName = "ExtensionLoader_%s.py" % \ - module.name.replace(".", "_") - module.code = compile(EXTENSION_LOADER_SOURCE % fileName, - generatedFileName, "exec") - target = os.path.join(targetDir, fileName) - filesToCopy.append((module, target)) - if module.code is None: - continue - fileName = "/".join(module.name.split(".")) - if module.path: - fileName += "/__init__" - if module.file is not None and os.path.exists(module.file): - mtime = os.stat(module.file).st_mtime - else: - mtime = time.time() - zipTime = time.localtime(mtime)[:6] - data = imp.get_magic() + struct.pack("<i", mtime) + \ - marshal.dumps(module.code) - zinfo = zipfile.ZipInfo(fileName + ".pyc", zipTime) - if compress: - zinfo.compress_type = zipfile.ZIP_DEFLATED - outFile.writestr(zinfo, data) - origPath = os.environ["PATH"] - for module, target in filesToCopy: - try: - if module.parent is not None: - path = os.pathsep.join([origPath] + module.parent.path) - os.environ["PATH"] = path - self._CopyFile(module.file, target, copyDependentFiles) - finally: - os.environ["PATH"] = origPath - - def Freeze(self): - self.finder = None - self.excludeModules = {} - self.dependentFiles = {} - self.filesCopied = {} - cx_Freeze.util.SetOptimizeFlag(self.optimizeFlag) - if self.createLibraryZip: - self.finder = self._GetModuleFinder() - for executable in self.executables: - self._FreezeExecutable(executable) - if self.createLibraryZip: - fileName = os.path.join(self.targetDir, "library.zip") - self._RemoveFile(fileName) - self._WriteModules(fileName, self.initScript, self.finder, - self.compress, self.copyDependentFiles) - for sourceFileName, targetFileName in self.includeFiles: - fullName = os.path.join(self.targetDir, targetFileName) - if os.path.isdir(sourceFileName): - for path, dirNames, fileNames in os.walk(sourceFileName): - shortPath = path[len(sourceFileName) + 1:] - if ".svn" in dirNames: - dirNames.remove(".svn") - if "CVS" in dirNames: - dirNames.remove("CVS") - for fileName in fileNames: - fullSourceName = os.path.join(path, fileName) - fullTargetName = os.path.join(self.targetDir, - targetFileName, shortPath, fileName) - self._CopyFile(fullSourceName, fullTargetName, - copyDependentFiles = False) - else: - self._CopyFile(sourceFileName, fullName, - copyDependentFiles = False) - - -class ConfigError(Exception): - - def __init__(self, format, *args): - self.what = format % args - - def __str__(self): - return self.what - - -class Executable(object): - - def __init__(self, script, initScript = None, base = None, path = None, - targetDir = None, targetName = None, includes = None, - excludes = None, packages = None, replacePaths = None, - compress = None, copyDependentFiles = None, - appendScriptToExe = None, appendScriptToLibrary = None, - icon = None): - self.script = script - self.initScript = initScript - self.base = base - self.path = path - self.targetDir = targetDir - self.targetName = targetName - self.includes = includes - self.excludes = excludes - self.packages = packages - self.replacePaths = replacePaths - self.compress = compress - self.copyDependentFiles = copyDependentFiles - self.appendScriptToExe = appendScriptToExe - self.appendScriptToLibrary = appendScriptToLibrary - self.icon = icon - - def __repr__(self): - return "<Executable script=%s>" % self.script - - def _VerifyConfiguration(self, freezer): - if self.path is None: - self.path = freezer.path - if self.targetDir is None: - self.targetDir = freezer.targetDir - if self.includes is None: - self.includes = freezer.includes - if self.excludes is None: - self.excludes = freezer.excludes - if self.packages is None: - self.packages = freezer.packages - if self.replacePaths is None: - self.replacePaths = freezer.replacePaths - if self.compress is None: - self.compress = freezer.compress - if self.copyDependentFiles is None: - self.copyDependentFiles = freezer.copyDependentFiles - if self.appendScriptToExe is None: - self.appendScriptToExe = freezer.appendScriptToExe - if self.appendScriptToLibrary is None: - self.appendScriptToLibrary = freezer.appendScriptToLibrary - if self.initScript is None: - self.initScript = freezer.initScript - else: - freezer._GetInitScriptFileName(self) - if self.base is None: - self.base = freezer.base - else: - freezer._GetBaseFileName(self) - if self.appendScriptToLibrary: - freezer._VerifyCanAppendToLibrary() - if self.icon is None: - self.icon = freezer.icon - if self.script is not None: - name, ext = os.path.splitext(os.path.basename(self.script)) - if self.appendScriptToLibrary: - self.moduleName = "%s__main__" % os.path.normcase(name) - else: - self.moduleName = "__main__" - if self.targetName is None: - baseName, ext = os.path.splitext(self.base) - self.targetName = name + ext - self.targetName = os.path.join(self.targetDir, self.targetName) - - -class ConstantsModule(object): - - def __init__(self, releaseString = None, copyright = None, - moduleName = "BUILD_CONSTANTS", timeFormat = "%B %d, %Y %H:%M:%S"): - self.moduleName = moduleName - self.timeFormat = timeFormat - self.values = {} - self.values["BUILD_RELEASE_STRING"] = releaseString - self.values["BUILD_COPYRIGHT"] = copyright - - def Create(self, finder): - """Create the module which consists of declaration statements for each - of the values.""" - today = datetime.datetime.today() - sourceTimestamp = 0 - for module in finder.modules: - if module.file is None: - continue - if module.inZipFile: - continue - if not os.path.exists(module.file): - raise ConfigError("no file named %s", module.file) - timestamp = os.stat(module.file).st_mtime - sourceTimestamp = max(sourceTimestamp, timestamp) - sourceTimestamp = datetime.datetime.fromtimestamp(sourceTimestamp) - self.values["BUILD_TIMESTAMP"] = today.strftime(self.timeFormat) - self.values["BUILD_HOST"] = socket.gethostname().split(".")[0] - self.values["SOURCE_TIMESTAMP"] = \ - sourceTimestamp.strftime(self.timeFormat) - module = finder._AddModule(self.moduleName) - sourceParts = [] - names = self.values.keys() - names.sort() - for name in names: - value = self.values[name] - sourceParts.append("%s = %r" % (name, value)) - source = "\n".join(sourceParts) - module.code = compile(source, "%s.py" % self.moduleName, "exec") - diff --git a/setup/installer/cx_Freeze/cx_Freeze/hooks.py b/setup/installer/cx_Freeze/cx_Freeze/hooks.py deleted file mode 100644 index edc2f78788..0000000000 --- a/setup/installer/cx_Freeze/cx_Freeze/hooks.py +++ /dev/null @@ -1,281 +0,0 @@ -import os -import sys - -def initialize(finder): - """upon initialization of the finder, this routine is called to set up some - automatic exclusions for various platforms.""" - finder.ExcludeModule("FCNTL") - finder.ExcludeModule("os.path") - if os.name == "nt": - finder.ExcludeModule("fcntl") - finder.ExcludeModule("grp") - finder.ExcludeModule("pwd") - finder.ExcludeModule("termios") - else: - finder.ExcludeModule("_winreg") - finder.ExcludeModule("msilib") - finder.ExcludeModule("msvcrt") - finder.ExcludeModule("nt") - if os.name not in ("os2", "ce"): - finder.ExcludeModule("ntpath") - finder.ExcludeModule("nturl2path") - finder.ExcludeModule("pythoncom") - finder.ExcludeModule("pywintypes") - finder.ExcludeModule("winerror") - finder.ExcludeModule("winsound") - finder.ExcludeModule("win32api") - finder.ExcludeModule("win32con") - finder.ExcludeModule("win32event") - finder.ExcludeModule("win32file") - finder.ExcludeModule("win32pdh") - finder.ExcludeModule("win32pipe") - finder.ExcludeModule("win32process") - finder.ExcludeModule("win32security") - finder.ExcludeModule("win32service") - finder.ExcludeModule("wx.activex") - if os.name != "posix": - finder.ExcludeModule("posix") - if os.name != "mac": - finder.ExcludeModule("Carbon") - finder.ExcludeModule("gestalt") - finder.ExcludeModule("ic") - finder.ExcludeModule("mac") - finder.ExcludeModule("MacOS") - finder.ExcludeModule("macpath") - finder.ExcludeModule("macurl2path") - if os.name != "nt": - finder.ExcludeModule("EasyDialogs") - if os.name != "os2": - finder.ExcludeModule("os2") - finder.ExcludeModule("os2emxpath") - finder.ExcludeModule("_emx_link") - if os.name != "ce": - finder.ExcludeModule("ce") - if os.name != "riscos": - finder.ExcludeModule("riscos") - finder.ExcludeModule("riscosenviron") - finder.ExcludeModule("riscospath") - finder.ExcludeModule("rourl2path") - if sys.platform[:4] != "java": - finder.ExcludeModule("java.lang") - finder.ExcludeModule("org.python.core") - - -def load_cElementTree(finder, module): - """the cElementTree module implicitly loads the elementtree.ElementTree - module; make sure this happens.""" - finder.IncludeModule("elementtree.ElementTree") - - -def load_ceODBC(finder, module): - """the ceODBC module implicitly imports both datetime and decimal; make - sure this happens.""" - finder.IncludeModule("datetime") - finder.IncludeModule("decimal") - - -def load_cx_Oracle(finder, module): - """the cx_Oracle module implicitly imports datetime; make sure this - happens.""" - finder.IncludeModule("datetime") - - -def load_docutils_frontend(finder, module): - """The optik module is the old name for the optparse module; ignore the - module if it cannot be found.""" - module.IgnoreName("optik") - - -def load_dummy_threading(finder, module): - """the dummy_threading module plays games with the name of the threading - module for its own purposes; ignore that here""" - finder.ExcludeModule("_dummy_threading") - - -def load_email(finder, module): - """the email package has a bunch of aliases as the submodule names were - all changed to lowercase in Python 2.5; mimic that here.""" - if sys.version_info[:2] >= (2, 5): - for name in ("Charset", "Encoders", "Errors", "FeedParser", - "Generator", "Header", "Iterators", "Message", "Parser", - "Utils", "base64MIME", "quopriMIME"): - finder.AddAlias("email.%s" % name, "email.%s" % name.lower()) - - -def load_ftplib(finder, module): - """the ftplib module attempts to import the SOCKS module; ignore this - module if it cannot be found""" - module.IgnoreName("SOCKS") - - -def load_matplotlib(finder, module): - """the matplotlib module requires data to be found in mpl-data in the - same directory as the frozen executable so oblige it""" - dir = os.path.join(module.path[0], "mpl-data") - finder.IncludeFiles(dir, "mpl-data") - - -def load_matplotlib_numerix(finder, module): - """the numpy.numerix module loads a number of modules dynamically""" - for name in ("ma", "fft", "linear_algebra", "random_array", "mlab"): - finder.IncludeModule("%s.%s" % (module.name, name)) - - -def load_numpy_linalg(finder, module): - """the numpy.linalg module implicitly loads the lapack_lite module; make - sure this happens""" - finder.IncludeModule("numpy.linalg.lapack_lite") - - -def load_pty(finder, module): - """The sgi module is not needed for this module to function.""" - module.IgnoreName("sgi") - - -def load_pythoncom(finder, module): - """the pythoncom module is actually contained in a DLL but since those - cannot be loaded directly in Python 2.5 and higher a special module is - used to perform that task; simply use that technique directly to - determine the name of the DLL and ensure it is included as a normal - extension; also load the pywintypes module which is implicitly - loaded.""" - import pythoncom - module.file = pythoncom.__file__ - module.code = None - finder.IncludeModule("pywintypes") - - -def load_pywintypes(finder, module): - """the pywintypes module is actually contained in a DLL but since those - cannot be loaded directly in Python 2.5 and higher a special module is - used to perform that task; simply use that technique directly to - determine the name of the DLL and ensure it is included as a normal - extension.""" - import pywintypes - module.file = pywintypes.__file__ - module.code = None - - -def load_PyQt4_Qt(finder, module): - """the PyQt4.Qt module is an extension module which imports a number of - other modules and injects their namespace into its own. It seems a - foolish way of doing things but perhaps there is some hidden advantage - to this technique over pure Python; ignore the absence of some of - the modules since not every installation includes all of them.""" - finder.IncludeModule("PyQt4.QtCore") - finder.IncludeModule("PyQt4.QtGui") - finder.IncludeModule("sip") - for name in ("PyQt4.QtSvg", "PyQt4.Qsci", "PyQt4.QtAssistant", - "PyQt4.QtNetwork", "PyQt4.QtOpenGL", "PyQt4.QtScript", "PyQt4._qt", - "PyQt4.QtSql", "PyQt4.QtSvg", "PyQt4.QtTest", "PyQt4.QtXml"): - try: - finder.IncludeModule(name) - except ImportError: - pass - - -def load_Tkinter(finder, module): - """the Tkinter module has data files that are required to be loaded so - ensure that they are copied into the directory that is expected at - runtime.""" - import Tkinter - import _tkinter - tk = _tkinter.create() - tclDir = os.path.dirname(tk.call("info", "library")) - tclSourceDir = os.path.join(tclDir, "tcl%s" % _tkinter.TCL_VERSION) - tkSourceDir = os.path.join(tclDir, "tk%s" % _tkinter.TK_VERSION) - finder.IncludeFiles(tclSourceDir, "tcl") - finder.IncludeFiles(tkSourceDir, "tk") - - -def load_tempfile(finder, module): - """the tempfile module attempts to load the fcntl and thread modules but - continues if these modules cannot be found; ignore these modules if they - cannot be found.""" - module.IgnoreName("fcntl") - module.IgnoreName("thread") - - -def load_time(finder, module): - """the time module implicitly loads _strptime; make sure this happens.""" - finder.IncludeModule("_strptime") - - -def load_win32api(finder, module): - """the win32api module implicitly loads the pywintypes module; make sure - this happens.""" - finder.IncludeModule("pywintypes") - - -def load_win32com(finder, module): - """the win32com package manipulates its search path at runtime to include - the sibling directory called win32comext; simulate that by changing the - search path in a similar fashion here.""" - baseDir = os.path.dirname(os.path.dirname(module.file)) - module.path.append(os.path.join(baseDir, "win32comext")) - - -def load_win32file(finder, module): - """the win32api module implicitly loads the pywintypes module; make sure - this happens.""" - finder.IncludeModule("pywintypes") - - -def load_xml(finder, module): - """the builtin xml package attempts to load the _xmlplus module to see if - that module should take its role instead; ignore the failure to find - this module, though.""" - module.IgnoreName("_xmlplus") - - -def load_xml_etree_cElementTree(finder, module): - """the xml.etree.cElementTree module implicitly loads the - xml.etree.ElementTree module; make sure this happens.""" - finder.IncludeModule("xml.etree.ElementTree") - -def load_IPython(finder, module): - ipy = os.path.join(os.path.dirname(module.file), 'Extensions') - extensions = set([]) - for m in os.listdir(ipy): - extensions.add(os.path.splitext(m)[0]) - extensions.remove('__init__') - for m in extensions: - finder.IncludeModule('IPython.Extensions.'+m) - -def load_lxml(finder, module): - finder.IncludeModule('lxml._elementpath') - -def load_cherrypy(finder, module): - finder.IncludeModule('cherrypy.lib.encoding') - -def missing_cElementTree(finder, caller): - """the cElementTree has been incorporated into the standard library in - Python 2.5 so ignore its absence if it cannot found.""" - if sys.version_info[:2] >= (2, 5): - caller.IgnoreName("cElementTree") - - -def missing_EasyDialogs(finder, caller): - """the EasyDialogs module is not normally present on Windows but it also - may be so instead of excluding it completely, ignore it if it can't be - found""" - if sys.platform == "win32": - caller.IgnoreName("EasyDialogs") - - -def missing_readline(finder, caller): - """the readline module is not normally present on Windows but it also may - be so instead of excluding it completely, ignore it if it can't be - found""" - if sys.platform == "win32": - caller.IgnoreName("readline") - - -def missing_xml_etree(finder, caller): - """the xml.etree package is new for Python 2.5 but it is common practice - to use a try..except.. block in order to support versions earlier than - Python 2.5 transparently; ignore the absence of the package in this - situation.""" - if sys.version_info[:2] < (2, 5): - caller.IgnoreName("xml.etree") - diff --git a/setup/installer/cx_Freeze/cx_Freeze/main.py b/setup/installer/cx_Freeze/cx_Freeze/main.py deleted file mode 100644 index 1704c598d2..0000000000 --- a/setup/installer/cx_Freeze/cx_Freeze/main.py +++ /dev/null @@ -1,171 +0,0 @@ -import optparse -import os -import shutil -import stat -import sys - -import cx_Freeze - -__all__ = ["main"] - -USAGE = \ -""" -%prog [options] [SCRIPT] - -Freeze a Python script and all of its referenced modules to a base -executable which can then be distributed without requiring a Python -installation.""" - -VERSION = \ -""" -%%prog %s -Copyright (c) 2007-2008 Colt Engineering. All rights reserved. -Copyright (c) 2001-2006 Computronix Corporation. All rights reserved.""" % \ - cx_Freeze.version - - -def ParseCommandLine(): - parser = optparse.OptionParser(version = VERSION.strip(), - usage = USAGE.strip()) - parser.add_option("-O", - action = "count", - default = 0, - dest = "optimized", - help = "optimize generated bytecode as per PYTHONOPTIMIZE; " - "use -OO in order to remove doc strings") - parser.add_option("-c", "--compress", - action = "store_true", - dest = "compress", - help = "compress byte code in zip files") - parser.add_option("--base-name", - dest = "baseName", - metavar = "NAME", - help = "file on which to base the target file; if the name of the " - "file is not an absolute file name, the subdirectory bases " - "(rooted in the directory in which the freezer is found) " - "will be searched for a file matching the name") - parser.add_option("--init-script", - dest = "initScript", - metavar = "NAME", - help = "script which will be executed upon startup; if the name " - "of the file is not an absolute file name, the " - "subdirectory initscripts (rooted in the directory in " - "which the cx_Freeze package is found) will be searched " - "for a file matching the name") - parser.add_option("--target-dir", "--install-dir", - dest = "targetDir", - metavar = "DIR", - help = "the directory in which to place the target file and " - "any dependent files") - parser.add_option("--target-name", - dest = "targetName", - metavar = "NAME", - help = "the name of the file to create instead of the base name " - "of the script and the extension of the base binary") - parser.add_option("--no-copy-deps", - dest = "copyDeps", - default = True, - action = "store_false", - help = "do not copy the dependent files (extensions, shared " - "libraries, etc.) to the target directory; this also " - "modifies the default init script to ConsoleKeepPath.py " - "and means that the target executable requires a Python " - "installation to execute properly") - parser.add_option("--default-path", - action = "append", - dest = "defaultPath", - metavar = "DIRS", - help = "list of paths separated by the standard path separator " - "for the platform which will be used to initialize " - "sys.path prior to running the module finder") - parser.add_option("--include-path", - action = "append", - dest = "includePath", - metavar = "DIRS", - help = "list of paths separated by the standard path separator " - "for the platform which will be used to modify sys.path " - "prior to running the module finder") - parser.add_option("--replace-paths", - dest = "replacePaths", - metavar = "DIRECTIVES", - help = "replace all the paths in modules found in the given paths " - "with the given replacement string; multiple values are " - "separated by the standard path separator and each value " - "is of the form path=replacement_string; path can be * " - "which means all paths not already specified") - parser.add_option("--include-modules", - dest = "includeModules", - metavar = "NAMES", - help = "comma separated list of modules to include") - parser.add_option("--exclude-modules", - dest = "excludeModules", - metavar = "NAMES", - help = "comma separated list of modules to exclude") - parser.add_option("--ext-list-file", - dest = "extListFile", - metavar = "NAME", - help = "name of file in which to place the list of dependent files " - "which were copied into the target directory") - parser.add_option("-z", "--zip-include", - dest = "zipIncludes", - action = "append", - default = [], - metavar = "SPEC", - help = "name of file to add to the zip file or a specification of " - "the form name=arcname which will specify the archive name " - "to use; multiple --zip-include arguments can be used") - options, args = parser.parse_args() - if len(args) == 0: - options.script = None - elif len(args) == 1: - options.script, = args - else: - parser.error("only one script can be specified") - if not args and options.includeModules is None and options.copyDeps: - parser.error("script or a list of modules must be specified") - if not args and options.targetName is None: - parser.error("script or a target name must be specified") - if options.excludeModules: - options.excludeModules = options.excludeModules.split(",") - else: - options.excludeModules = [] - if options.includeModules: - options.includeModules = options.includeModules.split(",") - else: - options.includeModules = [] - replacePaths = [] - if options.replacePaths: - for directive in options.replacePaths.split(os.pathsep): - fromPath, replacement = directive.split("=") - replacePaths.append((fromPath, replacement)) - options.replacePaths = replacePaths - if options.defaultPath is not None: - sys.path = [p for mp in options.defaultPath \ - for p in mp.split(os.pathsep)] - if options.includePath is not None: - paths = [p for mp in options.includePath for p in mp.split(os.pathsep)] - sys.path = paths + sys.path - if options.script is not None: - sys.path.insert(0, os.path.dirname(options.script)) - return options - - -def main(): - options = ParseCommandLine() - executables = [cx_Freeze.Executable(options.script, - targetName = options.targetName)] - freezer = cx_Freeze.Freezer(executables, - includes = options.includeModules, - excludes = options.excludeModules, - replacePaths = options.replacePaths, - compress = options.compress, - optimizeFlag = options.optimized, - copyDependentFiles = options.copyDeps, - initScript = options.initScript, - base = options.baseName, - path = None, - createLibraryZip = False, - appendScriptToExe = True, - targetDir = options.targetDir) - freezer.Freeze() - diff --git a/setup/installer/cx_Freeze/cx_Freeze/windist.py b/setup/installer/cx_Freeze/cx_Freeze/windist.py deleted file mode 100644 index 51af544771..0000000000 --- a/setup/installer/cx_Freeze/cx_Freeze/windist.py +++ /dev/null @@ -1,337 +0,0 @@ -import distutils.command.bdist_msi -import msilib -import os - -__all__ = [ "bdist_msi" ] - -# force the remove existing products action to happen first since Windows -# installer appears to be braindead and doesn't handle files shared between -# different "products" very well -sequence = msilib.sequence.InstallExecuteSequence -for index, info in enumerate(sequence): - if info[0] == u'RemoveExistingProducts': - sequence[index] = (info[0], info[1], 1450) - - -class bdist_msi(distutils.command.bdist_msi.bdist_msi): - user_options = distutils.command.bdist_msi.bdist_msi.user_options + [ - ('add-to-path=', None, 'add target dir to PATH environment variable'), - ('upgrade-code=', None, 'upgrade code to use') - ] - x = y = 50 - width = 370 - height = 300 - title = "[ProductName] Setup" - modeless = 1 - modal = 3 - - def add_config(self, fullname): - initialTargetDir = self.get_initial_target_dir(fullname) - if self.add_to_path is None: - self.add_to_path = False - for executable in self.distribution.executables: - if os.path.basename(executable.base).startswith("Console"): - self.add_to_path = True - break - if self.add_to_path: - msilib.add_data(self.db, 'Environment', - [("E_PATH", "Path", r"[~];[TARGETDIR]", "TARGETDIR")]) - msilib.add_data(self.db, 'CustomAction', - [("InitialTargetDir", 256 + 51, "TARGETDIR", initialTargetDir) - ]) - msilib.add_data(self.db, 'InstallExecuteSequence', - [("InitialTargetDir", 'TARGETDIR=""', 401)]) - msilib.add_data(self.db, 'InstallUISequence', - [("PrepareDlg", None, 140), - ("InitialTargetDir", 'TARGETDIR=""', 401), - ("SelectDirectoryDlg", "not Installed", 1230), - ("MaintenanceTypeDlg", - "Installed and not Resume and not Preselected", 1250), - ("ProgressDlg", None, 1280) - ]) - - def add_cancel_dialog(self): - dialog = msilib.Dialog(self.db, "CancelDlg", 50, 10, 260, 85, 3, - self.title, "No", "No", "No") - dialog.text("Text", 48, 15, 194, 30, 3, - "Are you sure you want to cancel [ProductName] installation?") - button = dialog.pushbutton("Yes", 72, 57, 56, 17, 3, "Yes", "No") - button.event("EndDialog", "Exit") - button = dialog.pushbutton("No", 132, 57, 56, 17, 3, "No", "Yes") - button.event("EndDialog", "Return") - - def add_error_dialog(self): - dialog = msilib.Dialog(self.db, "ErrorDlg", 50, 10, 330, 101, 65543, - self.title, "ErrorText", None, None) - dialog.text("ErrorText", 50, 9, 280, 48, 3, "") - for text, x in [("No", 120), ("Yes", 240), ("Abort", 0), - ("Cancel", 42), ("Ignore", 81), ("Ok", 159), ("Retry", 198)]: - button = dialog.pushbutton(text[0], x, 72, 81, 21, 3, text, None) - button.event("EndDialog", "Error%s" % text) - - def add_exit_dialog(self): - dialog = distutils.command.bdist_msi.PyDialog(self.db, "ExitDialog", - self.x, self.y, self.width, self.height, self.modal, - self.title, "Finish", "Finish", "Finish") - dialog.title("Completing the [ProductName] installer") - dialog.back("< Back", "Finish", active = False) - dialog.cancel("Cancel", "Back", active = False) - dialog.text("Description", 15, 235, 320, 20, 0x30003, - "Click the Finish button to exit the installer.") - button = dialog.next("Finish", "Cancel", name = "Finish") - button.event("EndDialog", "Return") - - def add_fatal_error_dialog(self): - dialog = distutils.command.bdist_msi.PyDialog(self.db, "FatalError", - self.x, self.y, self.width, self.height, self.modal, - self.title, "Finish", "Finish", "Finish") - dialog.title("[ProductName] installer ended prematurely") - dialog.back("< Back", "Finish", active = False) - dialog.cancel("Cancel", "Back", active = False) - dialog.text("Description1", 15, 70, 320, 80, 0x30003, - "[ProductName] setup ended prematurely because of an error. " - "Your system has not been modified. To install this program " - "at a later time, please run the installation again.") - dialog.text("Description2", 15, 155, 320, 20, 0x30003, - "Click the Finish button to exit the installer.") - button = dialog.next("Finish", "Cancel", name = "Finish") - button.event("EndDialog", "Exit") - - def add_files_in_use_dialog(self): - dialog = distutils.command.bdist_msi.PyDialog(self.db, "FilesInUse", - self.x, self.y, self.width, self.height, 19, self.title, - "Retry", "Retry", "Retry", bitmap = False) - dialog.text("Title", 15, 6, 200, 15, 0x30003, - r"{\DlgFontBold8}Files in Use") - dialog.text("Description", 20, 23, 280, 20, 0x30003, - "Some files that need to be updated are currently in use.") - dialog.text("Text", 20, 55, 330, 50, 3, - "The following applications are using files that need to be " - "updated by this setup. Close these applications and then " - "click Retry to continue the installation or Cancel to exit " - "it.") - dialog.control("List", "ListBox", 20, 107, 330, 130, 7, - "FileInUseProcess", None, None, None) - button = dialog.back("Exit", "Ignore", name = "Exit") - button.event("EndDialog", "Exit") - button = dialog.next("Ignore", "Retry", name = "Ignore") - button.event("EndDialog", "Ignore") - button = dialog.cancel("Retry", "Exit", name = "Retry") - button.event("EndDialog", "Retry") - - def add_maintenance_type_dialog(self): - dialog = distutils.command.bdist_msi.PyDialog(self.db, - "MaintenanceTypeDlg", self.x, self.y, self.width, self.height, - self.modal, self.title, "Next", "Next", "Cancel") - dialog.title("Welcome to the [ProductName] Setup Wizard") - dialog.text("BodyText", 15, 63, 330, 42, 3, - "Select whether you want to repair or remove [ProductName].") - group = dialog.radiogroup("RepairRadioGroup", 15, 108, 330, 60, 3, - "MaintenanceForm_Action", "", "Next") - group.add("Repair", 0, 18, 300, 17, "&Repair [ProductName]") - group.add("Remove", 0, 36, 300, 17, "Re&move [ProductName]") - dialog.back("< Back", None, active = False) - button = dialog.next("Finish", "Cancel") - button.event("[REINSTALL]", "ALL", - 'MaintenanceForm_Action="Repair"', 5) - button.event("[Progress1]", "Repairing", - 'MaintenanceForm_Action="Repair"', 6) - button.event("[Progress2]", "repairs", - 'MaintenanceForm_Action="Repair"', 7) - button.event("Reinstall", "ALL", - 'MaintenanceForm_Action="Repair"', 8) - button.event("[REMOVE]", "ALL", - 'MaintenanceForm_Action="Remove"', 11) - button.event("[Progress1]", "Removing", - 'MaintenanceForm_Action="Remove"', 12) - button.event("[Progress2]", "removes", - 'MaintenanceForm_Action="Remove"', 13) - button.event("Remove", "ALL", - 'MaintenanceForm_Action="Remove"', 14) - button.event("EndDialog", "Return", - 'MaintenanceForm_Action<>"Change"', 20) - button = dialog.cancel("Cancel", "RepairRadioGroup") - button.event("SpawnDialog", "CancelDlg") - - def add_prepare_dialog(self): - dialog = distutils.command.bdist_msi.PyDialog(self.db, "PrepareDlg", - self.x, self.y, self.width, self.height, self.modeless, - self.title, "Cancel", "Cancel", "Cancel") - dialog.text("Description", 15, 70, 320, 40, 0x30003, - "Please wait while the installer prepares to guide you through" - "the installation.") - dialog.title("Welcome to the [ProductName] installer") - text = dialog.text("ActionText", 15, 110, 320, 20, 0x30003, - "Pondering...") - text.mapping("ActionText", "Text") - text = dialog.text("ActionData", 15, 135, 320, 30, 0x30003, None) - text.mapping("ActionData", "Text") - dialog.back("Back", None, active = False) - dialog.next("Next", None, active = False) - button = dialog.cancel("Cancel", None) - button.event("SpawnDialog", "CancelDlg") - - def add_progress_dialog(self): - dialog = distutils.command.bdist_msi.PyDialog(self.db, "ProgressDlg", - self.x, self.y, self.width, self.height, self.modeless, - self.title, "Cancel", "Cancel", "Cancel", bitmap = False) - dialog.text("Title", 20, 15, 200, 15, 0x30003, - r"{\DlgFontBold8}[Progress1] [ProductName]") - dialog.text("Text", 35, 65, 300, 30, 3, - "Please wait while the installer [Progress2] [ProductName].") - dialog.text("StatusLabel", 35, 100 ,35, 20, 3, "Status:") - text = dialog.text("ActionText", 70, 100, self.width - 70, 20, 3, - "Pondering...") - text.mapping("ActionText", "Text") - control = dialog.control("ProgressBar", "ProgressBar", 35, 120, 300, - 10, 65537, None, "Progress done", None, None) - control.mapping("SetProgress", "Progress") - dialog.back("< Back", "Next", active = False) - dialog.next("Next >", "Cancel", active = False) - button = dialog.cancel("Cancel", "Back") - button.event("SpawnDialog", "CancelDlg") - - def add_properties(self): - metadata = self.distribution.metadata - props = [ - ('DistVersion', metadata.get_version()), - ('DefaultUIFont', 'DlgFont8'), - ('ErrorDialog', 'ErrorDlg'), - ('Progress1', 'Install'), - ('Progress2', 'installs'), - ('MaintenanceForm_Action', 'Repair') - ] - email = metadata.author_email or metadata.maintainer_email - if email: - props.append(("ARPCONTACT", email)) - if metadata.url: - props.append(("ARPURLINFOABOUT", metadata.url)) - if self.upgrade_code is not None: - props.append(("UpgradeCode", self.upgrade_code)) - msilib.add_data(self.db, 'Property', props) - - def add_select_directory_dialog(self): - dialog = distutils.command.bdist_msi.PyDialog(self.db, - "SelectDirectoryDlg", self.x, self.y, self.width, self.height, - self.modal, self.title, "Next", "Next", "Cancel") - dialog.title("Select destination directory") - dialog.back("< Back", None, active = False) - button = dialog.next("Next >", "Cancel") - button.event("SetTargetPath", "TARGETDIR", ordering = 1) - button.event("SpawnWaitDialog", "WaitForCostingDlg", ordering = 2) - button.event("EndDialog", "Return", ordering = 3) - button = dialog.cancel("Cancel", "DirectoryCombo") - button.event("SpawnDialog", "CancelDlg") - dialog.control("DirectoryCombo", "DirectoryCombo", 15, 70, 272, 80, - 393219, "TARGETDIR", None, "DirectoryList", None) - dialog.control("DirectoryList", "DirectoryList", 15, 90, 308, 136, 3, - "TARGETDIR", None, "PathEdit", None) - dialog.control("PathEdit", "PathEdit", 15, 230, 306, 16, 3, - "TARGETDIR", None, "Next", None) - button = dialog.pushbutton("Up", 306, 70, 18, 18, 3, "Up", None) - button.event("DirectoryListUp", "0") - button = dialog.pushbutton("NewDir", 324, 70, 30, 18, 3, "New", None) - button.event("DirectoryListNew", "0") - - def add_text_styles(self): - msilib.add_data(self.db, 'TextStyle', - [("DlgFont8", "Tahoma", 9, None, 0), - ("DlgFontBold8", "Tahoma", 8, None, 1), - ("VerdanaBold10", "Verdana", 10, None, 1), - ("VerdanaRed9", "Verdana", 9, 255, 0) - ]) - - def add_ui(self): - self.add_text_styles() - self.add_error_dialog() - self.add_fatal_error_dialog() - self.add_cancel_dialog() - self.add_exit_dialog() - self.add_user_exit_dialog() - self.add_files_in_use_dialog() - self.add_wait_for_costing_dialog() - self.add_prepare_dialog() - self.add_select_directory_dialog() - self.add_progress_dialog() - self.add_maintenance_type_dialog() - - def add_upgrade_config(self, sversion): - if self.upgrade_code is not None: - msilib.add_data(self.db, 'Upgrade', - [(self.upgrade_code, None, sversion, None, 513, None, - "REMOVEOLDVERSION"), - (self.upgrade_code, sversion, None, None, 257, None, - "REMOVENEWVERSION") - ]) - - def add_user_exit_dialog(self): - dialog = distutils.command.bdist_msi.PyDialog(self.db, "UserExit", - self.x, self.y, self.width, self.height, self.modal, - self.title, "Finish", "Finish", "Finish") - dialog.title("[ProductName] installer was interrupted") - dialog.back("< Back", "Finish", active = False) - dialog.cancel("Cancel", "Back", active = False) - dialog.text("Description1", 15, 70, 320, 80, 0x30003, - "[ProductName] setup was interrupted. Your system has not " - "been modified. To install this program at a later time, " - "please run the installation again.") - dialog.text("Description2", 15, 155, 320, 20, 0x30003, - "Click the Finish button to exit the installer.") - button = dialog.next("Finish", "Cancel", name = "Finish") - button.event("EndDialog", "Exit") - - def add_wait_for_costing_dialog(self): - dialog = msilib.Dialog(self.db, "WaitForCostingDlg", 50, 10, 260, 85, - self.modal, self.title, "Return", "Return", "Return") - dialog.text("Text", 48, 15, 194, 30, 3, - "Please wait while the installer finishes determining your " - "disk space requirements.") - button = dialog.pushbutton("Return", 102, 57, 56, 17, 3, "Return", - None) - button.event("EndDialog", "Exit") - - def get_initial_target_dir(self, fullname): - return r"[ProgramFilesFolder]\%s" % fullname - - def get_installer_filename(self, fullname): - return os.path.join(self.dist_dir, "%s.msi" % fullname) - - def initialize_options(self): - distutils.command.bdist_msi.bdist_msi.initialize_options(self) - self.upgrade_code = None - self.add_to_path = None - - def run(self): - if not self.skip_build: - self.run_command('build') - install = self.reinitialize_command('install', reinit_subcommands = 1) - install.prefix = self.bdist_dir - install.skip_build = self.skip_build - install.warn_dir = 0 - distutils.log.info("installing to %s", self.bdist_dir) - install.ensure_finalized() - install.run() - self.mkpath(self.dist_dir) - fullname = self.distribution.get_fullname() - filename = os.path.abspath(self.get_installer_filename(fullname)) - if os.path.exists(filename): - os.unlink(filename) - metadata = self.distribution.metadata - author = metadata.author or metadata.maintainer or "UNKNOWN" - version = metadata.get_version() - sversion = "%d.%d.%d" % \ - distutils.version.StrictVersion(version).version - self.db = msilib.init_database(filename, msilib.schema, - self.distribution.metadata.name, msilib.gen_uuid(), sversion, - author) - msilib.add_tables(self.db, msilib.sequence) - self.add_properties() - self.add_config(fullname) - self.add_upgrade_config(sversion) - self.add_ui() - self.add_files() - self.db.Commit() - if not self.keep_temp: - distutils.dir_util.remove_tree(self.bdist_dir, - dry_run = self.dry_run) - diff --git a/setup/installer/cx_Freeze/cxfreeze b/setup/installer/cx_Freeze/cxfreeze deleted file mode 100755 index acd6789833..0000000000 --- a/setup/installer/cx_Freeze/cxfreeze +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/python - -from cx_Freeze import main - -main() - diff --git a/setup/installer/cx_Freeze/initscripts/Console.py b/setup/installer/cx_Freeze/initscripts/Console.py deleted file mode 100755 index e10649d722..0000000000 --- a/setup/installer/cx_Freeze/initscripts/Console.py +++ /dev/null @@ -1,35 +0,0 @@ -#------------------------------------------------------------------------------ -# Console.py -# Initialization script for cx_Freeze which manipulates the path so that the -# directory in which the executable is found is searched for extensions but -# no other directory is searched. It also sets the attribute sys.frozen so that -# the Win32 extensions behave as expected. -#------------------------------------------------------------------------------ - -import encodings -import os -import sys -import warnings -import zipimport - -sys.frozen = True -sys.path = sys.path[:4] - -os.environ["TCL_LIBRARY"] = os.path.join(DIR_NAME, "tcl") -os.environ["TK_LIBRARY"] = os.path.join(DIR_NAME, "tk") - -m = __import__("__main__") -importer = zipimport.zipimporter(INITSCRIPT_ZIP_FILE_NAME) -if INITSCRIPT_ZIP_FILE_NAME != SHARED_ZIP_FILE_NAME: - moduleName = m.__name__ -else: - name, ext = os.path.splitext(os.path.basename(os.path.normcase(FILE_NAME))) - moduleName = "%s__main__" % name -code = importer.get_code(moduleName) -exec code in m.__dict__ - -if sys.version_info[:2] >= (2, 5): - module = sys.modules.get("threading") - if module is not None: - module._shutdown() - diff --git a/setup/installer/cx_Freeze/initscripts/ConsoleKeepPath.py b/setup/installer/cx_Freeze/initscripts/ConsoleKeepPath.py deleted file mode 100755 index 60151a1ff6..0000000000 --- a/setup/installer/cx_Freeze/initscripts/ConsoleKeepPath.py +++ /dev/null @@ -1,19 +0,0 @@ -#------------------------------------------------------------------------------ -# ConsoleKeepPath.py -# Initialization script for cx_Freeze which leaves the path alone and does -# not set the sys.frozen attribute. -#------------------------------------------------------------------------------ - -import sys -import zipimport - -m = __import__("__main__") -importer = zipimport.zipimporter(INITSCRIPT_ZIP_FILE_NAME) -code = importer.get_code(m.__name__) -exec code in m.__dict__ - -if sys.version_info[:2] >= (2, 5): - module = sys.modules.get("threading") - if module is not None: - module._shutdown() - diff --git a/setup/installer/cx_Freeze/initscripts/ConsoleSetLibPath.py b/setup/installer/cx_Freeze/initscripts/ConsoleSetLibPath.py deleted file mode 100755 index b558652c0a..0000000000 --- a/setup/installer/cx_Freeze/initscripts/ConsoleSetLibPath.py +++ /dev/null @@ -1,38 +0,0 @@ -#------------------------------------------------------------------------------ -# ConsoleSetLibPath.py -# Initialization script for cx_Freeze which manipulates the path so that the -# directory in which the executable is found is searched for extensions but -# no other directory is searched. The environment variable LD_LIBRARY_PATH is -# manipulated first, however, to ensure that shared libraries found in the -# target directory are found. This requires a restart of the executable because -# the environment variable LD_LIBRARY_PATH is only checked at startup. -#------------------------------------------------------------------------------ - -import encodings -import os -import sys -import warnings -import zipimport - -paths = os.environ.get("LD_LIBRARY_PATH", "").split(os.pathsep) -if DIR_NAME not in paths: - paths.insert(0, DIR_NAME) - os.environ["LD_LIBRARY_PATH"] = os.pathsep.join(paths) - os.execv(sys.executable, sys.argv) - -sys.frozen = True -sys.path = sys.path[:4] - -os.environ["TCL_LIBRARY"] = os.path.join(DIR_NAME, "tcl") -os.environ["TK_LIBRARY"] = os.path.join(DIR_NAME, "tk") - -m = __import__("__main__") -importer = zipimport.zipimporter(INITSCRIPT_ZIP_FILE_NAME) -code = importer.get_code(m.__name__) -exec code in m.__dict__ - -if sys.version_info[:2] >= (2, 5): - module = sys.modules.get("threading") - if module is not None: - module._shutdown() - diff --git a/setup/installer/cx_Freeze/initscripts/SharedLib.py b/setup/installer/cx_Freeze/initscripts/SharedLib.py deleted file mode 100755 index 0445367010..0000000000 --- a/setup/installer/cx_Freeze/initscripts/SharedLib.py +++ /dev/null @@ -1,20 +0,0 @@ -#------------------------------------------------------------------------------ -# SharedLib.py -# Initialization script for cx_Freeze which behaves similarly to the one for -# console based applications but must handle the case where Python has already -# been initialized and another DLL of this kind has been loaded. As such it -# does not block the path unless sys.frozen is not already set. -#------------------------------------------------------------------------------ - -import encodings -import os -import sys -import warnings - -if not hasattr(sys, "frozen"): - sys.frozen = True - sys.path = sys.path[:4] - -os.environ["TCL_LIBRARY"] = os.path.join(DIR_NAME, "tcl") -os.environ["TK_LIBRARY"] = os.path.join(DIR_NAME, "tk") - diff --git a/setup/installer/cx_Freeze/initscripts/SharedLibSource.py b/setup/installer/cx_Freeze/initscripts/SharedLibSource.py deleted file mode 100755 index 3edae93694..0000000000 --- a/setup/installer/cx_Freeze/initscripts/SharedLibSource.py +++ /dev/null @@ -1,23 +0,0 @@ -#------------------------------------------------------------------------------ -# SharedLibSource.py -# Initialization script for cx_Freeze which imports the site module (as per -# normal processing of a Python script) and then searches for a file with the -# same name as the shared library but with the extension .pth. The entries in -# this file are used to modify the path to use for subsequent imports. -#------------------------------------------------------------------------------ - -import os -import sys -import warnings - -# the site module must be imported for normal behavior to take place; it is -# done dynamically so that cx_Freeze will not add all modules referenced by -# the site module to the frozen executable -__import__("site") - -# now locate the pth file to modify the path appropriately -baseName, ext = os.path.splitext(FILE_NAME) -pathFileName = baseName + ".pth" -sys.path = [s.strip() for s in file(pathFileName).read().splitlines()] + \ - sys.path - diff --git a/setup/installer/cx_Freeze/samples/advanced/advanced_1.py b/setup/installer/cx_Freeze/samples/advanced/advanced_1.py deleted file mode 100644 index 2f1b68bceb..0000000000 --- a/setup/installer/cx_Freeze/samples/advanced/advanced_1.py +++ /dev/null @@ -1,7 +0,0 @@ -import sys - -print "Hello from cx_Freeze Advanced #1" -print - -module = __import__("testfreeze_1") - diff --git a/setup/installer/cx_Freeze/samples/advanced/advanced_2.py b/setup/installer/cx_Freeze/samples/advanced/advanced_2.py deleted file mode 100644 index 1a6fe37e62..0000000000 --- a/setup/installer/cx_Freeze/samples/advanced/advanced_2.py +++ /dev/null @@ -1,7 +0,0 @@ -import sys - -print "Hello from cx_Freeze Advanced #2" -print - -module = __import__("testfreeze_2") - diff --git a/setup/installer/cx_Freeze/samples/advanced/modules/testfreeze_1.py b/setup/installer/cx_Freeze/samples/advanced/modules/testfreeze_1.py deleted file mode 100644 index 6157b72a69..0000000000 --- a/setup/installer/cx_Freeze/samples/advanced/modules/testfreeze_1.py +++ /dev/null @@ -1 +0,0 @@ -print "Test freeze module #1" diff --git a/setup/installer/cx_Freeze/samples/advanced/modules/testfreeze_2.py b/setup/installer/cx_Freeze/samples/advanced/modules/testfreeze_2.py deleted file mode 100644 index ca133a7d58..0000000000 --- a/setup/installer/cx_Freeze/samples/advanced/modules/testfreeze_2.py +++ /dev/null @@ -1 +0,0 @@ -print "Test freeze module #2" diff --git a/setup/installer/cx_Freeze/samples/advanced/setup.py b/setup/installer/cx_Freeze/samples/advanced/setup.py deleted file mode 100644 index 3a79cf23af..0000000000 --- a/setup/installer/cx_Freeze/samples/advanced/setup.py +++ /dev/null @@ -1,31 +0,0 @@ -# An advanced setup script to create multiple executables and demonstrate a few -# of the features available to setup scripts -# -# hello.py is a very simple "Hello, world" type script which also displays the -# environment in which the script runs -# -# Run the build process by running the command 'python setup.py build' -# -# If everything works well you should find a subdirectory in the build -# subdirectory that contains the files needed to run the script without Python - -import sys -from cx_Freeze import setup, Executable - -executables = [ - Executable("advanced_1.py"), - Executable("advanced_2.py") -] - -buildOptions = dict( - compressed = True, - includes = ["testfreeze_1", "testfreeze_2"], - path = sys.path + ["modules"]) - -setup( - name = "advanced_cx_Freeze_sample", - version = "0.1", - description = "Advanced sample cx_Freeze script", - options = dict(build_exe = buildOptions), - executables = executables) - diff --git a/setup/installer/cx_Freeze/samples/matplotlib/setup.py b/setup/installer/cx_Freeze/samples/matplotlib/setup.py deleted file mode 100644 index 54bd97fc3f..0000000000 --- a/setup/installer/cx_Freeze/samples/matplotlib/setup.py +++ /dev/null @@ -1,27 +0,0 @@ -# A simple setup script to create an executable using matplotlib. -# -# test_matplotlib.py is a very simple matplotlib application that demonstrates -# its use. -# -# Run the build process by running the command 'python setup.py build' -# -# If everything works well you should find a subdirectory in the build -# subdirectory that contains the files needed to run the application - -import cx_Freeze -import sys - -base = None -if sys.platform == "win32": - base = "Win32GUI" - -executables = [ - cx_Freeze.Executable("test_matplotlib.py", base = base) -] - -cx_Freeze.setup( - name = "test_matplotlib", - version = "0.1", - description = "Sample matplotlib script", - executables = executables) - diff --git a/setup/installer/cx_Freeze/samples/matplotlib/test_matplotlib.py b/setup/installer/cx_Freeze/samples/matplotlib/test_matplotlib.py deleted file mode 100644 index 2029845ca5..0000000000 --- a/setup/installer/cx_Freeze/samples/matplotlib/test_matplotlib.py +++ /dev/null @@ -1,48 +0,0 @@ -from numpy import arange, sin, pi -import matplotlib -matplotlib.use('WXAgg') -from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas -from matplotlib.backends.backend_wx import NavigationToolbar2Wx -from matplotlib.figure import Figure -from wx import * - -class CanvasFrame(Frame): - def __init__(self): - Frame.__init__(self,None,-1, 'CanvasFrame',size=(550,350)) - self.SetBackgroundColour(NamedColor("WHITE")) - self.figure = Figure() - self.axes = self.figure.add_subplot(111) - t = arange(0.0,3.0,0.01) - s = sin(2*pi*t) - self.axes.plot(t,s) - self.canvas = FigureCanvas(self, -1, self.figure) - self.sizer = BoxSizer(VERTICAL) - self.sizer.Add(self.canvas, 1, LEFT | TOP | GROW) - self.SetSizerAndFit(self.sizer) - self.add_toolbar() - - def add_toolbar(self): - self.toolbar = NavigationToolbar2Wx(self.canvas) - self.toolbar.Realize() - if Platform == '__WXMAC__': - self.SetToolBar(self.toolbar) - else: - tw, th = self.toolbar.GetSizeTuple() - fw, fh = self.canvas.GetSizeTuple() - self.toolbar.SetSize(Size(fw, th)) - self.sizer.Add(self.toolbar, 0, LEFT | EXPAND) - self.toolbar.update() - - def OnPaint(self, event): - self.canvas.draw() - -class App(App): - def OnInit(self): - 'Create the main window and insert the custom frame' - frame = CanvasFrame() - frame.Show(True) - return True - -app = App(0) -app.MainLoop() - diff --git a/setup/installer/cx_Freeze/samples/relimport/pkg1/__init__.py b/setup/installer/cx_Freeze/samples/relimport/pkg1/__init__.py deleted file mode 100644 index 5a170fd2dd..0000000000 --- a/setup/installer/cx_Freeze/samples/relimport/pkg1/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -print "importing pkg1" -from . import sub1 -from . import pkg2 diff --git a/setup/installer/cx_Freeze/samples/relimport/pkg1/pkg2/__init__.py b/setup/installer/cx_Freeze/samples/relimport/pkg1/pkg2/__init__.py deleted file mode 100644 index 71e0b1fbe6..0000000000 --- a/setup/installer/cx_Freeze/samples/relimport/pkg1/pkg2/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -print "importing pkg1.pkg2" -from . import sub3 -from .. import sub4 diff --git a/setup/installer/cx_Freeze/samples/relimport/pkg1/pkg2/sub3.py b/setup/installer/cx_Freeze/samples/relimport/pkg1/pkg2/sub3.py deleted file mode 100644 index 1719aadb41..0000000000 --- a/setup/installer/cx_Freeze/samples/relimport/pkg1/pkg2/sub3.py +++ /dev/null @@ -1,3 +0,0 @@ -print "importing pkg1.pkg2.sub3" -from . import sub5 -from .. import sub6 diff --git a/setup/installer/cx_Freeze/samples/relimport/pkg1/pkg2/sub5.py b/setup/installer/cx_Freeze/samples/relimport/pkg1/pkg2/sub5.py deleted file mode 100644 index 1c91b8fa23..0000000000 --- a/setup/installer/cx_Freeze/samples/relimport/pkg1/pkg2/sub5.py +++ /dev/null @@ -1 +0,0 @@ -print "importing pkg1.pkg2.sub5" diff --git a/setup/installer/cx_Freeze/samples/relimport/pkg1/sub1.py b/setup/installer/cx_Freeze/samples/relimport/pkg1/sub1.py deleted file mode 100644 index 514bd88a87..0000000000 --- a/setup/installer/cx_Freeze/samples/relimport/pkg1/sub1.py +++ /dev/null @@ -1,2 +0,0 @@ -print "importing pkg1.sub1" -from . import sub2 diff --git a/setup/installer/cx_Freeze/samples/relimport/pkg1/sub2.py b/setup/installer/cx_Freeze/samples/relimport/pkg1/sub2.py deleted file mode 100644 index 63a0838b25..0000000000 --- a/setup/installer/cx_Freeze/samples/relimport/pkg1/sub2.py +++ /dev/null @@ -1 +0,0 @@ -print "importing pkg1.sub2" diff --git a/setup/installer/cx_Freeze/samples/relimport/pkg1/sub4.py b/setup/installer/cx_Freeze/samples/relimport/pkg1/sub4.py deleted file mode 100644 index 3a8e760e43..0000000000 --- a/setup/installer/cx_Freeze/samples/relimport/pkg1/sub4.py +++ /dev/null @@ -1 +0,0 @@ -print 'importing pkg1.sub4' diff --git a/setup/installer/cx_Freeze/samples/relimport/pkg1/sub6.py b/setup/installer/cx_Freeze/samples/relimport/pkg1/sub6.py deleted file mode 100644 index 1e7d7955d6..0000000000 --- a/setup/installer/cx_Freeze/samples/relimport/pkg1/sub6.py +++ /dev/null @@ -1 +0,0 @@ -print "importing pkg1.sub6" diff --git a/setup/installer/cx_Freeze/samples/relimport/relimport.py b/setup/installer/cx_Freeze/samples/relimport/relimport.py deleted file mode 100644 index 39cb50c91d..0000000000 --- a/setup/installer/cx_Freeze/samples/relimport/relimport.py +++ /dev/null @@ -1 +0,0 @@ -import pkg1 diff --git a/setup/installer/cx_Freeze/samples/relimport/setup.py b/setup/installer/cx_Freeze/samples/relimport/setup.py deleted file mode 100644 index b8b3f3853b..0000000000 --- a/setup/installer/cx_Freeze/samples/relimport/setup.py +++ /dev/null @@ -1,16 +0,0 @@ -# relimport.py is a very simple script that tests importing using relative -# imports (available in Python 2.5 and up) -# -# Run the build process by running the command 'python setup.py build' -# -# If everything works well you should find a subdirectory in the build -# subdirectory that contains the files needed to run the script without Python - -from cx_Freeze import setup, Executable - -setup( - name = "relimport", - version = "0.1", - description = "Sample cx_Freeze script for relative imports", - executables = [Executable("relimport.py")]) - diff --git a/setup/installer/cx_Freeze/samples/simple/hello.py b/setup/installer/cx_Freeze/samples/simple/hello.py deleted file mode 100644 index 0fb32405bc..0000000000 --- a/setup/installer/cx_Freeze/samples/simple/hello.py +++ /dev/null @@ -1,19 +0,0 @@ -import sys - -print "Hello from cx_Freeze" -print - -print "sys.executable", sys.executable -print "sys.prefix", sys.prefix -print - -print "ARGUMENTS:" -for a in sys.argv: - print a -print - -print "PATH:" -for p in sys.path: - print p -print - diff --git a/setup/installer/cx_Freeze/samples/simple/setup.py b/setup/installer/cx_Freeze/samples/simple/setup.py deleted file mode 100644 index 25de838b10..0000000000 --- a/setup/installer/cx_Freeze/samples/simple/setup.py +++ /dev/null @@ -1,18 +0,0 @@ -# A very simple setup script to create a single executable -# -# hello.py is a very simple "Hello, world" type script which also displays the -# environment in which the script runs -# -# Run the build process by running the command 'python setup.py build' -# -# If everything works well you should find a subdirectory in the build -# subdirectory that contains the files needed to run the script without Python - -from cx_Freeze import setup, Executable - -setup( - name = "hello", - version = "0.1", - description = "Sample cx_Freeze script", - executables = [Executable("hello.py")]) - diff --git a/setup/installer/cx_Freeze/samples/wx/setup.py b/setup/installer/cx_Freeze/samples/wx/setup.py deleted file mode 100644 index 9412996859..0000000000 --- a/setup/installer/cx_Freeze/samples/wx/setup.py +++ /dev/null @@ -1,25 +0,0 @@ -# A simple setup script to create an executable running wxPython. This also -# demonstrates the method for creating a Windows executable that does not have -# an associated console. -# -# wxapp.py is a very simple "Hello, world" type wxPython application -# -# Run the build process by running the command 'python setup.py build' -# -# If everything works well you should find a subdirectory in the build -# subdirectory that contains the files needed to run the application - -import sys - -from cx_Freeze import setup, Executable - -base = None -if sys.platform == "win32": - base = "Win32GUI" - -setup( - name = "hello", - version = "0.1", - description = "Sample cx_Freeze wxPython script", - executables = [Executable("wxapp.py", base = base)]) - diff --git a/setup/installer/cx_Freeze/samples/wx/wxapp.py b/setup/installer/cx_Freeze/samples/wx/wxapp.py deleted file mode 100644 index 7baa90b8d1..0000000000 --- a/setup/installer/cx_Freeze/samples/wx/wxapp.py +++ /dev/null @@ -1,42 +0,0 @@ -import wx - -class Frame(wx.Frame): - - def __init__(self): - wx.Frame.__init__(self, parent = None, title = "Hello from cx_Freeze") - panel = wx.Panel(self) - closeMeButton = wx.Button(panel, -1, "Close Me") - wx.EVT_BUTTON(self, closeMeButton.GetId(), self.OnCloseMe) - wx.EVT_CLOSE(self, self.OnCloseWindow) - pushMeButton = wx.Button(panel, -1, "Push Me") - wx.EVT_BUTTON(self, pushMeButton.GetId(), self.OnPushMe) - sizer = wx.BoxSizer(wx.HORIZONTAL) - sizer.Add(closeMeButton, flag = wx.ALL, border = 20) - sizer.Add(pushMeButton, flag = wx.ALL, border = 20) - panel.SetSizer(sizer) - topSizer = wx.BoxSizer(wx.VERTICAL) - topSizer.Add(panel, flag = wx.ALL | wx.EXPAND) - topSizer.Fit(self) - - def OnCloseMe(self, event): - self.Close(True) - - def OnPushMe(self, event): - 1 / 0 - - def OnCloseWindow(self, event): - self.Destroy() - - -class App(wx.App): - - def OnInit(self): - frame = Frame() - frame.Show(True) - self.SetTopWindow(frame) - return True - - -app = App(1) -app.MainLoop() - diff --git a/setup/installer/cx_Freeze/setup.py b/setup/installer/cx_Freeze/setup.py deleted file mode 100755 index b51453aa7a..0000000000 --- a/setup/installer/cx_Freeze/setup.py +++ /dev/null @@ -1,197 +0,0 @@ -""" -Distutils script for cx_Freeze. -""" - -import distutils.command.bdist_rpm -import distutils.command.build_ext -import distutils.command.build_scripts -import distutils.command.install -import distutils.command.install_data -import distutils.sysconfig -import os -import sys - -from distutils.core import setup -from distutils.extension import Extension - -class bdist_rpm(distutils.command.bdist_rpm.bdist_rpm): - - # rpm automatically byte compiles all Python files in a package but we - # don't want that to happen for initscripts and samples so we tell it to - # ignore those files - def _make_spec_file(self): - specFile = distutils.command.bdist_rpm.bdist_rpm._make_spec_file(self) - specFile.insert(0, "%define _unpackaged_files_terminate_build 0%{nil}") - return specFile - - def run(self): - distutils.command.bdist_rpm.bdist_rpm.run(self) - specFile = os.path.join(self.rpm_base, "SPECS", - "%s.spec" % self.distribution.get_name()) - queryFormat = "%{name}-%{version}-%{release}.%{arch}.rpm" - command = "rpm -q --qf '%s' --specfile %s" % (queryFormat, specFile) - origFileName = os.popen(command).read() - parts = origFileName.split("-") - parts.insert(2, "py%s%s" % sys.version_info[:2]) - newFileName = "-".join(parts) - self.move_file(os.path.join("dist", origFileName), - os.path.join("dist", newFileName)) - - -class build_ext(distutils.command.build_ext.build_ext): - - def build_extension(self, ext): - if ext.name.find("bases") < 0: - distutils.command.build_ext.build_ext.build_extension(self, ext) - return - os.environ["LD_RUN_PATH"] = "${ORIGIN}:${ORIGIN}/../lib" - objects = self.compiler.compile(ext.sources, - output_dir = self.build_temp, - include_dirs = ext.include_dirs, - debug = self.debug, - depends = ext.depends) - fileName = os.path.splitext(self.get_ext_filename(ext.name))[0] - fullName = os.path.join(self.build_lib, fileName) - libraryDirs = ext.library_dirs or [] - libraries = self.get_libraries(ext) - extraArgs = ext.extra_link_args or [] - if sys.platform != "win32": - vars = distutils.sysconfig.get_config_vars() - libraryDirs.append(vars["LIBPL"]) - libraries.append("python%s.%s" % sys.version_info[:2]) - if vars["LINKFORSHARED"]: - extraArgs.extend(vars["LINKFORSHARED"].split()) - if vars["LIBS"]: - extraArgs.extend(vars["LIBS"].split()) - if vars["LIBM"]: - extraArgs.append(vars["LIBM"]) - if vars["BASEMODLIBS"]: - extraArgs.extend(vars["BASEMODLIBS"].split()) - if vars["LOCALMODLIBS"]: - extraArgs.extend(vars["LOCALMODLIBS"].split()) - extraArgs.append("-s") - self.compiler.link_executable(objects, fullName, - libraries = libraries, - library_dirs = libraryDirs, - runtime_library_dirs = ext.runtime_library_dirs, - extra_postargs = extraArgs, - debug = self.debug) - - def get_ext_filename(self, name): - fileName = distutils.command.build_ext.build_ext.get_ext_filename(self, - name) - if name.find("bases") < 0: - return fileName - ext = self.compiler.exe_extension or "" - return os.path.splitext(fileName)[0] + ext - - -class build_scripts(distutils.command.build_scripts.build_scripts): - - def copy_scripts(self): - distutils.command.build_scripts.build_scripts.copy_scripts(self) - if sys.platform == "win32": - for script in self.scripts: - batFileName = os.path.join(self.build_dir, script + ".bat") - fullScriptName = r"%s\Scripts\%s" % \ - (os.path.dirname(sys.executable), script) - command = "%s %s %%1 %%2 %%3 %%4 %%5 %%6 %%7 %%8 %%9" % \ - (sys.executable, fullScriptName) - file(batFileName, "w").write("@echo off\n\n%s" % command) - - -class install(distutils.command.install.install): - - def get_sub_commands(self): - subCommands = distutils.command.install.install.get_sub_commands(self) - subCommands.append("install_packagedata") - return subCommands - - -class install_packagedata(distutils.command.install_data.install_data): - - def run(self): - installCommand = self.get_finalized_command("install") - installDir = getattr(installCommand, "install_lib") - sourceDirs = ["samples", "initscripts"] - while sourceDirs: - sourceDir = sourceDirs.pop(0) - targetDir = os.path.join(installDir, "cx_Freeze", sourceDir) - self.mkpath(targetDir) - for name in os.listdir(sourceDir): - if name == "build" or name.startswith("."): - continue - fullSourceName = os.path.join(sourceDir, name) - if os.path.isdir(fullSourceName): - sourceDirs.append(fullSourceName) - else: - fullTargetName = os.path.join(targetDir, name) - self.copy_file(fullSourceName, fullTargetName) - self.outfiles.append(fullTargetName) - - -commandClasses = dict( - build_ext = build_ext, - build_scripts = build_scripts, - bdist_rpm = bdist_rpm, - install = install, - install_packagedata = install_packagedata) - -if sys.platform == "win32": - libraries = ["imagehlp"] -else: - libraries = [] -utilModule = Extension("cx_Freeze.util", ["source/util.c"], - libraries = libraries) -depends = ["source/bases/Common.c"] -if sys.platform == "win32": - if sys.version_info[:2] >= (2, 6): - extraSources = ["source/bases/manifest.rc"] - else: - extraSources = ["source/bases/dummy.rc"] -else: - extraSources = [] -console = Extension("cx_Freeze.bases.Console", - ["source/bases/Console.c"] + extraSources, depends = depends) -consoleKeepPath = Extension("cx_Freeze.bases.ConsoleKeepPath", - ["source/bases/ConsoleKeepPath.c"] + extraSources, depends = depends) -extensions = [utilModule, console, consoleKeepPath] -if sys.platform == "win32": - gui = Extension("cx_Freeze.bases.Win32GUI", - ["source/bases/Win32GUI.c"] + extraSources, - depends = depends, extra_link_args = ["-mwindows"]) - extensions.append(gui) - -docFiles = "LICENSE.txt README.txt HISTORY.txt doc/cx_Freeze.html" - -classifiers = [ - "Development Status :: 5 - Production/Stable", - "Intended Audience :: Developers", - "License :: OSI Approved :: Python Software Foundation License", - "Natural Language :: English", - "Operating System :: OS Independent", - "Programming Language :: C", - "Programming Language :: Python", - "Topic :: Software Development :: Build Tools", - "Topic :: Software Development :: Libraries :: Python Modules", - "Topic :: System :: Software Distribution", - "Topic :: Utilities" -] - -setup(name = "cx_Freeze", - description = "create standalone executables from Python scripts", - long_description = "create standalone executables from Python scripts", - version = "4.0.1", - cmdclass = commandClasses, - options = dict(bdist_rpm = dict(doc_files = docFiles), - install = dict(optimize = 1)), - ext_modules = extensions, - packages = ['cx_Freeze'], - maintainer="Anthony Tuininga", - maintainer_email="anthony.tuininga@gmail.com", - url = "http://cx-freeze.sourceforge.net", - scripts = ["cxfreeze"], - classifiers = classifiers, - keywords = "freeze", - license = "Python Software Foundation License") - diff --git a/setup/installer/cx_Freeze/source/bases/Common.c b/setup/installer/cx_Freeze/source/bases/Common.c deleted file mode 100644 index ce1e137ebb..0000000000 --- a/setup/installer/cx_Freeze/source/bases/Common.c +++ /dev/null @@ -1,262 +0,0 @@ -//----------------------------------------------------------------------------- -// Common.c -// Routines which are common to running frozen executables. -//----------------------------------------------------------------------------- - -#include <compile.h> -#include <eval.h> -#include <osdefs.h> - -// global variables (used for simplicity) -static PyObject *g_FileName = NULL; -static PyObject *g_DirName = NULL; -static PyObject *g_ExclusiveZipFileName = NULL; -static PyObject *g_SharedZipFileName = NULL; -static PyObject *g_InitScriptZipFileName = NULL; - -//----------------------------------------------------------------------------- -// GetDirName() -// Return the directory name of the given path. -//----------------------------------------------------------------------------- -static int GetDirName( - const char *path, // path to calculate dir name for - PyObject **dirName) // directory name (OUT) -{ - int i; - - for (i = strlen(path); i > 0 && path[i] != SEP; --i); - *dirName = PyString_FromStringAndSize(path, i); - if (!*dirName) - return FatalError("cannot create string for directory name"); - return 0; -} - - -//----------------------------------------------------------------------------- -// SetExecutableName() -// Set the script to execute and calculate the directory in which the -// executable is found as well as the exclusive (only for this executable) and -// shared zip file names. -//----------------------------------------------------------------------------- -static int SetExecutableName( - const char *fileName) // script to execute -{ - char temp[MAXPATHLEN + 12], *ptr; -#ifndef WIN32 - char linkData[MAXPATHLEN + 1]; - struct stat statData; - size_t linkSize, i; - PyObject *dirName; -#endif - - // store file name - g_FileName = PyString_FromString(fileName); - if (!g_FileName) - return FatalError("cannot create string for file name"); - -#ifndef WIN32 - for (i = 0; i < 25; i++) { - if (lstat(fileName, &statData) < 0) { - PyErr_SetFromErrnoWithFilename(PyExc_OSError, (char*) fileName); - return FatalError("unable to stat file"); - } - if (!S_ISLNK(statData.st_mode)) - break; - linkSize = readlink(fileName, linkData, sizeof(linkData)); - if (linkSize < 0) { - PyErr_SetFromErrnoWithFilename(PyExc_OSError, (char*) fileName); - return FatalError("unable to stat file"); - } - if (linkData[0] == '/') { - Py_DECREF(g_FileName); - g_FileName = PyString_FromStringAndSize(linkData, linkSize); - } else { - if (GetDirName(PyString_AS_STRING(g_FileName), &dirName) < 0) - return -1; - if (PyString_GET_SIZE(dirName) + linkSize + 1 > MAXPATHLEN) { - Py_DECREF(dirName); - return FatalError("cannot dereference link, path too large"); - } - strcpy(temp, PyString_AS_STRING(dirName)); - strcat(temp, "/"); - strcat(temp, linkData); - Py_DECREF(g_FileName); - g_FileName = PyString_FromString(temp); - } - if (!g_FileName) - return FatalError("cannot create string for linked file name"); - fileName = PyString_AS_STRING(g_FileName); - } -#endif - - // calculate and store directory name - if (GetDirName(fileName, &g_DirName) < 0) - return -1; - - // calculate and store exclusive zip file name - strcpy(temp, fileName); - ptr = temp + strlen(temp) - 1; - while (ptr > temp && *ptr != SEP && *ptr != '.') - ptr--; - if (*ptr == '.') - *ptr = '\0'; - strcat(temp, ".zip"); - g_ExclusiveZipFileName = PyString_FromString(temp); - if (!g_ExclusiveZipFileName) - return FatalError("cannot create string for exclusive zip file name"); - - // calculate and store shared zip file name - strcpy(temp, PyString_AS_STRING(g_DirName)); - ptr = temp + strlen(temp); - *ptr++ = SEP; - strcpy(ptr, "library.zip"); - g_SharedZipFileName = PyString_FromString(temp); - if (!g_SharedZipFileName) - return FatalError("cannot create string for shared zip file name"); - - return 0; -} - - -//----------------------------------------------------------------------------- -// SetPathToSearch() -// Set the path to search. This includes the file (for those situations where -// a zip file is attached to the executable itself), the directory where the -// executable is found (to search for extensions), the exclusive zip file -// name and the shared zip file name. -//----------------------------------------------------------------------------- -static int SetPathToSearch(void) -{ - PyObject *pathList; - - pathList = PySys_GetObject("path"); - if (!pathList) - return FatalError("cannot acquire sys.path"); - if (PyList_Insert(pathList, 0, g_FileName) < 0) - return FatalError("cannot insert file name into sys.path"); - if (PyList_Insert(pathList, 1, g_DirName) < 0) - return FatalError("cannot insert directory name into sys.path"); - if (PyList_Insert(pathList, 2, g_ExclusiveZipFileName) < 0) - return FatalError("cannot insert exclusive zip name into sys.path"); - if (PyList_Insert(pathList, 3, g_SharedZipFileName) < 0) - return FatalError("cannot insert shared zip name into sys.path"); - return 0; -} - - -//----------------------------------------------------------------------------- -// GetImporterHelper() -// Helper which is used to locate the importer for the initscript. -//----------------------------------------------------------------------------- -static PyObject *GetImporterHelper( - PyObject *module, // zipimport module - PyObject *fileName) // name of file to search -{ - PyObject *importer; - - importer = PyObject_CallMethod(module, "zipimporter", "O", fileName); - if (importer) - g_InitScriptZipFileName = fileName; - else - PyErr_Clear(); - return importer; -} - - -//----------------------------------------------------------------------------- -// GetImporter() -// Return the importer which will be used for importing the initialization -// script. The executable itself is searched first, followed by the exclusive -// zip file and finally by the shared zip file. -//----------------------------------------------------------------------------- -static int GetImporter( - PyObject **importer) // importer (OUT) -{ - PyObject *module; - - module = PyImport_ImportModule("zipimport"); - if (!module) - return FatalError("cannot import zipimport module"); - *importer = GetImporterHelper(module, g_FileName); - if (!*importer) { - *importer = GetImporterHelper(module, g_ExclusiveZipFileName); - if (!*importer) - *importer = GetImporterHelper(module, g_SharedZipFileName); - } - Py_DECREF(module); - if (!*importer) - return FatalError("cannot get zipimporter instance"); - return 0; -} - - -//----------------------------------------------------------------------------- -// PopulateInitScriptDict() -// Return the dictionary used by the initialization script. -//----------------------------------------------------------------------------- -static int PopulateInitScriptDict( - PyObject *dict) // dictionary to populate -{ - if (!dict) - return FatalError("unable to create temporary dictionary"); - if (PyDict_SetItemString(dict, "__builtins__", PyEval_GetBuiltins()) < 0) - return FatalError("unable to set __builtins__"); - if (PyDict_SetItemString(dict, "FILE_NAME", g_FileName) < 0) - return FatalError("unable to set FILE_NAME"); - if (PyDict_SetItemString(dict, "DIR_NAME", g_DirName) < 0) - return FatalError("unable to set DIR_NAME"); - if (PyDict_SetItemString(dict, "EXCLUSIVE_ZIP_FILE_NAME", - g_ExclusiveZipFileName) < 0) - return FatalError("unable to set EXCLUSIVE_ZIP_FILE_NAME"); - if (PyDict_SetItemString(dict, "SHARED_ZIP_FILE_NAME", - g_SharedZipFileName) < 0) - return FatalError("unable to set SHARED_ZIP_FILE_NAME"); - if (PyDict_SetItemString(dict, "INITSCRIPT_ZIP_FILE_NAME", - g_InitScriptZipFileName) < 0) - return FatalError("unable to set INITSCRIPT_ZIP_FILE_NAME"); - return 0; -} - - - - -//----------------------------------------------------------------------------- -// ExecuteScript() -// Execute the script found within the file. -//----------------------------------------------------------------------------- -static int ExecuteScript( - const char *fileName) // name of file containing Python code -{ - PyObject *importer, *dict, *code, *temp; - - if (SetExecutableName(fileName) < 0) - return -1; - if (SetPathToSearch() < 0) - return -1; - importer = NULL; - if (GetImporter(&importer) < 0) - return -1; - - // create and populate dictionary for initscript module - dict = PyDict_New(); - if (PopulateInitScriptDict(dict) < 0) { - Py_XDECREF(dict); - Py_DECREF(importer); - return -1; - } - - // locate and execute script - code = PyObject_CallMethod(importer, "get_code", "s", "cx_Freeze__init__"); - Py_DECREF(importer); - if (!code) - return FatalError("unable to locate initialization module"); - temp = PyEval_EvalCode( (PyCodeObject*) code, dict, dict); - Py_DECREF(code); - Py_DECREF(dict); - if (!temp) - return FatalScriptError(); - Py_DECREF(temp); - - return 0; -} - diff --git a/setup/installer/cx_Freeze/source/bases/Console.c b/setup/installer/cx_Freeze/source/bases/Console.c deleted file mode 100644 index d6a8a515a0..0000000000 --- a/setup/installer/cx_Freeze/source/bases/Console.c +++ /dev/null @@ -1,72 +0,0 @@ -//----------------------------------------------------------------------------- -// Console.c -// Main routine for frozen programs which run in a console. -//----------------------------------------------------------------------------- - -#include <Python.h> -#ifdef __WIN32__ -#include <windows.h> -#endif - -//----------------------------------------------------------------------------- -// FatalError() -// Prints a fatal error. -//----------------------------------------------------------------------------- -static int FatalError( - const char *message) // message to print -{ - PyErr_Print(); - Py_FatalError(message); - return -1; -} - - -//----------------------------------------------------------------------------- -// FatalScriptError() -// Prints a fatal error in the initialization script. -//----------------------------------------------------------------------------- -static int FatalScriptError(void) -{ - PyErr_Print(); - return -1; -} - - -#include "Common.c" - - -//----------------------------------------------------------------------------- -// main() -// Main routine for frozen programs. -//----------------------------------------------------------------------------- -int main(int argc, char **argv) -{ - const char *fileName; - char *encoding; - - // initialize Python - Py_NoSiteFlag = 1; - Py_FrozenFlag = 1; - Py_IgnoreEnvironmentFlag = 1; - - encoding = getenv("PYTHONIOENCODING"); - if (encoding != NULL) { - Py_FileSystemDefaultEncoding = strndup(encoding, 100); - } - - Py_SetPythonHome(""); - Py_SetProgramName(argv[0]); - fileName = Py_GetProgramFullPath(); - - Py_Initialize(); - PySys_SetArgv(argc, argv); - - - // do the work - if (ExecuteScript(fileName) < 0) - return 1; - - Py_Finalize(); - return 0; -} - diff --git a/setup/installer/cx_Freeze/source/bases/ConsoleKeepPath.c b/setup/installer/cx_Freeze/source/bases/ConsoleKeepPath.c deleted file mode 100644 index 3ad00f8488..0000000000 --- a/setup/installer/cx_Freeze/source/bases/ConsoleKeepPath.c +++ /dev/null @@ -1,60 +0,0 @@ -//----------------------------------------------------------------------------- -// ConsoleKeepPath.c -// Main routine for frozen programs which need a Python installation to do -// their work. -//----------------------------------------------------------------------------- - -#include <Python.h> -#ifdef __WIN32__ -#include <windows.h> -#endif - -//----------------------------------------------------------------------------- -// FatalError() -// Prints a fatal error. -//----------------------------------------------------------------------------- -static int FatalError( - const char *message) // message to print -{ - PyErr_Print(); - Py_FatalError(message); - return -1; -} - - -//----------------------------------------------------------------------------- -// FatalScriptError() -// Prints a fatal error in the initialization script. -//----------------------------------------------------------------------------- -static int FatalScriptError(void) -{ - PyErr_Print(); - return -1; -} - - -#include "Common.c" - - -//----------------------------------------------------------------------------- -// main() -// Main routine for frozen programs. -//----------------------------------------------------------------------------- -int main(int argc, char **argv) -{ - const char *fileName; - - // initialize Python - Py_SetProgramName(argv[0]); - fileName = Py_GetProgramFullPath(); - Py_Initialize(); - PySys_SetArgv(argc, argv); - - // do the work - if (ExecuteScript(fileName) < 0) - return 1; - - Py_Finalize(); - return 0; -} - diff --git a/setup/installer/cx_Freeze/source/bases/Win32GUI.c b/setup/installer/cx_Freeze/source/bases/Win32GUI.c deleted file mode 100644 index f5bbe74dba..0000000000 --- a/setup/installer/cx_Freeze/source/bases/Win32GUI.c +++ /dev/null @@ -1,242 +0,0 @@ -//----------------------------------------------------------------------------- -// Win32GUI.c -// Main routine for frozen programs written for the Win32 GUI subsystem. -//----------------------------------------------------------------------------- - -#include <Python.h> -#include <windows.h> - -//----------------------------------------------------------------------------- -// FatalError() -// Handle a fatal error. -//----------------------------------------------------------------------------- -static int FatalError( - char *a_Message) // message to display -{ - MessageBox(NULL, a_Message, "cx_Freeze Fatal Error", MB_ICONERROR); - Py_Finalize(); - return -1; -} - - -//----------------------------------------------------------------------------- -// StringifyObject() -// Stringify a Python object. -//----------------------------------------------------------------------------- -static char *StringifyObject( - PyObject *object, // object to stringify - PyObject **stringRep) // string representation -{ - if (object) { - *stringRep = PyObject_Str(object); - if (*stringRep) - return PyString_AS_STRING(*stringRep); - return "Unable to stringify"; - } - - // object is NULL - *stringRep = NULL; - return "None"; -} - - -//----------------------------------------------------------------------------- -// FatalPythonErrorNoTraceback() -// Handle a fatal Python error without traceback. -//----------------------------------------------------------------------------- -static int FatalPythonErrorNoTraceback( - PyObject *origType, // exception type - PyObject *origValue, // exception value - char *message) // message to display -{ - PyObject *typeStrRep, *valueStrRep, *origTypeStrRep, *origValueStrRep; - char *totalMessage, *typeStr, *valueStr, *origTypeStr, *origValueStr; - PyObject *type, *value, *traceback; - int totalMessageLength; - char *messageFormat; - - // fetch error and string representations of the error - PyErr_Fetch(&type, &value, &traceback); - origTypeStr = StringifyObject(origType, &origTypeStrRep); - origValueStr = StringifyObject(origValue, &origValueStrRep); - typeStr = StringifyObject(type, &typeStrRep); - valueStr = StringifyObject(value, &valueStrRep); - - // fill out the message to be displayed - messageFormat = "Type: %s\nValue: %s\nOther Type: %s\nOtherValue: %s\n%s"; - totalMessageLength = strlen(origTypeStr) + strlen(origValueStr) + - strlen(typeStr) + strlen(valueStr) + strlen(message) + - strlen(messageFormat) + 1; - totalMessage = malloc(totalMessageLength); - if (!totalMessage) - return FatalError("Out of memory!"); - sprintf(totalMessage, messageFormat, typeStr, valueStr, origTypeStr, - origValueStr, message); - - // display the message - MessageBox(NULL, totalMessage, - "cx_Freeze: Python error in main script (traceback unavailable)", - MB_ICONERROR); - free(totalMessage); - return -1; -} - - -//----------------------------------------------------------------------------- -// ArgumentValue() -// Return a suitable argument value by replacing NULL with Py_None. -//----------------------------------------------------------------------------- -static PyObject *ArgumentValue( - PyObject *object) // argument to massage -{ - if (object) { - Py_INCREF(object); - return object; - } - Py_INCREF(Py_None); - return Py_None; -} - - -//----------------------------------------------------------------------------- -// HandleSystemExitException() -// Handles a system exit exception differently. If an integer value is passed -// through then that becomes the exit value; otherwise the string value of the -// value passed through is displayed in a message box. -//----------------------------------------------------------------------------- -static void HandleSystemExitException() -{ - PyObject *type, *value, *traceback, *valueStr; - int exitCode = 0; - char *message; - - PyErr_Fetch(&type, &value, &traceback); - if (PyInstance_Check(value)) { - PyObject *code = PyObject_GetAttrString(value, "code"); - if (code) { - Py_DECREF(value); - value = code; - if (value == Py_None) - Py_Exit(0); - } - } - if (PyInt_Check(value)) - exitCode = PyInt_AsLong(value); - else { - message = StringifyObject(value, &valueStr); - MessageBox(NULL, message, "cx_Freeze: Application Terminated", - MB_ICONERROR); - Py_XDECREF(valueStr); - exitCode = 1; - } - Py_Exit(exitCode); -} - - -//----------------------------------------------------------------------------- -// FatalScriptError() -// Handle a fatal Python error with traceback. -//----------------------------------------------------------------------------- -static int FatalScriptError() -{ - PyObject *type, *value, *traceback, *argsTuple, *module, *method, *result; - int tracebackLength, i; - char *tracebackStr; - - // if a system exception, handle it specially - if (PyErr_ExceptionMatches(PyExc_SystemExit)) - HandleSystemExitException(); - - // get the exception details - PyErr_Fetch(&type, &value, &traceback); - - // import the traceback module - module = PyImport_ImportModule("traceback"); - if (!module) - return FatalPythonErrorNoTraceback(type, value, - "Cannot import traceback module."); - - // get the format_exception method - method = PyObject_GetAttrString(module, "format_exception"); - Py_DECREF(module); - if (!method) - return FatalPythonErrorNoTraceback(type, value, - "Cannot get format_exception method."); - - // create a tuple for the arguments - argsTuple = PyTuple_New(3); - if (!argsTuple) { - Py_DECREF(method); - return FatalPythonErrorNoTraceback(type, value, - "Cannot create arguments tuple for traceback."); - } - PyTuple_SET_ITEM(argsTuple, 0, ArgumentValue(type)); - PyTuple_SET_ITEM(argsTuple, 1, ArgumentValue(value)); - PyTuple_SET_ITEM(argsTuple, 2, ArgumentValue(traceback)); - - // call the format_exception method - result = PyObject_CallObject(method, argsTuple); - Py_DECREF(method); - Py_DECREF(argsTuple); - if (!result) - return FatalPythonErrorNoTraceback(type, value, - "Failed calling format_exception method."); - - // determine length of string representation of formatted traceback - tracebackLength = 1; - for (i = 0; i < PyList_GET_SIZE(result); i++) - tracebackLength += PyString_GET_SIZE(PyList_GET_ITEM(result, i)); - - // create a string representation of the formatted traceback - tracebackStr = malloc(tracebackLength); - if (!tracebackStr) { - Py_DECREF(result); - return FatalError("Out of memory!"); - } - tracebackStr[0] = '\0'; - for (i = 0; i < PyList_GET_SIZE(result); i++) - strcat(tracebackStr, PyString_AS_STRING(PyList_GET_ITEM(result, i))); - Py_DECREF(result); - - // bring up the error - MessageBox(NULL, tracebackStr, "cx_Freeze: Python error in main script", - MB_ICONERROR); - Py_Finalize(); - return 1; -} - - -#include "Common.c" - - -//----------------------------------------------------------------------------- -// WinMain() -// Main routine for the executable in Windows. -//----------------------------------------------------------------------------- -int WINAPI WinMain( - HINSTANCE instance, // handle to application - HINSTANCE prevInstance, // previous handle to application - LPSTR commandLine, // command line - int showFlag) // show flag -{ - const char *fileName; - - // initialize Python - Py_NoSiteFlag = 1; - Py_FrozenFlag = 1; - Py_IgnoreEnvironmentFlag = 1; - Py_SetPythonHome(""); - Py_SetProgramName(__argv[0]); - fileName = Py_GetProgramFullPath(); - Py_Initialize(); - PySys_SetArgv(__argc, __argv); - - // do the work - if (ExecuteScript(fileName) < 0) - return 1; - - // terminate Python - Py_Finalize(); - return 0; -} - diff --git a/setup/installer/cx_Freeze/source/bases/dummy.rc b/setup/installer/cx_Freeze/source/bases/dummy.rc deleted file mode 100644 index 5c1fa1a194..0000000000 --- a/setup/installer/cx_Freeze/source/bases/dummy.rc +++ /dev/null @@ -1,5 +0,0 @@ -STRINGTABLE -{ - 1, "Just to ensure that buggy EndUpdateResource doesn't fall over." -} - diff --git a/setup/installer/cx_Freeze/source/bases/manifest.rc b/setup/installer/cx_Freeze/source/bases/manifest.rc deleted file mode 100644 index 2b7ee27ab5..0000000000 --- a/setup/installer/cx_Freeze/source/bases/manifest.rc +++ /dev/null @@ -1,3 +0,0 @@ -#include "dummy.rc" - -1 24 source/bases/manifest.txt diff --git a/setup/installer/cx_Freeze/source/util.c b/setup/installer/cx_Freeze/source/util.c deleted file mode 100644 index 1c8eb0c0ca..0000000000 --- a/setup/installer/cx_Freeze/source/util.c +++ /dev/null @@ -1,418 +0,0 @@ -//----------------------------------------------------------------------------- -// util.c -// Shared library for use by cx_Freeze. -//----------------------------------------------------------------------------- - -#include <Python.h> - -#ifdef WIN32 -#include <windows.h> -#include <imagehlp.h> - -#pragma pack(2) - -typedef struct { - BYTE bWidth; // Width, in pixels, of the image - BYTE bHeight; // Height, in pixels, of the image - BYTE bColorCount; // Number of colors in image - BYTE bReserved; // Reserved ( must be 0) - WORD wPlanes; // Color Planes - WORD wBitCount; // Bits per pixel - DWORD dwBytesInRes; // How many bytes in this resource? - DWORD dwImageOffset; // Where in the file is this image? -} ICONDIRENTRY; - -typedef struct { - WORD idReserved; // Reserved (must be 0) - WORD idType; // Resource Type (1 for icons) - WORD idCount; // How many images? - ICONDIRENTRY idEntries[0]; // An entry for each image -} ICONDIR; - -typedef struct { - BYTE bWidth; // Width, in pixels, of the image - BYTE bHeight; // Height, in pixels, of the image - BYTE bColorCount; // Number of colors in image - BYTE bReserved; // Reserved ( must be 0) - WORD wPlanes; // Color Planes - WORD wBitCount; // Bits per pixel - DWORD dwBytesInRes; // How many bytes in this resource? - WORD nID; // resource ID -} GRPICONDIRENTRY; - -typedef struct { - WORD idReserved; // Reserved (must be 0) - WORD idType; // Resource Type (1 for icons) - WORD idCount; // How many images? - GRPICONDIRENTRY idEntries[0]; // An entry for each image -} GRPICONDIR; -#endif - -//----------------------------------------------------------------------------- -// Globals -//----------------------------------------------------------------------------- -#ifdef WIN32 -static PyObject *g_BindErrorException = NULL; -static PyObject *g_ImageNames = NULL; -#endif - - -#ifdef WIN32 -//----------------------------------------------------------------------------- -// BindStatusRoutine() -// Called by BindImageEx() at various points. This is used to determine the -// dependency tree which is later examined by cx_Freeze. -//----------------------------------------------------------------------------- -static BOOL __stdcall BindStatusRoutine( - IMAGEHLP_STATUS_REASON reason, // reason called - PSTR imageName, // name of image being examined - PSTR dllName, // name of DLL - ULONG virtualAddress, // computed virtual address - ULONG parameter) // parameter (value depends on reason) -{ - char fileName[MAX_PATH + 1]; - - switch (reason) { - case BindImportModule: - if (!SearchPath(NULL, dllName, NULL, sizeof(fileName), fileName, - NULL)) - return FALSE; - Py_INCREF(Py_None); - if (PyDict_SetItemString(g_ImageNames, fileName, Py_None) < 0) - return FALSE; - break; - default: - break; - } - return TRUE; -} - - -//----------------------------------------------------------------------------- -// GetFileData() -// Return the data for the given file. -//----------------------------------------------------------------------------- -static int GetFileData( - const char *fileName, // name of file to read - char **data) // pointer to data (OUT) -{ - DWORD numberOfBytesRead, dataSize; - HANDLE file; - - file = CreateFile(fileName, GENERIC_READ, FILE_SHARE_READ, NULL, - OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - if (file == INVALID_HANDLE_VALUE) - return -1; - dataSize = GetFileSize(file, NULL); - if (dataSize == INVALID_FILE_SIZE) { - CloseHandle(file); - return -1; - } - *data = PyMem_Malloc(dataSize); - if (!*data) { - CloseHandle(file); - return -1; - } - if (!ReadFile(file, *data, dataSize, &numberOfBytesRead, NULL)) { - CloseHandle(file); - return -1; - } - CloseHandle(file); - return 0; -} - - -//----------------------------------------------------------------------------- -// CreateGroupIconResource() -// Return the group icon resource given the icon file data. -//----------------------------------------------------------------------------- -static GRPICONDIR *CreateGroupIconResource( - ICONDIR *iconDir, // icon information - DWORD *resourceSize) // size of resource (OUT) -{ - GRPICONDIR *groupIconDir; - int i; - - *resourceSize = sizeof(GRPICONDIR) + - sizeof(GRPICONDIRENTRY) * iconDir->idCount; - groupIconDir = PyMem_Malloc(*resourceSize); - if (!groupIconDir) - return NULL; - groupIconDir->idReserved = iconDir->idReserved; - groupIconDir->idType = iconDir->idType; - groupIconDir->idCount = iconDir->idCount; - for (i = 0; i < iconDir->idCount; i++) { - groupIconDir->idEntries[i].bWidth = iconDir->idEntries[i].bWidth; - groupIconDir->idEntries[i].bHeight = iconDir->idEntries[i].bHeight; - groupIconDir->idEntries[i].bColorCount = - iconDir->idEntries[i].bColorCount; - groupIconDir->idEntries[i].bReserved = iconDir->idEntries[i].bReserved; - groupIconDir->idEntries[i].wPlanes = iconDir->idEntries[i].wPlanes; - groupIconDir->idEntries[i].wBitCount = iconDir->idEntries[i].wBitCount; - groupIconDir->idEntries[i].dwBytesInRes = - iconDir->idEntries[i].dwBytesInRes; - groupIconDir->idEntries[i].nID = i + 1; - } - - return groupIconDir; -} - - -//----------------------------------------------------------------------------- -// ExtAddIcon() -// Add the icon as a resource to the specified file. -//----------------------------------------------------------------------------- -static PyObject *ExtAddIcon( - PyObject *self, // passthrough argument - PyObject *args) // arguments -{ - char *executableName, *iconName, *data, *iconData; - GRPICONDIR *groupIconDir; - DWORD resourceSize; - ICONDIR *iconDir; - BOOL succeeded; - HANDLE handle; - int i; - - if (!PyArg_ParseTuple(args, "ss", &executableName, &iconName)) - return NULL; - - // begin updating the executable - handle = BeginUpdateResource(executableName, FALSE); - if (!handle) { - PyErr_SetExcFromWindowsErrWithFilename(PyExc_WindowsError, - GetLastError(), executableName); - return NULL; - } - - // first attempt to get the data from the icon file - data = NULL; - succeeded = TRUE; - groupIconDir = NULL; - if (GetFileData(iconName, &data) < 0) - succeeded = FALSE; - iconDir = (ICONDIR*) data; - - // next, attempt to add a group icon resource - if (succeeded) { - groupIconDir = CreateGroupIconResource(iconDir, &resourceSize); - if (groupIconDir) - succeeded = UpdateResource(handle, RT_GROUP_ICON, - MAKEINTRESOURCE(1), - MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), - groupIconDir, resourceSize); - else succeeded = FALSE; - } - - // next, add each icon as a resource - if (succeeded) { - for (i = 0; i < iconDir->idCount; i++) { - iconData = &data[iconDir->idEntries[i].dwImageOffset]; - resourceSize = iconDir->idEntries[i].dwBytesInRes; - succeeded = UpdateResource(handle, RT_ICON, MAKEINTRESOURCE(i + 1), - MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), iconData, - resourceSize); - if (!succeeded) - break; - } - } - - // finish writing the resource (or discarding the changes upon an error) - if (!EndUpdateResource(handle, !succeeded)) { - if (succeeded) { - succeeded = FALSE; - PyErr_SetExcFromWindowsErrWithFilename(PyExc_WindowsError, - GetLastError(), executableName); - } - } - - // clean up - if (groupIconDir) - PyMem_Free(groupIconDir); - if (data) - PyMem_Free(data); - if (!succeeded) - return NULL; - - Py_INCREF(Py_None); - return Py_None; -} - - -//----------------------------------------------------------------------------- -// ExtBeginUpdateResource() -// Wrapper for BeginUpdateResource(). -//----------------------------------------------------------------------------- -static PyObject *ExtBeginUpdateResource( - PyObject *self, // passthrough argument - PyObject *args) // arguments -{ - BOOL deleteExistingResources; - char *fileName; - HANDLE handle; - - deleteExistingResources = TRUE; - if (!PyArg_ParseTuple(args, "s|i", &fileName, &deleteExistingResources)) - return NULL; - handle = BeginUpdateResource(fileName, deleteExistingResources); - if (!handle) { - PyErr_SetExcFromWindowsErrWithFilename(PyExc_WindowsError, - GetLastError(), fileName); - return NULL; - } - return PyInt_FromLong((long) handle); -} - - -//----------------------------------------------------------------------------- -// ExtUpdateResource() -// Wrapper for UpdateResource(). -//----------------------------------------------------------------------------- -static PyObject *ExtUpdateResource( - PyObject *self, // passthrough argument - PyObject *args) // arguments -{ - int resourceType, resourceId, resourceDataSize; - char *resourceData; - HANDLE handle; - - if (!PyArg_ParseTuple(args, "iiis#", &handle, &resourceType, &resourceId, - &resourceData, &resourceDataSize)) - return NULL; - if (!UpdateResource(handle, MAKEINTRESOURCE(resourceType), - MAKEINTRESOURCE(resourceId), - MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), resourceData, - resourceDataSize)) { - PyErr_SetExcFromWindowsErr(PyExc_WindowsError, GetLastError()); - return NULL; - } - - Py_INCREF(Py_None); - return Py_None; -} - - -//----------------------------------------------------------------------------- -// ExtEndUpdateResource() -// Wrapper for EndUpdateResource(). -//----------------------------------------------------------------------------- -static PyObject *ExtEndUpdateResource( - PyObject *self, // passthrough argument - PyObject *args) // arguments -{ - BOOL discardChanges; - HANDLE handle; - - discardChanges = FALSE; - if (!PyArg_ParseTuple(args, "i|i", &handle, &discardChanges)) - return NULL; - if (!EndUpdateResource(handle, discardChanges)) { - PyErr_SetExcFromWindowsErr(PyExc_WindowsError, GetLastError()); - return NULL; - } - - Py_INCREF(Py_None); - return Py_None; -} - - -//----------------------------------------------------------------------------- -// ExtGetDependentFiles() -// Return a list of files that this file depends on. -//----------------------------------------------------------------------------- -static PyObject *ExtGetDependentFiles( - PyObject *self, // passthrough argument - PyObject *args) // arguments -{ - PyObject *results; - char *imageName; - - if (!PyArg_ParseTuple(args, "s", &imageName)) - return NULL; - g_ImageNames = PyDict_New(); - if (!g_ImageNames) - return NULL; - if (!BindImageEx(BIND_NO_BOUND_IMPORTS | BIND_NO_UPDATE | BIND_ALL_IMAGES, - imageName, NULL, NULL, BindStatusRoutine)) { - Py_DECREF(g_ImageNames); - PyErr_SetExcFromWindowsErrWithFilename(g_BindErrorException, - GetLastError(), imageName); - return NULL; - } - results = PyDict_Keys(g_ImageNames); - Py_DECREF(g_ImageNames); - return results; -} - - -//----------------------------------------------------------------------------- -// ExtGetSystemDir() -// Return the Windows directory (C:\Windows for example). -//----------------------------------------------------------------------------- -static PyObject *ExtGetSystemDir( - PyObject *self, // passthrough argument - PyObject *args) // arguments (ignored) -{ - char dir[MAX_PATH + 1]; - - if (GetSystemDirectory(dir, sizeof(dir))) - return PyString_FromString(dir); - PyErr_SetExcFromWindowsErr(PyExc_RuntimeError, GetLastError()); - return NULL; -} -#endif - - -//----------------------------------------------------------------------------- -// ExtSetOptimizeFlag() -// Set the optimize flag as needed. -//----------------------------------------------------------------------------- -static PyObject *ExtSetOptimizeFlag( - PyObject *self, // passthrough argument - PyObject *args) // arguments -{ - if (!PyArg_ParseTuple(args, "i", &Py_OptimizeFlag)) - return NULL; - Py_INCREF(Py_None); - return Py_None; -} - - -//----------------------------------------------------------------------------- -// Methods -//----------------------------------------------------------------------------- -static PyMethodDef g_ModuleMethods[] = { - { "SetOptimizeFlag", ExtSetOptimizeFlag, METH_VARARGS }, -#ifdef WIN32 - { "BeginUpdateResource", ExtBeginUpdateResource, METH_VARARGS }, - { "UpdateResource", ExtUpdateResource, METH_VARARGS }, - { "EndUpdateResource", ExtEndUpdateResource, METH_VARARGS }, - { "AddIcon", ExtAddIcon, METH_VARARGS }, - { "GetDependentFiles", ExtGetDependentFiles, METH_VARARGS }, - { "GetSystemDir", ExtGetSystemDir, METH_NOARGS }, -#endif - { NULL } -}; - - -//----------------------------------------------------------------------------- -// initutil() -// Initialization routine for the shared libary. -//----------------------------------------------------------------------------- -void initutil(void) -{ - PyObject *module; - - module = Py_InitModule("cx_Freeze.util", g_ModuleMethods); - if (!module) - return; -#ifdef WIN32 - g_BindErrorException = PyErr_NewException("cx_Freeze.util.BindError", - NULL, NULL); - if (!g_BindErrorException) - return; - if (PyModule_AddObject(module, "BindError", g_BindErrorException) < 0) - return; -#endif -} - diff --git a/setup/installer/linux/__init__.py b/setup/installer/linux/__init__.py index f80efbd125..68f29362ee 100644 --- a/setup/installer/linux/__init__.py +++ b/setup/installer/linux/__init__.py @@ -17,7 +17,8 @@ class Linux32(VMInstaller): INSTALLER_EXT = 'tar.bz2' VM_NAME = 'gentoo32_build' VM = '/vmware/bin/gentoo32_build' - FREEZE_COMMAND = 'linux_freeze' + FREEZE_COMMAND = 'linux_freeze2' + FREEZE_TEMPLATE = 'sudo python -OO setup.py {freeze_command}' class Linux64(Linux32): diff --git a/setup/installer/linux/freeze.py b/setup/installer/linux/freeze.py index 954033fb1b..6cbe7accf6 100644 --- a/setup/installer/linux/freeze.py +++ b/setup/installer/linux/freeze.py @@ -46,7 +46,6 @@ class LinuxFreeze(Command): '/usr/lib/libunrar.so', '/usr/lib/libchm.so.0', '/usr/lib/libsqlite3.so.0', - '/usr/lib/libsqlite3.so.0', '/usr/lib/libmng.so.1', '/usr/lib/libpodofo.so.0.8.2', '/lib/libz.so.1', diff --git a/setup/installer/linux/freeze2.py b/setup/installer/linux/freeze2.py index cd8443e11c..b30762f4b6 100644 --- a/setup/installer/linux/freeze2.py +++ b/setup/installer/linux/freeze2.py @@ -6,10 +6,22 @@ __license__ = 'GPL v3' __copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>' __docformat__ = 'restructuredtext en' -import sys, os, shutil, platform, subprocess, stat, py_compile, glob +import sys, os, shutil, platform, subprocess, stat, py_compile, glob, \ + textwrap, tarfile -from setup import Command, modules, basenames, functions +from setup import Command, modules, basenames, functions, __version__, \ + __appname__ +SITE_PACKAGES = ['IPython', 'PIL', 'dateutil', 'dns', 'PyQt4', 'mechanize', + 'sip.so', 'BeautifulSoup.py', 'cssutils', 'encutils', 'lxml', + 'sipconfig.py', 'xdg'] + + + +gcc = subprocess.Popen(["gcc-config", "-c"], stdout=subprocess.PIPE).communicate()[0] +chost, _, gcc = gcc.rpartition('-') +stdcpp = '/usr/lib/gcc/%s/%s/libstdc++.so.?'%(chost.strip(), gcc.strip()) +stdcpp = glob.glob(stdcpp)[-1] is64bit = platform.architecture()[0] == '64bit' arch = 'x86_64' if is64bit else 'i686' ffi = '/usr/lib/libffi.so.5' if is64bit else '/usr/lib/gcc/i686-pc-linux-gnu/4.4.1/libffi.so.4' @@ -25,38 +37,35 @@ binary_includes = [ '/usr/lib/liblcms.so.1', '/usr/lib/libunrar.so', '/usr/lib/libsqlite3.so.0', - '/usr/lib/libsqlite3.so.0', '/usr/lib/libmng.so.1', - '/usr/lib/libpodofo.so.0.6.99', + '/usr/lib/libpodofo.so.0.8.4', '/lib/libz.so.1', - '/usr/lib/libtiff.so.3', + '/usr/lib/libtiff.so.5', '/lib/libbz2.so.1', - '/usr/lib/libpoppler.so.5', + '/usr/lib/libpoppler.so.7', '/usr/lib/libxml2.so.2', '/usr/lib/libopenjpeg.so.2', '/usr/lib/libxslt.so.1', - '/usr/lib/libjpeg.so.7', + '/usr/lib/libjpeg.so.8', '/usr/lib/libxslt.so.1', '/usr/lib/libgthread-2.0.so.0', - '/usr/lib/gcc/***-pc-linux-gnu/4.4.1/libstdc++.so.6'.replace('***', - arch), + stdcpp, ffi, - '/usr/lib/libpng12.so.0', + '/usr/lib/libpng14.so.14', '/usr/lib/libexslt.so.0', - '/usr/lib/libMagickWand.so.2', - '/usr/lib/libMagickCore.so.2', + '/usr/lib/libMagickWand.so.4', + '/usr/lib/libMagickCore.so.4', '/usr/lib/libgcrypt.so.11', '/usr/lib/libgpg-error.so.0', '/usr/lib/libphonon.so.4', - '/usr/lib/libssl.so.0.9.8', - '/usr/lib/libcrypto.so.0.9.8', + '/usr/lib/libssl.so.1.0.0', + '/usr/lib/libcrypto.so.1.0.0', '/lib/libreadline.so.6', + '/usr/lib/libchm.so.0', + '/usr/lib/liblcms2.so.2', ] binary_includes += [os.path.join(QTDIR, 'lib%s.so.4'%x) for x in QTDLLS] -SITE_PACKAGES = ['IPython', 'PIL', 'dateutil', 'dns', 'PyQt4', 'mechanize', - 'sip.so', 'BeautifulSoup.py', 'ClientForm.py', 'lxml'] - class LinuxFreeze2(Command): def run(self, opts): @@ -68,11 +77,12 @@ class LinuxFreeze2(Command): self.lib_dir = self.j(self.base, 'lib') self.bin_dir = self.j(self.base, 'bin') - #self.initbase() - #self.copy_libs() - #self.copy_python() - #self.compile_mount_helper() + self.initbase() + self.copy_libs() + self.copy_python() + self.compile_mount_helper() self.build_launchers() + self.create_tarfile() def initbase(self): if os.path.exists(self.base): @@ -109,7 +119,7 @@ class LinuxFreeze2(Command): 'linux_mount_helper.c'), '-o', dest]) os.chown(dest, 0, 0) os.chmod(dest, stat.S_ISUID|stat.S_ISGID|stat.S_IRUSR|stat.S_IWUSR|\ - stat.S_IXUSR|stat.S_IXGRP|stat.S_IXOTH) + stat.S_IXUSR|stat.S_IXGRP|stat.S_IXOTH|stat.S_IRGRP|stat.S_IROTH) self.drop_privileges() def copy_python(self): @@ -117,27 +127,30 @@ class LinuxFreeze2(Command): def ignore_in_lib(base, items): ans = [] - for x in items: - x = os.path.join(base, x) + for y in items: + x = os.path.join(base, y) if (os.path.isfile(x) and os.path.splitext(x)[1] in ('.so', '.py')) or \ - (os.path.isdir(x) and x in ('.svn', '.bzr', 'test')): + (os.path.isdir(x) and x not in ('.svn', '.bzr', 'test', 'tests', + 'testing')): continue - ans.append(x) + ans.append(y) return ans srcdir = self.j('/usr/lib/python'+self.py_ver) self.py_dir = self.j(self.lib_dir, self.b(srcdir)) - os.mkdir(self.py_dir) + if not os.path.exists(self.py_dir): + os.mkdir(self.py_dir) for x in os.listdir(srcdir): y = self.j(srcdir, x) ext = os.path.splitext(x)[1] if os.path.isdir(y) and x not in ('test', 'hotshot', 'distutils', - 'site-packages', 'idlelib', 'test', 'lib2to3'): + 'site-packages', 'idlelib', 'lib2to3', 'dist-packages'): shutil.copytree(y, self.j(self.py_dir, x), ignore=ignore_in_lib) - if os.path.isfile(y) and ext in ('.py', '.so'): + if os.path.isfile(y) and ext in ('.py', '.so') and \ + self.b(y) not in ('pdflib_py.so',): shutil.copy2(y, self.py_dir) srcdir = self.j(srcdir, 'site-packages') @@ -155,13 +168,19 @@ class LinuxFreeze2(Command): for x in os.listdir(self.SRC): shutil.copytree(self.j(self.SRC, x), self.j(dest, x), ignore=ignore_in_lib) - for x in ('translations', 'manual'): + for x in ('manual', 'trac'): x = self.j(dest, 'calibre', x) - shutil.rmtree(x) + if os.path.exists(x): + shutil.rmtree(x) + + for x in glob.glob(self.j(dest, 'calibre', 'translations', '*.po')): + os.remove(x) shutil.copytree(self.j(self.src_root, 'resources'), self.j(self.base, 'resources')) + self.create_site_py() + for x in os.walk(self.py_dir): for f in x[-1]: if f.endswith('.py'): @@ -176,17 +195,37 @@ class LinuxFreeze2(Command): except: self.warn('Failed to byte-compile', y) - def run_builder(self, cmd): + + def run_builder(self, cmd, verbose=True): p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - self.info(*cmd) - self.info(p.stdout.read()) - self.info(p.stderr.read()) + if verbose: + self.info(*cmd) + x = p.stdout.read() + p.stderr.read() + if x.strip(): + self.info(x.strip()) if p.wait() != 0: self.info('Failed to run builder') sys.exit(1) + def create_tarfile(self): + self.info('Creating archive...') + dist = os.path.join(self.d(self.SRC), 'dist', + '%s-%s-%s.tar.bz2'%(__appname__, __version__, arch)) + with tarfile.open(dist, mode='w:bz2', + format=tarfile.PAX_FORMAT) as tf: + cwd = os.getcwd() + os.chdir(self.base) + try: + for x in os.listdir('.'): + tf.add(x) + finally: + os.chdir(cwd) + self.info('Archive %s created: %.2f MB'%(dist, + os.stat(dist).st_size/(1024.**2))) + + def build_launchers(self): self.obj_dir = self.j(self.src_root, 'build', 'launcher') if not os.path.exists(self.obj_dir): @@ -195,7 +234,7 @@ class LinuxFreeze2(Command): sources = [self.j(base, x) for x in ['util.c']] headers = [self.j(base, x) for x in ['util.h']] objects = [self.j(self.obj_dir, self.b(x)+'.o') for x in sources] - cflags = '-W -Wall -c -O2 -pipe -DPYTHON_VER="python%s"'%self.py_ver + cflags = '-fno-strict-aliasing -W -Wall -c -O2 -pipe -DPYTHON_VER="python%s"'%self.py_ver cflags = cflags.split() + ['-I/usr/include/python'+self.py_ver] for src, obj in zip(sources, objects): if not self.newer(obj, headers+[src, __file__]): continue @@ -210,34 +249,109 @@ class LinuxFreeze2(Command): self.run_builder(cmd) src = self.j(base, 'main.c') + + modules['console'].append('calibre.linux') + basenames['console'].append('calibre_postinstall') + functions['console'].append('main') for typ in ('console', 'gui', ): self.info('Processing %s launchers'%typ) for mod, bname, func in zip(modules[typ], basenames[typ], functions[typ]): xflags = list(cflags) - xflags += ['-DGUI_APP='+('1' if type == 'gui' else '0')] + xflags += ['-DGUI_APP='+('1' if typ == 'gui' else '0')] xflags += ['-DMODULE="%s"'%mod, '-DBASENAME="%s"'%bname, '-DFUNCTION="%s"'%func] + launcher = textwrap.dedent('''\ + #!/bin/sh + path=`readlink -e $0` + base=`dirname $path` + lib=$base/lib + export LD_LIBRARY_PATH=$lib:$LD_LIBRARY_PATH + export QT_PLUGIN_PATH=$lib/qt_plugins + export MAGICK_CONFIGURE_PATH=$lib/ImageMagick/config + export MAGICK_CODER_MODULE_PATH=$lib/ImageMagick/modules-Q16/coders + export MAGICK_CODER_FILTER_PATH=$lib/ImageMagick/modules-Q16/filters + $base/bin/{0} "$@" + ''') + dest = self.j(self.obj_dir, bname+'.o') if self.newer(dest, [src, __file__]+headers): self.info('Compiling', bname) cmd = ['gcc'] + xflags + [src, '-o', dest] - self.run_builder(cmd) + self.run_builder(cmd, verbose=False) exe = self.j(self.bin_dir, bname) + sh = self.j(self.base, bname) + with open(sh, 'wb') as f: + f.write(launcher.format(bname)) + os.chmod(sh, + stat.S_IREAD|stat.S_IEXEC|stat.S_IWRITE|stat.S_IRGRP|stat.S_IXGRP|stat.S_IROTH|stat.S_IXOTH) + if self.newer(exe, [dest, __file__]): self.info('Linking', bname) - cmd = ['gcc', '-O2', '-Wl,--rpath=$ORIGIN/../lib', + cmd = ['gcc', '-O2', '-o', exe, dest, '-L'+self.lib_dir, '-lcalibre-launcher', ] - self.run_builder(cmd) + self.run_builder(cmd, verbose=False) + def create_site_py(self): # {{{ + with open(self.j(self.py_dir, 'site.py'), 'wb') as f: + f.write(textwrap.dedent('''\ + import sys + import encodings + import __builtin__ + import locale + import os + import codecs + + def set_default_encoding(): + locale.setlocale(locale.LC_ALL, '') + enc = locale.getdefaultlocale()[1] + if not enc: + enc = locale.nl_langinfo(locale.CODESET) + if not enc or enc.lower() == 'ascii': + enc = 'UTF-8' + enc = codecs.lookup(enc).name + sys.setdefaultencoding(enc) + del sys.setdefaultencoding + + class _Helper(object): + """Define the builtin 'help'. + This is a wrapper around pydoc.help (with a twist). + + """ + + def __repr__(self): + return "Type help() for interactive help, " \ + "or help(object) for help about object." + def __call__(self, *args, **kwds): + import pydoc + return pydoc.help(*args, **kwds) + + def set_helper(): + __builtin__.help = _Helper() + def main(): + try: + sys.argv[0] = sys.calibre_basename + set_default_encoding() + set_helper() + mod = __import__(sys.calibre_module, fromlist=[1]) + func = getattr(mod, sys.calibre_function) + return func() + except SystemExit: + raise + except: + import traceback + traceback.print_exc() + return 1 + ''')) + # }}} diff --git a/setup/installer/linux/util.c b/setup/installer/linux/util.c index f7482d2501..dfbaaef62c 100644 --- a/setup/installer/linux/util.c +++ b/setup/installer/linux/util.c @@ -11,10 +11,8 @@ static char exe_path[PATH_MAX]; static char base_dir[PATH_MAX]; static char bin_dir[PATH_MAX]; static char lib_dir[PATH_MAX]; -static char qt_dir[PATH_MAX]; static char extensions_dir[PATH_MAX]; static char resources_dir[PATH_MAX]; -static char magick_dir[PATH_MAX]; void set_gui_app(bool yes) { GUI_APP = yes; } @@ -26,7 +24,8 @@ int report_error(const char *msg, int code) { int report_libc_error(const char *msg) { char buf[2000]; int err = errno; - snprintf("%s::%s", 2000, msg, strerror(err)); + + snprintf(buf, 2000, "%s::%s", msg, strerror(err)); return report_error(buf, err); } @@ -122,54 +121,31 @@ static void get_paths() exit(report_error("No path separators in executable path", EXIT_FAILURE)); } strncat(base_dir, exe_path, p - exe_path); - strcat(base_dir, "\0"); + p = rindex(base_dir, '/'); + if (p == NULL) { + exit(report_error("Only one path separator in executable path", EXIT_FAILURE)); + } + *p = 0; + snprintf(bin_dir, PATH_MAX, "%s/bin", base_dir); snprintf(lib_dir, PATH_MAX, "%s/lib", base_dir); - snprintf(magick_dir, PATH_MAX, "%s/ImageMagick", lib_dir); - snprintf(qt_dir, PATH_MAX, "%s/qt_plugins", lib_dir); snprintf(resources_dir, PATH_MAX, "%s/resources", base_dir); snprintf(extensions_dir, PATH_MAX, "%s/%s/site-packages/calibre/plugins", lib_dir, PYTHON_VER); } -void init_env() { - char buf[PATH_MAX]; - - if (setenv("QT_PLUGIN_PATH", qt_dir, 1) == -1) - exit(report_libc_error("Failed to set environment variable")); - - snprintf(buf, PATH_MAX, "%s/config", magick_dir); - if (setenv("MAGICK_CONFIGURE_PATH", buf, 1) == -1) - exit(report_libc_error("Failed to set environment variable")); - - snprintf(buf, PATH_MAX, "%s/modules-Q16/coders", magick_dir); - if (setenv("MAGICK_CODER_MODULE_PATH", buf, 1) == -1) - exit(report_libc_error("Failed to set environment variable")); - - snprintf(buf, PATH_MAX, "%s/modules-Q16/filters", magick_dir); - if (setenv("MAGICK_CODER_FILTER_PATH", buf, 1) == -1) - exit(report_libc_error("Failed to set environment variable")); - - if (setenv("PYTHONIOENCODING", "utf-8", 1) == -1) - exit(report_libc_error("Failed to set environment variable")); - - if (setenv("PYTHONHOME", base_dir, 1) == -1) - exit(report_libc_error("Failed to set environment variable")); - -} void setup_stream(const char *name, const char *errors) { PyObject *stream; - char *buf = (char *)calloc(100, sizeof(char)); - if (!buf) OOM; + char buf[100]; - snprintf(buf, 100, "%s", "utf-8"); + snprintf(buf, 20, "%s", name); + stream = PySys_GetObject(buf); - stream = PySys_GetObject(name); + snprintf(buf, 20, "%s", "utf-8"); + snprintf(buf+21, 30, "%s", errors); - if (!PyFile_SetEncodingAndErrors(stream, buf, errors)) + if (!PyFile_SetEncodingAndErrors(stream, buf, buf+21)) exit(report_python_error("Failed to set stream encoding", 1)); - - free(buf); } @@ -187,10 +163,9 @@ void setup_streams() { void initialize_interpreter(int argc, char **argv, char *outr, char *errr, const char *basename, const char *module, const char *function) { - char *path; + char *path, *encoding, *p; get_paths(); - init_env(); path = (char*)calloc(3*PATH_MAX, sizeof(char)); if (!path) OOM; @@ -213,6 +188,17 @@ void initialize_interpreter(int argc, char **argv, char *outr, char *errr, //printf("Path before Py_Initialize(): %s\r\n\n", Py_GetPath()); Py_Initialize(); + if (!Py_FileSystemDefaultEncoding) { + encoding = getenv("PYTHONIOENCODING"); + if (encoding != NULL) { + Py_FileSystemDefaultEncoding = strndup(encoding, 20); + p = index(Py_FileSystemDefaultEncoding, ':'); + if (p != NULL) *p = 0; + } else + Py_FileSystemDefaultEncoding = strndup("UTF-8", 10); + } + + setup_streams(); PySys_SetArgv(argc, argv); @@ -220,16 +206,21 @@ void initialize_interpreter(int argc, char **argv, char *outr, char *errr, PySys_SetPath(path); //printf("Path set by me: %s\r\n\n", path); PySys_SetObject("gui_app", PyBool_FromLong((long)GUI_APP)); - PySys_SetObject("app_dir", PyString_FromString(base_dir)); - PySys_SetObject("calibre_basename", PyBytes_FromString(basename)); PySys_SetObject("calibre_module", PyBytes_FromString(module)); PySys_SetObject("calibre_function", PyBytes_FromString(function)); + PySys_SetObject("extensions_location", PyBytes_FromString(extensions_dir)); + PySys_SetObject("resources_location", PyBytes_FromString(resources_dir)); + PySys_SetObject("executables_location", PyBytes_FromString(base_dir)); + PySys_SetObject("frozen_path", PyBytes_FromString(base_dir)); + PySys_SetObject("frozen", Py_True); + Py_INCREF(Py_True); - //if (GUI_APP && outr && errr) { + + if (GUI_APP && outr && errr) { // PySys_SetObject("stdout_redirect", PyUnicode_FromWideChar(outr, wcslen(outr))); // PySys_SetObject("stderr_redirect", PyUnicode_FromWideChar(errr, wcslen(outr))); - //} + } } @@ -256,6 +247,8 @@ int execute_python_entrypoint(int argc, char **argv, const char *basename, const if (res == NULL) ret = report_python_error("Python function terminated unexpectedly", 1); + + ret = pyobject_to_int(res); } } PyErr_Clear(); diff --git a/setup/installer/windows/notes.rst b/setup/installer/windows/notes.rst index ed78bf3158..9c553c42e8 100644 --- a/setup/installer/windows/notes.rst +++ b/setup/installer/windows/notes.rst @@ -21,7 +21,7 @@ This is where all dependencies will be installed. Add C:\Python27\Scripts and C:\Python27 to PATH -Edit mimetypes.py in C:\Python27\Lib and change line 250 UnicodeEncodeError to ValueError and set _winreg = None to prevent reading of mimetypes from the windows registry +Edit mimetypes.py in C:\Python27\Lib and set _winreg = None to prevent reading of mimetypes from the windows registry Install setuptools from http://pypi.python.org/pypi/setuptools If there are no windows binaries already compiled for the version of python you are using then download the source and run the following command in the folder where the source has been unpacked:: @@ -36,6 +36,7 @@ Install BeautifulSoup 3.0.x manually into site-packages (3.1.x parses broken HTM Install pywin32 and edit win32com\__init__.py setting _frozen = True and __gen_path__ to a temp dir (otherwise it tries to set it to a dir in the install tree which leads to permission errors) +Also edit win32com\client\gencache.py and change the except IOError on line 57 to catch all exceptions. SQLite --------- diff --git a/src/calibre/devices/usbms/device.py b/src/calibre/devices/usbms/device.py index f826167d16..af2948cf82 100644 --- a/src/calibre/devices/usbms/device.py +++ b/src/calibre/devices/usbms/device.py @@ -586,8 +586,8 @@ class Device(DeviceConfig, DevicePlugin): pass cmd = 'calibre-mount-helper' - if getattr(sys, 'frozen_path', False): - cmd = os.path.join(sys.frozen_path, cmd) + if getattr(sys, 'frozen', False): + cmd = os.path.join(sys.executables_location, 'bin', cmd) cmd = [cmd, 'mount'] try: p = subprocess.Popen(cmd + [node, '/media/'+label]) @@ -754,8 +754,8 @@ class Device(DeviceConfig, DevicePlugin): for drive in drives: cmd = 'calibre-mount-helper' - if getattr(sys, 'frozen_path', False): - cmd = os.path.join(sys.frozen_path, cmd) + if getattr(sys, 'frozen', False): + cmd = os.path.join(sys.executables_location, 'bin', cmd) cmd = [cmd, 'eject'] mp = getattr(self, "_linux_mount_map", {}).get(drive, 'dummy/')[:-1] @@ -787,8 +787,8 @@ class Device(DeviceConfig, DevicePlugin): if drive and mp: mp = mp[:-1] cmd = 'calibre-mount-helper' - if getattr(sys, 'frozen_path', False): - cmd = os.path.join(sys.frozen_path, cmd) + if getattr(sys, 'frozen', False): + cmd = os.path.join(sys.executables_location, 'bin', cmd) cmd = [cmd, 'cleanup'] if mp and os.path.exists(mp): try: diff --git a/src/calibre/ebooks/pdf/pdftohtml.py b/src/calibre/ebooks/pdf/pdftohtml.py index 971114a180..564ba14a32 100644 --- a/src/calibre/ebooks/pdf/pdftohtml.py +++ b/src/calibre/ebooks/pdf/pdftohtml.py @@ -23,8 +23,8 @@ if isosx and hasattr(sys, 'frameworks_dir'): if iswindows and hasattr(sys, 'frozen'): PDFTOHTML = os.path.join(os.path.dirname(sys.executable), 'pdftohtml.exe') popen = partial(subprocess.Popen, creationflags=0x08) # CREATE_NO_WINDOW=0x08 so that no ugly console is popped up -if (islinux or isfreebsd) and getattr(sys, 'frozen_path', False): - PDFTOHTML = os.path.join(getattr(sys, 'frozen_path'), 'pdftohtml') +if (islinux or isfreebsd) and getattr(sys, 'frozen', False): + PDFTOHTML = os.path.join(sys.executables_location, 'bin', 'pdftohtml') def pdftohtml(output_dir, pdf_path, no_images): ''' diff --git a/src/calibre/gui2/__init__.py b/src/calibre/gui2/__init__.py index f035c40cb4..57b914877d 100644 --- a/src/calibre/gui2/__init__.py +++ b/src/calibre/gui2/__init__.py @@ -644,7 +644,7 @@ def open_url(qurl): '').split(os.pathsep) paths = [x for x in paths if x] if isfrozen and islinux and paths: - npaths = [x for x in paths if x != sys.frozen_path] + npaths = [x for x in paths if x != sys.frozen_path+'/lib'] os.environ['LD_LIBRARY_PATH'] = os.pathsep.join(npaths) QDesktopServices.openUrl(qurl) if isfrozen and islinux and paths: diff --git a/src/calibre/libunrar.py b/src/calibre/libunrar.py index e05afc4e38..4bfd5c537a 100644 --- a/src/calibre/libunrar.py +++ b/src/calibre/libunrar.py @@ -28,7 +28,7 @@ if hasattr(sys, 'frozen') and iswindows: lp = os.path.join(os.path.dirname(sys.executable), 'DLLs', 'unrar.dll') _libunrar = cdll.LoadLibrary(lp) elif hasattr(sys, 'frozen_path'): - lp = os.path.join(sys.frozen_path, 'libunrar.so') + lp = os.path.join(sys.frozen_path, 'lib', 'libunrar.so') _libunrar = cdll.LoadLibrary(lp) else: _libunrar = load_library(_librar_name, cdll) diff --git a/src/calibre/utils/ipc/launch.py b/src/calibre/utils/ipc/launch.py index a179f356be..28d5d889e3 100644 --- a/src/calibre/utils/ipc/launch.py +++ b/src/calibre/utils/ipc/launch.py @@ -8,7 +8,7 @@ __docformat__ = 'restructuredtext en' import subprocess, os, sys, time, binascii, cPickle -from calibre.constants import iswindows, isosx, isfrozen, isnewosx +from calibre.constants import iswindows, isosx, isfrozen from calibre.utils.config import prefs from calibre.ptempfile import PersistentTemporaryFile, base_dir @@ -51,17 +51,11 @@ class Worker(object): return os.path.join(os.path.dirname(sys.executable), e+'.exe' if isfrozen else \ 'Scripts\\%s.exe'%e) - if isnewosx: + if isosx: return os.path.join(sys.console_binaries_path, e) - if isosx: - if not isfrozen: return e - contents = os.path.join(self.osx_contents_dir, - 'console.app', 'Contents') - return os.path.join(contents, 'MacOS', self.osx_interpreter) - if isfrozen: - return os.path.join(getattr(sys, 'frozen_path'), e) + return os.path.join(sys.executables_location, e) c = os.path.join(sys.executables_location, e) if os.access(c, os.X_OK): @@ -71,13 +65,9 @@ class Worker(object): @property def gui_executable(self): - if isnewosx: + if isosx: return os.path.join(sys.binaries_path, self.exe_name) - if isfrozen and isosx: - return os.path.join(self.osx_contents_dir, - 'MacOS', self.osx_interpreter) - return self.executable @property @@ -123,27 +113,6 @@ class Worker(object): def __init__(self, env, gui=False): self._env = {} self.gui = gui - if isosx and isfrozen and not isnewosx: - contents = os.path.join(self.osx_contents_dir, 'console.app', 'Contents') - resources = os.path.join(contents, 'Resources') - fd = os.path.join(contents, 'Frameworks') - sp = os.path.join(resources, 'lib', 'python'+sys.version[:3], 'site-packages.zip') - self.osx_prefix = 'import sys, os; sys.frameworks_dir = "%s"; sys.frozen = "macosx_app"; '%fd - self.osx_prefix += 'sys.path.insert(0, %s); '%repr(sp) - self.osx_prefix += 'sys.extensions_location = os.path.join(sys.frameworks_dir, "plugins");' - self.osx_prefix += 'sys.resources_location = os.path.join(os.path.dirname(sys.frameworks_dir), "Resources", "resources"); ' - - self._env['PYTHONHOME'] = resources - self._env['MAGICK_HOME'] = os.path.join(fd, 'ImageMagick') - self._env['DYLD_LIBRARY_PATH'] = os.path.join(fd, 'ImageMagick', 'lib') - self._env['FONTCONFIG_PATH'] = \ - os.path.join(os.path.realpath(resources), 'fonts') - self._env['QT_PLUGIN_PATH'] = \ - os.path.join(self.osx_contents_dir, 'MacOS') - - if isfrozen and not (iswindows or isosx): - self._env['LD_LIBRARY_PATH'] = getattr(sys, 'frozen_path') + ':'\ - + os.environ.get('LD_LIBRARY_PATH', '') self._env.update(env) def __call__(self, redirect_output=True, cwd=None, priority=None): @@ -155,13 +124,9 @@ class Worker(object): env = self.env env['ORIGWD'] = cwd or os.path.abspath(os.getcwd()) _cwd = cwd - if isfrozen and not iswindows and not isosx: - _cwd = getattr(sys, 'frozen_path', None) if priority is None: priority = prefs['worker_process_priority'] cmd = [exe] - if isosx and not isnewosx: - cmd += ['-c', self.osx_prefix + 'from calibre.utils.ipc.worker import main; main()'] args = { 'env' : env, 'cwd' : _cwd, From b44e60f80d6fab30a05ad52732604350a51b7dc4 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Mon, 29 Nov 2010 09:44:39 -0700 Subject: [PATCH 185/375] La Rijoa nad NacionRed by Arturo Martinez Nieves --- resources/nacionred.recipe | 11 +++++++ resources/recipes/la_rioja.recipe | 54 +++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 resources/nacionred.recipe create mode 100644 resources/recipes/la_rioja.recipe diff --git a/resources/nacionred.recipe b/resources/nacionred.recipe new file mode 100644 index 0000000000..4108deab88 --- /dev/null +++ b/resources/nacionred.recipe @@ -0,0 +1,11 @@ +from calibre.web.feeds.news import BasicNewsRecipe + +class AdvancedUserRecipe1291022049(BasicNewsRecipe): + title = u'NacionRed.com' + oldest_article = 7 + max_articles_per_feed = 100 + language = 'es' + __author__ = 'Arturo Martinez Nieves' + + feeds = [(u'NacionRed.com', u'http://feeds.weblogssl.com/nacionred?format=xml')] + diff --git a/resources/recipes/la_rioja.recipe b/resources/recipes/la_rioja.recipe new file mode 100644 index 0000000000..eea3dd2687 --- /dev/null +++ b/resources/recipes/la_rioja.recipe @@ -0,0 +1,54 @@ +__license__ = 'GPL v3' +__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>' +''' +www.larioja.com +''' + +from calibre.web.feeds.news import BasicNewsRecipe + +class LaRioja(BasicNewsRecipe): + title = 'La Rioja' + __author__ = 'Arturo Martinez Nieves' + description = 'Noticias de La Rioja y el resto del mundo' + publisher = 'La Rioja' + category = 'news, politics, Spain' + oldest_article = 2 + max_articles_per_feed = 200 + no_stylesheets = True + encoding = 'cp1252' + use_embedded_content = False + language = 'es' + remove_empty_feeds = True + masthead_url = 'http://www.larioja.com/includes/manuales/larioja/include-lariojapapeldigital-zonac-fondocabecera01.jpg' + extra_css = ' body{font-family: Arial,Helvetica,sans-serif } img{margin-bottom: 0.4em} .photo-caption{font-size: x-small} ' + + conversion_options = { + 'comment' : description + , 'tags' : category + , 'publisher' : publisher + , 'language' : language + } + + keep_only_tags = [ + dict(attrs={'id':'title'}) + ,dict(attrs={'class':['overhead','headline','subhead','date','text','noticia_cont','desarrollo']}) + ] + remove_tags = [dict(name='ul')] + remove_attributes = ['width','height'] + + + feeds = [ + (u'Ultimas Noticias' , u'http://www.larioja.com/rss/feeds/ultima.xml' ) + ,(u'Portada' , u'http://www.larioja.com/rss/feeds/portada.xml' ) + ,(u'Mundo' , u'http://www.larioja.com/rss/feeds/mundo.xml' ) + ,(u'Espana' , u'http://www.larioja.com/rss/feeds/espana.xml' ) + ,(u'Region' , u'http://www.larioja.com/rss/feeds/region.xml' ) + ,(u'Comarcas' , u'http://www.larioja.com/rss/feeds/comarcas.xml') + ,(u'Deportes' , u'http://www.larioja.com/rss/feeds/deportes.xml' ) + ,(u'Economia' , u'http://www.larioja.com/rss/feeds/economia.xml' ) + ,(u'Cultura' , u'http://www.larioja.com/rss/feeds/cultura.xml' ) + ,(u'Opinion' , u'http://www.larioja.com/rss/feeds/opinion.xml' ) + ,(u'Sociedad' , u'http://www.larioja.com/rss/feeds/sociedad.xml' ) + + ] + From 4bb388216a65dd86f70811ea3ee1d20906cd74e1 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Mon, 29 Nov 2010 16:58:54 +0000 Subject: [PATCH 186/375] Drag & drop onto user categories --- src/calibre/gui2/dialogs/tag_categories.py | 2 +- src/calibre/gui2/library/views.py | 2 + src/calibre/gui2/tag_view.py | 88 +++++++++++++++++++++- 3 files changed, 87 insertions(+), 5 deletions(-) diff --git a/src/calibre/gui2/dialogs/tag_categories.py b/src/calibre/gui2/dialogs/tag_categories.py index 679a5c9da9..7a9660a655 100644 --- a/src/calibre/gui2/dialogs/tag_categories.py +++ b/src/calibre/gui2/dialogs/tag_categories.py @@ -51,7 +51,7 @@ class TagCategories(QDialog, Ui_TagCategories): cc_map = self.db.custom_column_label_map for cc in cc_map: - if cc_map[cc]['datatype'] == 'text': + if cc_map[cc]['datatype'] in ['text', 'series']: self.category_labels.append(db.field_metadata.label_to_key(cc)) category_icons.append(cc_icon) category_values.append(lambda col=cc: self.db.all_custom(label=col)) diff --git a/src/calibre/gui2/library/views.py b/src/calibre/gui2/library/views.py index a972acfc13..fadb8314e3 100644 --- a/src/calibre/gui2/library/views.py +++ b/src/calibre/gui2/library/views.py @@ -517,6 +517,8 @@ class BooksView(QTableView): # {{{ md.setUrls([url_for_id(i) for i in selected]) drag = QDrag(self) + col = self.selectionModel().currentIndex().column() + md.column_name = self.column_map[col] drag.setMimeData(md) cover = self.drag_icon(m.cover(self.currentIndex().row()), len(selected) > 1) diff --git a/src/calibre/gui2/tag_view.py b/src/calibre/gui2/tag_view.py index 3ded769137..ed27026562 100644 --- a/src/calibre/gui2/tag_view.py +++ b/src/calibre/gui2/tag_view.py @@ -67,7 +67,7 @@ class TagsView(QTreeView): # {{{ author_sort_edit = pyqtSignal(object, object) tag_item_renamed = pyqtSignal() search_item_renamed = pyqtSignal() - drag_drop_finished = pyqtSignal(object) + drag_drop_finished = pyqtSignal(object, object) def __init__(self, parent=None): QTreeView.__init__(self, parent=None) @@ -252,6 +252,30 @@ class TagsView(QTreeView): # {{{ self.context_menu.popup(self.mapToGlobal(point)) return True + def dragMoveEvent(self, event): + self.setDropIndicatorShown(False) + index = self.indexAt(event.pos()) + if not index.isValid(): + self.setDropIndicatorShown(False) + return + item = index.internalPointer() + flags = self._model.flags(index) + if item.type == TagTreeItem.TAG and flags & Qt.ItemIsDropEnabled: + self.setDropIndicatorShown(True) + else: + item = index.internalPointer() + if item.type == TagTreeItem.CATEGORY: + fm_dest = self.db.metadata_for_field(item.category_key) + if fm_dest['kind'] == 'user': + md = event.mimeData() + fm_src = self.db.metadata_for_field(md.column_name) + if md.column_name in ['authors', 'publisher', 'series'] or \ + (fm_src['is_custom'] and + fm_src['datatype'] in ['series', 'text'] and + not fm_src['is_multiple']): + self.setDropIndicatorShown(True) + QTreeView.dragMoveEvent(self, event) + def clear(self): if self.model(): self.model().clear_state() @@ -448,8 +472,59 @@ class TagsModel(QAbstractItemModel): # {{{ ids = list(map(int, str(md.data(mime)).split())) self.handle_drop(node, ids) return True + elif node.type == TagTreeItem.CATEGORY: + fm_dest = self.db.metadata_for_field(node.category_key) + if fm_dest['kind'] == 'user': + fm_src = self.db.metadata_for_field(md.column_name) + if md.column_name in ['authors', 'publisher', 'series'] or \ + (fm_src['is_custom'] and + fm_src['datatype'] in ['series', 'text'] and + not fm_src['is_multiple']): + mime = 'application/calibre+from_library' + ids = list(map(int, str(md.data(mime)).split())) + self.handle_user_category_drop(node, ids, md.column_name) + return True return False + def handle_user_category_drop(self, on_node, ids, column): + categories = self.db.prefs.get('user_categories', {}) + category = categories.get(on_node.category_key[:-1], None) + if category is None: + return + fm_src = self.db.metadata_for_field(column) + for id in ids: + vmap = {} + label = fm_src['label'] + if not fm_src['is_custom']: + if label == 'authors': + items = self.db.get_authors_with_ids() + items = [(i[0], i[1].replace('|', ',')) for i in items] + value = self.db.authors(id, index_is_id=True) + value = [v.replace('|', ',') for v in value.split(',')] + elif label == 'publisher': + items = self.db.get_publishers_with_ids() + value = self.db.publisher(id, index_is_id=True) + elif label == 'series': + items = self.db.get_series_with_ids() + value = self.db.series(id, index_is_id=True) + else: + items = self.db.get_custom_items_with_ids(label=label) + value = self.db.get_custom(id, label=label, index_is_id=True) + if value is None: + return + if not isinstance(value, list): + value = [value] + for v in items: + vmap[v[1]] = v[0] + for val in value: + for (v, c, id) in category: + if v == val and c == column: + break + else: + category.append([val, column, vmap[val]]) + categories[on_node.category_key[:-1]] = category + self.db.prefs.set('user_categories', categories) + self.drag_drop_finished.emit(None, True) def handle_drop(self, on_node, ids): #print 'Dropped ids:', ids, on_node.tag @@ -499,7 +574,7 @@ class TagsModel(QAbstractItemModel): # {{{ self.db.set_metadata(id, mi, set_title=False, set_authors=set_authors, commit=False) self.db.commit() - self.drag_drop_finished.emit(ids) + self.drag_drop_finished.emit(ids, False) def set_search_restriction(self, s): self.search_restriction = s @@ -641,6 +716,8 @@ class TagsModel(QAbstractItemModel): # {{{ (fm['is_custom'] and \ fm['datatype'] in ['text', 'rating', 'series']): ans |= Qt.ItemIsDropEnabled + else: + ans |= Qt.ItemIsDropEnabled return ans def supportedDropActions(self): @@ -857,8 +934,11 @@ class TagBrowserMixin(object): # {{{ self.library_view.model().refresh() self.tags_view.recount() - def drag_drop_finished(self, ids): - self.library_view.model().refresh_ids(ids) + def drag_drop_finished(self, ids, is_category): + if is_category: + self.tags_view.recount() + else: + self.library_view.model().refresh_ids(ids) # }}} From fdf989c011f0bc7edffa68b6e9dbf585fa49b48d Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Mon, 29 Nov 2010 10:06:39 -0700 Subject: [PATCH 187/375] ... --- src/calibre/manual/faq.rst | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/calibre/manual/faq.rst b/src/calibre/manual/faq.rst index f9fe5bd3af..55451206b6 100644 --- a/src/calibre/manual/faq.rst +++ b/src/calibre/manual/faq.rst @@ -247,6 +247,18 @@ Also, :: must return ``CONFIG_SCSI_MULTI_LUN=y``. If you don't see either, you have to recompile your kernel with the correct settings. +My device is getting mounted read-only in linux, so |app| cannot connect to it? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +linux kernels mount devices read-only when their filesystems have errors. You can repair the filesystem with:: + + sudo fsck.vfat -y /dev/sdc + +Replace /dev/sdc with the path to the device node of your device. You can find the device node of your device, which +will always be under /dev by examining the output of:: + + mount + Why does |app| not support collection on the Kindle or shelves on the Nook? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From 25467ff22afa384a8945acee887b43ae053fd22d Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Mon, 29 Nov 2010 10:36:35 -0700 Subject: [PATCH 188/375] Fix #7729 (calibre network share not working) --- src/calibre/library/server/browse.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/library/server/browse.py b/src/calibre/library/server/browse.py index fbb35e598c..b6dbde4c77 100644 --- a/src/calibre/library/server/browse.py +++ b/src/calibre/library/server/browse.py @@ -368,7 +368,7 @@ class BrowseServer(object): for x, y, z in cats] main = u'<div class="toplevel"><h3>{0}</h3><ul>{1}</ul></div>'\ - .format(_('Choose a category to browse by:'), '\n\n'.join(cats)) + .format(_('Choose a category to browse by:'), u'\n\n'.join(cats)) return self.browse_template('name').format(title='', script='toplevel();', main=main) From eeda4caf10443bbdeeab1076cca2ca75e6ddb24d Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Mon, 29 Nov 2010 13:13:10 -0700 Subject: [PATCH 189/375] ... --- resources/{ => recipes}/nacionred.recipe | 0 setup/commands.py | 6 ++-- setup/installer/linux/__init__.py | 2 +- setup/installer/linux/freeze2.py | 44 +++++++++++++++--------- 4 files changed, 30 insertions(+), 22 deletions(-) rename resources/{ => recipes}/nacionred.recipe (100%) diff --git a/resources/nacionred.recipe b/resources/recipes/nacionred.recipe similarity index 100% rename from resources/nacionred.recipe rename to resources/recipes/nacionred.recipe diff --git a/setup/commands.py b/setup/commands.py index 06ab7b36f7..12fb5fe0af 100644 --- a/setup/commands.py +++ b/setup/commands.py @@ -18,7 +18,7 @@ __all__ = [ 'pypi_register', 'pypi_upload', 'upload_to_server', 'upload_user_manual', 'upload_to_mobileread', 'upload_demo', 'upload_to_sourceforge', 'upload_to_google_code', - 'linux32', 'linux64', 'linux', 'linux_freeze', 'linux_freeze2', + 'linux32', 'linux64', 'linux', 'linux_freeze', 'osx32_freeze', 'osx', 'rsync', 'push', 'win32_freeze', 'win32', 'win', 'stage1', 'stage2', 'stage3', 'stage4', 'publish' @@ -79,10 +79,8 @@ from setup.installer.linux import Linux, Linux32, Linux64 linux = Linux() linux32 = Linux32() linux64 = Linux64() -from setup.installer.linux.freeze import LinuxFreeze +from setup.installer.linux.freeze2 import LinuxFreeze linux_freeze = LinuxFreeze() -from setup.installer.linux.freeze2 import LinuxFreeze2 -linux_freeze2 = LinuxFreeze2() from setup.installer.osx import OSX osx = OSX() diff --git a/setup/installer/linux/__init__.py b/setup/installer/linux/__init__.py index 68f29362ee..3d759cff9a 100644 --- a/setup/installer/linux/__init__.py +++ b/setup/installer/linux/__init__.py @@ -17,7 +17,7 @@ class Linux32(VMInstaller): INSTALLER_EXT = 'tar.bz2' VM_NAME = 'gentoo32_build' VM = '/vmware/bin/gentoo32_build' - FREEZE_COMMAND = 'linux_freeze2' + FREEZE_COMMAND = 'linux_freeze' FREEZE_TEMPLATE = 'sudo python -OO setup.py {freeze_command}' diff --git a/setup/installer/linux/freeze2.py b/setup/installer/linux/freeze2.py index b30762f4b6..0379c0d839 100644 --- a/setup/installer/linux/freeze2.py +++ b/setup/installer/linux/freeze2.py @@ -16,21 +16,9 @@ SITE_PACKAGES = ['IPython', 'PIL', 'dateutil', 'dns', 'PyQt4', 'mechanize', 'sip.so', 'BeautifulSoup.py', 'cssutils', 'encutils', 'lxml', 'sipconfig.py', 'xdg'] - - -gcc = subprocess.Popen(["gcc-config", "-c"], stdout=subprocess.PIPE).communicate()[0] -chost, _, gcc = gcc.rpartition('-') -stdcpp = '/usr/lib/gcc/%s/%s/libstdc++.so.?'%(chost.strip(), gcc.strip()) -stdcpp = glob.glob(stdcpp)[-1] -is64bit = platform.architecture()[0] == '64bit' -arch = 'x86_64' if is64bit else 'i686' -ffi = '/usr/lib/libffi.so.5' if is64bit else '/usr/lib/gcc/i686-pc-linux-gnu/4.4.1/libffi.so.4' - - QTDIR = '/usr/lib/qt4' QTDLLS = ('QtCore', 'QtGui', 'QtNetwork', 'QtSvg', 'QtXml', 'QtWebKit', 'QtDBus') - binary_includes = [ '/usr/bin/pdftohtml', '/usr/lib/libwmflite-0.2.so.7', @@ -49,8 +37,6 @@ binary_includes = [ '/usr/lib/libjpeg.so.8', '/usr/lib/libxslt.so.1', '/usr/lib/libgthread-2.0.so.0', - stdcpp, - ffi, '/usr/lib/libpng14.so.14', '/usr/lib/libexslt.so.0', '/usr/lib/libMagickWand.so.4', @@ -66,7 +52,11 @@ binary_includes = [ ] binary_includes += [os.path.join(QTDIR, 'lib%s.so.4'%x) for x in QTDLLS] -class LinuxFreeze2(Command): +is64bit = platform.architecture()[0] == '64bit' +arch = 'x86_64' if is64bit else 'i686' + + +class LinuxFreeze(Command): def run(self, opts): self.drop_privileges() @@ -93,7 +83,21 @@ class LinuxFreeze2(Command): self.info('Copying libs...') os.mkdir(self.lib_dir) os.mkdir(self.bin_dir) - for x in binary_includes: + + gcc = subprocess.Popen(["gcc-config", "-c"], stdout=subprocess.PIPE).communicate()[0] + chost, _, gcc = gcc.rpartition('-') + gcc_lib = '/usr/lib/gcc/%s/%s/'%(chost.strip(), gcc.strip()) + stdcpp = gcc_lib+'libstdc++.so.?' + stdcpp = glob.glob(stdcpp)[-1] + ffi = gcc_lib+'libffi.so.?' + ffi = glob.glob(ffi) + if ffi: + ffi = ffi[-1] + else: + ffi = glob.glob('/usr/lib/libffi.so.?')[-1] + + + for x in binary_includes + [stdcpp, ffi]: dest = self.bin_dir if '/bin/' in x else self.lib_dir shutil.copy2(x, dest) shutil.copy2('/usr/lib/libpython%s.so.1.0'%self.py_ver, dest) @@ -268,7 +272,6 @@ class LinuxFreeze2(Command): base=`dirname $path` lib=$base/lib export LD_LIBRARY_PATH=$lib:$LD_LIBRARY_PATH - export QT_PLUGIN_PATH=$lib/qt_plugins export MAGICK_CONFIGURE_PATH=$lib/ImageMagick/config export MAGICK_CODER_MODULE_PATH=$lib/ImageMagick/modules-Q16/coders export MAGICK_CODER_FILTER_PATH=$lib/ImageMagick/modules-Q16/filters @@ -336,12 +339,19 @@ class LinuxFreeze2(Command): def set_helper(): __builtin__.help = _Helper() + def set_qt_plugin_path(): + from PyQt4.Qt import QCoreApplication + paths = list(map(unicode, QCoreApplication.libraryPaths())) + paths.insert(0, sys.frozen_path + '/lib/qt_plugins') + QCoreApplication.setLibraryPaths(paths) + def main(): try: sys.argv[0] = sys.calibre_basename set_default_encoding() set_helper() + set_qt_plugin_path() mod = __import__(sys.calibre_module, fromlist=[1]) func = getattr(mod, sys.calibre_function) return func() From 6f2a36949a9ce4d5f0311f70d6b4c2f8718c0e0f Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Mon, 29 Nov 2010 16:37:50 -0700 Subject: [PATCH 190/375] Fix #7733 (Updated gui.rst and associated image files) --- src/calibre/manual/customize.rst | 2 + src/calibre/manual/gui.rst | 278 ++++++++++++------ src/calibre/manual/images/actions.png | Bin 21712 -> 37220 bytes src/calibre/manual/images/add_books.png | Bin 4054 -> 2705 bytes .../manual/images/auto_author_sort.png | Bin 0 -> 1283 bytes src/calibre/manual/images/catalogs.png | Bin 8581 -> 13227 bytes src/calibre/manual/images/connect_share.png | Bin 0 -> 4929 bytes src/calibre/manual/images/convert_ebooks.png | Bin 4742 -> 3788 bytes src/calibre/manual/images/device.png | Bin 0 -> 3152 bytes .../manual/images/edit_meta_information.png | Bin 2555 -> 3574 bytes src/calibre/manual/images/fetch_news.png | Bin 3132 -> 3101 bytes src/calibre/manual/images/folder_device.png | Bin 0 -> 3685 bytes src/calibre/manual/images/jobs.png | Bin 3726 -> 1753 bytes src/calibre/manual/images/library.png | Bin 0 -> 5737 bytes src/calibre/manual/images/preferences.png | Bin 0 -> 4505 bytes src/calibre/manual/images/remove_books.png | Bin 3952 -> 4993 bytes src/calibre/manual/images/save_to_disk.png | Bin 4466 -> 3934 bytes src/calibre/manual/images/send_to_device.png | Bin 4292 -> 2896 bytes src/calibre/manual/images/show_tag_editor.png | Bin 0 -> 1094 bytes .../manual/images/swap_title_author.png | Bin 0 -> 1327 bytes src/calibre/manual/images/view.png | Bin 3575 -> 3101 bytes 21 files changed, 185 insertions(+), 95 deletions(-) create mode 100644 src/calibre/manual/images/auto_author_sort.png create mode 100644 src/calibre/manual/images/connect_share.png create mode 100644 src/calibre/manual/images/device.png create mode 100644 src/calibre/manual/images/folder_device.png create mode 100644 src/calibre/manual/images/library.png create mode 100644 src/calibre/manual/images/preferences.png create mode 100644 src/calibre/manual/images/show_tag_editor.png create mode 100644 src/calibre/manual/images/swap_title_author.png diff --git a/src/calibre/manual/customize.rst b/src/calibre/manual/customize.rst index 0d6f75b9cf..d7b4e931d9 100644 --- a/src/calibre/manual/customize.rst +++ b/src/calibre/manual/customize.rst @@ -104,6 +104,8 @@ A Hello World GUI plugin Here's a simple Hello World plugin for the |app| GUI. It will cause a box to popup with the message "Hellooo World!" when you press Ctrl+Shift+H +.. note:: Only available in calibre versions ``>= 0.7.32``. + .. code-block:: python from calibre.customize import InterfaceActionBase diff --git a/src/calibre/manual/gui.rst b/src/calibre/manual/gui.rst index a91124b214..28fd0307d3 100644 --- a/src/calibre/manual/gui.rst +++ b/src/calibre/manual/gui.rst @@ -12,6 +12,7 @@ for using |app| is to first add books to the library from your hard disk. to its internal database. Once they are in the database, you can perform a various :ref:`actions` on them that include conversion from one format to another, transfer to the reading device, viewing on your computer, editing metadata, including covers, etc. +Note that |app| creates copies of the files you add to it, your original files are left untouched. The interface is divided into various sections: @@ -27,7 +28,7 @@ Actions .. image:: images/actions.png :alt: The Actions Toolbar -The actions toolbar provides convenient shortcuts to commonly used actions. Most of the action buttons have little arrows next to them. By clicking the arrows, you can perform variations on the default action. +The actions toolbar provides convenient shortcuts to commonly used actions. Most of the action buttons have little arrows next to them. By clicking the arrows, you can perform variations on the default action. Please note that the actions toolbar will look slightly different depending on whether you have an ebook reader attached to your computer. .. contents:: :depth: 1 @@ -39,99 +40,51 @@ Add books ~~~~~~~~~~~~~~~~~~ .. |adbi| image:: images/add_books.png -|adbi| The :guilabel:`Add books` action has three variations, accessed by the arrow next to the button. +|adbi| The :guilabel:`Add books` action has five variations, accessed by the clicking the down arrow on the right side of the button. 1. **Add books from a single directory**: Opens a file chooser dialog and allows you to specify which books in a directory should be added. This action is *context sensitive*, i.e. it depends on which :ref:`catalog <catalogs>` you have selected. If you have selected the :guilabel:`Library`, books will be added to the library. If you have selected the ebook reader device, the books will be uploaded to the device, and so on. - 2. **Add books recursively (One book per directory)**: Allows you to choose a directory. The directory and all its sub-directories are scanned recursively and any ebooks found are added to the library.The algorithm assumes that each directory contains a single book. All ebook files in a directory are assumedto be the same book in different formats. This action is the inverse of the :ref:`Save to disk <save_to_disk_multiple>` action, i.e. you can :guilabel:`Save to disk`, delete the books and re-add them with no lost information (except date). + 2. **Add books from directories, including sub-directories (One book per directory, assumes every ebook file is the same book in a different format)**: Allows you to choose a directory. The directory and all its sub-directories are scanned recursively and any ebooks found are added to the library. The algorithm assumes that each directory contains a single book. All ebook files in a directory are assumedto be the same book in different formats. This action is the inverse of the :ref:`Save to disk <save_to_disk_multiple>` action, i.e. you can :guilabel:`Save to disk`, delete the books and re-add them with no lost information (except date). - 3. **Add books recursively (Multiple books per directory)**: Allows you to choose a directory. The directory and all its sub-directories are scanned recursively and any ebooks found are added to the library.The algorithm assumes that each directory contains many books. All ebook files with the same name in a directory are assumed to be the same book in different formats. This action is the inverse of the :ref:`Save to disk <save_to_disk_single>` action, i.e. you can :guilabel:`Save to disk`, delete the books and re-add them with no lost information (except date). + 3. **Add books directories, including sub-directories (Multiple books per directory, assumes every ebook file is a different book)**: Allows you to choose a directory. The directory and all its sub-directories are scanned recursively and any ebooks found are added to the library. The algorithm assumes that each directory contains many books. All ebook files with the same name in a directory are assumed to be the same book in different formats. Ebooks with different names are added as different books. This action is the inverse of the :ref:`Save to disk <save_to_disk_single>` action, i.e. you can :guilabel:`Save to disk`, delete the books and re-add them with no lost information (except date). + 4. **Add empty book. (Book Entry with blank formats)**: Allows you to create a blank book record. This can be used to then manually fill out the information about a book that you may not have yet in your collection. + + 5. **Add by ISBN**: Allows you to add one or more books by entering just their ISBN into a list or pasting the list of ISBNs from your clipboard. + +The :guilabel:`Add books` action can read metadata from a wide variety of e-book formats. In addition it tries to guess metadata from the filename. +See the :ref:`config_filename_metadata` section, to learn how to configure this. -The :guilabel:`Add books` action can read metadata from the following ebook formats: ``LRF, EPUB, LIT, MOBI, RTF, PDF, PRC, HTML``. In addition it tries to guess metadata from the filename. See the :ref:`config_filename_metadata` section, to learn how to configure this. - -To add a new format to an existing book, use the :ref:`edit_meta_information` action. - -.. _remove_books: - -Remove books -~~~~~~~~~~~~~~~~~~~~~ -.. |rbi| image:: images/remove_books.png - -|rbi| The :guilabel:`Remove books` action deletes books permanently, so use it with care. It is *context sensitive*, i.e. it depends on which :ref:`catalog <catalogs>` you have selected. If you have selected the :guilabel:`Library`, books will be removed from the library. If you have selected the ebook reader device, the books will be removed from the device. To remove only a particular format for a given book use the :ref:`edit_meta_information` action. +To add an additional format for an existing book, use the :ref:`edit_meta_information` action. .. _edit_meta_information: -Edit meta information +Edit metadata ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. |emii| image:: images/edit_meta_information.png -|emii| The :guilabel:`Edit meta information` action has two variations, accessed by the arrow next to the button. +|emii| The :guilabel:`Edit metadata` action has six variations, which can be accessed by clicking the down arrow on the right side of the button. 1. **Edit metadata individually**: This allows you to edit the metadata of books one-by-one, with the option of fetching metadata, including covers from the internet. It also allows you to add/remove particular ebook formats from a book. For more detail see :ref:`metadata`. - 2. **Edit metadata in bulk**: This allows you to edit common metadata fields for large numbers of books simulataneously. It operates on all the books you have selected in the :ref:`Library view <search_sort>`. + 3. **Download metadata and covers**: Downloads metadata and covers (if available), for the books that are selected in the book list. + 4. **Download only metadata**: Downloads only metadata (if available), for the books that are selected in the book list. + 5. **Download only covers**: Downloads only covers (if available), for the books that are selected in the book list. + 6. **Download only social metadata**: Downloads only social metadata such as tags and reviews (if available), for the books that are selected in the book list. + 7. **Merge Book Records**: Gives you the capability of merging the metadata and formats of two or more book records together. You can choose to either delete or keep the records that were not clicked first. -.. _send_to_device: - -Send to device -~~~~~~~~~~~~~~~~~~~~~~~~ -.. |stdi| image:: images/send_to_device.png - -|stdi| The :guilabel:`Send to device` action has two variations, accessed by the arrow next to the button. - - 1. **Send to main memory**: The selected books are transferred to the main memory of the ebook reader. - 2. **Send to card**: The selected books are transferred to the storage card on the ebook reader. - -You can control the file name and folder structure of files sent to the device by setting up a template in -:guilabel:`Preferences->Import/Export->Sending books to devices`. Also see :ref:`templatelangcalibre`. - -.. _save_to_disk: - -Save to disk -~~~~~~~~~~~~~~~~~~~~~~~~~ -.. |svdi| image:: images/save_to_disk.png - -|svdi| The :guilabel:`Save to disk` action has two variations, accessed by the arrow next to the button. - -.. _save_to_disk_multiple: - - 1. **Save to disk**: This will save the selected books to disk organized in directories. The directory structure looks like:: - - Author - Title - Book Files - -.. _save_to_disk_single: - - 2. **Save to disk in a single directory**: The selected books are saved to disk in a single directory. - -All available formats as well as metadata is stored to disk for each selected book. Metadata is stored in an OPF file. - -Saved books can be re-imported to the library without any loss of information by using the :ref:`Add books <add_books>` action. - -You can control the file name and folder structure of files saved to disk by setting up a template in -:guilabel:`Preferences->Import/Export->Saving books to disk`. Also see :ref:`templatelangcalibre`. - - -.. _fetch_news: - -Fetch news -~~~~~~~~~~~~~~~~~ -.. |fni| image:: images/fetch_news.png - -|fni| The :guilabel:`Fetch news` action downloads news from various websites and converts it into an ebook that can be read on your ebook reader. Normally, the newly created ebook is added to your ebook library, but if an ebook reader is connected at the time the download finishes, the news is uploaded to the reader directly. - -The :guilabel:`Fetch news` action uses simple recipes (10-15 lines of code) for each news site. To learn how to create recipes for your own news sources, see :ref:`news`. - + .. _convert_ebooks: Convert e-books ~~~~~~~~~~~~~~~~~~~~~~ .. |cei| image:: images/convert_ebooks.png -|cei| Ebooks can be converted from a number of formats into the LRF format (for the SONY Reader). Note that ebooks you purchase will typically have `Digital Rights Management <http://bugs.calibre-ebook.com/wiki/DRM>`_ *(DRM)*. |app| will not convert these ebooks. For many DRM formats, it is easy to remove the DRM, but as this is illegal, you have to find tools to liberate your books yourself and then use |app| to convert them. +|cei| Ebooks can be converted from a number of formats into whatever format your e-book reader prefers. +Note that ebooks you purchase will typically have `Digital Rights Management <http://bugs.calibre-ebook.com/wiki/DRM>`_ *(DRM)*. +|app| will not convert these ebooks. For many DRM formats, it is easy to remove the DRM, but as this may be illegal, +you have to find tools to liberate your books yourself and then use |app| to convert them. For most people, conversion should be a simple 1-click affair. But if you want to learn more about the conversion process, see :ref:`conversion`. @@ -141,29 +94,180 @@ The :guilabel:`Convert E-books` action has three variations, accessed by the arr 2. **Bulk convert**: This allows you to specify options only once to convert a number of ebooks in bulk. - 3. **Create catalog**: This action allows you to generate a complete listing with all metadata of the books in your library, in several formats, like XML, CSV, EPUB and MOBI. The catalog will contain all the books showing in the library view currently, so you can use the search features to limit the books to be catalogued. In addition, if you select multiple books using the mouse, only those books will be added to the catalog. If you generate the catalog in an e-book format such as EPUB or MOBI, the next time you connect your e-book reader, the catalog will be automatically sent to the device. For details on how catalogs work, see `here <http://www.mobileread.com/forums/showthread.php?p=755468#post755468>`_. - + 3. **Create catalog**: This action allows you to generate a complete listing with all metadata of the books in your library, + in several formats, like XML, CSV, BiBTeX, EPUB and MOBI. The catalog will contain all the books showing in the library view currently, + so you can use the search features to limit the books to be catalogued. In addition, if you select multiple books using the mouse, + only those books will be added to the catalog. If you generate the catalog in an e-book format such as EPUB or MOBI, + the next time you connect your e-book reader, the catalog will be automatically sent to the device. + For details on how catalogs work, see `here <http://www.mobileread.com/forums/showthread.php?p=755468#post755468>`. + .. _view: View ~~~~~~~~~~~ .. |vi| image:: images/view.png -|vi| The :guilabel:`View` action displays the book in an ebook viewer program. |app| has a builtin viewer for the LRF format. For other formats it uses the default operating system application. If a book has more than one format, you can view a particular format by clicking the arrow next to the :guilabel:`View` button. +|vi| The :guilabel:`View` action displays the book in an ebook viewer program. |app| has a builtin viewer for the most e-book formats. +For other formats it uses the default operating system application. You can configure which formats should open with the internal viewer via +Preferences->Behavior. If a book has more than one format, you can view a particular format by clicking the down arrow +on the right of the :guilabel:`View` button. + +.. _send_to_device: + +Send to device +~~~~~~~~~~~~~~~~~~~~~~~~ +.. |stdi| image:: images/send_to_device.png + +|stdi| The :guilabel:`Send to device` action has eight variations, accessed by clicking the down arrow on the right of the button. + + 1. **Send to main memory**: The selected books are transferred to the main memory of the ebook reader. + 2. **Send to card (A)**: The selected books are transferred to the storage card (A) on the ebook reader. + 3. **Send to card (B)**: The selected books are transferred to the storage card (B) on the ebook reader. + 4. **Send and delete from library>**: The selected books are transferred to the selected storage location on the device, and then **deleted** from the Library. + 5. **Send Specific format>**: The selected books are transferred to the selected storage location on the device, in the format that you specify. + 6. **Eject device**: The device is detached from |app|. + 7. **Set default send to device action>**: This action allows you to Specify which of the option 1) through 6) above will be the default action when you click the main button. + 8. **Fetch Annotations**: This is an experimental action which will transfer annotations you may have made on an ebook on your device, and add those annotations to the comments metadata of the book in the |app| library + +You can control the file name and folder structure of files sent to the device by setting up a template in +:guilabel:`Preferences->Import/Export->Sending books to devices`. Also see :ref:`templatelangcalibre`. + +.. _fetch_news: + +Fetch news +~~~~~~~~~~~~~~~~~ +.. |fni| image:: images/fetch_news.png + +|fni| The :guilabel:`Fetch news` action downloads news from various websites and converts it into an ebook that can be read on your ebook reader. Normally, the newly created ebook is added to your ebook library, but if an ebook reader is connected at the time the download finishes, the news is also uploaded to the reader automatically. + +The :guilabel:`Fetch news` action uses simple recipes (10-15 lines of code) for each news site. To learn how to create recipes for your own news sources, see :ref:`news`. + +The :guilabel:`Fetch news` action has three variations, accessed by clicking the down arrow on the right of the button. + + 1. **Schedule news download**: This action allows you to schedule the download of of your selected news sources from a list of hundreds of available. Scheduling can be set individually for each news source you select and the scheduling is flexible allowing you to select specific days of the week or a frequency of days between downloads. + 2. **Add a custom news service**: This action allows you to create a simple recipe for downloading news from a custom news site that you wish to access. Creating the recipe can be as simple as specifying an RSS news feed URL, or you can be more prescriptive by creating python based code for the task, see :ref:`news`. + 3. **Download all scheduled news sources**: This action causes |app| to immediately begin to download all news sources that you have previously scheduled. + + +.. _library: + +Library +~~~~~~~~~~~~~~~~~ +.. |lii| image:: images/library.png + +|lii| The :guilabel: `Library` action allows you to create, switch between, rename or delete a Library. |app| allows you to create as many libraries as you wish. You coudl for instance create a fiction library, a non fiction library, a foreign language library a project library, basically any structure that suits your needs. Libraries are the highest organizational structure within |app|, each library has its own set of books, tags, categories and base storage location. + + 1. **Switch\Create library..**: This action allows you to; a) connect to a pre-existing |app| library at another location from your currently open library, b) Create and empty library at a nw location or, c) Move the current Library to a newly specified location. + 2. **Quick Switch>**: This action allows you to switch between libraries that have been registered or created within |app|. + 3. **Rename Library>**: This action allows you to rename a Library. + 4. **Delete Library>**: This action allows you to **permanenetly delete** a Library. + 5. **<calibre library>**: Actions 5, 6 etc .. give you immediate switch access between multiple Libraries that you have created or attached to. + +.. _device: + +Device +~~~~~~~~~~~~~~~~~ +.. |dvi| image:: images/device.png + +|dvi| The :guilabel:`Device` action allows you to view the books in the main memory or storage cards of your device, or to eject the device (detach it from |app|). +This icon shows up automatically on the main |app| toolbar when you connect a supported device. You can click on it to see the books on your device. You can also drag and drop books from your |app| library onto the icon to transfer them to your device. Conversely, you can drag and drop books from your device onto the |app| icon on the toolbar to transfer books from your device to the |app| library. + + +.. _save_to_disk: + +Save to disk +~~~~~~~~~~~~~~~~~~~~~~~~~ +.. |svdi| image:: images/save_to_disk.png + +|svdi| The :guilabel:`Save to disk` action has five variations, accessed by the arrow next to the button. + +.. _save_to_disk_multiple: + + 1. **Save to disk**: This will save the selected books to disk organized in directories. The directory structure looks like:: + + Author_(sort) + Title + Book Files + + You can control the file name and folder structure of files saved to disk by setting up a template in + :guilabel:`Preferences->Import/Export->Saving books to disk`. Also see :ref:`templatelangcalibre`. + +.. _save_to_disk_single: + + 2. **Save to disk in a single directory**: The selected books are saved to disk in a single directory. + + For 1. and 2. All available formats as well as metadata is stored to disk for each selected book. Metadata is stored in an OPF file. + + Saved books can be re-imported to the library without any loss of information by using the :ref:`Add books <add_books>` action. + + 3. **Save only *<your preferred>* format to disk**: The selected books are saved to disk in the directory structure as shown in (1.) but only in your preferred ebook format you can set <your preferred> format in :guilabel:`Preferences->Behaviour->Preferred output format` + + 4. **Save only *<your preferred>* format to disk in a single directory**: The selected books are saved to disk in a single directory but only in <your preferred> ebook format you can set <your preferred> format in :guilabel:`Preferences->Behaviour->Preferred output format` + + 5. **Save single format to disk ..**: The selected books are saved to disk in the directory structure as shown in (1.) but only in the format you select from the pop-out list. There are currently 35 formats available and new ones are being added all the time. + +.. _connect_share: + +Connect/Share +~~~~~~~~~~~~~~~~~ +.. |csi| image:: images/connect_share.png + +|csi| The :guilabel:`Connect/Share` action allows you to manually connect to a device or folder on your computer, it also allows you to set up you |app| library for access via a web browser, or email. + + The :guilabel:`Connect/Share` action has four variations, accessed by clicking the down arrow on the right of the button. + + 1. **Connect to folder**: This action allows you to connect to any folder on your computer as though it were a device and use all the facilities |app| has for devices with that folder. Useful if your device cannot be supported by |app| but is available as a USB disk. + + 2. **Connect to iTunes**: Allows you to connect to your iTunes books database as though it were a device. Once the books are sent to iTunes, you can then use iTunes to make them available on your various iDevices. Useful if you would rather not have |app| send books to your iDevice directly. + + 3. **Start Content Server**: This action causes |app| to start up its built-in web server. When this is started, your |app| library will be accessible via a web browser from the internet (if you choose). You can configure how the web server is accessed by setting preferences at :guilabel:`Preferences->Sharing->Sharing over the net` + + 4. **Setup email based sharing of books**: This action allows you to setup |app| to share books (and news feeds) by email. After setting up email addresses for this option |app| will send news updates and book updates to the entered email addresses. You can configure how the |app| sends email by setting preferences at :guilabel:`Preferences->Sharing->Sharing books by email`. Once you have setup one or more email addresses, this menu entry get replaced by menu entries to send books to the setup email addresses. + +.. _remove_books: + +Remove books +~~~~~~~~~~~~~~~~~~~~~ +.. |rbi| image:: images/remove_books.png + +|rbi| The :guilabel:`Remove books` action **deletes books permanently**, so use it with care. It is *context sensitive*, i.e. it depends on which :ref:`catalog <catalogs>` you have selected. If you have selected the :guilabel:`Library`, books will be removed from the library. If you have selected the ebook reader device, the books will be removed from the device. To remove only a particular format for a given book use the :ref:`edit_meta_information` action. Remove books also has five variations which can be accessed by clicking the down arrow on the right side of the button. + + 1. **Remove Selected Books**: Allows you to **permanently** remove all books that are selected in the book list. + + 2. **Remove files of a specified format from selected books..**: Allows you to **permanently** remove ebook files of a specified format, from books that are selected in the book list. + + 3. **Remove all files of a specified format, except..**: Allows you to **permanently** remove ebook files of a multiple formats except a given format, from books that are selected in the book list. + + 4. **Remove covers from selected books**: Allows you to **permanently** remove cover images files, from books that are selected in the book list. + + 5. **Remove matching books from device**: Allows you to remove ebook files from a connected device, that match the books that are selected in the book list. + +.. note:: + Note that when you use Remove books to delete books from your |app| library, the book record is permanently deleted, but, on (Windows and OS X) the files are placed into the recycle bin, so you can recover them if you change your mind. + +.. _configuration: + +Preferences +--------------- +.. |cbi| image:: images/preferences.png + +The Preferences Action allows you to change the way various aspects of |app| work. To access it, click the |cbi|. + .. _catalogs: Catalogs ---------- .. image:: images/catalogs.png -A *catalog* is a collection of books. |app| can manage three different catalogs: +A *catalog* is a collection of books. |app| can manage two types of different catalogs: - 1. **Library**: This is a collection of books stored in a database file on your computers harddisk. + 1. **Library**: This is a collection of books stored in your |app| library on your computer - 2. **Reader**: This is a collection of books stored in the main memory of your ebook reader. It will be available when you connect the reader to your computer. - - 3. **Card**: This is a collection of books stored on the storage card in your reader. + 2. **Device**: This is a collection of books stored in the main memory of your ebook reader. It will be available when you connect the reader to your computer. + - In addition, you can see the books on the storage card (if any) in your reader device. + +Many operations, like Adding books, deleting, viewing, etc. are context sensitive. So, for example, if you click the View button when you have the **Device** catalog selected, |app| will open the files on the device to view. If you have the **Library** catalog selected, files in your |app| library will be opened instead. .. _search_sort: @@ -274,14 +378,6 @@ Searching for ``no`` or ``unchecked`` will find all books with ``No`` in the col :guilabel:`Advanced Search Dialog` -You can test for the number of items in multiple-value columns, such as tags, formats, authors, and tags-like custom columns. This is done using a syntax very similar to numeric tests (discussed above), except that the relational operator begins with a ``#`` character. For example:: - - tags:#>3 will give you books with more than three tags - tags:#!=3 will give you books that do not have three tags - authors:#=1 will give you books with exactly one author - #cust:#<5 will give you books with less than five items in custom column #cust - formats:#>1 will give you books with more than one format - Saving searches ----------------- @@ -289,14 +385,6 @@ Saving searches Now, you can access your saved search in the Tag Browser under "Searches". A single click will allow you to re-use any arbitrarily complex search easily, without needing to re-create it. -.. _configuration: - -Preferences ---------------- -The Preferences dialog allows you to change the way various aspects of |app| work. To access it, click the |cbi|. - -.. |cbi| image:: images/configuration.png - .. _config_filename_metadata: Guessing metadata from file names diff --git a/src/calibre/manual/images/actions.png b/src/calibre/manual/images/actions.png index efee432da25a21b367a3cffb6f35f7e50e6e6436..90f1ec4567c4fb4567b4232fbcfa929d53586d8e 100644 GIT binary patch literal 37220 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 literal 21712 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 LrVlE$?8E*C)+eu@ diff --git a/src/calibre/manual/images/add_books.png b/src/calibre/manual/images/add_books.png index 1a0b341bbd2627ba3f66c61538b4b57dc7db6876..624a5bf8a5febba4f76446c37c4c318e06a1ace6 100644 GIT binary patch literal 2705 zcmXw*c{CK<8^_1eAj`-uds&L?8jLN*l3jygQr5;8+b}a3B71hKpEWckS+it`?1p5U zOr)_zh)~(HMZDwvo%f#mJkNPP-|xNWIp_X!6K$+a*w3Cn3jhGvO|KimXw{q+Cd@!u zwoYk&Oe=Ian27<PYDjp6)-a;<E%gC_nun}MZf9scOTcvm4glbIcN%n=avVZ5$b>hw zG-8@OdyZF4{hesi@W05&5wCw2?}fnv%BslMX^0I^LxxD42NoTGM`Qc}+$<6oY5eRd zhhhRkuxOMQ9#8=yLui!aUy4P#om$25Xg?(2>K=%Nrm&nUwir)5!3~Q9+zvQ7wX^<v zIU48T>qfI;0gavY4{4bB6g#+K{n7p?K&R06cp78+|M|OE4<umcB<AOTHYmo=59yBw z?2@xOXbgC2vqR&3k$}>*5g8hhI3>{kMzT8{NkvIn339sC#g)||S5+X&nlXnjJ8465 znHuWb1v{_a!uZ;b@t){RnO^VP>Xq<-IsxIy85Lqw>Y#uU5(eF%PZ5x{(Oa~Yf|Q9x zt68#&$-LOLmCT`9OvV>f!V(xY+@XotN(C2^{wJ=>K3YGn22-DW6l>5YCeuKmyjkxC zhlj80>UC&D@r!7-ujk_^f2VO2oxPc*6774xFQsK?OEB`#|2+PCn3J2^)zuX(QIOg> z`tf7uR0YA_&Mq>z5%ZN}ad&lUGae+?^>gP%Z7s|?sQXJtz#M&=s80D5@!%lD!otFJ zFiYMB$i(zbUS3|D(E$#}KTxNKqS2Qb9UotpM5UXVne8XE1g)MIPEJl1E-fmOGAtbC zkDlK&%qg~R19L0Hg63ZS-rMVaD6Dxwq}tv3*?gWVO6jCuCP7}l`bl@@=$J?EL3r7p zvQ2(P=h)#O*6{dJBhVcA5HytEQ#i{E=g&UpA;L>&nyn~%P)GGstbri?tc|D%6|+mk z#l6GL{Y{UunWjA-J$LfemGbaycD18pLV({C@KRC+G3*KYk`B^Y0cUS-KQ~fjt~BXS zs*dh~F+cgU5#pq^M1cDndz|z-dg`Z3C-n4$T-G^I(GunWCp(yz(bf%;%7{OSLi(}1 z9C@z5E?IhtW25?O$o5^|!&x;@mb#t@Y0M=;3K`r^&djtAe)U<gsJNj4e#Xb&-^u~L z@k-g;;X;hWz&y{eEUTk?(8QlMvFF9_Q@w@C%A4U-{AXvkMj|~4HCcCDr#OdD0JFIq z{B)VEsEYoy5}SPHo|d9_f^$^{8pQtUnmC~FqS*$HqLLKgU8KgqWkl5O8C?OLJ6J#A zynVZ8Ypb?WlGRREq+iEptm^hi8~1KUI=s3|<@T0B3kr(zV{f>>&vcpXQcOq4wsg?? z%!l;AHlI($mTv>U0WEs3%pvAg&m;8j+yg$wh)$XfH(_=ry(jJub`CI7s@D56laY}N zusi3kC<|5XpvZhVT$wq*S2jd$lxcBH<uv1E-bL|i*v}|_XCo%~!H~mn*vh(WTlg9U zz}jcTz$Y(wCvh)`&MUK0-d2Z|H!pbW6@tG-#z$*&+f8bC?S*ihGGC2HjUz+~*IY4! z91|eRc=F1=<`%yJ%o69gg+*spS~a7_?D5LxlXbp~$*7Ht{s9FcT|X@%A-*|c7x=>| zoLJmz@09vy`hzzjWA(AMOIw=8)Rt9Sv2J^0PqpatFdv=ptwuew2?IfG<U;7)+SPoL zOGo&9KihaL<>Bic2Tak8X$8#9R@ivgQHx(kSQ>?t1-}qyDv`;gDi(J(FUqU;T3khc zT`l7_dA4dtM{0R++_Kdjobh<j2V5`NsroMUR}|`7!MHRmNju-jY&0ygQM@<zV9Pu# zXvh1!<#cmT9RK!P$;#TC9Zjve!3C%N-J0A9^EVnGPtn=EUlTF*4g69#_QqEEZek|k zDqoM8cH2z3*!nx7s*Y^LLO=J>;Xcc|ab3g@`|p>cpn=b$&+NOfg-Ie=Me<>t#ofq4 zC$*zT_T^bTo^tM4(7+eu8(GFuNpkX?CJ3V<wj2xHo75`PNOguBURU(bU@)5zti0dn zeQ>(UmpZSnw>&+?XQHEec+BMq;}w@qpJpPpl0CJr+{ZLseEUhM_&eAGX02A<`r6hE zTvMF__~h&&0+;S~^zA9Z{?Ay;ZAV0!*FBZHIk&S902uurkNl>L5@p9*XJKX0f5jfk z<vOXsT|ZN)KzXxO=55!-NpQ`9b32ij4Omy+cO`-a&Q)yTT1(eQQh~_591=dmvL-E^ zDzGs2#yx0|OmA#rqKW_gWD*`Ya6D3{0(=g*GWGV>o-5+qZ0h^gyC7=wI9wq&2U+Oz zWUqpL5#gCOmcmgOb};%z!YE8o)((g<u1=Yb&W_}!q_6b9@-eOR%0t@~+#xsU!-tNP z>NU+3bH9ZmViP-ToZXG91rI;;RYXu!K6$6B6qD|`*)j!YNpIUF&dbjFm)+6MsBx-@ z>B${0y|Sdf^4M#m9sbB9?d5jG&ZCS!ddmhMKpieTQ8T{rg9Dp5=rfAU-);-YmZF;p z0<;#(iTD_yeUqwGcr-M^HQLe8eMxJn5Z7H$AW`4gxQ*J~sj972xz&V~+6;xNx~|yU zkoP`BBO#u=ssaycQ)7^xU^PfGkKD7$x`N5jIo<uR`^=~yR0CGt8R78S?BSg@NVigo zu8YWz+9(Ocu(2zJ9Ud$|hp+7b#6813P5l_w1YTg2(-sCmW=ujqY0#H>4J(y;h?*?u zJP5o|0uRZxOxG}<8Cbl(%>DF{tP_Fj;sm}pEBWxEjJ?jBt_uv~W(?(c-8JjD`ZbEW zYn8$jmmY{_lo7mUxr9<u?e>~i3m;$~lcg-TZEB4l+%U*WoF5J4Ssy{lSbZgJrZZ;4 zLtrv=WFmvEo@y-ja(8G+?)VAI^irO5p!HB7zUec{>~g<FVE|`LlGve6MgCv!H@GlP zlG34G7>JM;x^dhtsi)O=QPV54<cHME_m@`iwTX3;?R`lD!P?fNFT5$<nd!t$+h3VV z>HDj`in}*Nhz`TCIE|rJOve4MV|iC7z77LZbVMH<pEIc&Wi77(B>~>QZ=So`G8ZJ~ z;h7@A$+q$WBgF9Ybri8hgDM5|mAi*RDQkrSP8Prf9iag}!6G_1GpSPm!c@8?$&Pow z!fDvIefE4WJ?Gm%n|^`HE#Wxq#1MnmV(qj>o^PXn2&`o39Vak=tzDOzSfGm^mSL`E z`K|V~ho5iHFX**_KKP`jfSNlp0tfSGUMJ^78RJ9C_P*?YK&4*Sp0BniMrHk|^bckb z$yqKk%lTypS`#&2{vD+5E{-}-eOlSZ;Pq>_i~kFoCr>t^rHvVX#3G~3*JKA{cM%fR z4z~Hj&qvL5s|G_p6g=20fX1^azEpH+_YKz@ocYdc;+M9yg*^^d{Yxxz91Da`Nj)!l zVr8v9XHXq;A%8z_qPV2wAa9~{)~IRRoEosd;Wqu9%cgN0BuLYipGFkeBy^k%^)dWz xo*ZL|873SLYl$R`ecP1myeYHlgi}2MIYrddy97iY)4oywQzI+GDg)Q(e*l(k09OD2 literal 4054 zcmV;{4=M18P)<h;3K|Lk000e1NJLTq003VA002t}1^@s677JT=00001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO7` z0wM!gSG;2Y000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}000j$Nkl<Z zc-rlqdvIL!b;m#VwJ+^UD`_Rm56L#R107>KgbXe1424c++9XgyJ3~UDKs}kzq_pwC zOj8ObfrKOlPbevLz$vd}LZ?Gor<o3!rllRi(57IBF$O=dWn0M7N?z?st9{(puYcUV zS9c%MieO|}-lMs5_uk*{-o5)h=lA`cbAIQJq-=IX(3Z0z>e+q(T{p<*^W<_<R4O_` z2!s%*s*0v*B$IKH$po6FE<5n0vtjwCPiGk(K7|kx@pzI%B0)z-2Z2BURaFr}U|ANr zu2U=)DHNuen#v=DMSp)UU0ta*`0rPShE9;lWJ#y{Sg~RSp->1(l28-{S(cp#lBAkz zgb>)a4M3$*VQg%S(a{l-$tY{r4z$5<CBwrby!YNHD_5?eudfe9QP4Ea1KS0>e(yb` z@7Od=gb<95j&l6?G5Y&^Sh1q74Su~;DisbKI7lGS!Mb(p&@_!eATTfBexU1>;6G<s z7N%)(<j4^Ug-JGT+CVTEXoC-s%}#RQz(EEE){{=B(KHQ3Q5t}MKUQBaE+vhRk8|+g z0XA${ODffQetSD(V`CgVc$7_>E+QU}qiGtFBq4-Y5U307<IWe|-Q5I(+t|174c4wT zNT<{11o-lY1^mX17t+zu;c@%>0evCjx}-t~6h$E#jk0CSHjW-WNhXsy|G=M|%<=Zy zhZ!7PPb3l{7z{QAZ7wkDL3Ou<C_+&bB9RCeU9_3QhmVoV<<B45sZ?|h9Xdi+S1<8+ zyasq7L{olufwhFiL}d(c`c!*4)*;DshtkNB+;Y??ib5ihU|?W9M~=M9#TRcT5YU!C z_(MZO6pK3R*RSvbrFyDyl~8ZZC9}whnIR-(ByjdsB}mA`v^XIpJnx9{E1<u>pG;<q zp`jr*ZrrfEX=i+VoZ;b93=9l9H?0Ot^HEGa&6t*nVd<E*iD4TUmX2YWn3joM*SFam zQh$E^`U@Bvn_zr=VtHHsd+(h>RYOFhQ9_~6yxiPOY#}ghqiW~XNEZo7l97=Rw(VWp zY~<A6U(+;Vu^7o@7b7F5=;`TRo|d1<WXNPDNT<`-K9K6IwAuODz3o}KX&acf>1>vP zVHr(F%3Mly+ilyXx3`bU$vorZ<IB_XGnol23!>4eH_6sdu&q26TiBSkQMG%?wR`W+ zMl{SJ{*lm3G)*IsNFd7^nal(|Jw3|{{ORdwve`)ziDUyP&0IxSDUEbtV_K#+;ev!L zNgfS}YGQ4!346XEth>91Y<7%7p+GbmT|Tsv&reY(6bS}{4b<Sb`euH+|Jb%g6UuQn z10m+8v-x6#NF;(`m`l>{|3H>sC={@5fu?C_nl=ZYH>V5#u@C~oHmW4!Cmx4}Y|)x_ znvDiUQL2eNg+igQe84wNlbM+r6h-xNEX}Oj5IQG|Cje3PV5C`Z1_?=mqFKbU%qo~N zl9=`JL1K9N1R*8d5P&(y&bgI|H7Jr&GXi8;Mo|=0RijiYVObW6qMZBSm&;|!<qEQ_ z%$pvVtYrDWiI;1wx(cvg3DwZ53b=4=UUFFR?TP)h0hk;8`rOi3FitX*YD#gcs!=SK zD3{B0bab5i;2VaCVHik~<gGN>w%x$>jwfR}5DTfnm!BmWu<Lw$36O*jY-#qhgzQbq z60^@xKOeZyWLY-4Zm@)~{~)wuU|ANRU>F9rZ6nKagVou#<H-P?wO7mvre&a829{-F z*%qc{&R%N^&&m}^L6&4xSwm9-1eE|GHSBC!$We%>ofrJipzFGmKdLUiEDO$e0xIXT zuIn{c=Ke@Yk~lp*!T+56Ic1|v*(jl#I*6);3c$v>j}X;;?Ps^2+sEHuLMEh!h-eWu zBrYV>74{}$cj2a7F8dT>FAwnjK~%Y1CZErH=QK@2RaF#4p-`G;ypVAKwdVlT`|MLn z3*d!t;)9vW3^U~!W=aJrl?s++VHnP+v@DB!KHu=X=e(aUNiwRcRQc5Met1LpUj?x> z@S+xYy9%}q*v|E0j!}V4%NRhGC2s;h=Plp0Zr9_{bsbez8}cn7B}_!_KuDqic;V8H zZBeqyb6S2#2|HfU9CRcD5v`-a>vHMOwr#HnYgvFF3<d}W1LX5XWLcqDED{cfYZ6;R z2-ZZ`^6+nbuOS8O-yh4r%g&eXoO4v%ch!TeP7JiHaBxSS``t4$GgZ$_ClU!PxrLQq zc^n1;0Yag$H|7n)XaK%hlsj*_xt`yvl(SF=!2i8M2ye2rER#?uOdt?g9+vN}nJS9h z;8**Vu%L;q$z)pZ^(;hr?sxlB+fJKBM@M8yMYkU~u@;R+h(y9(fRoGRYJjf?p|$1D z;cm9L*0L<```qtzy&TK32n1B3(GHfHd?4^+u^91q4BIw6>Zu1|!3wDJdK}8BdOa<a z*39Z%%F*>Qu~>{)EVjJB4~N4f5^*$5_5jZ1avu1uuia7sO+26)*RuuJ`z_z^+gE## zNW|w|-aIE$$^gk^lFrTq<KsDGIpA5poAYtw07;UN<>uudf~qe+SA;u<23*ixFUQ@N zN+l#oLf0$AVi7t!Kim?+RI0yapKNyI%v!z!eu7jgMKCy9E|SS)YAn&epL_A!7m(Ej zTJ_kwK>J6QyB`}H^U;w(S63H_MEpYqzZtL#X+I+&UsqR(uC5e9%qFf*pFZsYVw$Fx z*mBR+#0*LhNl3N%9@`DJBm!!%foAGA+qTJOvtB=4FOy6r7VSlfxd5I|F=wnw`P8XV zjvqh4)KtmK@jG)u0!2~0&0XMd6JIVBiRxcX099RlQDmhiZQX2}o}OlAW~Q3hGte{` z7+6DJU+<#wxSxVrjfgW=vDVYmO}SjgFh(esEia>J+jb4-*01yW%f{W6sd|brZL_IY z<8pjHpZB~QM@bgxbRXT_U5h@6X0s!tQvEG~KckipP%4!e9)6FJkueOzu1RF|_V#*K z?|&7@wS2eA&0p<SUky<o$y%1h`1p9ug1u#x>Fw=d)vA?*!(o=PoYDIHa5zj~UvKrb zopE%1c4aG*$&g4S2!%o(!0rN!pML7+gSnO`E0qe9laqA|=mzO@H+_A*OCI<$4!#?B zxfVP+n(-(IAfL}OH8n+NXQ%gikUJ7w(3@GlzskWhO-`RaU8f)$RfVpuZhCvuOEREZ z6!2XIxGCIBW}HHyjNij_EmqSs;_<jgL33HY5Q3?xDGbAC;_DkkA_2O)yXfsrFUeqP zQ8>R|Tr16HC&^}WR4SG?4=m&ztoh&95-18J5>dLkQlwI;n)QV9*7CiZt17*{y>xVR z5RFF3<?`h7)0n0Wy#FOVXB1dynnE-hA(4pF*_m8&Wq?b<^6O=4YKrOU0);|>VzET2 zq+^;Ewk>KrBfq5!VI#{Ds;UqSszf4TqR}Yvc<h|v_OoL7^<GLi93~VB6N^PD7E8>` z6sc6oR4Te}F~(JZGx@4&pt@=nA{vc&_mCvKoY7KT9RJY4cTxtHSHokPmQ#mgIVlAv zonT|zZW_QjZ`*Db((zt&UH2*uT<~StaX;M`r&YB`E;m_?4U}qigj}7h6;xHJmIk`# zRaDhER#naGyDY$Wb2ZN9=51y_&nm)dXm6gIsm=Y{wuCGTFE`{*QK+hlWtpB5R8>I; z)eFGfcfy2MVj>X2`KimIR?`Kd{&mmUe2efb-bn@6zLbE|-s-i_nzTc8b4x&G^F*>2 zIm@!*jTkpxIIlRr_J?b<Wge{B5VXN>gWr}m_-*jpaxQ^C^$J&S{R3W}`W4z+UHf4_ zTif#6mhTgTp+`T#n!b%(@#t~%Hdc!We(5l~pDA(8L!Y7Y>{A>nwZU2>@CCV7AK``Y zXZi9qw{cVCr+nwtd`<0=C>`e6+dsvxtsbC%(^dTOuKy)xExf%!tQ@cG+Ro)0*U`87 zqkQ7_A9ASVt28bi=KDLYW!vB&eS??r$sNyesJQTUUjl^by?@X3TRzSWkG)C3HW+*1 zn|$s!x3Ri!fWd9o^5v)BqF|pb@U09l?s|h&U%HNg=qj%J(rRAc_1|PX@QUoae>;CO zaV<~3c95eleVfbP{s-PEEVR9e6b|vk!C&X$pC4f8wI{f4Viz~vzn>xiGraz_Tlv<= zCwcrA?=bX>zvELQ5AsL%?PF#^?XHFlM*nRmSKshFYwq8}lecXqT6&9}fAz1d`pS>k zf8q%HfBY4;9Q{Y$EuJOt^^<$}?#Zp}xGIf;LeFpC&bE_}@%+i^8fx(<PyZ~y_WN(* zW9bl~^d;Q-jn8v|yL{TJy_tkA;EP|M?SIStHxvBX4;&DR$9U#HLu~)XO<d~U@9Q@c z{*MK=1K0)LeBulI?q43|+Gn5Vo1b1m06<cS$Tm|W$2mDsA-wwI-2BzAu_by|z%OxV z_fx!ebPvD3ZY8NyKV9qokRKg=oA2#DObNg&a7>SLap!E}ESS2Ol$+pe)!s~k$(sIw z&dtR1V@#XQ{f--PwsZz+?iVwLC@iEMpmKsA?tX>H^>=XVCGpuG9=VX6kN+v1|Meg@ zU$K?-AG@A=elof!4n_m`BDa_CypZJHy~oLBN4#xx?_DHcc!XDT0@NsL1JmrAoUJC% zC*LGnsUEayZ#vv^b^Z5K2n-Tco%;=FQ~Yvr7LrPKAJf_b+X2EC@zsC+7MJYV&W(@k z^KrUD;-fe6zz=@Hs|WY<(gPpir#m0ut(ip!-y-wk-}3sJFYuYwwdvr%>Z|$U>NnW+ zVg@U+mK(1uv-_U!vv<5gd3-NV{q^I#TXwCfMSD~4>Ijc|{a@#qd!D3p<qfQl0Fgm% zx}wDHyPoCMOoejhHJ-fdNs3o|mURnhuZp(v(>%22J_et=g&Q7zooO4G{v~(Z`56EH zPL{H1g9HK_vFMhs5A*zYhq+|O74+0E_$X<v{EID|cw`SJ^$xb){RBIb|HKVjH?a2d zJ9v5HEo}05vQ>K%iEd>31uyewmw$wTZMX7V^3Qqt?#(za^F-Np?{4l)|Cm3ybQ6P@ z-o~EZ9XxaIR-y}P_bH(7_xSd|Jix~1xAVD&USle<fzMwy!4o(C7K5uc^E*3_am@pF zvw0ETB9hwwIij6jXoKIDHu!Du+tLQV4SrkN;J3kV%bAn^2a6~OjOpH(#{d8T07*qo IM6N<$f~+Xh{{R30 diff --git a/src/calibre/manual/images/auto_author_sort.png b/src/calibre/manual/images/auto_author_sort.png new file mode 100644 index 0000000000000000000000000000000000000000..9950b77c95fe044299ab13370efe3b7b0911730b GIT binary patch literal 1283 zcmeAS@N?(olHy`uVBq!ia0vp^;y^6M!3HF?%h*|g6k~CayA#8@b22Z19F}xPUq=Rp zjs4tz5<!xj1s;*b3=DinK$vl=HlH+5kiEpy*OmPimk_HQ*WW(2GO&<qM2TZ*Nk)DV z!^(AMJb*$xB|ssU)Z*l#%z~24{5%F>PDN#)I2TCVIlrK?C^J2ygkcT;87rVDA6T>~ zH4&s#p(HammBI8oKPOOz6C@LypH@<ySd_{TTks#GoEvO-W^r;(B2Z}&!}bGP`hmh6 zAmQ-DqP)z!bcO@c&)R`v>=6B>MaiiQU;j71hADH-&&^HED`EI{X4-zB7#m1gNM=b+ zD#MC*m(+nGiXahZn3F<4PBJnuG_V383k3s1D<exQQ-h__Zz32Nm|Hwu978<3w@$t9 zKRZ<7xc&Rv>vaFRF0?<^uc(%?xv}xgPS^EUjvSe><7js8_Y+eu?s$`LaIwO4Z=n8} zGm8ujFH4KF&yJoGX6~>_k;^DTQ+C6@q}=<{zSq9C)ZZeuqDf`mli8oQJ-3<vdCqg2 z^Ojz&CjXW%3wd~0zUK6o=F(HUcD`RKQ#SQ@6T8LtU)*AcoA&>D=Q=Ao%Cfj>!nv^X z`yO_$w0R#RqdwcO@ZZ|YD<+B5uPFHTG<gfFP0YTU){iHxRg5c*mY%Agv}L-?$;oG% zW-GnPWi-F}mFuVz<KiWTb&surg_GB;O`X_yt9!}bCmwOUd9|JQmrY2VA!B*x@MZtG zN8WBI{QX>F^2YfdYu7|P-tAem>g=bQ$+>G^6j^@!HS6R|MmF}oqEAPJx0qGWoH^&g zwXdu1#P=l6SZ2C?;;Z0%?mGg?cl%2|9$s^B=fz1Jt-M#$l!Z7A4K8@6N6$F&=KT@3 zead#<)t{EiW(KcsD|oqgj!0)q=h>HE<Tou`Km7tPvumg>YZTL$Z?3L4<Wwj3d_Mg` z^_`#p!px}L#$O?uuOHeZd0uV%?4Rsvdu5gGZC~z@zG=<6Wh<`T`Zg<i#=qVte`5RW z|37l8cpdX!df&^Rlin%l+sunHv-p!@@3zlrd%E&gk<`WcSDvg}oxc6CgE!lq$dv}u z);##Us>Xip=cB%JANHH385QWS=Q#QAzN+QbZAU+MS~hcsd$a82>g+lBr0L)VV?RDk z)^q(T8&-0yn($`nn=;mR-=msAW>s5~+n+~2P+z2Vv7vjry?&5J_=nvhZSzWlw5C}W zui~D5S+Bt?h`+S%kMij=f0+($=npv3y-)JZv71V4yn%|gYo+4(sy~=(^4LFjG3?4n zy?g5A%q2GtZe@}0Rr8o>*7s$raNhUD9PgK|4f)%dcedE@$H}RzyO>qi&HZYq^5FAH z6XDO<kN&IflkyJ!SoKo+jY7!<b^je~YY$0_Pt;*!oW9%p`KKq>gJO1-_H%EPF`v%k z6zlj){`~^g7u%kNB;Nl0E96et!b4sa#mQ#p+m%oM*_CwR@@>EPdh2}-lQl#(evRF7 zxOgVx=|^3*a&`^Qb82EX8yBpZobg3LuAe#hO@{uYZ<CZO!(vYyf3)@czGF}GANEdX z<NP`M-^PG4>4>wUmH%fKZi$)Yf8S;+<8-(69oI7gV?JHoU11)uxG=P3%jM{Y#vi$^ g+T7>Q&^N1Rd~(=-wUgs%P;tlL>FVdQ&MBb@01T`_mjD0& literal 0 HcmV?d00001 diff --git a/src/calibre/manual/images/catalogs.png b/src/calibre/manual/images/catalogs.png index 8e5ba480e30141723ec1be9dfdb856eb755e8576..49357d15b2f7bde2cbaa51512d97731a010217d3 100644 GIT binary patch literal 13227 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 Blz#vK literal 8581 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 diff --git a/src/calibre/manual/images/connect_share.png b/src/calibre/manual/images/connect_share.png new file mode 100644 index 0000000000000000000000000000000000000000..0275089d1cf512635fd0fd73cb18f65537cf791e GIT binary patch literal 4929 zcmXw-byO70*MOHLmky;tkw)p1j-`8-?v!0=SW4+wMN(Lh?p$dJrAt~mq@+PWq`N+R zzw<k1?%Z>q`^=m>|4yWimNF4OEj|DMAW~HULmsl;Ln!0nJnX5QRwoY$!xN$`52zTX z-+m~t9ON|R0D$T^f*Wh>hZ^LjV(bY35O@CzjHKtpbPo_0p{l8fJBLqB!p$yM-nj7} zQZz!yc_Cn~9)Qw{A(aP2h<HF?drw;rxEliQ>H?quF)=@I{C`}*)y>ZX?f^po%1DO9 zA1LvE)WhETpZXL5ceV!zpOb(dI-q|YsOu|)kF|$Az})TrpHA@K<#111C+i2*1JKZ3 z8~1?m{$WFF4;Q$L1E8I5^W6i({r~e`9=7&?)BCX9|7i-Y&d&BO2*BA;a@zyL`KRf@ z5l;4ilE35Z4}|F-QTX3TdjCce;N#~L|F^`R^7D%e35yE|zHznA2LQ-ARl#z4z7~6C z#%?G>@4Gi+t-09Tcq}Z{s;{UW;)R_A#W>q*4l&)o{b`6#D^2aJaMzSGgFZe^py~^Q zZZai-N+%_C`omJuV)4|Wa(rE4zI^YQ6acfpT6LIfU88A>&z66~wa8+gsc8dD;;fGM z_WXY7?cZ-pQu9*x&NM|uMWGk<1%w!w7<=2>a+a1)UcGt+QMyP6bBKyk2@4AwHF<Lr zHn=Vk$Hv9wfBQyrd3m|SLJtu!Y+8&xJM%^*C3U!+{h3|<yVxX$YO!z~z`0~28|drP znF~1G(WjQaIp|t;tZc#gG<d4n`E<kc$MA5E@{@oQtWmvr?YNn^U%x;<85l2a1J^h0 zY}SzYDH=W4+C5M3@MBbSS3>9a6b+JT=w=MjBN3EsGQkypL1M2K4lZx{`iI+*r;q#k z__$Hsp>w)jwt%`>CxRU@OJ=R*s~^&4-=@Q?Khr@)*srdYmTP8p+Zw55E~7Gi4{_<R zj1=S{7#K&xi@mVxS^_C%Z%M|6m9enE3v(^KPgJXWPxgBTuSJ-<GJM_pl&|+NYH$CN z;jo!gXQ#<&&pb7o5Gga)f1iC<IO+=*9Evhp{<dkMqmu&=Zn?YK4f+C~U@JW8u;MG- zIlMU74Z63yId1_`qX(_a%p!SvGpqbq1q9Ri`Gg`pw_G}Q4{hfO94TVG&K9I@&d&JQ zJP4MJbP3f*!(|ObH1Z56C~>7JY1e>970yI_v_$UP{ui!6-BS|zRh1laIn9JE6Ba9& z2iQc^sZ}fE8xn5f3$R%e+^{m|8qbk|flew*e==Zgbv2n*u^>F}o=J9r&ZBdoina$S zOns8ROiWG2M{VEX&({~kmIxAcm6r80CZiQa$p~*IeI{|cBw@y@D3v#WGK4B(SNQ@e zW$=mzqpSdZLqqM0O#yfVEy?>+l8S2!><nMMgUEmFkj7xN(HQuU;?T^?o`jR6<x2Rx z(M`#Y;vUgwmGYU>0iqFXvs2dhD<9!Ef2W`NU;0&bM!#bwKGFPYbsnXcB49Q2Lyk|7 z!i8p>fZ}c?yV7caw&}e^byM;EF;7OP86Pihz5$6il3uM-N=Y#K<;!5nW0j!n(aWhe z{|_Je-xA(Kp;{SDM*stw3G3nZQ4}5JJF1=+NAcK+qrw{-ov1{DFF#u>Z+C^Ghx4lS zB;RjzN_9*29M5en`o8c+2Q7qjtiVrv;<_Z9mD`yitTy(1wAOv3I^ae^2ri?kTT6>5 za_2N%%0{rf>VptT%-q322c9HU1Z(kGUJWd7iSNTUpIVAd{0^zISMHt*Va$m1zP!Ud zR*w^pQStXcpSTXk$I=Dd;6~LhS=!Dp)ky?o&OA}Nl#3Iyws<M@I#VI#(Y4S|Dg5*9 zNB)#_H}y0aVA;oyF-5=Sc_`)k8kLeTO2rO^p?_W;@FRPR__=b<&ZE18rLikV4`v;( zNHO%AYk>xHv;}Qrc0J`X#NAehB@SSxQ?VDFy*m413$|lI3)a%1eWbGem{V=XV=(lA zf8J3)1o2Js;Jxj!xVf8g5w=F@Gjr*5%sZN5Aj|J#jMV_mSBag|&$V7OihUoxlw=eu zBW7K+$X&@K7oU*tlB0FO3RmJ=rlNgD04$qlP!Egcr^ZtOFLy@2;DX1Kw1H{H{OzJZ zd;~;owO%8uwwy+z8eqLZJ3Fk2i3wHx9wY{a?d!?Vj2!Jrjdr^YF#R)Y9t;IpVRAK$ z@Py=4=h$d?or$h_63G`|=X3y*1?2Sn3le@|U;T(^dr<AXCXYh`>H7WM2tjstg|zXb zY<+;ee$+F6vBkc16F1#(q%r+t=3=`oZ9?d4h4gGoR>FbT6yVhN;58sx1KfVlFU)Rx za6M@!38Z8nJ7O2+@2qk+e|ZG<SpN7l<Cf*sdZ&)bW1^1;-^IQJ>S^UjDjn~Ar}w#I zHFcD)Fb3Gys%5AYxhuM71Nj-0DshdGPx0;YS3W8h88`>!dUMLtG-wYv{q~`KUgZaU ze3O?9Ww!03l%bC=2ubEi3{GWc8+57uz(8Qtdp?t&Tfu_lRQo;6Jq1h?BTa>=)`!0Y zwq_%+bn-{S<S{y*x6|4kPEQ%y%ufsR3(-y|TfOznRH^cPI*WJlhgJi(CM-}dX+1Yj zj4B^9FUf|u-pL|t-=*Sa2Se@cNtBNT7!GH$%f}o%5Ie$Z5B9`~FlI}^w9tr+X6A^^ zDXSseZ@umM+Jwr!h0&p(8@505o|JwWp|SnRk<jLJ0EpUjh<sVak^aftD7fwJGF!TC z?b#FMUsp^9k6x*R<8ur6wY!V*IB@Iq72TrXP1o<Ver7VF43bu;Wacw#7Re12vClpm zRvLu3)D-F&1YY}mK6G=#$y$(qESfyv($5y#<;>S*_7yl%ZW`Gpb%Z%-K=qx0M~0U| zBF%ABMiP^tCf?BC1-~6Jl6{Yhk;rZ%*IS=I_ST=O-ia$tJzu4LffFtB>a^>5Q+epP z&4t}f785}kV|5$0Vu>j<`uzU2==8{VLZMAN(O`SKEXT_l=Xnv|?%V?OPX|d@({xmn z=+&686O_>ps!3xp+o}Ypj0Z>l?DzWswHebcyf35+yRaF3)<iG(8mwmN-%8HAhn5Qg z$XKSjU%8zgOW(}wUmsYh&}YJW=Z=8Q%`KEcXSc824k7vi_7fhrSEr;o65fAQICIka zSH|4UocBpboV$njon`GW2NaK8skS`+ie@wOwgF714fB=i6Qj5d+}#WV?`8T1e<*kD zkPDT?cp;+-sVb!~ZvT84fiyrrh~h!*=Ucx}{ur5h8WnOvu7>O`8*wdD8uYB|v&X6m zPv9(V<lg;UrGH_>6%#?6F2MW5RrYTn{*h-qtEpB$h#OU0Jh!oF#|(v)w0lOfDtiFT z=#%J-duqyp6ZVIq*Y{9!Y;49Q2_tzgBywmtQ&hMpH|}wB@-}D^W^-$rSeAX%GzP>4 zn+6DYT0=ql@6g2Wx^sz}&;=c<2~U?g99Fi7{d&;zhkN<vKtEGN5(D{udY4eLsan#f zrEi|a&90G}0tGf!NSg#xq-nh`PXmDxzZHM7Ucko&tXvZP&LuljPX6LQ-oS)r4z3rF zNO+VzB)A{1ZY*Gm^?poBHQbdkOUHIKub=?j^Jy~kAf9#hUXP0BXPx7Wy!C_!#!gbe z@j;)P7zTY7M{y;4nXK=T6sj5&l3NMlSR!%fCrl9I7s&2+e8X|~WVrqF+m-!Xha1LL zs!L)$1HA!)#>x2!2Ovj>%GqhHDLE@9W&j5dk1oX2#3UKzcDP7VC^fZ_3TPxP0$rI! z5RA_(F>{#~0nEP%9Bu}Wr&k;$0VZv#msh&pseMpaSFg7Dj<2hXRACBJn_^!^K$`ba z{v0x10-r{Fe^BraIUG6Z+S~64C`TF76Tz;M^}aGNGU8ASMnps$u?a#|Efp0bfDK>2 z8V%zop$Ec@J{y$FTUcayWHB{yMUr47><qR_!s5|iu%j?MyiGSyzV)08TWP-SAI4Ql z{j6fL&EROBkZ~@JEqPUXIywbi-H*)|Lk2km{c?WTs|E?0!G4t$S{}J@oq*TGBO-;G z@*vWV^+<v&P|gY2i!8vpS8Tx@9=!|*;pJ5a{4lPu$(iKe)9GE-ESjyUrF2C(E?OQ8 zX~g4@s;tk(QpfCZz)B#Wo1gz&aq1cPTGs0tcHJ1?&#RnXi=n2Pm&ydg3Wcb86{E%i z$6rBqkVqsSKYuRJ6R6EO#TF8LBu=}oW0uyMU?96~g-2VMh_=wzFQlhnZD?z=^j1oK z-xY~<veOcXr^gc<``nM=1L?TwI1Wc);y73WU0>oMB_>v4!Az>7w&Q>88mhKGtc}zx zNF?5(Z3)NMDVIMf8$pkAlJT+e-~khvP)0yiH#j+>5O>DHY{@pr0$P)*$HWlOb87s9 z=?y)Dae=-(h|!r<KPwm#kRLKRlPl%Nf%p(Oyk8*qlm=Aryd+3Xe!|+TWZKM{!E&5) zJ2MU^hJ4Ulh@ecoB%6q9DvSShqXJvu-Zmi7R^Y5a;aN^?kX}#=X5JeLN%5lJ`4K`y zCs%V=Fv0fLf{yx9Uxq9~HaI5gHQGl~&w+?MWHM=mg4J+;k%mq8`{^-kUX89uQ(hpL zWnR=d7$RSa#tMmzU=*j-v)C0f_4E6NUyMg9$C_jE!S6@woLzzG-jqe){;!t7gz9X^ zx=OQez$~L&g}h7_S*#axu}Ytth<{#|+CmuOYARz@XD!3B%WAocWO~~W+mJU-CBIm8 zfgl{YJT6Dh{PIct-sCIj(hOukT72?ZIpTAGiJrw4UmchnPmObbW_p^dZnI_f>1)2r zXy=rByC?M%S=o@J;bm#=V2>jdA9wCtlVC(I3to`m?BrxY`vzkcq;J4+Q|UqfnS6Z% ztE?<U@b9Dz)IYrbsYfM`%&(Ymb*$8tk(RgTlX1F!Tq!vd!!?jRWo2de-D&QHwjfJZ zRNYP@Bb>~N;c)?ZNyNBX6m(TYH?TH}+q52Rqr6w=(3>*H?=C;br0ANoO^Da1rSXNx zvk0~BU|b7@1lQNsOGBF!`rq8&o=@$Pges)>I-=bXOo<x%WOg{0gq53bZB<nl8(g29 z?JwQGIMhq6AfVzY=pFPds*Oak+)76VVTE+G4#(`2Ni}3(rSE5#{A$!baj=kMq~Co4 z&f4xi7E~0HG%{g9k^3F4DkfFrhm&&vmH24>>`rF>iiPaJ*iN)K8Fg^(s11Lqe7UbM zZ>oBw`DgZe1IJJuW&+q)uPxU&1$(J+Pa(GQKY1t3R0eUzl$IUO{=5uUJ@Yf^EV4_z z<2pAC-tk#}<9f5_@H=zL20a~J*%t1d4R+jBMT}6+gU>%1H*ew8?!6bMq$pLMOHR#v z*~bnjxlR;p5Ba3?NqX2uNed5l-fw_v1!W|c(>HjQ6}vOS!-aV4;>07j46%p9D`guy zB4noTFwVf5wj;PJ`>5pi>x`ff`sAEM<t&w2^55WduWY<bgN*3k&UCS0c+barmkj^i zk{ftTJ}mjV{3Fs?EC>zS#nNU4G-{(j7j_~t9|}wA3s>B2FQU_+W_RSD75qVacUTTC zNa}#bKD+d|ylsTa>-o6F-t@Ugec=+8AoY{&FtJk~>v_s^>21WSc{#=&uG=PeJ=K9p z(rd8LT9}lV*hyUPK_@})D9;`*J-*<yH)AnzYp4{k$5c7}*&L#=lp?Or7Z|uhZ2o>U zOKdSbKj_JHlge9st!H<e_1yS6w`n3r{g^Y{bYrA14a(yT2OZ9t5w-Na5^ojGcPy_w zYcs^-2GJvl*GOaxY^=9#ZIPWJqchzEX!p_O*B?|{HG<56NEabQQt(9lm|^Ao=n^XS zHHeq+ba$)(#?WE!*LvO!>RY_HsR}xmS+SS;n_e6ot6UTPWsZH7myvDdZMQ&c_;jVh zT8!Y=lt!8FWI@K*zt8$rHI#NDsVM{-ULaPil?g<qzf3V^=m?#yWvpwcs}Zx;pPJiL zq>U`gzV%%=TZ5?zjgnueFQd+uGuPVR{-}<wV@Te||8t&GSFpQEv+ytxnQZvCY(;i~ z;;R6$VD=N+%{Oc6;OVcs&#)-}Fy{crR}%f@t>)dE3o%Kqw~S(w-DJF3?+?@1R$c$< zYh^g2sU#)>n=xHW9+OOo$}We)ji+Ko<<HZW9J?#E!A%u@O3{+Bh50?C4&xDT=&v>? zu9|~V*edQwe@XeO9Zqm9li|_-WG}yTVlb2$au6J*zhEV19f*n7T6+s49@*aGrK3=R z(ck4&jiwA`m8-=zU+sJzJaSx*kZ(eHJHJzRbGc_pu1!{_;ahkoyCV-RBseB}5_IE! zb(E_*q}o`&vQQfKv+dD$6&EY}edD~2XtvV3K#rh`?@;=|L&rvz%X<@q!>{B>w^McT zy9iUp+EvT1nhr(Rjv;11Ha~nM?_<Aq`CFpRiVB`n(Uip7sreZil$~#}_i>?BKtKTA jsNMU3c~Q!cdrVG4&W^`3jaUy~KLAxlEpUarRp|c#%RfHf literal 0 HcmV?d00001 diff --git a/src/calibre/manual/images/convert_ebooks.png b/src/calibre/manual/images/convert_ebooks.png index e82725e17079684e79fc5ca4da2469af12ba9a65..2218a541b8d15504a1da075b8f7e84806e08d913 100644 GIT binary patch literal 3788 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 literal 4742 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 U67gQu5C8xG07*qoM6N<$g5mZcjsO4v diff --git a/src/calibre/manual/images/device.png b/src/calibre/manual/images/device.png new file mode 100644 index 0000000000000000000000000000000000000000..ce16ea67b49470ae75a4f100b72257c1e01514be GIT binary patch literal 3152 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 literal 0 HcmV?d00001 diff --git a/src/calibre/manual/images/edit_meta_information.png b/src/calibre/manual/images/edit_meta_information.png index 061653a60acba6452d61d27acbc148a8e2270c60..9f6805076746311b3aff27b062c8d06bfb7836fb 100644 GIT binary patch literal 3574 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 literal 2555 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 P!<Z~gtwD_@UP=D|0_o@4 diff --git a/src/calibre/manual/images/fetch_news.png b/src/calibre/manual/images/fetch_news.png index f93108db4963f7c6487fd6a26032595f907f87ca..a0116b15aa7765dd444bb85526434c6c6fa76a0b 100644 GIT binary patch literal 3101 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 literal 3132 zcmV-C48!w@P)<h;3K|Lk000e1NJLTq003D4002t}1^@s68x<=*00001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iO7` z0x>oA0%&Le000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}000Y@Nkl<Z zc-rlpdyG`o9mhZSHP79d<*|Yb2n+HkMIMR-T~R5GEos#%wi>mSsx{Wewl>=Os?<kC ztFcLIOQ@#Wmf9C>6b#xJrIspbB^Z>YP$(2AuY$ww?9R^2eVo%j?%dhgWoPasWmbmH zNp5oY-rt;i?)QGr_xygpbIvNM)P705RJEve2<jl$L9UlzMXyGs`}Q5gwq2=L6s6Ch zs%r82F<)F&i+25gTUtu*d%r2Y*S`+O5eVTNQ?GljVi-D>WfG0*wFC0u!zt#?yXd4~ zk(3f4#DMooKS(;A2J*E7viEWT2RrlR?Y=MB7|{_D!n#6ZM5m*pgG?qvJRT<$3enZo zMIw>FvMf3}I%sNYqNAgOWHO0qniz&bcXv0A<B&)sux*>BrY6$qG`U=kXf#SDlOYre z(cIiz5#Z9c)|6a8Z=>Jd(LraARs1_*sEi&G;Yhc|_~s}x&PcFj%NB+V8A3jvr@g(M z`Sa(qcI{fmj~|b&>vVQ@vU&4nX3w6@x^?RqIdUYet*!L*^sr;c4s6>do6QoB$4RHt zOqw)_b?eqKefo5U4<B9;;F{HB$LVEmLs-Ku{H?1hV~0oS%2`;BAf&tcoJ=OkWHRWw z&iL`;Q51#N)>c|tTG+mQI}HsDB$G*`luVsEl~gK4EEX&1t%ItnG&eVM`0!zl9z9AX zlVQ}TQFL~8meu{iEJ`(kkqsL*anVH|8+82@LR9Sfl>kns(`cGidra=^Op`bBRR`A* zf?O_F5#UHTjIIy-x<iKysj4nl1?1ia%c>75mTi;ISN@RUPzX)a%C<#HS$iOR4NoKz zB&zJ5`GFI3kgKLnR|RC-wgJfJbH(#=#V`y)p)fyMwGm5=qX0QuAO&a|Na@N!*wC5Q zEV*Rv6nc6x*tT8P{{@IfW9Yg@Hk<QpZ!8w8Sl3AjvZ5$OhWYhEDP2ZpEs2a6=&Fk2 z*r0({K-orMs2W)-gOn1>vif*1<=deWL<PJy)Evkj&{B#(`YnYdZwa)Jf{@?{iKYpp z1j})Vhcu)R2qADB#}^b;RRcZ0Z&aw%4#<{e6+ln|G`s+o0@=KS0;q~Y)^adZ1zQNB zhK?iQ$kFZ+aLd>04RWr|D#y|DY6xU62_&WP)jF@MI*vrw71CLYSV$vesANo=sG*}O zu=8LyGlxpw0nhD4eSPOsG7IOi$OS_BGFed+Y#<!c2pbxC+hueltdocu97yFb!YU|g zp<XJoxLk-I%<Zf(kUd8GbXHVVC7FyPbOS|!CN%^K#0-t@oI^aWLteoMM+;HgzyoS& zMCWPp@r)ximb-8YT~#844CL!JM-)uiL)Ml^N1_0Zt<llhO;|Hf6q|9UB@2Vpz&%7! zl;ZQe5AFB-nwJYV;uC@7;;IWK4w#D=n5oBVvg@w(1>cnx@u9M~>P$W!nagIgeL(f< zC@t}Lyx=(uBo+S~P&FqPmSq+qKdYEm=$&?QHPv&kq;$`1yEniPVqia5%IJVh_6Eaa z*&R$SYLdyN-bIkG+Wjy#j$;>q5d*%w2V(z}rmCt4;gqp;0=3zFrdE4dI3WbK?fB$5 z+#IfH=CLfhBGbG`&os?q59sezlm-{>M?OVC7D5!*B?i>i{<hu>hrg{Xi6|?#p{c0} zP1ES<=?NqWZjUo+6=XXQ$hK|!+Dhr!I)Q@>zdCDHlY6DY_SIw|1e&H{+m5fTr}d6w z`vw}GtzVt}vxYV0!j&F=wjSeyNQ;~2Z~}qs*`AUh_p;cZovutc$7$=&WUm(mVRBHr zlN4k-5OD5c1+aCB_H~ejz_P3&^ZZ`Wo9PH*>(v<q<REg@Yg=O=ds9R%I~`wkdLP8k z*0QXkt)GNimW8hCf&65z&YEPh7sUku&K>yt<iZ2l--WX*3r*7kG1N3o-(>|Sr3;tO z=dmm^fX-T&rWr^VOPL%5WK~rIG1N58+MBHwLXgkr18Z_VpAV#;wrv*x@z-Pz<RF@C znkJTI)fUK7$^w(EK<xBBh@Y+3t%G<MrfHUh%l^Ht=Hx;MK{lH$%77opxm@mqgPhOj z17!gLa=BdX$%SDUD2hTj9QFkx6bb<luCO4mf4z}N#J65u*U>bMNF)*{;;Xr&eKZ=Q zxw)Cf#s*)l3x&eOVlfOu_hnNo79$*v6lSC=gWS;2h^nfDLjIYxWU{F^(NHrW4;wa= zbUKZ$>*%^sG4myapsTA3T{p^Z!0DACNiLTo7K`F7L@CEY?^+^}=wo}V9jK~CEEcO8 z$Vz=jYV}KfA735hQ={k~=EJ?5ueYkQcg9)v*?(7Q-5Zq7@hQc%aHShB2YVyVpn=?* zBesg?Zhk_PWYgT8qHeS&3Jbg4B)$-`n9v_+fnn(mS54DURrg#~wSxQRUDwcc4NWV( zuA}Q(abWgrYYJp9v0j?EcO1JUAM6xoLi*qDKda&bE&D73@W5471x?fX9J;RKICc?i zUDuFOFMK$GuInW|$m>lm4Ala<Dj<6=91e$%i3B~CdJJ}_o=O*YyZ1|_q!N?+?%P&S z6pz6wnx>X8y_D_hsjJC-U(n$HrPRHPI>>d9>!l8I9ppO5A6iMT=dzhs@m9JHa=laq z<n($jYi(iZ(2}Dy0OL+kW>zm4NuJN@O)F_j)R{T>a$z1|&BI@yZSn+0j-JK*FFnJ? zF5$9x#v=Z*=WQ+>*O&P+w}+P=xQ@A#CUE+Mi@D+HjikMqC(*^GXTQNGXG~_~h%=cw z|0^utoEdnsDZQS{rhkGTKUKlLT>Em{SkktD$F>({sqI6&zU)0Z3qQ<lf07H^9${<F z;?S#)aqR`O7&CG#<7QpK9Y1TQTMQb=IkrBvnEST0@x3?RWA~Poe64W>x7_;<>BjR| zwdwa<aK`zp{?~p|yS!e|L;GWkxqnL=PrUvfyEZK6%Iq3;_Y|t^-p2B+GkN%xjqKh1 zHqS3Q#1C&@!R~TXa24$<v@blG%g?r1yCH=QSO;F^(dAFD{sRHnq~3WG^Xy9*<FvEn z-qno0=MQY&vxCj6?qSBx-|)|#YJl8XU}UK#AKJ<DtKg<bZ=`KhoN!_SmwxlB4Ex)! z$~Pjri|1a^xbg9unKvd*WXNPLzw3U^YAD=~f0X+kx{h;O;uw+BIQQBwGq&SR4wU=1 z6_xC>mD(3$!qpQ=ui8$RwAi=$1^%sWVc8ppab!3DSk=Ykt6PaFIx$s{-oKl@NAg6+ z%wh3^4>6;m8XzYNj7$}dT`OserrCCAGY_0Iwg`Un)Z5u`cpp9G7VcPG>@*vhH8fNv zg%@R1tT*MT=rJ^DQnq(ivbQR=PoZ(j=NPqbHG7WkW#vkh8y~-xp6AxEuX8Ui?r-6m zDGeyGkFew?w=v{TPqO&pnM{~{4G+A05OdHp*=Xd<5i@ym)9zmIQ~UW~=kJOGq(Z+< zlSU&GLS4L@GOIu0__R-Ln$Du+-&wQ%7p&G6an1RkWs&n+R{Zr<+LKo>vq=Rsl4pOO zrN4Zc4cj)eZs`>MxMV5qnZW`%I)R%%BY65-&+z8XG<iGAf7)N;2Y24XyIp`5VT7LM z{X@ClfhgL_4GV34diS%uwXcVK$2MMi;t}5Ot^&w@?bC-bccIOShh8Fb{X$yer}OFS z3|{!ouW=U6VVDkdZQ{<mmhsxw6ggXf0uq57JntgH<U4-O_vf_p-7DuXZqzj9-MWI* zc{ee+0f<fHwyT<0wqO#&i{3?yX?H)*gOmQu*DsvLxN~mh#n`79Ta{%GKJCNc^aU3Z z>ln=!FByS>!N^OlXY>bAE?zK_5J1C3Zkc<8XBN+6+~~9T_>x^*zVzFi6%XEu`nrpH zSX~FXUQT#eT`vQcp+j4axt2=puQT~Xmi~bD|GN(I2?lx~fa@Svk<oRK>)yqwSN;o9 WFykG)QH)Cf0000<MNUMnLSTY6Bm+7C diff --git a/src/calibre/manual/images/folder_device.png b/src/calibre/manual/images/folder_device.png new file mode 100644 index 0000000000000000000000000000000000000000..87b2d7862f27fe5891c00c3db90ed750ba7a74e9 GIT binary patch literal 3685 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 literal 0 HcmV?d00001 diff --git a/src/calibre/manual/images/jobs.png b/src/calibre/manual/images/jobs.png index ab0716af481147c48494a19cfc2a0804d8f9fa20..2c70a947d447c386ff426b1c9b5a9fe38a93de86 100644 GIT binary patch literal 1753 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 literal 3726 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 diff --git a/src/calibre/manual/images/library.png b/src/calibre/manual/images/library.png new file mode 100644 index 0000000000000000000000000000000000000000..781c87430fa84e52d3ec05eec4186ec5d69955db GIT binary patch literal 5737 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 bUkmv^J=K?7D{|~f00000NkvXXu0mjfVi>>B literal 0 HcmV?d00001 diff --git a/src/calibre/manual/images/preferences.png b/src/calibre/manual/images/preferences.png new file mode 100644 index 0000000000000000000000000000000000000000..ad939d238872713ae0f7ea8df48ac7520a0639a2 GIT binary patch literal 4505 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 literal 0 HcmV?d00001 diff --git a/src/calibre/manual/images/remove_books.png b/src/calibre/manual/images/remove_books.png index 9d798394d90e1f93ab06db4b56b3aa688c6d4673..065de14be503302c401f5eafc4ed565d659189cf 100644 GIT binary patch literal 4993 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 DmqwaN literal 3952 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 KMNUMnLSTZ}Lx^_( diff --git a/src/calibre/manual/images/save_to_disk.png b/src/calibre/manual/images/save_to_disk.png index 74db6ba6b1b4be426b008cf8a95be12013d059f7..a4d3137349a4a4871659952f72cf27b853379918 100644 GIT binary patch literal 3934 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 literal 4466 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 Eg49X2{{R30 diff --git a/src/calibre/manual/images/send_to_device.png b/src/calibre/manual/images/send_to_device.png index 1cc45f020f60b23056a37aee080d083036550c30..ed325ed753ecdb5d20601a0afa25f64fa0d9d8cf 100644 GIT binary patch literal 2896 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 literal 4292 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 diff --git a/src/calibre/manual/images/show_tag_editor.png b/src/calibre/manual/images/show_tag_editor.png new file mode 100644 index 0000000000000000000000000000000000000000..55b7a855e46752c37b0047facff270e3a4a03253 GIT binary patch literal 1094 zcmeAS@N?(olHy`uVBq!ia0vp^;y^6M!3HF?%h*|g6k~CayA#8@b22Z19F}xPUq=Rp zjs4tz5<!xj1s;*b3=DinK$vl=HlH+5kiEpy*OmPimk_Hw_vA_J3&BFJ5haeLB^mie z3@g{2@c;_(lmLZXQj3#|G7CyF^Ya*lITe+G;#?qc=lp`oqRjM+5{5PWXRLstd|=U{ z)I^X{g_6wNR0h-U{G31;PLND+ep*R+Vo@qXY{7q!a&EBUnZ?ODi9n@A4BHQE=?4mP zfP}*ni}Et_(isj&KWhhyu|xEi7A2=LeEr}28m7!SKQ}iuuY}>-nQ8lhVr(E~A(<sP zsSGRLT~Y^%D1t<sVNMDGImyVt(7+0WEEEh3t&9z<OpUl}U;8mIFdg@FaSZYB-Wuwi z9qcIb@7-R{m1h@cUSd%c6J$BKB%nZ>Bk#_Qb-Osc>KmFAxbnKA9R*o_Gk3j<+E9AA z_r;;s6%q5dbT<Wc_0L+?xi>ei{Fr62@#L4eQYsHP+h<xE-!DH`Q=FDmnE1m#P4m-g zWA6xEvw-|f^PIo7=FIVG{rKS&>q*6v`uAfGJO~ilu6AsKuUnPc{ToGv>4}n0FNw+B zo%7-3`MYsP-faDR;s|@dO5-(aYuuE?8dD>!CfuAJDOqe?%CCIfUqNi!ht-?9SF)e~ zkW?jOrkmpQZE+{#6lodXV@DL6jpSUj4Ag2Z1gFoFlbSNmQ|;T=^6%eRn1uXoj<~Cx zT-up`t!UP!+~_p-wMAcLWz_XrRpn9@o1@)Sw!cvCc>etP*KbpKu4tWqT6E(1=LJo{ zH-&a7?^ItjDY!ss#+*4<T%Pe=Sr_8an$5Z3<n2uz3(YF6t(A&o+^aN1UcFedUGhP~ zvt@Z}&pdzj>|3VXnTnDUktbfoGj~?1t`s@%Xa6v-`Qz2MYX5`Qe4L(t|8vmFBd4Dl zmB&sGUmbcc!^9%lr|QDAxY`L3MUNEijA|E{@<)^(UD<u@TTNusO!n;9)P0exGL5R< z-{pgJ=dDnmIAcd-ou(KU>)NfWCYWuxyVy(d%|dpsVBd`$b2_U6Qyk}7PpsCJN%TG0 z>;1(2yRk(@rPah$hD{l33Kz|qqj8nV^u8~bv4rQ!jmKPO-|6t1%`F$V{fy_dgrqHX z_rET8-O`+Y-~8jASHBovm|YIb=(}|-dquhGzHDFjm_^QfSGFAu-ud>CkCo19)tWaZ z`>Z6_TwDAjg7abQ#D`z|rSAP%bNb(M`@}U@lp-E$uKAuiQN~iUuti<&k@DpCKd<a{ z{c^m$;O`@ew#V+fG%u9CD^KPBK3{KflxE_$V>|r)I=mm<&qzLgX??W5V2)y-*{P2a jf4E<ssaE_YekNYWZ}t4SQyQ{>>7T*V)z4*}Q$iB}7Sha5 literal 0 HcmV?d00001 diff --git a/src/calibre/manual/images/swap_title_author.png b/src/calibre/manual/images/swap_title_author.png new file mode 100644 index 0000000000000000000000000000000000000000..e4d7470a44dc63622783cab5871240e7dd8183b9 GIT binary patch literal 1327 zcmXxjdpOg390%~9$joh$hhuWwsx><mttC4;#jI_ZTd1K&(#(?IoNa}};owNQ9C1jk zti*E5G7obt9&(wKY95Kglv|xcYFRsB=eK%#p6~Vbd4Ipp_n+@YUvH9uE>af&00Roy z-5;9Gpl+(84UL#{u#M29!SN@#0m8>y7NCt5!<Fg^0HQp-)o^tY9!sWi0Ko8px@#0+ z3@sppaVb<HY)sd9<BzCjzhKR;L_EfIJ<E+^v4JY#AQ>WkE=2BhP6V47%Vn}aU^Cpt z4su<!6IihcY$hX$3*12r;vqHss%(0=I%>^j#?S$r0s)6AaCPMfE0P-*&ZYy$V^!+7 z-q*{SoQN~wP?QZcbvEQdtfS_m;cSozGJsBt*-Xe_-_D<9N6>*!s`Pi?V+2-A3?1YG zD}$FiAk$XI0+`%0bf9wa843~`wGh5PDM0<CJr0fzcy-%v?cj*VLJQ~5-HI*%(5$1l zy9SUw8;gdbLjz6v4lYq63zSd23cQoYZTAYYZ#A?UxjGSzN)4vFGN!F=VygVPf+@E; zd!b2aGul2)Trfi1<kzt7wYlK-O-hwup@Df#vYK3?n0=+_<*@JzIh0}T_SksEy||${ z{>OWB6VbTx<%75yc#14tI(YZ<aA5OH)k({JiDFWMO4(=7-Ff48MjDr8Me0>JjupS$ zvwC_$R(sLhBg4h2WA9(Jlo!=K7@tK(C5rMix`B4Twd=!&-6m`XdUm_yxGFzsTN8MF zMY_%_OK3HZ-%*eFv~>sG?EOGkS%#mz4=&LpQK@q;fA@U0RfSV>+Qg_<zM!~jXM5@g zkSC&Ilr>u(g`{8OxBom7MrjH2libfunF%~!Kof7ni;`f0JCWUYFL|Kmhu*|SB97eu z)%yg#Gf;Xx5}Q96Db>-$2OR1sDI!N`@w?(SR2Q3~y{Side1W*x%NGu}%#+DL;hG%p z&6K#;)Hce;row-iZp(UdSN7!>ke*?|so1X?S6p9><ok5E^bOsxV$2LO-}dlMP1ncW z$;6^2wi;E74P=KCC7$s8zI+$YLiVI+{(><g=|SpqA!mMG_pNB?3Qdk4N{XHmAGM=h zy;T^t=l#ez6uY*i?7hcxt$&Pyca>-oa&naVTh|K(d0A)c6tap@rQEUl-1*?rtgz@h z2Fb~6F4=+C1WNYN3J(mtTuO1kIZNbn;;h*jU4ee`A_2LW(K!6tE^pev#qId^$`JEs z3mOAGtF!g-8UbJU*87sL3e$@(SY8n<KcRuI;`q<j^g@H$T5OG(5Ami&!bJ4p^Zjjp zy0~j0q8w#~vqg}nbpnpM(SK8_txj4a>rqN++n*)K+x*egac3`^`oHB<yRe}2w4d!U z>4pVZF0gIp#ma$7%BzQ6y|86tg|E+I`IDCH;eHSczCQi5?sEU90SsQ}0$E;q<y2{? z<gmTOL)NEV8E44rU;Foq4bo}77BeQk854`m9~LI_km7RWDch6vm(cBG-fw#eIK10W zSh4A7Z++CE=r`~FE1*QlGB-&o_2{T7QY+lJj4kdjZ|Y+OXVu_U=@fG<_6YixEp^Mm zdg@C0A0bI2L~z{HDccaSLVC1o?dax<IbJCiHETH1M=rLwhqJ^luW2hbLoC`!Em@P@ zam$x6&*PVd^}&`-QFmsLY)oa|k}DjrnRLlsN=sl!kC~QLY2WDI*<h*+I;85E+f8^Z Va<1$M%7s2UKp}d&3*Ann{SOVuSKI&q literal 0 HcmV?d00001 diff --git a/src/calibre/manual/images/view.png b/src/calibre/manual/images/view.png index c16ec58bcfcfa3aebf22278c2db4ed90c892bdca..7c3346383f7803856bff07277ce6d104adf97d5f 100644 GIT binary patch literal 3101 zcmXw*2{;tYAICQ#*2>MgdX?j?$h+>Vu-5Kcq#U`)CdU%XTI<?!m2$VSisUBueWcvS zk~@iVvyycmxuX2n`+wf&nd6zyd}ro2Gr!+F6M5SR$qp0(0ssJZl%B2$y@t^<l7*RG z+S>ebqE}~pOprQ&(g6_~y}{@Ly$J;XD&pCW(M<F<tCyaY4*+n!<20WkOP?2}!*h7l zP58NSAUBhsj6)lr;lBuOiHG{)U9mVoL1~{J9f9z4r0eA4h{Jf{F<4Ik59>v7ItQL| z7}hHQhjDSm1ByBN)ams6zZB<$K9!2$F&<6;rF{-odJpSqk15s}?}x@Y0qnd^PUUR> zPLA<$e1N7)ae%s(>UcV4ImH%eoF~T91<)eA_>|7h{eQeK&d~|5dlJ6#pA3fe@Nn|P z1NQoon(2)BRAz?3KX3x%uMhuCCl^l%>_3ytPEC@B$U)Rkld2d*PF-F}T|u$w7bKXz zsWg->)Xd+0&DO=x%w6aaGuyItYm;(RCHH)+{%BKal&h|Il0#%vuwi*|w2BnMoVt89 z32dNPAt5CcoUbL5?@+IO&!VMN5Q<K`{ON0F)RP;7y}v0W!ay>`*5@uxzAv?`aWLR$ zzu(fnG4M{57K*c+Gv;W2BfGqub7Q9Y1mi#($_(GkL9z=e0wxH{Bdke97G+7AL3<z) ziRAjVJkx$gtMB*kqkYH8ci!(;9v<yo!{Km44FNuuCMG8O=gy0;T>5#q<1#f6{FvEy zW%LO{c1}*txa3%YDN=EMq`-9ZXmc(cu(d@+5`X{Nefv(|ptn!#?ymo(nT2%KgDYQ~ z9v(%cf5-7MiC-_+OKJ?-Pl^-O;P340G{S`RJGUn*xOn{-5N#kHa`S#7tc_>745lr8 ze#@~uR<<$nt`zS!lFxNsL=})tEZAe9ypnU=T<jM%-MQP~&*eT^-1>w~K$o{Sq4OS8 zTN{vf^K}G$zAVh=ygZ6ut~Zqu>%BP(1%EfFQ7Mrcsi2E5DJ%2SS193S$t@d9*XsJU zyCUa0B$le-H{kBJRGh*BR#ZgD3MJD%zjf@26Kw-WUQ%}I;eGI}5}p<zg|V!>&l>o1 z34Ql-HZmT98J5V&%@s`P>b5R)r?NzlD$IgD++T{6JoiQ`SW{j>As16(U88%<1_Uyu z7MQ-h*ZutBv&hKSFeWxH+OTBm^#JZS8h%N8iTPGl&U18A0!{0QGoN0A1r2LdKopWV zvg0zzZLBnQZKBR`>b-A<hyT|66Y#9x#&jsOZ)L0u%18TB^fDjW{OI>;NZ)G}j&#k3 z@|B3Px{4x{uY%83k$DL>*WcG{YC+!K-a|TvSI;WdIzeFNV1V3$<foO@Z&h6@F+$0= z8&Dh5jmCC4Noi?uYCelBU@k7M?(S|*u^8?t4|8*VDZ^J{b~-Q^DJ8|N`U8!S8b4i% zooUKS3p6XUzmcjH{3mGWj@`Mi%$%@5>?k{rtE`NSjA7o#!NGG>p1a~OW%^AB6Kq<w z^#iyS`i6Mma5zeUVTB#$=KSzM5gW7MKUc55@V2RaK*Q^z0I#H^O&n9~%Kx5N32XgG zzL6=A3B@Pn_eRAmRaWh&P7HE_3kRTMG$0SYE-FP4GryX0WAs+b=FU#h_B}5?5fK?S zhf8}49~0arEL28IZ0c5HhO*7ZM!y6F63KtfJnzr29&&x*szvw1#gPPbpZBky7@9$d zmDP@te2x^Tf?V>oF{n=Wm2;#TTW@sEnX}A#h!ywyEHR!_?=yo>{!|j=tMRnqt5sim z!1qV$(e2Fj@Y{5!T1${bz#JeVw~UOEQXk`gE*Z0aY$hIN9eL5uDppXzS<fm~k$B+6 z+Cn6OLR-P12>kaR^7j41v_qzygu*Bd!)axYafyou)UNm^`+I8>28CrITT0pzDrj@e z!W9+wQIPvsDc=?2Iki?a_h@5~A8XHL`2PA-crDXbyC$eNIQglmF>XuhkGeNw6DH&; z%17mLv47QOM`1JRc1S&I5jC$xj2apms!BY7aP#o2F;}QNe|>xNwemr4)jbKqQYo2g zu<4-32yAW;xRV|2qoT$ZQ9!;e<f=`xb7kYdX8kxLBSSwRQ$iPsr0VGd_atR0&1c(Y z%itN3-Y2?T`YlA{7vv;+L=`pp1*i)Jwyx?nFn(*zDS~))oazSS(A~GfOA9o|rawUh zvq1+>`rF@R=@@7BzWhgAMMXeZ#k1O?J=H0TsO2J=J$kT3J?ZUy-LGrK<>Ei!5S6La z8^kDf{kjM}sJO>IKI7Z{P1>&qC;e#_TYbq=kUU%pnL!7SB9_qIAs?PWMfa_e!9o>J zh#4Fgt`7}b@ABtsqbr_Xcr36YT3FpBKRaEO+}-n$QsX|>u?XR{5STDlCx&)7a|&kB zBBKkd?{xxg>v8a?4jD1O)vv}9ks+I8Ulac4lWJOrS>DR>dGhmlpnQc}@ylJnv5rU{ zCXhYo2TVt2H3SlYHr(EvgSq5++58nB-bx-W^^(qnNAoi<#{&+Ij!rUUW6&{(8c%A| zq_+K;aGzmI6Fb*@7M9NeLe_<mCdqGarQe&V_3->bmTfBR^_DNAd&?8gmo^EBAO@Wp zhtw>yh%(TU|KOXB{^Fke;~(~C!=p1le5VZ0wuZ0mh0j&K0127Bhb?Ny-I4PHn5J#@ z04gos$5`6=RbSizeMcn%0tJ)!$S!lz*%qGGa*2M<M&Ctyf>0Dii6-^9BAi5-enenf z%(a7`f}z};qZ<Bs?Q(z0txGO^3os2alk!kvV4k|BV9Otn_`%78EIaxsV|}vTw2g>0 zjtzk>g5%=Bayqrrta=1OZ6cFMZnnon?Yw8BuS6B4<@P#ZYrd1a$p@RrDw3cfDN4-! zWY-v2)A(o}b)~=<(hbf<A8voIoa*k!IJX#zh)O=zR<j|ioK3r5vaB6h6vQ|1^KDng z?^)?s;rNTgueKEmx&H~wpodJfLEgerKWw8#B;VkrEJLk*kaHiAMM+k$=MlsfJN3Ti zhV2gqQ7T8;Y_2{{6sIK4`hDUTBiNQVU9;U6k*k=mf}Q52-CovluymSe2&j@iHlG-C zX~|GEg&+L1ViFgV8G_jQC35EdT8}g0)6qQ3EYMNN+wLoMhcTR)>`7K*lYBgpdbGEe zusX)GVCwK3x?a%tM#JKTdLWlRYrF4yzm$YTH!ZkIQa`(e6&&+<SEf{D!&C=cI@1_r z(US4$J^*nAJ(*d@zYQC9|KWdkTo~T}dd*eKaz#&Hzm5K$<$CrkTRL@BPSwk%Glqjq z7~Y9f0<T2(xSbn((|1(tUJ`>E=fGab*tPn&nZszNw3qInDn?D1?uZe{FI>Atz3HX{ zxAiNjEg9FOnG>}R9<-Z#%-~mO+v#JxL5qvN{mzW+Fq!jnk9FD!Iza-_=o7smlXXV3 zN0zOV42|E$l^}|Qr=1K>d4&!Gv{xaFYWkp)u`nrSqtMWl5zcqO{b2ZeubUrDPJ(zM zD(h_-&$0m7kp%lDP*Peg+gxVc_Vc*A;yaML8g;FPI{|T0NCl-DAQ0|PxbU@?FwfaW z4ON7S{}r$l#<@Y=6a|?lr#3}U#2#4)$;&7&*ig9?%!H$ZuRD77KIQuWfuax#!PRZp z3qTnd7Y`QR)E^es;MH*~4H~TmS$@@QPzbZLif{i$P`F+Xmk+s&UbX*)5?L0?Zj?p_ z-$D#*{7~*0z!tw$ZXLI{g<~5gxv_t)Wy#`lzX=b7%D$(Vfm_{i^OY%HxyEvKB;J>1 zB+~3{e7}BMo_zS`Stg`A1)-tl8XJo!-|MP7#+g`_kNKBDNH#4)L)r~{7F(GJ^g|>0 zV(&91-DCrwPA1z3X5LE0AYnVojhXe~oQ3^5rLborUczd)93)%G^kU2x??+DwBl*S= z+&9wr=IRut#094pM`1gM-d(TBn51u$B%XsdFi<*>r*Zc=HVODF{J0W$tFN45$<ypQ zoB0&9hBSc${&bz1V`Vgm-tN76+%LMWSs{a6NUd34(j0DC!me*ls!nV(hJ?(Cuas>$ a9sd=h<Z?~*bKL2-7Jz~q>6Yp^g#8a!qQ5}^ literal 3575 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 From f826dcd050ae262aaef1aa7d6a75188515f54b67 Mon Sep 17 00:00:00 2001 From: Timothy Legge <timlegge@gmail.com> Date: Mon, 29 Nov 2010 22:14:23 -0400 Subject: [PATCH 191/375] Fix deleting txt documents --- src/calibre/devices/kobo/driver.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/calibre/devices/kobo/driver.py b/src/calibre/devices/kobo/driver.py index 0eddf26549..ebb3f60101 100644 --- a/src/calibre/devices/kobo/driver.py +++ b/src/calibre/devices/kobo/driver.py @@ -220,6 +220,7 @@ class KOBO(USBMS): # 2) volume_shorcover # 2) content +# debug_print('delete_via_sql: ContentID: ', ContentID, 'ContentType: ', ContentType) connection = sqlite.connect(self.normalize_path(self._main_prefix + '.kobo/KoboReader.sqlite')) cursor = connection.cursor() t = (ContentID,) @@ -400,6 +401,9 @@ class KOBO(USBMS): elif extension == '.pdf' or extension == '.epub': # print "ePub or pdf" ContentType = 16 + elif extension == '.txt': + # print "txt" + ContentType = 901 else: # if extension == '.html' or extension == '.txt': ContentType = 999 # Yet another hack: to get around Kobo changing how ContentID is stored return ContentType From 26aef9cc53b91b2c94d096597adc435e2bf5f823 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Mon, 29 Nov 2010 20:17:33 -0700 Subject: [PATCH 192/375] Conversion pipeline: Do not override CSS for images with the value of the img width/height attributes, unless no CSS is specified for the image --- src/calibre/ebooks/oeb/stylizer.py | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/calibre/ebooks/oeb/stylizer.py b/src/calibre/ebooks/oeb/stylizer.py index d10ea12394..4f8ae68943 100644 --- a/src/calibre/ebooks/oeb/stylizer.py +++ b/src/calibre/ebooks/oeb/stylizer.py @@ -240,18 +240,26 @@ class Stylizer(object): else: for elem in matches: self.style(elem)._update_cssdict(cssdict) - for elem in xpath(tree, '//h:img[@width or @height]'): - base = elem.get('style', '').strip() - if base: - base += ';' - for prop in ('width', 'height'): - val = elem.get(prop, False) - if val: - base += '%s: %s;'%(prop, val) - del elem.attrib[prop] - elem.set('style', base) for elem in xpath(tree, '//h:*[@style]'): self.style(elem)._apply_style_attr() + num_pat = re.compile(r'\d+$') + for elem in xpath(tree, '//h:img[@width or @height]'): + style = self.style(elem) + # Check if either height or width is not default + is_styled = style._style.get('width', 'auto') != 'auto' or \ + style._style.get('height', 'auto') != 'auto' + if not is_styled: + # Update img style dimension using width and height + upd = {} + for prop in ('width', 'height'): + val = elem.get(prop, '').strip() + del elem.attrib[prop] + if val: + if num_pat.match(val) is not None: + val += 'px' + upd[prop] = val + if upd: + style._update_cssdict(upd) def _fetch_css_file(self, path): hrefs = self.oeb.manifest.hrefs From a5d7a19c341326d3359798a724ed4e4d1de1d916 Mon Sep 17 00:00:00 2001 From: Timothy Legge <timlegge@gmail.com> Date: Mon, 29 Nov 2010 23:24:31 -0400 Subject: [PATCH 193/375] Allow html, htm and rtf documents to be deleted --- src/calibre/devices/kobo/driver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/devices/kobo/driver.py b/src/calibre/devices/kobo/driver.py index ebb3f60101..981bf3decb 100644 --- a/src/calibre/devices/kobo/driver.py +++ b/src/calibre/devices/kobo/driver.py @@ -401,7 +401,7 @@ class KOBO(USBMS): elif extension == '.pdf' or extension == '.epub': # print "ePub or pdf" ContentType = 16 - elif extension == '.txt': + elif extension == '.rtf' or extension == '.txt' or extension == '.htm' or extension == '.html': # print "txt" ContentType = 901 else: # if extension == '.html' or extension == '.txt': From 8a6e316e9fdcfd36c61b9a52a8a65c5ac6d0e1a2 Mon Sep 17 00:00:00 2001 From: Timothy Legge <timlegge@gmail.com> Date: Mon, 29 Nov 2010 23:51:55 -0400 Subject: [PATCH 194/375] Fix the deletion of html, htm, txt and rtf by firmware version --- src/calibre/devices/kobo/driver.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/calibre/devices/kobo/driver.py b/src/calibre/devices/kobo/driver.py index 981bf3decb..b76ee4b1c3 100644 --- a/src/calibre/devices/kobo/driver.py +++ b/src/calibre/devices/kobo/driver.py @@ -79,11 +79,11 @@ class KOBO(USBMS): # Determine the firmware version f = open(self.normalize_path(self._main_prefix + '.kobo/version'), 'r') - fwversion = f.readline().split(',')[2] + self.fwversion = f.readline().split(',')[2] f.close() - if fwversion != '1.0' and fwversion != '1.4': + if self.fwversion != '1.0' and self.fwversion != '1.4': self.has_kepubs = True - debug_print('Version of firmware: ', fwversion, 'Has kepubs:', self.has_kepubs) + debug_print('Version of firmware: ', self.fwversion, 'Has kepubs:', self.has_kepubs) self.booklist_class.rebuild_collections = self.rebuild_collections @@ -220,7 +220,7 @@ class KOBO(USBMS): # 2) volume_shorcover # 2) content -# debug_print('delete_via_sql: ContentID: ', ContentID, 'ContentType: ', ContentType) + debug_print('delete_via_sql: ContentID: ', ContentID, 'ContentType: ', ContentType) connection = sqlite.connect(self.normalize_path(self._main_prefix + '.kobo/KoboReader.sqlite')) cursor = connection.cursor() t = (ContentID,) @@ -403,7 +403,10 @@ class KOBO(USBMS): ContentType = 16 elif extension == '.rtf' or extension == '.txt' or extension == '.htm' or extension == '.html': # print "txt" - ContentType = 901 + if self.fwversion == '1.0' or self.fwversion == '1.4' or self.fwversion == '1.7.4': + ContentType = 999 + else: + ContentType = 901 else: # if extension == '.html' or extension == '.txt': ContentType = 999 # Yet another hack: to get around Kobo changing how ContentID is stored return ContentType From 549b73e248e0ec3a38b64843b0d2feb8d97de2d6 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Mon, 29 Nov 2010 21:10:36 -0700 Subject: [PATCH 195/375] Force overwrite title/author metadata to True when downloading metadata for books added by ISBN --- src/calibre/gui2/actions/add.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/calibre/gui2/actions/add.py b/src/calibre/gui2/actions/add.py index 5cc72c3ff0..9b348d8285 100644 --- a/src/calibre/gui2/actions/add.py +++ b/src/calibre/gui2/actions/add.py @@ -18,6 +18,7 @@ from calibre.ebooks import BOOK_EXTENSIONS from calibre.utils.filenames import ascii_filename from calibre.constants import preferred_encoding, filesystem_encoding from calibre.gui2.actions import InterfaceAction +from calibre.gui2 import config class AddAction(InterfaceAction): @@ -101,7 +102,12 @@ class AddAction(InterfaceAction): else: ids.add(db.import_book(mi, [])) self.gui.library_view.model().books_added(len(books)) - self.gui.iactions['Edit Metadata'].do_download_metadata(ids) + orig = config['overwrite_author_title_metadata'] + config['overwrite_author_title_metadata'] = True + try: + self.gui.iactions['Edit Metadata'].do_download_metadata(ids) + finally: + config['overwrite_author_title_metadata'] = orig def files_dropped(self, paths): From ab93cea8b0193330a54cf5cd32fe22670aba8964 Mon Sep 17 00:00:00 2001 From: Translators <> Date: Tue, 30 Nov 2010 04:46:15 +0000 Subject: [PATCH 196/375] Launchpad automatic translations update. --- src/calibre/translations/cs.po | 103 +- src/calibre/translations/es.po | 2 +- src/calibre/translations/fr.po | 8 +- src/calibre/translations/he.po | 2205 ++++++++++++++++------------- src/calibre/translations/zh_CN.po | 8 +- 5 files changed, 1331 insertions(+), 995 deletions(-) diff --git a/src/calibre/translations/cs.po b/src/calibre/translations/cs.po index 108a4e0e16..830d85b321 100644 --- a/src/calibre/translations/cs.po +++ b/src/calibre/translations/cs.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" "POT-Creation-Date: 2010-11-27 20:21+0000\n" -"PO-Revision-Date: 2010-11-28 20:16+0000\n" +"PO-Revision-Date: 2010-11-29 19:40+0000\n" "Last-Translator: Marek Sušický <Unknown>\n" "Language-Team: Czech <cs@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-29 04:47+0000\n" +"X-Launchpad-Export-Date: 2010-11-30 04:45+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -3010,6 +3010,14 @@ msgid "" "\n" "Manipulate a PDF.\n" msgstr "" +"příkaz...\n" +"\n" +"příkaz může být jeden z následujících:\n" +"[%%commands]\n" +"\n" +"Použijte %prog příkaz --help pro získání více informací o příkazu\n" +"\n" +"Měnit PDF.\n" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/crop.py:29 msgid "" @@ -3197,6 +3205,17 @@ msgid "" "\n" "Split a PDF.\n" msgstr "" +"\n" +"%prog %%name [options] file.pdf page_to_split_on ...\n" +"%prog %%name [options] file.pdf page_range_to_split_on ...\n" +"\t\n" +"Ex.\n" +"\t\n" +"%prog %%name file.pdf 6\n" +"%prog %%name file.pdf 6-12\n" +"%prog %%name file.pdf 6-12 8 10 9-20\n" +"\n" +"Rozdělit PDF.\n" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/split.py:61 msgid "Split Options:" @@ -3367,6 +3386,8 @@ msgid "" "Force splitting on the max-line-length value when no space is present. Also " "allows max-line-length to be below the minimum" msgstr "" +"Vynuť rozdělení podle maximální délky řádku když není místo. Dovoluje, aby " +"maximální délka řádku byla pod minimem" #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:67 msgid "Send file to storage card instead of main memory by default" @@ -4950,6 +4971,13 @@ msgid "" " wil be selected.\n" " -For time field, only the date will be used. " msgstr "" +"Vysvětlení této šablony:\n" +" -Dostupná pole jsou 'author_sort', 'authors', 'id',\n" +" 'isbn','pubdate','publisher','series_index','series',\n" +" 'tags','timestamp','title','uuid'\n" +" -Pro typy seznamů, tj. autory a tagy, je označen\n" +" jen první prvek.\n" +" -Pro časové pole je použité jen datum. " #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml.py:16 msgid "CSV/XML Options" @@ -5143,6 +5171,10 @@ msgid "" "understanding the conversion process and figuring out the correct values for " "conversion parameters like Table of Contents and Chapter Detection." msgstr "" +"Zvolte složku, do které budou ukládány ladící informace. Pokud zvolíte " +"složku, calibre do ní uloží mnoho ladících hlášek. Toto může být použito při " +"pochopení konverzních procesů a nalezení správných hodnot pro konverzní " +"parametry jako Obsah a detekce kapitol." #: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:59 msgid "" @@ -6661,7 +6693,7 @@ msgstr "&Zastavit označenou úlohu" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:51 msgid "Show job &details" -msgstr "Ukázat &detaily úlohy" +msgstr "Zobrazit &detaily úlohy" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:52 msgid "Stop &all non device jobs" @@ -6903,6 +6935,9 @@ msgid "" "for that series. Checking this box will tell calibre to start numbering\n" "from the value in the box" msgstr "" +"Série budou přečíslovány od nejvyššího čísla v databázi\n" +"pro tuto sérii. Zaškrtnutí tohoto pole říká calibre, aby\n" +"začalo číslovat od hodnoty v tomto poli" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:368 msgid "Remove &format:" @@ -6918,6 +6953,9 @@ msgid "" "checked,\n" "title and author are swapped before the title case is set" msgstr "" +"Vynutit název knihy velkými písmeny. Pokud je zaškrtnuta tato volba a prohoď " +"autora, \n" +"název a autor budou prohozeni před tím, než se nastaví velikost písma." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:372 msgid "Change title to title case" @@ -7012,6 +7050,10 @@ msgid "" "field is processed. In regular expression mode, only the matched text is " "processed" msgstr "" +"Zvolte, jak bude zpracován text po nalezení a nahrazení. Ve znakovém módu " +"je\n" +"zprocesované celé pole. V módu regulárních výrazů je zprocesován jen " +"nalezený text." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:392 msgid "&Destination field:" @@ -8955,6 +8997,9 @@ msgid "" "used. Also applied when switching to this library. Note that this setting is " "per library. " msgstr "" +"Použít toto omezení při startu Calibre, pokud je používána stávající " +"knihovna. Také bude použito při přepnutí na tuto knihovnu. Všimněte si, že " +"toto nastavení je na knihovnu. " #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:152 msgid "" @@ -8999,6 +9044,8 @@ msgid "" "book list. You can hide columns by unchecking them. You can also create your " "own, custom columns." msgstr "" +"Zde můžete přeskupit rozložení sloupců v seznamu calibre knihovny. Můžete " +"schovávat sloupce odškrtnutím. Můžete si také vytvořit své vlastní." #: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:84 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/custom_columns_ui.py:84 @@ -9030,7 +9077,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:19 msgid "Text, column shown in the tag browser" -msgstr "" +msgstr "Text, sloupec zobrazen v prohlížeči tagů" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:22 msgid "Comma separated text, like tags, shown in the tag browser" @@ -9093,6 +9140,8 @@ msgid "" "Lookup names cannot end with _index, because these names are reserved for " "the index of a series column." msgstr "" +"Lookup names nemohou končit _index, protože tato jména jsou rezervována pro " +"index sloupec sérií." #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:126 msgid "No column heading was provided" @@ -9134,7 +9183,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:131 msgid "" "Column heading in the library view and category name in the tag browser" -msgstr "" +msgstr "Nadpis sloupce v knihovním pohledu a kategorii v prohlížeči tagů" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:132 msgid "Column &type" @@ -9604,7 +9653,7 @@ msgstr "Libovolné pole" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:34 msgid "The lookup name of any custom field. These names begin with \"#\")" -msgstr "" +msgstr "Lookup name libovolného pole. Tato jména začínají s \"#\")" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template_ui.py:47 msgid "Save &template" @@ -9752,7 +9801,7 @@ msgstr "Maximum OPDS položek v dotaze:" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:132 msgid "Max. OPDS &ungrouped items:" -msgstr "" +msgstr "Max. OPDS &neseskupených položek:" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:133 msgid "Restriction (saved search) to apply:" @@ -10087,7 +10136,7 @@ msgstr "Seřadit podle průměrného hodnocení" #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:882 msgid "Set the sort order for entries in the Tag Browser" -msgstr "" +msgstr "Nastavit pořadí položek v Tag prohlížeči" #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:888 msgid "Match all" @@ -10197,6 +10246,9 @@ msgid "" "you find it useful, please consider donating to support its development. " "Your donation helps keep calibre development going." msgstr "" +"je výsledek přispění mnoha dobrovolníků z celého světa. Pokud se Vám produkt " +"líbí, podpořte jejich práci nějakým příspěvkem. Váš dar pomůže udržet vývoj " +"calibre v chodu." #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:543 msgid "There are active jobs. Are you sure you want to quit?" @@ -10239,7 +10291,7 @@ msgstr "Dostupný update!" #: /home/kovid/work/calibre/src/calibre/gui2/update.py:64 msgid "Show this notification for future updates" -msgstr "Ukázat toto upozornění pro budoucí updaty" +msgstr "Zobrazit toto upozornění pro budoucí aktualizace" #: /home/kovid/work/calibre/src/calibre/gui2/update.py:69 msgid "&Get update" @@ -10442,11 +10494,11 @@ msgstr "Patkové písmo" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:58 msgid "The sans-serif font family" -msgstr "" +msgstr "Rodina fontů sans-serif" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:60 msgid "The monospaced font family" -msgstr "" +msgstr "Rodina fontů monospaced" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:61 msgid "The standard font size in px" @@ -10745,7 +10797,7 @@ msgstr "Táhněte pro změnu velikosti" #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:893 msgid "Show" -msgstr "Ukázat" +msgstr "Zobrazit" #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:900 msgid "Hide" @@ -11043,7 +11095,7 @@ msgstr "Vaše heslo na e-mailovém serveru" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:137 msgid "&Show" -msgstr "&Ukázat" +msgstr "&Zobrazit" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:138 msgid "&Encryption:" @@ -11095,6 +11147,10 @@ msgid "" "directly on the device. To do this you have to turn on the calibre content " "server." msgstr "" +"<p> Pokud používáte <a href=\"http://www.lexcycle.com/download\">Stanza</a> " +"e-book aplikaci na Vašem iPhone/iTouch, můžete si zpřístupnit Vaši calibre " +"sbírku přímo na přístroji. Pro přístup budete muset zapnout calibre content " +"server." #: /home/kovid/work/calibre/src/calibre/gui2/wizard/stanza_ui.py:50 msgid "Turn on the &content server" @@ -11188,6 +11244,10 @@ msgid "" "Default: '%default'\n" "Applies to: BIBTEX output format" msgstr "" +"Vytvořit citaci pro BibTeX záznamy.\n" +"Boolská hodnota: True, False\n" +"Výchozí: '%default'\n" +"Používá se na: BIBTEX výstupní formát" #: /home/kovid/work/calibre/src/calibre/library/catalog.py:242 msgid "" @@ -11818,6 +11878,8 @@ msgid "" "Perform some checks on the filesystem representing a library. Reports are " "{0}\n" msgstr "" +"%prog check_library [options]\n" +"Provede nějaké kontroly na filesystému, kde je knihovna. Reporty jsou {0}\n" #: /home/kovid/work/calibre/src/calibre/library/cli.py:886 #: /home/kovid/work/calibre/src/calibre/library/cli.py:1036 @@ -11885,12 +11947,18 @@ msgid "" "Produce a report of the category information in the database. The\n" "information is the equivalent of what is shown in the tags pane.\n" msgstr "" +"%prog list_categories [options]\n" +"\n" +"Vytvoří report kategorií informací v databázi.\n" +"Informace je ekvivalentem toho, co se zobrazuje v panelu tagů.\n" #: /home/kovid/work/calibre/src/calibre/library/cli.py:1033 msgid "" "Output only the number of items in a category instead of the counts per item " "within the category" msgstr "" +"Výstupem je jen počet položek v kategorii namísto počtu položek v rámci " +"kategorie." #: /home/kovid/work/calibre/src/calibre/library/cli.py:1038 msgid "" @@ -12053,6 +12121,7 @@ msgid "" "Normally, calibre will update the metadata in the saved files from what is " "in the calibre library. Makes saving to disk slower." msgstr "" +"Calibre upraví metadata v uložených souborech. Zpomalí ukládání na disk." #: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:65 msgid "" @@ -12173,6 +12242,8 @@ msgid "" "Prefix to prepend to all URLs. Useful for reverseproxying to this server " "from Apache/nginx/etc." msgstr "" +"Prefix pro přidání ke všem URL. Použitelné pro reverzní proxy na tento " +"server z Apache/nginx/atd." #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:59 #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:437 @@ -12452,7 +12523,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/formatter.py:56 msgid "switch requires an odd number of arguments" -msgstr "" +msgstr "přepnutí potřebuje lichý počet parametrů" #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:43 msgid "Waiting..." @@ -12583,7 +12654,7 @@ msgid "" "Interpreter dies while excuting a command. To see the command, click Show " "details" msgstr "" -"Interpretr vytuhl během provádění příkazu. Klikněte na Ukázat detaily pro " +"Interpretr vytuhl během provádění příkazu. Klikněte na Zobrazit detaily pro " "zobrazení problémového příkazu" #: /home/kovid/work/calibre/src/calibre/utils/pyconsole/main.py:20 @@ -12728,7 +12799,7 @@ msgstr "Stahování obálky z %s" #: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1032 msgid "Masthead image downloaded" -msgstr "" +msgstr "Obrázek z tiráže stažen" #: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1200 msgid "Untitled Article" diff --git a/src/calibre/translations/es.po b/src/calibre/translations/es.po index df742bfe80..1150dfb8e2 100644 --- a/src/calibre/translations/es.po +++ b/src/calibre/translations/es.po @@ -17,7 +17,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-29 04:48+0000\n" +"X-Launchpad-Export-Date: 2010-11-30 04:46+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:502 diff --git a/src/calibre/translations/fr.po b/src/calibre/translations/fr.po index 565d894183..38933f4a69 100644 --- a/src/calibre/translations/fr.po +++ b/src/calibre/translations/fr.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: calibre 0.4.22\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-11-27 20:21+0000\n" -"PO-Revision-Date: 2010-11-28 08:41+0000\n" -"Last-Translator: sengian <Unknown>\n" +"PO-Revision-Date: 2010-11-29 05:41+0000\n" +"Last-Translator: Vincent C. <Unknown>\n" "Language-Team: Français <kde-i18n-doc@kde.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-29 04:47+0000\n" +"X-Launchpad-Export-Date: 2010-11-30 04:45+0000\n" "X-Generator: Launchpad (build Unknown)\n" "X-Poedit-Bookmarks: 1177,1104,-1,-1,-1,-1,-1,-1,-1,-1\n" "Generated-By: pygettext.py 1.5\n" @@ -9763,7 +9763,7 @@ msgstr "Annuler et retourner à la vue d'ensemble" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:269 msgid "Restoring to defaults not supported for" -msgstr "La restauration des valeurs par défaut n'est pas suppotée pour" +msgstr "La restauration des valeurs par défaut n'est pas supportée pour" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:304 msgid "" diff --git a/src/calibre/translations/he.po b/src/calibre/translations/he.po index 3af329b358..2ceaca90cb 100644 --- a/src/calibre/translations/he.po +++ b/src/calibre/translations/he.po @@ -7,14 +7,14 @@ msgid "" msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" -"POT-Creation-Date: 2010-10-28 00:31+0000\n" -"PO-Revision-Date: 2010-10-28 02:18+0000\n" -"Last-Translator: Kovid Goyal <Unknown>\n" +"POT-Creation-Date: 2010-11-27 20:21+0000\n" +"PO-Revision-Date: 2010-11-30 00:56+0000\n" +"Last-Translator: Eran Cohen <Unknown>\n" "Language-Team: Hebrew <he@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-10-29 05:24+0000\n" +"X-Launchpad-Export-Date: 2010-11-30 04:45+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -27,21 +27,21 @@ msgstr "לא עושה דבר" #: /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/books.py:24 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:444 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:448 #: /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:643 +#: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:657 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:401 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/metadata.py:56 #: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:407 #: /home/kovid/work/calibre/src/calibre/ebooks/epub/periodical.py:124 -#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:70 -#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:72 -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:336 -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:339 +#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:93 +#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:95 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:338 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:341 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1894 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1896 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:24 @@ -54,8 +54,8 @@ msgstr "לא עושה דבר" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:606 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:36 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:61 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:49 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:333 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:50 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:357 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:36 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:64 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:66 @@ -74,14 +74,14 @@ msgstr "לא עושה דבר" #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:78 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:119 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:153 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:611 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:817 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:819 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:627 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:833 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:835 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:911 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:916 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:982 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:913 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:918 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:984 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:143 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:150 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:64 @@ -89,7 +89,7 @@ msgstr "לא עושה דבר" #: /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 +#: /home/kovid/work/calibre/src/calibre/ebooks/pdb/input.py:40 #: /home/kovid/work/calibre/src/calibre/ebooks/pdb/palmdoc/writer.py:29 #: /home/kovid/work/calibre/src/calibre/ebooks/pdb/ztxt/writer.py:27 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/crop.py:82 @@ -109,43 +109,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:239 -#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:241 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:356 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:363 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:277 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:280 +#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:304 +#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:306 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:355 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:362 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:282 #: /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:114 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:139 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:141 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:915 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:924 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1231 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1234 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1039 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1042 #: /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:571 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:186 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:383 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:402 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:925 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1119 +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:244 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:918 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1112 #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:112 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:189 #: /home/kovid/work/calibre/src/calibre/library/cli.py:215 -#: /home/kovid/work/calibre/src/calibre/library/database.py:913 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:399 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:411 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1283 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1387 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2161 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2163 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2295 -#: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:224 +#: /home/kovid/work/calibre/src/calibre/library/database.py:914 +#: /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:1254 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1355 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2151 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2153 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2284 +#: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:229 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:139 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:142 #: /home/kovid/work/calibre/src/calibre/library/server/xml.py:78 @@ -185,14 +185,14 @@ msgstr "פעולה בממשק משתמש" #: /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: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/preferences/main.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:283 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:206 msgid "Preferences" msgstr "הגדרות" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:17 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:15 msgid "" "Follow all local links in an HTML file and create a ZIP file containing all " "linked files. This plugin is run every time you add an HTML file to the " @@ -201,7 +201,7 @@ msgstr "" "עקוב אחר כל הקישורים המקומיים בקובץ HTML וצור קובץ ZIP המכיל את כל הקבצים " "המקושרים. תוסף זה רץ בכל פעם שמתווסף קובץ HTML לספרייה." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:53 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:51 msgid "" "Character encoding for the input HTML files. Common choices include: cp1252, " "latin1, iso-8859-1 and utf-8." @@ -209,7 +209,7 @@ msgstr "" "קידוד תווים עבור קבצי ה HTML הנכנסים. בחירות נפוצות כוללות: cp1252, latin1, " "iso-8859-1 ו-utf-8." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:60 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:58 msgid "" "Create a PMLZ archive containing the PML file and all images in the " "directory pmlname_img or images. This plugin is run every time you add a PML " @@ -218,7 +218,7 @@ msgstr "" "צור ארכיון PMLZ אשר מכיל את קובץ הPML וכל התמונות בתוך תיקיית pmlname_img או " "images. תוסף זה רץ בכל פעם שמוסיפים קובץ PML לספריה." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:94 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:92 msgid "Extract cover from comic files" msgstr "חלץ עטיפה מקובץ קומיקס" @@ -265,98 +265,98 @@ msgstr "כתוב תגיות מטא מ- %s קבצים" msgid "Set metadata from %s files" msgstr "כתוב תגיות מטא מ- %s קבצים" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:706 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:717 msgid "Look and Feel" msgstr "מראה ותחושה" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:708 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:720 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:719 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:731 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:742 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:753 msgid "Interface" msgstr "ממשק" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:712 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:723 msgid "Adjust the look and feel of the calibre interface to suit your tastes" msgstr "התאם את המראה והמרגש של ממשק קליבר לטעם האישי שלך" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:718 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:729 msgid "Behavior" msgstr "אופן הפעולה" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:735 msgid "Change the way calibre behaves" msgstr "שנה את אופן הפעולה של קליבר" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:729 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:202 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:740 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:209 msgid "Add your own columns" msgstr "הוסף טורים אישיים" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:735 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:746 msgid "Add/remove your own columns to the calibre book list" msgstr "הוסף/הסר טורים אישיים לרשימת הספרים של קליבר" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:740 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:751 msgid "Customize the toolbar" msgstr "התאם אישית את סרגל הכלים" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:746 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:757 msgid "" "Customize the toolbars and context menus, changing which actions are " "available in each" msgstr "התאם אישית סרגלי כלים ותפריטי מידע, שנה את הפעולות האפשריות בכל אחד." -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:752 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:763 msgid "Input Options" msgstr "אפשרויות קלט" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:754 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:765 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:776 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:787 msgid "Conversion" msgstr "המרה" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 msgid "Set conversion options specific to each input format" msgstr "קבע אפשרויות המרה ספציפיות לפי סוג הקלט" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:763 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:774 msgid "Common Options" msgstr "אפשרויות נפוצות" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:780 msgid "Set conversion options common to all formats" msgstr "קבע אפשרויות המרה המשותפות לכל סוגי הקבצים" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:774 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:785 msgid "Output Options" msgstr "אפשריות פלט" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:780 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:791 msgid "Set conversion options specific to each output format" msgstr "קבע אפשרויות המרה ספציפיות לפי סוג הפלט" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:785 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:796 msgid "Adding books" msgstr "הוספת ספרים" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:787 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:799 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:811 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:823 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:798 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:810 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:822 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:834 msgid "Import/Export" msgstr "ייבוא/ייצוא" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:791 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:802 msgid "Control how calibre reads metadata from files when adding books" msgstr "שלוט בצורה שקליבר קורא מידע מטא מקבצים בזמן הוספת ספרים" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:797 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:808 msgid "Saving books to disk" msgstr "שומר ספרים לדיסק" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:803 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:814 msgid "" "Control how calibre exports files from its database to disk when using Save " "to disk" @@ -364,75 +364,75 @@ msgstr "" "קבע איך calibre מיצא קבצים ממסד הנתונים לדיסק הקשיח בבחירת \"שמירה לדיסק " "הקשיח\"" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:809 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:820 msgid "Sending books to devices" msgstr "שולח ספרים להתקנים" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:815 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:826 msgid "Control how calibre transfers files to your ebook reader" msgstr "שלוט בצורת ההעברה של קליבר לקורא הספרים שלך" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:821 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:832 msgid "Metadata plugboards" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:827 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:838 msgid "Change metadata fields before saving/sending" msgstr "שנה שדות נתוני מטא לפני שמירה/שליחה" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:832 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:843 msgid "Sharing books by email" msgstr "שיתוף ספרים במייל" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:834 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:846 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:845 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:857 msgid "Sharing" msgstr "שיתוף" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:838 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:849 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:844 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:855 msgid "Sharing over the net" msgstr "שיתוף ברשת" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:850 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:861 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:857 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:868 msgid "Plugins" msgstr "תוספים" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:859 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:871 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:870 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:882 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:893 msgid "Advanced" msgstr "הגדרות מתקדמות" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:863 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:874 msgid "Add/remove/customize various bits of calibre functionality" msgstr "הוסף/הסר/הגדר חלקים שונים של תפקודיות calibre" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:869 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:880 msgid "Tweaks" msgstr "שיפורים" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:875 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:886 msgid "Fine tune how calibre behaves in various contexts" -msgstr "" +msgstr "כוונן את התנהגות קליבר בהקשרים שונים" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:880 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:891 msgid "Miscellaneous" msgstr "שונות" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:886 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:897 msgid "Miscellaneous advanced configuration" msgstr "הגדרות מתקדמות שונות" @@ -475,7 +475,7 @@ msgstr "" "מקור המסמך." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:59 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:433 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:444 msgid "" "This profile is intended for the SONY PRS line. The 500/505/600/700 etc." msgstr "פרופיל זה מיועד עבור SONY PRS line מדגמים 500/505/600/700 ועוד." @@ -485,62 +485,62 @@ msgid "This profile is intended for the SONY PRS 300." msgstr "פרופיל זה מיועד עבור SONY PRS 300." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:80 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:470 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:484 msgid "This profile is intended for the SONY PRS-900." msgstr "פרופיל זה מיועד עבור SONY PRS-900." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:88 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:500 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:513 msgid "This profile is intended for the Microsoft Reader." msgstr "פרופיל זה מיועד עבור Microsoft Reader" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:99 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:511 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:524 msgid "This profile is intended for the Mobipocket books." msgstr "פרופיל זה מיועד עבור Mobipocket books." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:112 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:524 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:537 msgid "This profile is intended for the Hanlin V3 and its clones." msgstr "פרופיל זה מיועד עבור Hanlin V3 ומכשירים דומים." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:124 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:536 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:549 msgid "This profile is intended for the Hanlin V5 and its clones." msgstr "פרופיל זה מיועד עבור Hanlin V5 ומכשירים דומים" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:134 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:544 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:557 msgid "This profile is intended for the Cybook G3." msgstr "פרופיל זה מיועד עבור Cybook G3." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:147 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:557 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:570 msgid "This profile is intended for the Cybook Opus." msgstr "פרופיל זה מיועד עבור Cybook Opus." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:159 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:568 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:583 msgid "This profile is intended for the Amazon Kindle." msgstr "פרופיל זה מיועד עבור Amazon Kindle." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:171 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:609 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:631 msgid "This profile is intended for the Irex Illiad." msgstr "פרופיל זה מיועד עבור Irex Illiad." #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:183 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:622 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:644 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:196 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:636 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:658 msgid "This profile is intended for the IRex Digital Reader 800." msgstr "פרופיל זה מיועד עבור IRex Digital Reader 800" #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:208 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:650 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:672 msgid "This profile is intended for the B&N Nook." msgstr "פרופיל זה מיועד עבור B&N Nook." @@ -557,28 +557,28 @@ msgstr "" "פרופיל זה מנסה לת ברירות מחדל סבירות והוא יעיל במידה ואתה רוצה להפיק מסמך " "שנועד להקרא במחשב או על מגוון מכשירים." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:270 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:276 msgid "" "Intended for the iPad and similar devices with a resolution of 768x1024" msgstr "מיועד ל-iPad ומכשירים דומים עם רזולוציה של 768x1024" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:424 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:435 msgid "Intended for generic tablet devices, does no resizing of images" -msgstr "" +msgstr "מיועד למכשירי קריאה גנריים, לא משנה מידות של תמונות" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:448 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:462 msgid "This profile is intended for the Kobo Reader." msgstr "פרופיל זה מיועד ל-Kobo Reader" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:461 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:475 msgid "This profile is intended for the SONY PRS-300." msgstr "פרופיל זה מיועד למכשיר SONY PRS-300." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:479 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:493 msgid "This profile is intended for the 5-inch JetBook." msgstr "פרופיל זה מיועד למכשיר 5-inch JetBook." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:488 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:502 msgid "" "This profile is intended for the SONY PRS line. The 500/505/700 etc, in " "landscape mode. Mainly useful for comics." @@ -586,11 +586,15 @@ msgstr "" "פרופיל זה מיועד למכשיר מקו SONY PRS. ה- 500/505/700 וכדומה בתצוגה " "אופקית.שימושי במיוחד עבור קומיקס." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:589 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:609 msgid "This profile is intended for the Amazon Kindle DX." msgstr "פרופיל זה מיועד למכשיר Amazon Kindle DX." -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:663 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:684 +msgid "This profile is intended for the B&N Nook Color." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:695 msgid "This profile is intended for the Sanda Bambook." msgstr "הפרופיל הזה מיועד ל'סאנדה במבוק' (Sanda Bambook)." @@ -664,13 +668,13 @@ msgstr "הפסק את הרכיב המצויין" msgid "Communicate with Android phones." msgstr "מתקשר עם טלפון Android." -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:53 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:56 msgid "" "Comma separated list of directories to send e-books to on the device. The " "first one that exists will be used" msgstr "רשימת ספריות מופרדות בפסיקל שליחת ספרשת למכשיר." -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:95 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:98 msgid "Communicate with S60 phones." msgstr "תקשר עם סלולרי S60" @@ -703,14 +707,14 @@ msgstr "מעדכן רישום נתוני מטא של החומרה" #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:378 #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:947 #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:987 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2949 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2989 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2956 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2996 msgid "%d of %d" msgstr "%d מתוך %d" #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:385 #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:992 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2995 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:3002 msgid "finished" msgstr "הסתיים" @@ -740,29 +744,29 @@ msgstr "" "לא היה אפשר להמיר חלק מתמונות השער.\n" "לחץ על 'הצג פרטים' לקבלת רשימה." -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2546 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2553 #: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:444 #: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:467 #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:882 #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:888 #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:918 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:257 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:212 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:225 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2021 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:187 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:200 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2015 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:149 msgid "News" msgstr "חדשות" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2547 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2554 #: /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:1984 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2002 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:560 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1978 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1996 msgid "Catalog" msgstr "קטלוג" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2853 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2860 msgid "Communicate with iTunes." msgstr "תקשר עם אייטונס" @@ -784,6 +788,10 @@ msgstr "Kovid Goyal" msgid "Communicate with the Cybook Gen 3 / Opus eBook reader." msgstr "מחליף נתונים עם Cybook Gen 3 / Opus eBook reader." +#: /home/kovid/work/calibre/src/calibre/devices/cybook/driver.py:64 +msgid "Communicate with the Cybook Orizon eBook reader." +msgstr "תקשר עם הקורא האלקטרוני Cybook Orizon." + #: /home/kovid/work/calibre/src/calibre/devices/eb600/driver.py:24 msgid "Communicate with the EB600 eBook reader." msgstr "מחליף נתונים עם EB600 eBook reader." @@ -796,6 +804,10 @@ msgstr "תקשר עם אצטק מנטור EB600" msgid "Communicate with the PocketBook 301 reader." msgstr "תקשר עם קורא הספריםפוקטבוק 301" +#: /home/kovid/work/calibre/src/calibre/devices/eb600/driver.py:233 +msgid "Communicate with the PocketBook 602 reader." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/edge/driver.py:17 msgid "Entourage Edge" msgstr "Entourage Edge" @@ -854,8 +866,8 @@ msgstr "מתקשר עם SpringDesign Alex eBook reader." #: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:102 #: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:113 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:264 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:296 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:268 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:300 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:256 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:274 msgid "Removing books from device..." @@ -944,26 +956,26 @@ msgstr "" msgid "Getting list of books on device..." msgstr "קורא את רשימת הספרים מההתקן..." -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:300 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:307 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:304 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:311 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:281 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:286 msgid "Removing books from device metadata listing..." msgstr "מסיר ספרים מרשימת הספרים במכשיר" -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:312 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:347 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:316 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:351 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:219 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:250 msgid "Adding books to device metadata listing..." msgstr "מוסיף ספרים לרשימת הספרים במכשיר" -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:424 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:258 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:428 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:262 msgid "Not Implemented" msgstr "לא יושם" -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:425 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:429 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." @@ -982,29 +994,37 @@ msgid "Communicate with the Sweex MM300" msgstr "תקשר עם סוויקס MM300" #: /home/kovid/work/calibre/src/calibre/devices/misc.py:79 +msgid "Communicate with the Digma Q600" +msgstr "תקשר עם ה-Digma Q600" + +#: /home/kovid/work/calibre/src/calibre/devices/misc.py:88 msgid "Communicate with the Kogan" msgstr "תקשר עם קוגן" -#: /home/kovid/work/calibre/src/calibre/devices/misc.py:87 -#: /home/kovid/work/calibre/src/calibre/devices/misc.py:114 +#: /home/kovid/work/calibre/src/calibre/devices/misc.py:96 +#: /home/kovid/work/calibre/src/calibre/devices/misc.py:123 msgid "Communicate with the Pandigital Novel" msgstr "תקשר עם פאן דיגיטאל נובל" -#: /home/kovid/work/calibre/src/calibre/devices/misc.py:124 -msgid "Communicate with the VelocityMicro" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/devices/misc.py:142 +msgid "Communicate with the VelocityMicro" +msgstr "תקשר עם ה-VelocityMicro" + +#: /home/kovid/work/calibre/src/calibre/devices/misc.py:160 msgid "Communicate with the GM2000" msgstr "תקשר עם GM2000" +#: /home/kovid/work/calibre/src/calibre/devices/misc.py:180 +msgid "Communicate with the Acer Lumiread" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/nokia/driver.py:17 msgid "Communicate with the Nokia 770 internet tablet." msgstr "תקשר עם מחשב טאבלט נוקיה 770" #: /home/kovid/work/calibre/src/calibre/devices/nokia/driver.py:40 msgid "Communicate with the Nokia 810/900 internet tablet." -msgstr "" +msgstr "תקשר עם ה-Nokia 810/900 internet tablet" #: /home/kovid/work/calibre/src/calibre/devices/nokia/driver.py:74 msgid "Communicate with the Nokia E52" @@ -1018,6 +1038,14 @@ msgstr "מכשיר ה-Nook" msgid "Communicate with the Nook eBook reader." msgstr "מתקשר עם Nook eBook reader." +#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:85 +msgid "Nook Color" +msgstr "נוק צבעוני (Nook Color)" + +#: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:86 +msgid "Communicate with the Nook Color eBook reader." +msgstr "תקשר עם הקורא האלקטרוני, נוק הצבעוני (Nook Color)." + #: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:17 msgid "Communicate with the Nuut2 eBook reader." msgstr "מתקשר עם Nuut2 eBook reader" @@ -1053,11 +1081,15 @@ msgstr "תקשר עם קורא הספרים טקלסט K3/K5" msgid "Communicate with the Newsmy reader." msgstr "תקשר עם קורא הספרים ניוסמי" -#: /home/kovid/work/calibre/src/calibre/devices/teclast/driver.py:48 +#: /home/kovid/work/calibre/src/calibre/devices/teclast/driver.py:47 +msgid "Communicate with the Pico reader." +msgstr "תקשר עם ה-Pico reader" + +#: /home/kovid/work/calibre/src/calibre/devices/teclast/driver.py:57 msgid "Communicate with the iPapyrus reader." msgstr "תקשר עם קורא הספרים אייפפירוס" -#: /home/kovid/work/calibre/src/calibre/devices/teclast/driver.py:59 +#: /home/kovid/work/calibre/src/calibre/devices/teclast/driver.py:68 msgid "Communicate with the Sovos reader." msgstr "תקשר עם קורא הספרים סובוס" @@ -1068,6 +1100,7 @@ msgstr "לא מצליח למצוא את כונן %s. נסה לאתחל את המ #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:438 msgid "Unable to detect the %s mount point. Try rebooting." msgstr "" +"לא מצליח למצוא את עיגון החומרה (mount point) ה-%s. נסה לאתחל את המחשב." #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:503 msgid "Unable to detect the %s disk drive." @@ -1075,7 +1108,7 @@ msgstr "לא מצליח למצוא את כונן %s." #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:596 msgid "Could not find mount helper: %s." -msgstr "" +msgstr "לא הצליח למצוא את עזר עיגון חומרה (mount helper): %s" #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:608 msgid "" @@ -1092,6 +1125,8 @@ msgid "" "The main memory of %s is read only. This usually happens because of file " "system errors." msgstr "" +"הזיכרון של %s הינו לקריאה בלבד. דבר זה לרוב קורה בגלל שגיאות במערכת הקבצים " +"(file system)." #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:815 #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:817 @@ -1164,7 +1199,7 @@ msgstr "שולח מטא תגיות למכשיר" #: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:182 msgid "Rendered %s" -msgstr "" +msgstr "חובר %s" #: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:185 msgid "Failed %s" @@ -1321,15 +1356,15 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:183 msgid "List builtin recipes" -msgstr "" +msgstr "פרט מתכונים מובנים" #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:256 msgid "Output saved to" -msgstr "" +msgstr "הפלט נשמר אל" #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:99 msgid "Level of verbosity. Specify multiple times for greater verbosity." -msgstr "" +msgstr "רמת פירוט אודות המתבצע. בחר מספר פעמים לרמת פירוט גבוהה." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:106 msgid "" @@ -1419,13 +1454,15 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:217 msgid "Don't add auto-detected chapters to the Table of Contents." -msgstr "" +msgstr "את תוסיף פרקים שנמצאו אוטומטית לטבלת תוכן-העניינים." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:224 msgid "" "If fewer than this number of chapters is detected, then links are added to " "the Table of Contents. Default: %default" msgstr "" +"אם מספר הפרקים שנמצאו קטן מהמספר הנקוב, אז קישורים (לינקים) יווצרו בתוכן-" +"העניינים. ברירת מחדל: %default" #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:231 msgid "" @@ -1603,15 +1640,15 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:449 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:38 msgid "Set the title." -msgstr "" +msgstr "קבע את הכותרת." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:453 msgid "Set the authors. Multiple authors should be separated by ampersands." -msgstr "" +msgstr "קבע את המחברים. אם יש כמה, הפרד בינהם בעזרת התו אמפרסנד (&)." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:458 msgid "The version of the title to be used for sorting. " -msgstr "" +msgstr "גרסת המסמך, לשימוש במיון. " #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:462 msgid "String to be used when sorting by author. " @@ -1619,64 +1656,64 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:466 msgid "Set the cover to the specified file or URL" -msgstr "" +msgstr "קבע את הכריכה כקובץ המצויין או כתובת אינטרנט (URL)" #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:470 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:54 msgid "Set the ebook description." -msgstr "" +msgstr "קבע את תיאור הספר." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:474 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:56 msgid "Set the ebook publisher." -msgstr "" +msgstr "קבע את המוציא לאור." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:478 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:60 msgid "Set the series this ebook belongs to." -msgstr "" +msgstr "קבע את הסדרה לה הספר שייך." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:482 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:62 msgid "Set the index of the book in this series." -msgstr "" +msgstr "קבע את מספר הספר בסדרה." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:486 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:64 msgid "Set the rating. Should be a number between 1 and 5." -msgstr "" +msgstr "קבע את דירוג הספר. מספר זה צריך להיות בין 1 ל-5." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:490 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:66 msgid "Set the ISBN of the book." -msgstr "" +msgstr "קבע את המספר הסטנדרטי של הספר (ISBN)." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:494 #: /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 "" +msgstr "קבע תוייות לספר זה. הפרד תוויות עם פסיקים." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:498 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:70 msgid "Set the book producer." -msgstr "" +msgstr "קבע את מפיק הספר." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:502 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/cli.py:72 msgid "Set the language." -msgstr "" +msgstr "קבע את השפה." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:506 msgid "Set the publication date." -msgstr "" +msgstr "קבע את תאריך היציאה לאור." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:510 msgid "Set the book timestamp (used by the date column in calibre)." -msgstr "" +msgstr "קבע את זמן הספר (יופיע בעמודת 'תאריך' בקליבר)." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:610 msgid "Could not find an ebook inside the archive" -msgstr "" +msgstr "הספר לא נמצא בתוך הארכיון" #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:668 msgid "Values of series index and rating must be numbers. Ignoring" @@ -1684,23 +1721,23 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:675 msgid "Failed to parse date/time" -msgstr "" +msgstr "קריאת התאריך/זמן נכשלה." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:830 msgid "Converting input to HTML..." -msgstr "" +msgstr "ממיר את הקלט ל-HTML..." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:858 msgid "Running transforms on ebook..." -msgstr "" +msgstr "מריץ שינויים על הספר..." #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:945 msgid "Creating" -msgstr "" +msgstr "מייצר" #: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/__init__.py:20 msgid "Failed to parse: %s with error: %s" -msgstr "" +msgstr "קריאת %s נכשלה עם השגיאה: %s" #: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/__init__.py:26 msgid "ePub Fixer" @@ -1794,19 +1831,19 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:170 -#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:205 +#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:203 msgid "Start" -msgstr "" +msgstr "התחל" #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/fb2ml.py:147 #: /home/kovid/work/calibre/src/calibre/ebooks/rb/rbml.py:102 #: /home/kovid/work/calibre/src/calibre/ebooks/txt/txtml.py:77 msgid "Table of Contents:" -msgstr "" +msgstr "תוכן העניינים:" #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:32 msgid "Do not insert a Table of Contents at the beginning of the book." -msgstr "" +msgstr "אל תשים את תוכן העניינים בתחילת הספר." #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/output.py:21 #: /home/kovid/work/calibre/src/calibre/ebooks/pdb/output.py:32 @@ -1814,7 +1851,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/rb/output.py:21 #: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:35 msgid "Add Table of Contents to beginning of the book." -msgstr "" +msgstr "הוסף את תוכן העניינים בתחילת הספר." #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/output.py:24 msgid "" @@ -1822,12 +1859,16 @@ msgid "" "experimental. It can cause conversion to fail. It can also produce " "unexpected output." msgstr "" +"נסה להפוך את הפרקים לחלקים נפרדים. אזהרה: אופציה זו הינה ניסיונית. היא עלולה " +"לגרום להמרה להיכשל. היא גם עלולה לגרום לפלט לא צפוי." #: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:249 msgid "" "Traverse links in HTML files breadth first. Normally, they are traversed " "depth first." msgstr "" +"עבור על הקישורים בקבצי ה-HTML בצורה רוחבית (breadth first). לרוב המעבר נעשה " +"לעומק כל קישור (depth first)." #: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:256 msgid "" @@ -1844,10 +1885,26 @@ msgid "" "pipeline." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:273 +#: /home/kovid/work/calibre/src/calibre/ebooks/html/output.py:33 +msgid "CSS file used for the output instead of the default file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/html/output.py:36 msgid "" -"Average line length for line breaking if the HTML is from a previous partial " -"conversion of a PDF file. Default is %default which disables this." +"Template used for generation of the html index file instead of the default " +"file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/html/output.py:39 +msgid "" +"Template used for the generation of the html contents of the book instead of " +"the default file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/html/output.py:42 +msgid "" +"Extract the contents of the generated ZIP file to the specified directory. " +"WARNING: The contents of the directory will be deleted." msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lit/from_any.py:47 @@ -1881,23 +1938,23 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:539 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:552 msgid "Could not parse file: %s" -msgstr "" +msgstr "עיבוד הקובץ %s כשל" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:544 msgid "%s is an empty file" -msgstr "" +msgstr "%s הינה תיקייה ריקה" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:564 msgid "Failed to parse link %s %s" -msgstr "" +msgstr "עיבוד הקישור %s %s כשל" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:608 msgid "Cannot add link %s to TOC" -msgstr "" +msgstr "הוספת הקישור %s לתוכן העניינים לא הצליחה" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:957 msgid "Unable to process image %s. Error: %s" -msgstr "" +msgstr "לא מצליח לעבד את התמונה %s. שגיאה: %s" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1002 msgid "Unable to process interlaced PNG %s" @@ -1908,33 +1965,37 @@ msgid "" "Could not process image: %s\n" "%s" msgstr "" +"עיבוד התמונה לא הצליח: %s\n" +"%s" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1772 msgid "" "An error occurred while processing a table: %s. Ignoring table markup." -msgstr "" +msgstr "שגיאה קרתה בעת עיבוד הטבלה: %s. מתעלם מהגדרת הטבלה." #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1774 msgid "" "Bad table:\n" "%s" msgstr "" +"טבלה בלתי תקינה:\n" +"%s" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1796 msgid "Table has cell that is too large" -msgstr "" +msgstr "לטבלה תא גדול מדי" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1862 msgid "Could not read cover image: %s" -msgstr "" +msgstr "קריאת תמונת הכריכה לא הצליחה: %s" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1865 msgid "Cannot read from: %s" -msgstr "" +msgstr "לא יכול לקרוא מ: %s" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1994 msgid "Failed to process opf file" -msgstr "" +msgstr "עיבוד קובץ ה-opf לא הצליח" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrfparser.py:136 msgid "" @@ -1948,7 +2009,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrfparser.py:139 msgid "Do not save embedded image and font files to disk" -msgstr "" +msgstr "אל תשמור קבצי תמונות מקובעות ופונטים לדיסק הקשיח." #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrfparser.py:158 msgid "Parsing LRF..." @@ -1956,7 +2017,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrfparser.py:161 msgid "Creating XML..." -msgstr "" +msgstr "יוצר XML..." #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrfparser.py:163 msgid "LRS written to " @@ -1964,7 +2025,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:267 msgid "Could not read from thumbnail file:" -msgstr "" +msgstr "הקריאה מקובץ התמונות הממוזערות לא הצליחה:" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:287 msgid "" @@ -1977,7 +2038,7 @@ msgid "Path to output file" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:290 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:128 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:126 msgid "Verbose processing" msgstr "" @@ -2138,23 +2199,23 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:605 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:45 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:102 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:109 #: /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:380 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:930 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:373 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:923 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:303 -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:569 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:570 msgid "Title" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:606 #: /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:385 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:931 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:378 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:924 msgid "Author(s)" msgstr "" @@ -2170,37 +2231,36 @@ msgid "Producer" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:609 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:37 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:212 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:39 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:206 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:189 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:104 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:72 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:332 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1138 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:79 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:325 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1131 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:178 msgid "Comments" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:611 -#: /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/ebooks/oeb/transforms/jacket.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:29 #: /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:320 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1134 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:313 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1127 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:160 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:608 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:655 msgid "Tags" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:613 -#: /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/ebooks/oeb/transforms/jacket.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:28 #: /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:337 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1143 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:330 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1136 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:108 msgid "Series" msgstr "" @@ -2210,12 +2270,12 @@ msgid "Language" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:616 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1126 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1119 msgid "Timestamp" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:618 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:151 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:157 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:63 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:70 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:258 @@ -2320,6 +2380,7 @@ msgid "No cover found" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:28 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:44 msgid "Cover download" msgstr "" @@ -2365,49 +2426,53 @@ msgstr "" msgid "Downloads metadata from Douban.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:51 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:57 msgid "Metadata download" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:128 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:141 msgid "ratings" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:128 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:141 msgid "tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:129 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:142 msgid "description/reviews" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:130 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:143 msgid "Download %s from %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:156 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:150 +msgid "Convert comments downloaded from %s to plain text" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:178 msgid "Downloads metadata from Google Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:173 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:195 msgid "Downloads metadata from isbndb.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:201 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:223 msgid "" "To use isbndb.com you must sign up for a %sfree account%s and enter your " "access key below." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:211 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:233 msgid "Downloads social metadata from amazon.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:230 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:254 msgid "Downloads series/tags/rating information from librarything.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:109 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:107 msgid "" "\n" "%prog [options] key\n" @@ -2421,23 +2486,24 @@ msgid "" "\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:120 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:118 msgid "The ISBN ID of the book you want metadata for." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:122 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:120 msgid "The author whose book to search for." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:124 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:122 msgid "The title of the book to search for." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:126 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:124 msgid "The publisher of the book to search for." msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:77 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:336 msgid " not found." msgstr "" @@ -2450,8 +2516,24 @@ msgid "" "LibraryThing.com\n" msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:25 +msgid "Downloads metadata from french Nicebooks" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:41 +msgid "Downloads covers from french Nicebooks" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:332 +msgid "Nicebooks timed out. Try again later." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:337 +msgid "An errror occured with Nicebooks cover fetcher" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1308 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1399 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 msgid "Cover" msgstr "" @@ -2486,74 +2568,74 @@ msgstr "" msgid "All articles" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:259 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:262 msgid "This is an Amazon Topaz book. It cannot be processed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1400 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 msgid "Title Page" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 #: /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:199 msgid "Table of Contents" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 msgid "Index" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 msgid "Glossary" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 msgid "Acknowledgements" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 msgid "Bibliography" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 msgid "Colophon" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 msgid "Copyright" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 msgid "Dedication" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 msgid "Epigraph" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 msgid "Foreword" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 msgid "List of Illustrations" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 msgid "List of Tables" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 msgid "Notes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1416 msgid "Preface" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1417 msgid "Main Text" msgstr "" @@ -2561,7 +2643,7 @@ msgstr "" msgid "%s format books are not supported" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/cover.py:103 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/cover.py:98 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:156 msgid "Book %s of %s" msgstr "" @@ -2570,9 +2652,9 @@ msgstr "" msgid "HTML TOC generation options." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:153 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:159 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:71 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:606 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:653 msgid "Rating" msgstr "" @@ -2602,7 +2684,7 @@ msgstr "" msgid "Sidebar" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/pdb/input.py:22 +#: /home/kovid/work/calibre/src/calibre/ebooks/pdb/input.py:23 #: /home/kovid/work/calibre/src/calibre/ebooks/tcr/input.py:23 #: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:24 msgid "" @@ -2610,7 +2692,7 @@ msgid "" "it will assume that every line represents a paragraph instead." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/pdb/input.py:26 +#: /home/kovid/work/calibre/src/calibre/ebooks/pdb/input.py:27 #: /home/kovid/work/calibre/src/calibre/ebooks/tcr/input.py:27 #: /home/kovid/work/calibre/src/calibre/ebooks/txt/input.py:28 msgid "" @@ -2857,20 +2939,20 @@ msgid "" "Specify the character encoding of the output document. The default is cp1252." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:196 +#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:256 msgid "" "This RTF file has a feature calibre does not support. Convert it to HTML " "first and then try it.\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:32 +#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:25 #: /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 "" -#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:39 +#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:29 #: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:38 msgid "" "The maximum number of characters per line. This splits on the first space " @@ -2879,17 +2961,34 @@ msgid "" "minimum of 25 characters. Use 0 to disable line splitting." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:124 +#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:36 +msgid "" +"Specify whether or not to insert an empty line between two paragraphs." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:40 +msgid "" +"Specify whether or not to insert two space characters to indent the first " +"line of each paragraph." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:44 +msgid "" +"Specify whether or not to hide the chapter title for each chapter. Useful " +"for image-only output (eg. comics)." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:122 msgid "Start Page" msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:132 #: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:134 -#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:136 msgid "Cover Pages" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:149 -#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:152 +#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:147 +#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:150 msgid " (Preface)" msgstr "" @@ -3046,7 +3145,7 @@ msgid "Disable UI animations" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:183 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:487 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:509 msgid "Copied" msgstr "" @@ -3106,101 +3205,101 @@ msgstr "" msgid "How many empty books should be added?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:143 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:202 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:147 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:206 msgid "Uploading books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:164 #: /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:161 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:165 msgid "EPUB Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:162 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:166 msgid "LRF Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:163 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:167 msgid "HTML Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:168 msgid "LIT Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:169 msgid "MOBI Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:170 msgid "Topaz books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:171 msgid "Text books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:172 msgid "PDF Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:173 msgid "SNB Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:174 msgid "Comics" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:175 msgid "Archives" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:179 msgid "Supported books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:215 msgid "Merged some books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:216 msgid "" "Some duplicates were found and merged into the following existing books:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:225 msgid "Failed to read metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:226 msgid "Failed to read metadata from the following" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:241 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:246 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:245 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:250 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:269 msgid "Add to library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:246 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:250 #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:56 #: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:28 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:95 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:119 msgid "No book selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:263 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:265 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:269 msgid "No book files found" msgstr "" @@ -3213,7 +3312,7 @@ msgid "Add books to your calibre library from the connected device" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:536 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:542 msgid "Fetch annotations (experimental)" msgstr "" @@ -3308,7 +3407,7 @@ msgid "Checking database integrity" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:128 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:645 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:593 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:41 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:54 msgid "Error" @@ -3324,15 +3423,15 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:135 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." +"The following books had formats or covers listed in the database that are " +"not actually available. The entries for the formats/covers 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/actions/choose_library.py:148 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:51 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:139 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:162 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:112 msgid "%d books" msgstr "" @@ -3468,7 +3567,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:391 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:734 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:742 msgid "Not allowed" msgstr "" @@ -3500,6 +3599,10 @@ msgstr "" msgid "Starting conversion of %d book(s)" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:170 +msgid "Empty output file, probably the conversion process crashed" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:83 msgid "Copy to library" msgstr "" @@ -3534,9 +3637,9 @@ msgid "Could not copy books: " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:147 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:708 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:679 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:664 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:687 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:190 msgid "Failed" msgstr "" @@ -3597,14 +3700,14 @@ msgid "Main memory" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:473 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:482 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:467 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:476 msgid "Storage Card A" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:475 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:484 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:469 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:478 msgid "Storage Card B" msgstr "" @@ -3745,7 +3848,7 @@ msgid "covers" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:96 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:224 msgid "metadata" msgstr "" @@ -3767,26 +3870,26 @@ msgstr "" msgid "At least two books must be selected for merging" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:196 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:197 msgid "" "Book formats and metadata from the selected books will be added to the " -"<b>first selected book.</b> ISBN will <i>not</i> be merged.<br><br> The " +"<b>first selected book</b> (%s). ISBN will <i>not</i> be merged.<br><br> The " "second and subsequently selected books will not be deleted or " "changed.<br><br>Please confirm you want to proceed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:209 msgid "" "Book formats and metadata from the selected books will be merged into the " -"<b>first selected book</b>. ISBN will <i>not</i> be merged.<br><br>After " -"merger the second and subsequently selected books will be <b>deleted</b>. " -"<br><br>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 <b>deleted</b> from your computer.<br><br> Are you <b>sure</b> " -"you want to proceed?" +"<b>first selected book</b> (%s). ISBN will <i>not</i> be " +"merged.<br><br>After merger the second and subsequently selected books will " +"be <b>deleted</b>. <br><br>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 <b>deleted</b> from your computer.<br><br> Are " +"you <b>sure</b> 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:222 msgid "" "You are about to merge more than 5 books. Are you <b>sure</b> you want to " "proceed?" @@ -3833,6 +3936,7 @@ msgid "Ctrl+P" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:23 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:200 msgid "Run welcome wizard" msgstr "" @@ -3918,7 +4022,7 @@ msgid "Click the show details button to see which ones." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:16 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:613 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:660 msgid "Show book details" msgstr "" @@ -4005,21 +4109,21 @@ msgstr "" msgid "View specific format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:95 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:156 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:158 msgid "Cannot view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:100 #: /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:109 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:108 msgid "Multiple Books Selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:109 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 " @@ -4027,11 +4131,11 @@ msgid "" "continue?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:118 msgid "Cannot open folder" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:157 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:159 msgid "%s has no available formats." msgstr "" @@ -4056,7 +4160,7 @@ msgid "The specified directory could not be processed." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/add.py:229 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:857 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:813 msgid "No books" msgstr "" @@ -4241,49 +4345,49 @@ msgid "" "&Multiple books per folder, assumes every ebook file is a different book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:23 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:47 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:56 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:313 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:119 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:120 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:121 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:131 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:25 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:405 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:137 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:327 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1124 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:320 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1117 msgid "Path" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:24 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:50 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:122 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:123 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:124 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:127 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:326 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:319 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/emailp.py:24 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:117 msgid "Formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:25 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:934 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1127 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:927 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1120 msgid "Collections" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:49 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:51 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:60 msgid "Click to open" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:50 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:319 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:325 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:331 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1133 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1137 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:312 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:318 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1126 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1130 #: /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 @@ -4291,8 +4395,8 @@ msgstr "" msgid "None" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:312 -msgid "Click to open Book Details window" +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:404 +msgid "Double-click to open Book Details window" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex.py:16 @@ -4336,7 +4440,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:86 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml_ui.py:42 -#: /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:82 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_tab_template_ui.py:32 #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:93 #: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:54 @@ -4353,7 +4457,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_input_ui.py:43 #: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_output_ui.py:47 #: /home/kovid/work/calibre/src/calibre/gui2/convert/rb_output_ui.py:33 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/snb_output_ui.py:28 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/snb_output_ui.py:39 #: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:80 #: /home/kovid/work/calibre/src/calibre/gui2/convert/toc_ui.py:67 #: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:51 @@ -4379,7 +4483,7 @@ msgstr "" #: /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:112 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:123 msgid "Form" msgstr "" @@ -4459,23 +4563,23 @@ msgstr "" msgid "E-book options" 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:83 msgid "'Don't include this book' tag:" 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:84 msgid "'Mark this book as read' tag:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:79 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:85 msgid "Additional note tag prefix:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:86 msgid "Regex pattern describing tags to exclude as genres:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:87 msgid "" "Regex tips:\n" "- The default regex - \\[.+\\] - excludes genre tags of the form [tag], " @@ -4484,26 +4588,43 @@ msgid "" "Genre Section" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:90 msgid "Include 'Titles' Section" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:91 msgid "Include 'Recently Added' Section" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:92 msgid "Sort numbers as text" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:87 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:93 msgid "Include 'Series' Section" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:94 +msgid "Wishlist tag:" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_tab_template_ui.py:33 msgid "Tab template for catalog.ui" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:25 +msgid "Bold" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:26 +msgid "Italic" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:28 +msgid "Underline" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:36 msgid "" "For settings that cannot be specified in this dialog, use the values saved " @@ -4511,11 +4632,11 @@ msgid "" "specified in the Preferences" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:70 msgid "Bulk Convert" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:83 #: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:185 msgid "Options specific to the output format." msgstr "" @@ -4962,7 +5083,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:333 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:336 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:377 msgid "&Author(s): " msgstr "" @@ -4978,7 +5099,7 @@ 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:342 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:345 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:388 msgid "&Publisher: " msgstr "" @@ -4989,7 +5110,7 @@ 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:344 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:347 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:390 msgid "" "Tags categorize the book. This is particularly useful while searching. " @@ -4997,15 +5118,16 @@ msgid "" 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:351 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:354 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:214 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:352 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:353 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:355 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:356 #: /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:395 msgid "List of known series. You can add new series." @@ -5184,7 +5306,7 @@ msgid "Options specific to the input format." msgstr "" #: /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/book_info_ui.py:76 #: /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" @@ -5202,6 +5324,18 @@ msgstr "" msgid "SNB Output" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/convert/snb_output_ui.py:40 +msgid "Hide chapter name" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/snb_output_ui.py:41 +msgid "Insert space before the first line for each paragraph" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/snb_output_ui.py:42 +msgid "Insert empty line between paragraphs" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:17 msgid "" "Structure\n" @@ -5359,8 +5493,8 @@ msgid "Force maximum line length" msgstr "" #: /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/book_info_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:78 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:46 #: /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 @@ -5495,7 +5629,7 @@ msgid "Automatically number books" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:499 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:364 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:367 msgid "Force numbers to start with " msgstr "" @@ -5511,228 +5645,171 @@ msgstr "" msgid "tags to remove" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:44 #: /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:189 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:183 msgid "Device no longer connected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:307 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:301 msgid "Get device information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:318 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:312 msgid "Get list of books on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:328 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:322 msgid "Get annotations from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:340 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:334 msgid "Send metadata to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:345 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:339 msgid "Send collections to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:374 msgid "Upload %d books to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:389 msgid "Delete books from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:412 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:406 msgid "Download books from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:422 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:416 msgid "View book on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:456 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:450 msgid "Set default send to device action" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:462 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:456 msgid "Send to main memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:464 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:458 msgid "Send to storage card A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:466 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:460 msgid "Send to storage card B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:471 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:480 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:465 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:474 msgid "Main Memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:491 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:486 +msgid "Send specific format to" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:487 msgid "Send and delete from library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:492 -msgid "Send specific format" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:530 msgid "Eject device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:646 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:594 msgid "Error communicating with device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:667 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:605 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1089 +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:296 +msgid "No suitable formats" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:623 msgid "Select folder to open as device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:714 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:670 msgid "Error talking to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:715 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:671 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:758 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:714 msgid "Device: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:760 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:716 msgid " detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:858 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:814 msgid "selected to send" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:863 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:819 msgid "Choose format to send to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:872 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:828 msgid "No device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:873 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:829 msgid "Cannot send: No device is connected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:876 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:880 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:832 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:836 msgid "No card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:877 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:881 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:833 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:837 msgid "Cannot send: Device has no storage card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:922 -msgid "E-book:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:925 -msgid "Attached, you will find the e-book" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:926 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:107 -msgid "by" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:927 -msgid "in the %s format." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:940 -msgid "Sending email to" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:970 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:978 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1071 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1156 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1275 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1283 -msgid "No suitable formats" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:971 -msgid "Auto convert the following books before sending via email?" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:979 -msgid "" -"Could not email the following books as no suitable formats were found:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:997 -msgid "Failed to email books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:998 -msgid "Failed to email the following books:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1002 -msgid "Sent by email:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1030 -msgid "News:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1031 -msgid "Attached is the" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1042 -msgid "Sent news to" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1072 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1157 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1276 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:883 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:966 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1083 msgid "Auto convert the following books before uploading to the device?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1102 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:912 msgid "Sending catalogs to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1189 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:997 msgid "Sending news to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1242 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1050 msgid "Sending books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1284 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1090 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:1348 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1154 msgid "No space on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1349 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1155 msgid "" "<p>Cannot upload books to device there is no more free space available " msgstr "" @@ -5775,23 +5852,26 @@ msgstr "" msgid "" "<p>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 " -"metadata and covers for them.<p>Any invalid ISBNs in the list will be " -"ignored." +"metadata and covers for them.</p>\n" +"<p>Any invalid ISBNs in the list will be ignored.</p>\n" +"<p>You can also specify a file that will be added with each ISBN. To do this " +"enter the full path to the file after a <code>>></code>. For example:</p>\n" +"<p><code>9788842915232 >> %s</code></p>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:53 msgid "&Paste from clipboard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:80 msgid "Fit &cover within view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:81 msgid "&Previous" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:82 msgid "&Next" msgstr "" @@ -5841,21 +5921,32 @@ msgstr "" msgid "Names to ignore:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:59 +msgid "" +"Enter comma-separated standard file name wildcards, such as synctoy*.dat" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:62 msgid "Extensions to ignore" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:67 +msgid "" +"Enter comma-separated extensions without a leading dot. Used only in book " +"folders" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:119 msgid "Path from library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:119 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/bookmarkmanager.py:89 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:225 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:248 msgid "Name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:136 msgid "" "The marked files and folders will be <b>permanently deleted</b>. Are you " "sure?" @@ -5902,7 +5993,7 @@ msgid "No location selected" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:84 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:628 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:654 msgid "Bad location" msgstr "" @@ -5943,6 +6034,7 @@ msgid "Set options for converting %s" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:211 msgid "&Title:" msgstr "" @@ -5978,15 +6070,15 @@ 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:932 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:925 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:31 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:294 -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:568 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:569 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:1123 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1116 msgid "Format" msgstr "" @@ -5999,12 +6091,12 @@ msgid "Author sort" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:115 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:590 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:597 msgid "Invalid author name" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:591 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:598 msgid "Author names cannot contain & characters." msgstr "" @@ -6147,59 +6239,58 @@ msgstr "" msgid "Working" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:186 #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:386 msgid "Lower Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:187 #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:385 msgid "Upper Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:188 #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:388 msgid "Title Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:191 msgid "Character match" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:190 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:192 msgid "Regular Expression" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:193 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:195 msgid "Replace field" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:194 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:196 msgid "Prepend to field" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:195 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:197 msgid "Append to field" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:208 msgid "Editing meta information for <b>%d books</b>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:261 msgid "Book %d:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:274 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:276 msgid "" "<b>You can destroy your library using this feature.</b> Changes are " -"permanent. There is no undo function. This feature is experimental, and " -"there may be bugs. You are strongly encouraged to back up your library " -"before proceeding.<p>Search and replace in text fields using character " -"matching or regular expressions. " +"permanent. There is no undo function. You are strongly encouraged to back up " +"your library before proceeding.<p>Search and replace in text fields using " +"character matching or regular expressions. " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:284 msgid "" "In character mode, the field is searched for the entered search text. The " "text is replaced by the specified replacement text everywhere it is found in " @@ -6209,7 +6300,7 @@ msgid "" "text will match both upper- and lower-case letters" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:295 msgid "" "In regular expression mode, the search text is an arbitrary python-" "compatible regular expression. The replacement text can contain " @@ -6224,110 +6315,110 @@ msgid "" "function." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:436 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:440 msgid "You must specify a destination when source is a composite field" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:528 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:536 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:627 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:532 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:540 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:635 msgid "Search/replace invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:529 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:533 msgid "" "Authors cannot be set to the empty string. Book title %s not processed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:537 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:541 msgid "Title cannot be set to the empty string. Book title %s not processed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:628 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:636 msgid "Search pattern is invalid: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:665 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:673 msgid "" "Applying changes to %d books.\n" "Phase {0} {1}%%." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:332 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:335 msgid "Edit Meta information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:334 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:337 msgid "A&utomatically set author sort" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:335 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:338 msgid "Author s&ort: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:336 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:339 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:337 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:340 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384 msgid "&Rating:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:338 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:339 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:342 #: /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 msgid "Rating of this book. 0-5 stars" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:340 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:343 msgid "No change" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:344 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:387 msgid " stars" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:343 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:346 msgid "Add ta&gs: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:345 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:346 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:348 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:349 #: /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:392 msgid "Open Tag Editor" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:347 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:350 msgid "&Remove tags:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:348 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:351 msgid "Comma separated list of tags to remove from the books. " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:349 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:352 msgid "Check this box to remove all tags from the books." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:350 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:353 msgid "Remove all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:354 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:357 msgid "If checked, the series will be cleared" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:355 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:358 msgid "Clear series" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:356 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:359 msgid "" "If not checked, the series number for the books will be set to 1.\n" "If checked, selected books will be automatically numbered, in the order\n" @@ -6335,110 +6426,110 @@ 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:360 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:363 msgid "Automatically number books in this series" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:361 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:364 msgid "" "Series will normally be renumbered from the highest number in the database\n" "for that series. Checking this box will tell calibre to start numbering\n" "from the value in the box" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:365 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:368 msgid "Remove &format:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:366 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:369 msgid "&Swap title and author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:367 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:370 msgid "" "Force the title to be in title case. If both this and swap authors are " "checked,\n" "title and author are swapped before the title case is set" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:369 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:372 msgid "Change title to title case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:370 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:373 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:373 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:376 msgid "Remove &stored conversion settings for the selected books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:374 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:377 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:424 msgid "&Basic metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:375 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:378 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:425 msgid "&Custom metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:379 msgid "Search &field:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:377 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:380 msgid "The name of the field that you want to search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:378 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:381 msgid "Search mode:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:379 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:382 msgid "" "Choose whether to use basic text matching or advanced regular expression " "matching" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:380 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:383 msgid "&Search for:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:381 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:384 msgid "" "Enter the what you are looking for, either plain text or a regular " "expression, depending on the mode" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:382 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:385 msgid "" "Check this box if the search string must match exactly upper and lower case. " "Uncheck it if case is to be ignored" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:383 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:386 msgid "Case sensitive" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:387 msgid "&Replace with:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:385 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:388 msgid "" "The replacement text. The matched search text will be replaced with this " "string" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:386 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:389 msgid "Apply function after replace:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:387 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:390 msgid "" "Specify how the text is to be processed after matching and replacement. In " "character mode, the entire\n" @@ -6446,49 +6537,49 @@ msgid "" "processed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:389 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:392 msgid "&Destination field:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:390 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:393 msgid "" "The field that the text will be put into after all replacements. If blank, " "the source field is used." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:391 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:394 msgid "Mode:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:392 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:395 msgid "Specify how the text should be copied into the destination." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:393 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:396 msgid "" "If the replace mode is prepend or append, then this box indicates whether a " "comma or\n" "nothing should be put between the original text and the inserted text" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:395 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:398 msgid "use comma" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:396 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:399 msgid "Test &text" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:397 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:400 msgid "Test re&sult" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:398 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:401 msgid "Your test:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:399 -msgid "&Search and replace (experimental)" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:402 +msgid "&Search and replace" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:91 @@ -6571,72 +6662,74 @@ msgid "This ISBN number is invalid" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:611 -msgid "Cannot use tag editor" +msgid "Tags changed" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:612 -msgid "The tags editor cannot be used if you have modified the tags" +msgid "" +"You have changed the tags. In order to use the tags editor, you must either " +"discard or apply these changes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:632 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:639 msgid "Downloading cover..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:644 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:649 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:655 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:660 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:651 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:656 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:662 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:667 msgid "Cannot fetch cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:645 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:656 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:661 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:652 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:663 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:668 msgid "<b>Could not fetch cover.</b><br/>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:646 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:653 msgid "The download timed out." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:650 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:657 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:662 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:669 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:669 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:676 msgid "Bad cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:670 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:677 msgid "The cover is not a valid picture" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:703 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:710 msgid "There were errors" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:704 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:711 msgid "There were errors downloading social metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:735 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:742 msgid "Cannot fetch metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:736 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:743 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:823 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:833 msgid "Permission denied" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:824 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:834 msgid "Could not open %s. Is it being used by another program?" msgstr "" @@ -6755,20 +6848,21 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:63 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:217 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:125 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:133 msgid "&Username:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:64 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:218 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:126 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:135 msgid "&Password:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:65 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:219 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:167 msgid "&Show password" msgstr "" @@ -6996,61 +7090,98 @@ msgstr "" msgid "Negate" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:198 msgid "Advanced Search" msgstr "" -#: /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:120 -msgid "&All these words:" -msgstr "" - -#: /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:122 -msgid "&One or more of these words:" -msgstr "" - -#: /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:124 -msgid "Any of these &unwanted words:" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:199 msgid "What kind of match to use:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:126 -msgid "Contains: the word or phrase matches anywhere in the metadata" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:200 +msgid "Contains: the word or phrase matches anywhere in the metadata field" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:127 -msgid "Equals: the word or phrase must match an entire metadata field" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:201 +msgid "Equals: the word or phrase must match the entire metadata field" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:202 msgid "" -"Regular expression: the expression must match anywhere in the metadata" +"Regular expression: the expression must match anywhere in the metadata field" msgstr "" -#: /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:203 +msgid "Find entries that have..." +msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:204 +msgid "&All these words:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:205 +msgid "This exact &phrase:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:206 +msgid "&One or more of these words:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:207 +msgid "But dont show entries that have..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:208 +msgid "Any of these &unwanted words:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:209 msgid "" "See the <a href=\"http://calibre-ebook.com/user_manual/gui.html#the-search-" "interface\">User Manual</a> for more help" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:210 +msgid "A&dvanced Search" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:212 +msgid "Enter the title." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:213 +msgid "&Author:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:215 +msgid "Ta&gs:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:216 +msgid "Enter an author's name. Only one author can be used." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:217 +msgid "" +"Enter a series name, without an index. Only one series name can be used." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:218 +msgid "Enter tags separated by spaces" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:219 +msgid "&Clear" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:220 +msgid "Search only in specific fields:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:221 +msgid "Titl&e/Author/Series ..." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/select_formats.py:45 msgid "Choose formats" msgstr "" @@ -7178,12 +7309,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:580 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:587 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:581 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:588 msgid "An item cannot be set to nothing. Delete it instead." msgstr "" @@ -7264,7 +7395,7 @@ msgid "Discard changes" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:60 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:225 msgid "&Cancel" msgstr "" @@ -7453,6 +7584,60 @@ msgstr "" msgid "Recipe source code (python)" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:145 +msgid "Email %s to %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:187 +msgid "News:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:189 +msgid "Attached is the %s periodical downloaded by calibre." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:242 +msgid "E-book:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:245 +msgid "Attached, you will find the e-book" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:246 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:107 +msgid "by" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:247 +msgid "in the %s format." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:260 +msgid "Sending email to" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:290 +msgid "Auto convert the following books before sending via email?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:297 +msgid "" +"Could not email the following books as no suitable formats were found:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:303 +msgid "Failed to email book" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:306 +msgid "sent" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:329 +msgid "Sent news to" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:112 msgid "" "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" " @@ -7628,23 +7813,23 @@ msgstr "" msgid "Job has already run" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:251 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:262 msgid "Unavailable" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:294 msgid "Jobs:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:296 msgid "Shift+Alt+J" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:302 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:313 msgid "Click to see list of jobs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:371 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:382 msgid " - Jobs" msgstr "" @@ -7670,7 +7855,7 @@ msgid "Show books in the main memory of the device" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:67 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:848 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:820 msgid "Card A" msgstr "" @@ -7679,7 +7864,7 @@ msgid "Show books in storage card A" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:69 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:850 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:822 msgid "Card B" msgstr "" @@ -7691,38 +7876,46 @@ msgstr "" msgid "available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:158 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:159 msgid "" "Books display will be restricted to those matching the selected saved search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:171 -msgid "Advanced search" +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:170 +msgid "Shift+Ctrl+F" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:173 -msgid "&Search:" +msgid "Advanced search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:178 msgid "" "<p>Search the list of books by title, author, publisher, tags, comments, " "etc.<br><br>Words separated by spaces are ANDed" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:181 +msgid "&Go!" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:187 +msgid "Do Quick Search (you can also press the Enter key)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:193 msgid "Reset Quick Search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:199 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:205 msgid "Copy current search text (instead of search name)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:205 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:211 msgid "Save current search under the name shown in the box" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:217 msgid "Delete current saved search" msgstr "" @@ -7744,79 +7937,82 @@ msgstr "" msgid "Size (MB)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:338 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1143 -msgid "Book <font face=\"serif\">%s</font> of %s." +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:331 +msgid "Book %s of %s." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:700 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1243 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:407 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:693 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1236 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:414 msgid "The lookup/search name is \"{0}\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:706 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1245 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:699 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1238 msgid "This book's UUID is \"{0}\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:929 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:922 msgid "In Library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:933 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:926 msgid "Size" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1223 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1136 +msgid "Book <font face=\"serif\">%s</font> of %s." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1216 msgid "Marked for deletion" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1226 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1219 msgid "Double click to <b>edit</b> me<br><br>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:140 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:147 msgid "Hide column %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:145 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:152 msgid "Sort on %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:146 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:153 msgid "Ascending" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:156 msgid "Descending" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:168 msgid "Change text alignment for %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:163 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 msgid "Left" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:163 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 msgid "Right" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:171 msgid "Center" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:183 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:190 msgid "Show column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:195 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:202 msgid "Restore default layout" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:735 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:743 msgid "" "Dropping onto a device is not supported. First add the book to the calibre " "library." @@ -7847,7 +8043,7 @@ msgid "<b>No matches</b> for the search phrase <i>%s</i> 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:442 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:446 msgid "No matches found" msgstr "" @@ -7864,12 +8060,12 @@ msgid "LRF Viewer toolbar" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:131 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:487 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:503 msgid "Next Page" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:132 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:488 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:504 msgid "Previous Page" msgstr "" @@ -7913,7 +8109,7 @@ msgid "Do not check for updates" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/main.py:58 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:636 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:662 msgid "Calibre Library" msgstr "" @@ -8040,37 +8236,37 @@ msgstr "" msgid "No matches found for this book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:190 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:191 msgid "Failed to download metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:224 msgid "cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:225 msgid "Downloaded" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:225 msgid "Failed to get" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:229 msgid "%s %s for: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:284 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:288 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:162 msgid "Done" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:289 msgid "Successfully downloaded metadata for %d out of %d books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:287 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:612 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:291 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:659 msgid "Details" msgstr "" @@ -8566,39 +8762,39 @@ msgstr "" msgid "&Split the toolbar into two toolbars" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:222 msgid "&Apply" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:229 msgid "Restore &defaults" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:230 msgid "Save changes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:231 msgid "Cancel and return to overview" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:269 msgid "Restoring to defaults not supported for" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:304 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 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:307 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/main.py:312 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server.py:120 msgid "Restart needed" msgstr "" @@ -8904,7 +9100,7 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server.py:75 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:320 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:331 msgid "Failed to start content server" msgstr "" @@ -9098,24 +9294,25 @@ msgid "&Current tweaks" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:97 -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:270 #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:574 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:272 msgid "Search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:315 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:322 msgid "The selected search will be <b>permanently deleted</b>. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:357 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:364 msgid "Search (For Advanced Search click the button to the left)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:399 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:406 msgid "Saved Searches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:407 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:414 msgid "Choose saved search or enter name for new saved search" msgstr "" @@ -9196,26 +9393,22 @@ msgstr "" msgid "&Alternate shortcut:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:200 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:202 msgid "Rename '%s'" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:204 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:206 msgid "Edit sort for '%s'" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:209 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:211 msgid "Hide category %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:214 msgid "Show category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:216 -msgid "Show all categories" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:223 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:227 msgid "Manage %s" @@ -9230,63 +9423,67 @@ msgstr "" msgid "Manage User Categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:451 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:248 +msgid "Show all categories" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:458 msgid "" "Changing the authors for several books can take a while. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:456 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:463 msgid "" "Changing the metadata for that many books can take a while. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:512 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:320 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:519 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:296 msgid "Searches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:595 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:602 msgid "Duplicate search name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:596 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:603 msgid "The saved search name %s is already used." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:870 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:878 msgid "Sort by name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:870 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:878 msgid "Sort by popularity" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:871 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:879 msgid "Sort by average rating" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:874 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:882 msgid "Set the sort order for entries in the Tag Browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:880 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:888 msgid "Match all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:880 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:888 msgid "Match any" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:885 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:893 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:889 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:897 msgid "Manage &user categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:892 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:900 msgid "Add your own categories to the Tag Browser" msgstr "" @@ -9329,64 +9526,64 @@ msgid "" "reconvert them?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:171 msgid "&Restore" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:173 msgid "&Donate to support calibre" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:177 msgid "&Eject connected device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:218 msgid "Calibre Quick Start Guide" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:437 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:465 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:439 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:450 msgid "Conversion Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:438 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:451 msgid "" "<p>Could not convert: %s<p>It is a <a href=\"%s\">DRM</a>ed book. You must " "first remove the DRM using third party tools." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:451 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:465 msgid "Recipe Disabled" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:466 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:481 msgid "<b>Failed</b>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:502 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:517 msgid "" "is the result of the efforts of many volunteers from all over the world. If " "you find it useful, please consider donating to support its development. " "Your donation helps keep calibre development going." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:543 msgid "There are active jobs. Are you sure you want to quit?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:531 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:546 msgid "" " is communicating with the device!<br>\n" " Quitting may cause corruption on the device.<br>\n" " Are you sure you want to quit?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:535 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:550 msgid "WARNING: Active jobs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:613 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:628 msgid "" "will keep running in the system tray. To close it, choose <b>Quit</b> in the " "context menu of the system tray." @@ -9558,96 +9755,96 @@ msgstr "" msgid "No results found for:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:35 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:36 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:703 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:43 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:711 msgid "Remember last used window size" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:44 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:45 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:82 msgid "" "Set the user CSS stylesheet. This can be used to customize the look of all " "books." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:47 msgid "Maximum width of the viewer window, in pixels." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:48 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:49 msgid "Resize images larger than the viewer window to fit inside it" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:50 msgid "Hyphenate text" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:51 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:52 msgid "Default language for hyphenation rules" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:53 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:54 msgid "Font options" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:55 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:56 msgid "The serif font family" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:57 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:58 msgid "The sans-serif font family" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:59 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:60 msgid "The monospaced font family" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:61 msgid "The standard font size in px" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:61 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:62 msgid "The monospaced font size in px" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:62 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:63 msgid "The standard font type" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:463 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:479 msgid "&Lookup in dictionary" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:466 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:482 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:138 msgid "Go to..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:478 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:494 msgid "Next Section" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:479 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:495 msgid "Previous Section" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:481 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:497 msgid "Document Start" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:482 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:498 msgid "Document End" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:484 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:500 msgid "Section Start" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:485 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:501 msgid "Section End" msgstr "" @@ -9715,85 +9912,85 @@ msgstr "" msgid "Search for text in book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:275 msgid "Print Preview" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:309 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:312 msgid "Connecting to dict.org to lookup: <b>%s</b>…" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:409 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:413 msgid "Choose ebook" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:410 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:414 msgid "Ebooks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:443 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:447 msgid "No matches found for: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:480 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:488 msgid "Loading flow..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:524 msgid "Laying out %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:547 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:555 msgid "Bookmark #%d" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:551 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:559 msgid "Add bookmark" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:552 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:560 msgid "Enter title for bookmark:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:562 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:570 msgid "Manage Bookmarks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:599 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:607 msgid "Loading ebook..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:607 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:615 msgid "DRM Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:608 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:616 msgid "<p>This book is protected by <a href=\"%s\">DRM</a>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:612 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:620 msgid "Could not open ebook" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:690 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:698 msgid "Options to control the ebook viewer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:697 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:705 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:700 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:708 msgid "" "If specified, viewer window will try to open full screen when started." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:705 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:713 msgid "Print javascript alert and console messages to the console" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:711 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:719 msgid "" "%prog [options] file\n" "\n" @@ -9908,59 +10105,59 @@ msgstr "" msgid "Toggle" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:378 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:400 msgid "" "If you use the WordPlayer e-book app on your Android phone, you can access " "your calibre book collection directly on the device. To do this you have to " "turn on the content server." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:382 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:404 msgid "" "Remember to leave calibre running as the server only runs as long as calibre " "is running." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:384 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:406 msgid "" "You have to add the URL http://myhostname:8080 as your calibre library in " "WordPlayer. 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/wizard/__init__.py:461 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:483 msgid "Moving library..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:477 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:478 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:499 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:500 msgid "Failed to move library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:532 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:554 msgid "Invalid database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:533 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:555 msgid "" "<p>An invalid library already exists at %s, delete it before trying to move " "the existing library.<br>Error: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:544 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:566 msgid "Could not move library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:615 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:641 msgid "Select location for books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:629 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:655 msgid "" "You must choose an empty folder for the calibre library. %s is not empty." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:703 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:729 msgid "welcome wizard" msgstr "" @@ -10032,8 +10229,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/library_ui.py:58 msgid "" -"Choose a location for your books. When you add books to calibre, they will " -"be copied here:" +"<p>Choose a location for your books. When you add books to calibre, they " +"will be copied here. Use an <b>empty folder</b> for a new calibre library:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/library_ui.py:59 @@ -10047,121 +10244,158 @@ msgid "" "will switch to using it." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:34 msgid "Using: %s:%s@%s:%s and %s encryption" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:37 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:39 msgid "Sending..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:42 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:44 msgid "Mail successfully sent" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:124 -msgid "Finish gmail setup" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:136 msgid "" -"Dont forget to enter your gmail username and password. You can sign up for a " -"free gmail account at http://gmail.com" +"If you are setting up a new hotmail account, you must log in to it once " +"before you will be able to send mails." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:133 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:140 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:147 +msgid "" +"You can sign up for a free {name} email account at <a " +"href=\"http://{url}\">http://{url}</a>. {extra}" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:154 +msgid "Your %s &email address:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:155 +msgid "Your %s &username:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:156 +msgid "Your %s &password:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:174 +msgid "" +"If you plan to use email to send books to your Kindle, remember to add the " +"your %s email address to the allowed email addresses in your Amazon.com " +"Kindle management page." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:181 +msgid "Setup" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:196 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:203 msgid "Bad configuration" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:197 msgid "You must set the From email address" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:204 msgid "You must set the username and password for the mail server." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:124 msgid "Send email &from:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:125 msgid "" "<p>This is what will be present in the From: field of emails sent by " "calibre.<br> Set it to your email address" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:126 msgid "" "<p>A mail server is useful if the service you are sending mail to only " "accepts email from well know mail services." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:127 msgid "Mail &Server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:128 msgid "calibre can <b>optionally</b> use a server to send mail" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:129 msgid "&Hostname:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:130 msgid "The hostname of your mail server. For e.g. smtp.gmail.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:131 msgid "&Port:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:132 msgid "" "The port your mail server listens for connections on. The default is 25" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:134 msgid "Your username on the mail server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:136 msgid "Your password on the mail server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:137 msgid "&Show" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:138 msgid "&Encryption:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:139 msgid "" "Use TLS encryption when connecting to the mail server. This is the most " "common." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:140 msgid "&TLS" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:141 msgid "Use SSL encryption when connecting to the mail server." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:131 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:142 msgid "&SSL" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:143 +msgid "WARNING: Using no encryption is highly insecure" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:144 +msgid "&None" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:145 msgid "Use Gmail" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:146 +msgid "Use Hotmail" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:147 msgid "&Test email" msgstr "" @@ -10224,7 +10458,7 @@ msgstr "" msgid "empty" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:48 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:50 msgid "" "The fields to output when cataloging books in the database. Should be a " "comma-separated list of fields.\n" @@ -10233,7 +10467,7 @@ msgid "" "Applies to: CSV, XML output formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:58 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:60 msgid "" "Output field to sort on.\n" "Available fields: author_sort, id, rating, size, timestamp, title.\n" @@ -10241,7 +10475,7 @@ msgid "" "Applies to: CSV, XML output formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:212 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:214 msgid "" "The fields to output when cataloging books in the database. Should be a " "comma-separated list of fields.\n" @@ -10250,7 +10484,7 @@ msgid "" "Applies to: BIBTEX output format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:222 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:224 msgid "" "Output field to sort on.\n" "Available fields: author_sort, id, rating, size, timestamp, title.\n" @@ -10258,7 +10492,7 @@ msgid "" "Applies to: BIBTEX output format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:231 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:233 msgid "" "Create a citation for BibTeX entries.\n" "Boolean value: True, False\n" @@ -10266,7 +10500,7 @@ msgid "" "Applies to: BIBTEX output format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:240 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:242 msgid "" "The template for citation creation from database fields.\n" " Should be a template with {} enclosed fields.\n" @@ -10275,7 +10509,7 @@ msgid "" "Applies to: BIBTEX output format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:250 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:252 msgid "" "BibTeX file encoding output.\n" "Available types: utf8, cp1252, ascii.\n" @@ -10283,7 +10517,7 @@ msgid "" "Applies to: BIBTEX output format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:259 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:261 msgid "" "BibTeX file encoding flag.\n" "Available types: strict, replace, ignore, backslashreplace.\n" @@ -10291,7 +10525,7 @@ msgid "" "Applies to: BIBTEX output format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:268 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:270 msgid "" "Entry type for BibTeX catalog.\n" "Available types: book, misc, mixed.\n" @@ -10299,14 +10533,14 @@ msgid "" "Applies to: BIBTEX output format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:536 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:540 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:543 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:547 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 " @@ -10315,14 +10549,14 @@ msgid "" "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:557 msgid "" "Regex describing tags to exclude as genres.\n" "Default: '%default' excludes bracketed tags, e.g. '[<tag>]'\n" "Applies to: ePub, MOBI output formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:559 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:563 msgid "" "Comma-separated list of tag words indicating book should be excluded from " "output. Case-insensitive.\n" @@ -10331,35 +10565,35 @@ msgid "" "Applies to: ePub, MOBI output formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:567 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:571 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:574 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:578 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 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:585 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:588 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:592 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:595 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:599 msgid "" "Sort titles with leading numbers as text, e.g.,\n" "'2001: A Space Odyssey' sorts as \n" @@ -10368,7 +10602,7 @@ msgid "" "Applies to: ePub, MOBI output formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:602 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:606 msgid "" "Specifies the output profile. In some cases, an output profile is required " "to optimize the catalog for the device. For example, 'kindle' or " @@ -10378,13 +10612,20 @@ msgid "" "Applies to: ePub, MOBI output formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:609 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:613 msgid "" "Tag indicating book has been read.\n" "Default: '%default'\n" "Applies to: ePub, MOBI output formats" msgstr "" +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:619 +msgid "" +"Tag indicating book to be displayed as wishlist item.\n" +"Default: '%default'\n" +"Applies to: ePub, MOBI output formats" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/library/check_library.py:17 msgid "Invalid titles" msgstr "" @@ -10696,7 +10937,7 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/library/cli.py:665 -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:505 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:499 msgid "Show detailed output information. Useful for debugging" msgstr "" @@ -10926,35 +11167,35 @@ msgid "" "start with a letter" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:82 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:57 msgid "%sAverage rating is %3.1f" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:846 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:818 msgid "Main" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2321 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2310 msgid "<p>Migrating old database to ebook library in %s<br><center>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2350 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2339 msgid "Copying <b>%s</b>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2367 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2356 msgid "Compacting database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2460 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2449 msgid "Checking SQL integrity..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2499 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2488 msgid "Checking for missing files." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2521 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2516 msgid "Checked id" msgstr "" @@ -11138,124 +11379,139 @@ msgid "" "disable grouping." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/base.py:131 -msgid "Password to access your calibre library. Username is " +#: /home/kovid/work/calibre/src/calibre/library/server/__init__.py:48 +msgid "" +"Prefix to prepend to all URLs. Useful for reverseproxying to this server " +"from Apache/nginx/etc." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:51 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:399 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:59 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:437 msgid "Loading, please wait" -msgstr "" +msgstr "טוען, נא להמתין" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:80 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:85 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:106 +msgid "Go to" +msgstr "לך ל..." + +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:101 msgid "First" -msgstr "" +msgstr "ראשון" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:80 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:101 msgid "Last" -msgstr "" +msgstr "אחרון" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:80 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:101 msgid "Previous" -msgstr "" +msgstr "הקודם" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:81 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:102 msgid "Next" -msgstr "" +msgstr "הבא" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:83 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:104 msgid "Browsing %d books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:99 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:224 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:121 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:247 msgid "Average rating" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:100 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:122 msgid "%s: %.1f stars" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:132 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:155 msgid "%d stars" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:225 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:248 msgid "Popularity" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:244 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:267 msgid "Sort by" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:307 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:505 -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:568 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:270 +msgid "library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:271 +msgid "home" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:332 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:548 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:569 msgid "Newest" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:308 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:506 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:333 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:549 msgid "All books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:340 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:366 msgid "Browse books by" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:345 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:371 msgid "Choose a category to browse by:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:418 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:457 msgid "Browsing by" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:419 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:458 msgid "Up" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:535 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:579 msgid "in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:538 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:582 msgid "Books in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:588 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:634 msgid "Other formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:595 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:641 msgid "Read %s in the %s format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:600 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:646 msgid "Get" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:614 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:661 msgid "Permalink" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:615 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:662 msgid "A permanent link to this book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:626 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:673 msgid "This book has been deleted" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:707 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:757 msgid "in search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:709 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:759 msgid "Matching books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/main.py:28 +#: /home/kovid/work/calibre/src/calibre/library/server/main.py:39 msgid "" "[options]\n" "\n" @@ -11268,20 +11524,26 @@ msgid "" "The OPDS interface is advertised via BonJour automatically.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/main.py:41 +#: /home/kovid/work/calibre/src/calibre/library/server/main.py:52 msgid "Path to the library folder to serve with the content server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/main.py:43 +#: /home/kovid/work/calibre/src/calibre/library/server/main.py:54 msgid "Write process PID to the specified file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/main.py:47 +#: /home/kovid/work/calibre/src/calibre/library/server/main.py:58 msgid "" "Specifies a restriction to be used for this invocation. This option " "overrides any per-library settings specified in the GUI" msgstr "" +#: /home/kovid/work/calibre/src/calibre/library/server/main.py:62 +msgid "" +"Auto reload server when source code changes. May not work in all " +"environments." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:112 msgid "%d book" msgstr "" @@ -11402,27 +11664,27 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:43 msgid "Waiting..." -msgstr "" +msgstr "מחכה..." #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:52 msgid "Stopped" -msgstr "" +msgstr "נעצר" #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:54 msgid "Finished" -msgstr "" +msgstr "סיים" #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:76 msgid "Working..." -msgstr "" +msgstr "עובד..." #: /home/kovid/work/calibre/src/calibre/utils/localization.py:95 msgid "Brazilian Portuguese" -msgstr "" +msgstr "פורטוגזית ברזילאית" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:96 msgid "English (UK)" -msgstr "" +msgstr "אנגלית (הממלכה המאוחדת)" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:97 msgid "Simplified Chinese" @@ -11430,7 +11692,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:98 msgid "Chinese (HK)" -msgstr "" +msgstr "סינית (הונג-קונג)" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:99 msgid "Traditional Chinese" @@ -11438,23 +11700,23 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:100 msgid "English" -msgstr "" +msgstr "אנגלית" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:101 msgid "English (Australia)" -msgstr "" +msgstr "אנגלית (אוסטרליה)" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:102 msgid "English (New Zealand)" -msgstr "" +msgstr "אנגלית (ניו-זילנד)" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:103 msgid "English (Canada)" -msgstr "" +msgstr "אנגלית (קנדה)" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:104 msgid "English (India)" -msgstr "" +msgstr "אנגלית (הודו)" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:105 msgid "English (Thailand)" @@ -11470,7 +11732,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:108 msgid "English (Israel)" -msgstr "" +msgstr "אנגלית (ישראל)" #: /home/kovid/work/calibre/src/calibre/utils/localization.py:109 msgid "English (Singapore)" @@ -11562,7 +11824,7 @@ msgstr "" msgid "Failed to authenticate with server: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/smtp.py:234 +#: /home/kovid/work/calibre/src/calibre/utils/smtp.py:249 msgid "Control email delivery" msgstr "" @@ -11604,95 +11866,95 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:47 msgid "Unknown News Source" -msgstr "" +msgstr "מקור חדשות בלתי ידוע" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:615 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:628 msgid "The \"%s\" recipe needs a username and password." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:714 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:727 msgid "Download finished" -msgstr "" +msgstr "ההורדה הסתיימה" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:716 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:729 msgid "Failed to download the following articles:" -msgstr "" +msgstr "הורדת הכתבות הבאות כשלה:" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:722 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:735 msgid "Failed to download parts of the following articles:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:724 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:737 msgid " from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:726 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:739 msgid "\tFailed links:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:815 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:834 msgid "Could not fetch article. Run with -vv to see the reason" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:836 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:855 msgid "Fetching feeds..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:841 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:860 msgid "Got feeds from index page" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:850 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:869 msgid "Trying to download cover..." -msgstr "" +msgstr "מנסה להוריד עמוד שער/כריכה..." -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:852 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:871 msgid "Generating masthead..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:933 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:952 msgid "Starting download [%d thread(s)]..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:949 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:968 msgid "Feeds downloaded to %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:958 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:977 msgid "Could not download cover: %s" -msgstr "" +msgstr "לא הצליח להוריד כריכה: %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:965 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:986 msgid "Downloading cover from %s" -msgstr "" +msgstr "מוריד כריכה מ-%s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1010 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1032 msgid "Masthead image downloaded" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1178 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1200 msgid "Untitled Article" -msgstr "" +msgstr "כתבה ללא שם" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1249 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1271 msgid "Article downloaded: %s" -msgstr "" +msgstr "כתבה הורדה: %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1260 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1282 msgid "Article download failed: %s" -msgstr "" +msgstr "הורדת הכתבה כשלה: %s" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1277 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1299 msgid "Fetching feed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1424 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1446 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:1439 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1461 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." @@ -11702,7 +11964,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/collection.py:47 msgid "You" -msgstr "" +msgstr "את/ה" #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:73 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:82 @@ -11715,30 +11977,30 @@ msgstr "" msgid "Custom" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:482 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:476 msgid "" "%prog URL\n" "\n" "Where URL is for example http://google.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:485 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:479 msgid "Base directory into which URL is saved. Default is %default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:488 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:482 msgid "" "Timeout in seconds to wait for a response from the server. Default: %default " "s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:491 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:485 msgid "" "Maximum number of levels to recurse i.e. depth of links to follow. Default " "%default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:494 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:488 msgid "" "The maximum number of files to download. This only applies to files from <a " "href> tags. Default is %default" @@ -11746,27 +12008,27 @@ msgstr "" "מקסימום קבצים להורדה. רק לגבי קבצים מתגיות <a href>. ברירת המחדל היא " "%default ." -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:496 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:490 msgid "" "Minimum interval in seconds between consecutive fetches. Default is %default " "s" msgstr "פרק הזמן בין הורדות. ברירת המחדל היא %default שניות." -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:498 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:492 msgid "" "The character encoding for the websites you are trying to download. The " "default is to try and guess the encoding." msgstr "" "קידוד האותיות של האתר להורדה. ברירת המחדל תנסה לנחש את הקידוד המתאים." -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:500 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:494 msgid "" "Only links that match this regular expression will be followed. This option " "can be specified multiple times, in which case as long as a link matches any " "one regexp, it will be followed. By default all links are followed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:502 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:496 msgid "" "Any link that matches this regular expression will be ignored. This option " "can be specified multiple times, in which case as long as any regexp matches " @@ -11775,13 +12037,16 @@ msgid "" "applied first." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:504 +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:498 msgid "Do not download CSS stylesheets." msgstr "לא להוריד דפי-סגנון CSS" #~ msgid "Path to a txt file containing a comment." #~ msgstr "נתיב לקובץ TXT המכיל הערה." +#~ msgid " " +#~ msgstr " " + #~ msgid "Communicate with the Sony PRS-300/505/500 eBook reader." #~ msgstr "מתקשר עם Sony PRS-300/505/500 eBook reader." diff --git a/src/calibre/translations/zh_CN.po b/src/calibre/translations/zh_CN.po index ee6a1bea51..7ae2090006 100644 --- a/src/calibre/translations/zh_CN.po +++ b/src/calibre/translations/zh_CN.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" "POT-Creation-Date: 2010-11-27 20:21+0000\n" -"PO-Revision-Date: 2010-11-28 00:33+0000\n" -"Last-Translator: Jimmie Lin <Unknown>\n" +"PO-Revision-Date: 2010-11-30 01:34+0000\n" +"Last-Translator: kesalin <Unknown>\n" "Language-Team: Simplified Chinese <wanglihao@gmail.com>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-29 04:49+0000\n" +"X-Launchpad-Export-Date: 2010-11-30 04:46+0000\n" "X-Generator: Launchpad (build Unknown)\n" "X-Poedit-Country: CHINA\n" "X-Poedit-Language: Chinese\n" @@ -1020,7 +1020,7 @@ msgstr "与 Nook 通信。" #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:85 msgid "Nook Color" -msgstr "" +msgstr "Nook Color(一款B&N 旗下电子阅读器)" #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:86 msgid "Communicate with the Nook Color eBook reader." From 449de8255f19acb1fd8bab750efe67885fcaf22d Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Tue, 30 Nov 2010 12:56:27 +0000 Subject: [PATCH 197/375] Refactor search boxes to use placeholders, emit refocus events when appropriate, and improve the selected-text model. Also many general cleanups, such as renaming clear_to_help to clear. --- src/calibre/gui2/lrf_renderer/main.py | 2 +- src/calibre/gui2/search_box.py | 214 ++++++++----------- src/calibre/gui2/search_restriction_mixin.py | 4 +- src/calibre/gui2/tag_view.py | 10 +- src/calibre/gui2/ui.py | 4 +- src/calibre/gui2/viewer/main.py | 4 +- 6 files changed, 97 insertions(+), 141 deletions(-) diff --git a/src/calibre/gui2/lrf_renderer/main.py b/src/calibre/gui2/lrf_renderer/main.py index 8ddda175fa..2acfd3c9a7 100644 --- a/src/calibre/gui2/lrf_renderer/main.py +++ b/src/calibre/gui2/lrf_renderer/main.py @@ -127,7 +127,7 @@ class Main(MainWindow, Ui_MainWindow): self.progress_label.setText('Parsing '+ self.file_name) self.renderer = RenderWorker(self, stream, self.logger, self.opts) QObject.connect(self.renderer, SIGNAL('finished()'), self.parsed, Qt.QueuedConnection) - self.search.clear_to_help() + self.search.clear() self.last_search = None else: self.stack.setCurrentIndex(0) diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py index b37d74f51f..444ba156ca 100644 --- a/src/calibre/gui2/search_box.py +++ b/src/calibre/gui2/search_box.py @@ -8,9 +8,8 @@ __docformat__ = 'restructuredtext en' import re -from PyQt4.Qt import QComboBox, Qt, QLineEdit, QStringList, pyqtSlot, \ - pyqtSignal, SIGNAL, QObject, QDialog, QCompleter, \ - QAction, QKeySequence, QTimer +from PyQt4.Qt import QComboBox, Qt, QLineEdit, QStringList, pyqtSlot, QDialog, \ + pyqtSignal, QCompleter, QAction, QKeySequence, QTimer from calibre.gui2 import config from calibre.gui2.dialogs.confirm_delete import confirm @@ -20,35 +19,30 @@ from calibre.utils.search_query_parser import saved_searches class SearchLineEdit(QLineEdit): key_pressed = pyqtSignal(object) - mouse_released = pyqtSignal(object) - focus_out = pyqtSignal(object) def keyPressEvent(self, event): self.key_pressed.emit(event) QLineEdit.keyPressEvent(self, event) def mouseReleaseEvent(self, event): - self.mouse_released.emit(event) QLineEdit.mouseReleaseEvent(self, event) + QLineEdit.selectAll(self) - def focusOutEvent(self, event): - self.focus_out.emit(event) - QLineEdit.focusOutEvent(self, event) + def focusInEvent(self, event): + QLineEdit.focusInEvent(self, event) + QLineEdit.selectAll(self) def dropEvent(self, ev): - if self.parent().help_state: - self.parent().normalize_state() + self.parent().normalize_state() return QLineEdit.dropEvent(self, ev) def contextMenuEvent(self, ev): - if self.parent().help_state: - self.parent().normalize_state() + self.parent().normalize_state() return QLineEdit.contextMenuEvent(self, ev) @pyqtSlot() def paste(self, *args): - if self.parent().help_state: - self.parent().normalize_state() + self.parent().normalize_state() return QLineEdit.paste(self) class SearchBox2(QComboBox): @@ -59,14 +53,17 @@ class SearchBox2(QComboBox): * Call initialize() * Connect to the search() and cleared() signals from this widget. * Connect to the cleared() signal to know when the box content changes + * Connect to focus_to_library signal to be told to manually change focus * Call search_done() after every search is complete - * Use clear() to clear back to the help message ''' INTERVAL = 1500 #: Time to wait before emitting search signal MAX_COUNT = 25 - search = pyqtSignal(object) + search = pyqtSignal(object) + cleared = pyqtSignal() + changed = pyqtSignal() + focus_to_library = pyqtSignal() def __init__(self, parent=None): QComboBox.__init__(self, parent) @@ -75,13 +72,9 @@ class SearchBox2(QComboBox): self.setLineEdit(self.line_edit) c = self.line_edit.completer() c.setCompletionMode(c.PopupCompletion) - self.line_edit.key_pressed.connect(self.key_pressed, - type=Qt.DirectConnection) - self.line_edit.mouse_released.connect(self.mouse_released, - type=Qt.DirectConnection) + self.line_edit.key_pressed.connect(self.key_pressed, type=Qt.DirectConnection) self.activated.connect(self.history_selected) self.setEditable(True) - self.help_state = False self.as_you_type = True self.prev_search = '' self.timer = QTimer() @@ -98,54 +91,37 @@ class SearchBox2(QComboBox): self.as_you_type = config['search_as_you_type'] self.opt_name = opt_name self.addItems(QStringList(list(set(config[opt_name])))) - self.help_text = help_text + self.line_edit.setPlaceholderText(help_text) self.colorize = colorize - self.clear_to_help() + self.clear() def normalize_state(self): self.setToolTip(self.tool_tip_text) - if self.help_state: - self.setEditText('') - self.line_edit.setStyleSheet( - 'QLineEdit { color: black; background-color: %s; }' % - self.normal_background) - self.help_state = False - else: - self.line_edit.setStyleSheet( - 'QLineEdit { color: black; background-color: %s; }' % - self.normal_background) - - def clear_to_help(self): - self.setToolTip(self.tool_tip_text) - if self.help_state: - return - self.help_state = True - self.search.emit('') - self._in_a_search = False - self.setEditText(self.help_text) - self.line_edit.home(False) self.line_edit.setStyleSheet( - 'QLineEdit { color: gray; background-color: %s; }' % - self.normal_background) - self.emit(SIGNAL('cleared()')) + 'QLineEdit{color:black;background-color:%s;}' % self.normal_background) def text(self): return self.currentText() def clear(self): - self.clear_to_help() + self.normalize_state() + self.setEditText('') + self.search.emit('') + self._in_a_search = False + self.cleared.emit() def search_done(self, ok): if isinstance(ok, basestring): self.setToolTip(ok) ok = False if not unicode(self.currentText()).strip(): - return self.clear_to_help() + self.clear() + return self._in_a_search = ok col = 'rgba(0,255,0,20%)' if ok else 'rgb(255,0,0,20%)' if not self.colorize: col = self.normal_background - self.line_edit.setStyleSheet('QLineEdit { color: black; background-color: %s; }' % col) + self.line_edit.setStyleSheet('QLineEdit{color:black;background-color:%s;}' % col) def key_pressed(self, event): k = event.key() @@ -154,40 +130,25 @@ class SearchBox2(QComboBox): return self.normalize_state() if self._in_a_search: - self.emit(SIGNAL('changed()')) + self.changed.emit() self._in_a_search = False if event.key() in (Qt.Key_Return, Qt.Key_Enter): self.do_search() + self.focus_to_library.emit() if self.as_you_type: self.timer.start(1500) - def mouse_released(self, event): - self.normalize_state() - # Dont trigger a search since it make - # re-positioning the cursor using the mouse - # impossible - #if self.as_you_type: - # self.timer.start(1500) - def timer_event(self): self.do_search() def history_selected(self, text): - self.emit(SIGNAL('changed()')) + self.changed.emit() self.do_search() - @property - def smart_text(self): - text = unicode(self.currentText()).strip() - if not text or text == self.help_text: - return '' - return text - def do_search(self, *args): text = unicode(self.currentText()).strip() - if not text or text == self.help_text: + if not text: return self.clear() - self.help_state = False self.prev_search = text self.search.emit(text) @@ -220,7 +181,7 @@ class SearchBox2(QComboBox): def set_search_string(self, txt): if not txt: - self.clear_to_help() + self.clear() return self.normalize_state() self.setEditText(txt) @@ -243,25 +204,24 @@ class SavedSearchBox(QComboBox): if you care about changes to the list of saved searches. ''' + changed = pyqtSignal() + focus_to_library = pyqtSignal() + def __init__(self, parent=None): QComboBox.__init__(self, parent) self.normal_background = 'rgb(255, 255, 255, 0%)' self.line_edit = SearchLineEdit(self) self.setLineEdit(self.line_edit) - self.line_edit.key_pressed.connect(self.key_pressed, - type=Qt.DirectConnection) - self.line_edit.mouse_released.connect(self.mouse_released, - type=Qt.DirectConnection) - self.line_edit.focus_out.connect(self.focus_out, - type=Qt.DirectConnection) + self.line_edit.key_pressed.connect(self.key_pressed, type=Qt.DirectConnection) self.activated[str].connect(self.saved_search_selected) - completer = QCompleter(self) # turn off auto-completion + # Turn off auto-completion so that it doesn't interfere with typing + # names of new searches. + completer = QCompleter(self) self.setCompleter(completer) + self.setEditable(True) - self.help_state = True - self.prev_search = '' self.setInsertPolicy(self.NoInsert) self.setSizeAdjustPolicy(self.AdjustToMinimumContentsLengthWithIcon) self.setMinimumContentsLength(10) @@ -269,50 +229,40 @@ class SavedSearchBox(QComboBox): def initialize(self, _search_box, colorize=False, help_text=_('Search')): self.search_box = _search_box - self.help_text = help_text + self.line_edit.setPlaceholderText(help_text) self.colorize = colorize - self.clear_to_help() + self.clear() def normalize_state(self): - self.setEditText('') - self.line_edit.setStyleSheet( - 'QLineEdit { color: black; background-color: %s; }' % - self.normal_background) - self.help_state = False + # need this because line_edit will call it in some cases such as paste + pass - def clear_to_help(self): - self.setToolTip(self.tool_tip_text) + def clear(self): + QComboBox.clear(self) self.initialize_saved_search_names() - self.setEditText(self.help_text) + self.setEditText('') self.line_edit.home(False) - self.help_state = True - self.line_edit.setStyleSheet( - 'QLineEdit { color: gray; background-color: %s; }' % - self.normal_background) - - def focus_out(self, event): - if self.currentText() == '': - self.clear_to_help() def key_pressed(self, event): - if self.help_state: - self.normalize_state() - - def mouse_released(self, event): - if self.help_state: - self.normalize_state() + if event.key() in (Qt.Key_Return, Qt.Key_Enter): + self.saved_search_selected(self.currentText()) + self.focus_to_library.emit() def saved_search_selected(self, qname): qname = unicode(qname) if qname is None or not qname.strip(): + self.search_box.clear() + return + if not saved_searches().lookup(qname): + self.search_box.clear() + self.setEditText(qname) return - self.normalize_state() self.search_box.set_search_string(u'search:"%s"' % qname) self.setEditText(qname) self.setToolTip(saved_searches().lookup(qname)) + self.focus_to_library.emit() def initialize_saved_search_names(self): - self.clear() qnames = saved_searches().names() self.addItems(qnames) self.setCurrentIndex(-1) @@ -330,25 +280,24 @@ class SavedSearchBox(QComboBox): if ss is None: return saved_searches().delete(unicode(self.currentText())) - self.clear_to_help() - self.search_box.clear_to_help() - self.emit(SIGNAL('changed()')) + self.clear() + self.search_box.clear() + self.changed.emit() # SIGNALed from the main UI def save_search_button_clicked(self): name = unicode(self.currentText()) - if self.help_state or not name.strip(): + if not name.strip(): name = unicode(self.search_box.text()).replace('"', '') saved_searches().delete(name) saved_searches().add(name, unicode(self.search_box.text())) # now go through an initialization cycle to ensure that the combobox has # the new search in it, that it is selected, and that the search box # references the new search instead of the text in the search. - self.clear_to_help() - self.normalize_state() + self.clear() self.setCurrentIndex(self.findText(name)) self.saved_search_selected (name) - self.emit(SIGNAL('changed()')) + self.changed.emit() # SIGNALed from the main UI def copy_search_button_clicked (self): @@ -362,11 +311,11 @@ class SearchBoxMixin(object): def __init__(self): self.search.initialize('main_search_history', colorize=True, help_text=_('Search (For Advanced Search click the button to the left)')) - self.connect(self.search, SIGNAL('cleared()'), self.search_box_cleared) - self.connect(self.search, SIGNAL('changed()'), self.search_box_changed) - self.connect(self.clear_button, SIGNAL('clicked()'), self.search.clear) - QObject.connect(self.advanced_search_button, SIGNAL('clicked(bool)'), - self.do_advanced_search) + self.search.cleared.connect(self.search_box_cleared) + self.search.changed.connect(self.search_box_changed) + self.search.focus_to_library.connect(self.focus_to_library) + self.clear_button.clicked.connect(self.search.clear) + self.advanced_search_button.clicked[bool].connect(self.do_advanced_search) self.search.clear() self.search.setMaximumWidth(self.width()-150) @@ -384,11 +333,11 @@ class SearchBoxMixin(object): def search_box_cleared(self): self.tags_view.clear() - self.saved_search.clear_to_help() + self.saved_search.clear() self.set_number_of_books_shown() def search_box_changed(self): - self.saved_search.clear_to_help() + self.saved_search.clear() self.tags_view.clear() def do_advanced_search(self, *args): @@ -396,20 +345,24 @@ class SearchBoxMixin(object): if d.exec_() == QDialog.Accepted: self.search.set_search_string(d.search_string()) + def focus_to_library(self): + self.current_view().setFocus(Qt.OtherFocusReason) + class SavedSearchBoxMixin(object): def __init__(self): - self.connect(self.saved_search, SIGNAL('changed()'), self.saved_searches_changed) + self.saved_search.changed.connect(self.saved_searches_changed) + self.clear_button.clicked.connect(self.saved_search.clear) + self.saved_search.focus_to_library.connect(self.focus_to_library) + self.save_search_button.clicked.connect( + self.saved_search.save_search_button_clicked) + self.delete_search_button.clicked.connect( + self.saved_search.delete_search_button_clicked) + self.copy_search_button.clicked.connect( + self.saved_search.copy_search_button_clicked) self.saved_searches_changed() - self.connect(self.clear_button, SIGNAL('clicked()'), self.saved_search.clear_to_help) self.saved_search.initialize(self.search, colorize=True, help_text=_('Saved Searches')) - self.connect(self.save_search_button, SIGNAL('clicked()'), - self.saved_search.save_search_button_clicked) - self.connect(self.delete_search_button, SIGNAL('clicked()'), - self.saved_search.delete_search_button_clicked) - self.connect(self.copy_search_button, SIGNAL('clicked()'), - self.saved_search.copy_search_button_clicked) self.saved_search.setToolTip( _('Choose saved search or enter name for new saved search')) self.saved_search.setStatusTip(self.saved_search.toolTip()) @@ -420,7 +373,8 @@ class SavedSearchBoxMixin(object): def saved_searches_changed(self): p = sorted(saved_searches().names(), cmp=lambda x,y: cmp(x.lower(), y.lower())) t = unicode(self.search_restriction.currentText()) - self.search_restriction.clear() # rebuild the restrictions combobox using current saved searches + # rebuild the restrictions combobox using current saved searches + self.search_restriction.clear() self.search_restriction.addItem('') self.tags_view.recount() for s in p: @@ -433,6 +387,8 @@ class SavedSearchBoxMixin(object): d.exec_() if d.result() == d.Accepted: self.saved_searches_changed() - self.saved_search.clear_to_help() + self.saved_search.clear() + def focus_to_library(self): + self.current_view().setFocus(Qt.OtherFocusReason) diff --git a/src/calibre/gui2/search_restriction_mixin.py b/src/calibre/gui2/search_restriction_mixin.py index 139d7c551d..6373e452e5 100644 --- a/src/calibre/gui2/search_restriction_mixin.py +++ b/src/calibre/gui2/search_restriction_mixin.py @@ -49,8 +49,8 @@ class SearchRestrictionMixin(object): restriction = '' self.restriction_count_of_books_in_view = \ self.library_view.model().set_search_restriction(restriction) - self.search.clear_to_help() - self.saved_search.clear_to_help() + self.search.clear() + self.saved_search.clear() self.tags_view.set_search_restriction(restriction) self.set_number_of_books_shown() diff --git a/src/calibre/gui2/tag_view.py b/src/calibre/gui2/tag_view.py index 7210afd770..b841706439 100644 --- a/src/calibre/gui2/tag_view.py +++ b/src/calibre/gui2/tag_view.py @@ -843,7 +843,7 @@ class TagBrowserMixin(object): # {{{ self.tags_view.set_database(self.library_view.model().db, self.tag_match, self.sort_by) self.tags_view.tags_marked.connect(self.search.search_from_tags) - self.tags_view.tags_marked.connect(self.saved_search.clear_to_help) + self.tags_view.tags_marked.connect(self.saved_search.clear) self.tags_view.tag_list_edit.connect(self.do_tags_list_edit) self.tags_view.user_category_edit.connect(self.do_user_categories_edit) self.tags_view.saved_search_edit.connect(self.do_saved_search_edit) @@ -910,14 +910,14 @@ class TagBrowserMixin(object): # {{{ self.library_view.model().refresh() self.tags_view.set_new_model() self.tags_view.recount() - self.saved_search.clear_to_help() - self.search.clear_to_help() + self.saved_search.clear() + self.search.clear() def do_tag_item_renamed(self): # Clean up library view and search self.library_view.model().refresh() - self.saved_search.clear_to_help() - self.search.clear_to_help() + self.saved_search.clear() + self.search.clear() def do_author_sort_edit(self, parent, id): db = self.library_view.model().db diff --git a/src/calibre/gui2/ui.py b/src/calibre/gui2/ui.py index 00bba2b491..cb25f75d4a 100644 --- a/src/calibre/gui2/ui.py +++ b/src/calibre/gui2/ui.py @@ -383,8 +383,8 @@ class Main(MainWindow, MainWindowMixin, DeviceMixin, EmailMixin, # {{{ self.tags_view.set_database(db, self.tag_match, self.sort_by) self.library_view.model().set_book_on_device_func(self.book_on_device) self.status_bar.clear_message() - self.search.clear_to_help() - self.saved_search.clear_to_help() + self.search.clear() + self.saved_search.clear() self.book_details.reset_info() self.library_view.model().count_changed() prefs['library_path'] = self.library_path diff --git a/src/calibre/gui2/viewer/main.py b/src/calibre/gui2/viewer/main.py index f9a2432099..8fe176751d 100644 --- a/src/calibre/gui2/viewer/main.py +++ b/src/calibre/gui2/viewer/main.py @@ -237,9 +237,9 @@ class EbookViewer(MainWindow, Ui_EbookViewer): self.connect(self.action_previous_page, SIGNAL('triggered(bool)'), lambda x:self.view.previous_page()) self.connect(self.action_find_next, SIGNAL('triggered(bool)'), - lambda x:self.find(self.search.smart_text, repeat=True)) + lambda x:self.find(self.search.text(), repeat=True)) self.connect(self.action_find_previous, SIGNAL('triggered(bool)'), - lambda x:self.find(self.search.smart_text, + lambda x:self.find(self.search.text(), repeat=True, backwards=True)) self.connect(self.action_full_screen, SIGNAL('triggered(bool)'), From 9d465361a0247cfe93638845283a52139dc1ee01 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Tue, 30 Nov 2010 08:47:14 -0700 Subject: [PATCH 198/375] ... --- resources/images/news/novaya_gazeta.png | Bin 0 -> 610 bytes resources/images/news/vedomosti.png | Bin 0 -> 693 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 resources/images/news/novaya_gazeta.png create mode 100644 resources/images/news/vedomosti.png diff --git a/resources/images/news/novaya_gazeta.png b/resources/images/news/novaya_gazeta.png new file mode 100644 index 0000000000000000000000000000000000000000..41886a64b9d1e72d5d91d260871719d982b0dbf6 GIT binary patch literal 610 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b zK-vS0-A-oPfdtD69Mgd`SU*F|v9*U87#O=fT^vI!PT!sA>pdk=q;37@De@~=l9aTX zoN|@84)!}t>=9yNoj6T5+T$Msvm#eZ)NTPL@m-uEAp$LeET&3<D-JGj4bFPVGVPjx z^4?|Vinq@QRC`={byan-h0MFxH3$EzR<3`t-udgfx}cvAR>{ThT=#3A;oX^W!Ed4! z-tT>~cayE2^-bFkTl)8>zlv>IcOv-IHuINVJjUM*Pxhu8-h0Qwp)68RZ+EW!h@Itc z#;+G6c@{r<&8GL%Q`7anlZ?;9hLbnS4-~%*y;Za1SO&|(ioIVayG-C>Z#ZmF#Lus= zI`H5<eg>Y3eKT!%89Z2aTBfYu6&*2Yo=3q(3wxP@&AT`n#Ch+sRJJNK9`VYRK2*HW zqThSzat1k*(4u3OXKaLJzcaXhDdJAa`@dxCt0%nw|8#!8bm_Uu_T|?YGUDbvON~{( zC#gKw^v)_vcBbcZS{e2nkf_}3{6EPi)@(=hSDXGQEr!D?Iy?%VGfx~|D0xkMI)j9) z^nsqo*Js___+Cfx)k@u`r{f}zeF$G)zx=+R(>#NpVl}6Maim(}8c~v5l$uzQs+$5N z7>o=I4Rj3+b&ZTejEt;|4Xg|;wGE7|3=CLP)KXy@a`RI%(<%vQh`JgO2-Lvf>FVdQ I&MBb@0Ocj^tpET3 literal 0 HcmV?d00001 diff --git a/resources/images/news/vedomosti.png b/resources/images/news/vedomosti.png new file mode 100644 index 0000000000000000000000000000000000000000..3187308f4e9ff62fc547475a1a69523dd39b0e88 GIT binary patch literal 693 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b zK-vS0-A-oPfdtD69Mgd`SU*F|v9*U87#Qz)x;TbdoSr(#H(NMRq;0;nv6fztc%4db zx7(ubIt3OhDG}2h0a||rMO`Lz#qKD08DF5yvGzigW3R|AO)+QgjXNf2?a=TQX*F5# zK&hv#%&54(yKvb|KkljrhisqU`@HY`UK!W$H6hPh>pPM*Mg+0<>!|XDX?<3jdtd3^ zvX1v`-oFoiGIQOcFMn^}w56?^a<<Nz&JeOsfBW)mt*MVrzA^dR>>T*^?rc}CR;H_2 zqPMqsbDenhyGZ(B>(i&KVd3^hhK1q`zkANUxhxrwR`4&2Z>=dqTjBzSU7D|6zrR^z z&BJ$dV)oz9RU3Y4f7%>*yfijztCU+)bhXTl{rX<UGfg}mbo@}TYu~K?@+|Lyt;cTN z)K{7kzo+L@xA-~s-ozC<(w!cJ)HlrYluu51!nOT)ejc|*@ocx5KlaV9aY`-hbLW@; z@b)*q+VW+ZvHRQ>U+nn6?8EzL@m4>slxky<^L*|*AOCsub92#^E4rJW%SVLmx%0Bb zp*rEn>v_*rIbF);YYTF^I8C~cv%Nbzduv2)$(JmZHM=~b){0#_7bs^@t9NVpWp~N_ zrOkgjV|w&N3T4<|U%sw?{BYav@9%PYV&$D#nY%J)%Dj4c(16E<Wod}dlDm1yjAt|4 zrhKT#n)JWZ{#?ten~j1J5x{6yEpd$~NiIrFEJ@W(0TK*G28IT@hK9NZW+4W~Rz^lv oCWhKThJk@*uVoTULvDUbW?Cfy4P`d|VL%NGp00i_>zopr093dcqyPW_ literal 0 HcmV?d00001 From 2791f02c3dca565d9bc24f33613ebdadd852f4e8 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Tue, 30 Nov 2010 16:37:55 +0000 Subject: [PATCH 199/375] Enhancement #7732: add an 'apply' button to bulk edit --- src/calibre/gui2/dialogs/metadata_bulk.py | 44 +++++++++++++++++------ src/calibre/gui2/dialogs/metadata_bulk.ui | 2 +- 2 files changed, 34 insertions(+), 12 deletions(-) diff --git a/src/calibre/gui2/dialogs/metadata_bulk.py b/src/calibre/gui2/dialogs/metadata_bulk.py index f8177b7680..f2a2394e9e 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.py +++ b/src/calibre/gui2/dialogs/metadata_bulk.py @@ -6,7 +6,7 @@ __copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>' import re from PyQt4.Qt import Qt, QDialog, QGridLayout, QVBoxLayout, QFont, QLabel, \ - pyqtSignal + pyqtSignal, QDialogButtonBox from PyQt4 import QtGui from calibre.gui2.dialogs.metadata_bulk_ui import Ui_MetadataBulkDialog @@ -198,15 +198,30 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): ] def __init__(self, window, rows, model): + self.model = model + self.db = self.model.db + self.ids = [self.db.id(r) for r in rows] QDialog.__init__(self, window) Ui_MetadataBulkDialog.__init__(self) + self._initialize() + self.exec_() + + def _initialize(self): + # Remove all controls from the dialog box by deleting the top layout + if self.layout(): + import sip + sip.delete(self.layout()) + self.setupUi(self) - self.model = model - self.db = model.db - self.ids = [self.db.id(r) for r in rows] + self.button_box.clicked.connect(self.button_clicked) + self.button_box.button(QDialogButtonBox.Apply).setToolTip(_( + 'Immediately make all changes without closing the dialog. ' + 'This operation cannot be canceled or undone')) + self.box_title.setText('<p>' + _('Editing meta information for <b>%d books</b>') % - len(rows)) + len(self.ids)) + self.write_series = False self.changed = False @@ -232,7 +247,11 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): self.create_custom_column_editors() self.prepare_search_and_replace() - self.exec_() + + def button_clicked(self, which): + if which == self.button_box.button(QDialogButtonBox.Apply): + self._do_the_work() + self._initialize() def prepare_search_and_replace(self): self.search_for.initialize('bulk_edit_search_for') @@ -627,10 +646,7 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): self.series_start_number.setEnabled(False) self.series_start_number.setValue(1) - def accept(self): - if len(self.ids) < 1: - return QDialog.accept(self) - + def _do_the_work(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, @@ -690,8 +706,14 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): dynamic['s_r_search_mode'] = self.search_mode.currentIndex() self.db.clean() - return QDialog.accept(self) + return True + def accept(self): + if len(self.ids) < 1: + return QDialog.accept(self) + if not self._do_the_work(): + return False + return QDialog.accept(self) def series_changed(self, *args): self.write_series = True diff --git a/src/calibre/gui2/dialogs/metadata_bulk.ui b/src/calibre/gui2/dialogs/metadata_bulk.ui index 44839bbacd..344bde0fa0 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.ui +++ b/src/calibre/gui2/dialogs/metadata_bulk.ui @@ -710,7 +710,7 @@ nothing should be put between the original text and the inserted text</string> <enum>Qt::Horizontal</enum> </property> <property name="standardButtons"> - <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + <set>QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> </property> </widget> </item> From 243fcf5b3825d757c32db3f63c1db0704c052a66 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Tue, 30 Nov 2010 10:15:53 -0700 Subject: [PATCH 200/375] Search box: Only trigger as you type timer if text content has changed --- src/calibre/gui2/search_box.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py index c82489d218..547dc32c53 100644 --- a/src/calibre/gui2/search_box.py +++ b/src/calibre/gui2/search_box.py @@ -140,7 +140,7 @@ class SearchBox2(QComboBox): if event.key() in (Qt.Key_Return, Qt.Key_Enter): self.do_search() self.focus_to_library.emit() - if self.as_you_type: + elif self.as_you_type and unicode(event.text()): self.timer.start(1500) def timer_event(self): From ae9fcef78828834081ae54c825fd1969a964a3f3 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Tue, 30 Nov 2010 10:17:23 -0700 Subject: [PATCH 201/375] ... --- src/calibre/gui2/search_box.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py index 547dc32c53..f8d5d4777e 100644 --- a/src/calibre/gui2/search_box.py +++ b/src/calibre/gui2/search_box.py @@ -76,7 +76,6 @@ class SearchBox2(QComboBox): self.activated.connect(self.history_selected) self.setEditable(True) self.as_you_type = True - self.prev_search = '' self.timer = QTimer() self.timer.setSingleShot(True) self.timer.timeout.connect(self.timer_event, type=Qt.QueuedConnection) @@ -154,7 +153,6 @@ class SearchBox2(QComboBox): text = unicode(self.currentText()).strip() if not text: return self.clear() - self.prev_search = text self.search.emit(text) idx = self.findText(text, Qt.MatchFixedString) From 1063a52c121b5ee76e62f1d4773d14d8b4ad73e0 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Tue, 30 Nov 2010 10:22:01 -0700 Subject: [PATCH 202/375] ... --- src/calibre/gui2/search_box.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py index f8d5d4777e..6624acf35f 100644 --- a/src/calibre/gui2/search_box.py +++ b/src/calibre/gui2/search_box.py @@ -106,10 +106,11 @@ class SearchBox2(QComboBox): def text(self): return self.currentText() - def clear(self, emit_search=False): + def clear(self, emit_search=True): self.normalize_state() self.setEditText('') - self.search.emit('') + if emit_search: + self.search.emit('') self._in_a_search = False self.cleared.emit() From d2960c801f8a6416c909d11db52a309399c9346e Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Tue, 30 Nov 2010 10:31:36 -0700 Subject: [PATCH 203/375] Restore operation of clear search button --- src/calibre/gui2/search_box.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py index 6624acf35f..4d598a3bbb 100644 --- a/src/calibre/gui2/search_box.py +++ b/src/calibre/gui2/search_box.py @@ -114,6 +114,9 @@ class SearchBox2(QComboBox): self._in_a_search = False self.cleared.emit() + def clear_clicked(self, *args): + self.clear() + def search_done(self, ok): if isinstance(ok, basestring): self.setToolTip(ok) @@ -318,7 +321,7 @@ class SearchBoxMixin(object): self.search.cleared.connect(self.search_box_cleared) self.search.changed.connect(self.search_box_changed) self.search.focus_to_library.connect(self.focus_to_library) - self.clear_button.clicked.connect(self.search.clear) + self.clear_button.clicked.connect(self.search.clear_clicked) self.advanced_search_button.clicked[bool].connect(self.do_advanced_search) self.search.clear() From 2c45204996f9b29b0b1ba0b66f82b4a7b5ff57e2 Mon Sep 17 00:00:00 2001 From: GRiker <griker@hotmail.com> Date: Tue, 30 Nov 2010 10:34:41 -0700 Subject: [PATCH 204/375] GwR update to catalog read tag handling, jacket updates --- resources/jacket/stylesheet.css | 42 +++++-- resources/jacket/template.xhtml | 23 ++-- src/calibre/ebooks/oeb/transforms/jacket.py | 30 +++-- src/calibre/gui2/catalog/catalog_epub_mobi.py | 106 ++++++++++++++++-- src/calibre/gui2/catalog/catalog_epub_mobi.ui | 82 +++++++++----- src/calibre/library/catalog.py | 67 ++++++++--- src/calibre/library/cli.py | 2 +- 7 files changed, 276 insertions(+), 76 deletions(-) diff --git a/resources/jacket/stylesheet.css b/resources/jacket/stylesheet.css index 5f4f012d01..c45f8fe977 100644 --- a/resources/jacket/stylesheet.css +++ b/resources/jacket/stylesheet.css @@ -36,22 +36,37 @@ /* ** Title */ -.cbj_title { +table.cbj_header td.cbj_title { font-size: x-large; + font-style: italic; + text-align: center; +} + +/* +** Series +*/ +table.cbj_header td.cbj_series { + font-size: medium; text-align: center; } /* ** Author */ -.cbj_author { +table.cbj_header td.cbj_author { font-size: medium; text-align: center; - margin-bottom: 1ex; } /* -** Table containing Series, Publication Year, Rating and Tags +** Publisher/published +*/ +table.cbj_header td.cbj_pubdata { + text-align: center; +} + +/* +** Table containing Rating and Tags */ table.cbj_header { width: 100%; @@ -62,9 +77,8 @@ table.cbj_header { */ table.cbj_header td.cbj_label { font-family: sans-serif; - font-weight: bold; text-align: right; - width: 40%; + width: 33%; } /* @@ -73,9 +87,23 @@ table.cbj_header td.cbj_label { table.cbj_header td.cbj_content { font-family: sans-serif; text-align: left; - width:60%; + width:67%; } +/* +** Metadata divider +*/ +hr.metadata_divider { + width:90%; + margin-left:5%; + border-top: solid white 0px; + border-right: solid white 0px; + border-bottom: solid black 1px; + border-left: solid white 0px; + } + + + /* ** To skip a banner item (Series|Published|Rating|Tags), ** edit the appropriate CSS rule below. diff --git a/resources/jacket/template.xhtml b/resources/jacket/template.xhtml index 8447b1d6b3..056ac0aad3 100644 --- a/resources/jacket/template.xhtml +++ b/resources/jacket/template.xhtml @@ -6,17 +6,24 @@ </head> <body> <div class="cbj_banner"> - <div class="cbj_title">{title}</div> - <div class="cbj_author">{author}</div> <table class="cbj_header"> - <tr class="cbj_series"> - <td class="cbj_label">{series_label}:</td> - <td class="cbj_content">{series}</td> + <tr> + <td class="cbj_title" colspan="2">{title}</td> + </tr> + <tr> + <td class="cbj_series" colspan="2">{series}</td> </tr> - <tr class="cbj_pubdate"> - <td class="cbj_label">{pubdate_label}:</td> - <td class="cbj_content">{pubdate}</td> + <tr> + <td class="cbj_author" colspan="2">{author}</td> + </tr> + <tr> + <td class="cbj_pubdata" colspan="2">{publisher} ({pubdate})</td> </tr> + + <tr> + <td class="cbj_author" colspan="2"><hr class="metadata_divider" /></td> + </tr> + <tr class="cbj_rating"> <td class="cbj_label">{rating_label}:</td> <td class="cbj_content">{rating}</td> diff --git a/src/calibre/ebooks/oeb/transforms/jacket.py b/src/calibre/ebooks/oeb/transforms/jacket.py index e744a14389..1a4a402a31 100644 --- a/src/calibre/ebooks/oeb/transforms/jacket.py +++ b/src/calibre/ebooks/oeb/transforms/jacket.py @@ -93,7 +93,7 @@ class Jacket(object): # Render Jacket {{{ -def get_rating(rating, rchar): +def get_rating(rating, rchar, e_rchar): ans = '' try: num = float(rating)/2 @@ -104,12 +104,12 @@ def get_rating(rating, rchar): if num < 1: return ans - ans = rchar * int(num) + ans = ("%s%s") % (rchar * int(num), e_rchar * (5 - int(num))) return ans - def render_jacket(mi, output_profile, - alt_title=_('Unknown'), alt_tags=[], alt_comments=''): + alt_title=_('Unknown'), alt_tags=[], alt_comments='', + alt_publisher=('Unknown publisher')): css = P('jacket/stylesheet.css', data=True).decode('utf-8') try: @@ -124,12 +124,17 @@ def render_jacket(mi, output_profile, if not mi.series: series = '' + try: + publisher = mi.publisher if mi.publisher else alt_publisher + except: + publisher = _('Unknown publisher') + try: pubdate = strftime(u'%Y', mi.pubdate.timetuple()) except: pubdate = '' - rating = get_rating(mi.rating, output_profile.ratings_char) + rating = get_rating(mi.rating, output_profile.ratings_char, output_profile.empty_ratings_char) tags = mi.tags if mi.tags else alt_tags if tags: @@ -154,6 +159,7 @@ def render_jacket(mi, output_profile, css=css, title=title, author=author, + publisher=publisher, pubdate_label=_('Published'), pubdate=pubdate, series_label=_('Series'), series=series, rating_label=_('Rating'), rating=rating, @@ -165,19 +171,25 @@ def render_jacket(mi, output_profile, generated_html = P('jacket/template.xhtml', data=True).decode('utf-8').format(**args) + print generated_html + # 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 = soup.find('tr', attrs={'class':'cbj_series'}) + series_tag = soup.find(attrs={'class':'cbj_series'}) series_tag.extract() if not rating: - rating_tag = soup.find('tr', attrs={'class':'cbj_rating'}) + #rating_tag = soup.find('tr', attrs={'class':'cbj_rating'}) + rating_tag = soup.find(attrs={'class':'cbj_rating'}) rating_tag.extract() if not tags: - tags_tag = soup.find('tr', attrs={'class':'cbj_tags'}) + #tags_tag = soup.find('tr', attrs={'class':'cbj_tags'}) + tags_tag = soup.find(attrs={'class':'cbj_tags'}) tags_tag.extract() if not pubdate: - pubdate_tag = soup.find('tr', attrs={'class':'cbj_pubdate'}) + #pubdate_tag = soup.find('tr', attrs={'class':'cbj_pubdate'}) + pubdate_tag = soup.find(attrs={'class':'cbj_pubdate'}) pubdate_tag.extract() if output_profile.short_name != 'kindle': hr_tag = soup.find('hr', attrs={'class':'cbj_kindle_banner_hr'}) diff --git a/src/calibre/gui2/catalog/catalog_epub_mobi.py b/src/calibre/gui2/catalog/catalog_epub_mobi.py index ea4edb10b9..7ac6010896 100644 --- a/src/calibre/gui2/catalog/catalog_epub_mobi.py +++ b/src/calibre/gui2/catalog/catalog_epub_mobi.py @@ -7,9 +7,15 @@ __copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>' __docformat__ = 'restructuredtext en' -from calibre.gui2 import gprefs -from catalog_epub_mobi_ui import Ui_Form +import os + from calibre.ebooks.conversion.config import load_defaults +from calibre.gui2 import gprefs +from calibre.library.database2 import LibraryDatabase2 +from calibre.utils.config import prefs + +from catalog_epub_mobi_ui import Ui_Form +from PyQt4 import QtGui from PyQt4.Qt import QWidget class PluginWidget(QWidget,Ui_Form): @@ -23,7 +29,8 @@ class PluginWidget(QWidget,Ui_Form): ('generate_recently_added', True), ('note_tag','*'), ('numbers_as_text', False), - ('read_tag','+'), + ('read_pattern','+'), + ('read_source_field_cb','Tag'), ('wishlist_tag','Wishlist'), ] @@ -40,14 +47,55 @@ class PluginWidget(QWidget,Ui_Form): def initialize(self, name): self.name = name + + # Populate the 'Read book' source fields + dbpath = os.path.abspath(prefs['library_path']) + db = LibraryDatabase2(dbpath) + all_custom_fields = db.custom_field_keys() + custom_fields = {} + custom_fields['Tag'] = {'field':'tag', 'datatype':u'text'} + for custom_field in all_custom_fields: + field_md = db.metadata_for_field(custom_field) + if field_md['datatype'] in ['bool','composite','datetime','text']: + custom_fields[field_md['name']] = {'field':custom_field, + 'datatype':field_md['datatype']} + + # Add the sorted eligible fields to the combo box + for cf in sorted(custom_fields): + self.read_source_field_cb.addItem(cf) + + self.read_source_fields = custom_fields + self.read_source_field_cb.currentIndexChanged.connect(self.read_source_field_changed) + # Update dialog fields from stored options for opt in self.OPTION_FIELDS: opt_value = gprefs.get(self.name + '_' + opt[0], opt[1]) - if opt[0] in ['numbers_as_text','generate_titles','generate_series','generate_recently_added']: + if opt[0] in [ + 'generate_recently_added', + 'generate_series', + 'generate_titles', + 'numbers_as_text', + ]: getattr(self, opt[0]).setChecked(opt_value) + + # Combo box + elif opt[0] in ['read_source_field_cb']: + # Look for last-stored combo box value + index = self.read_source_field_cb.findText(opt_value) + print "last index: %d" % index + if index == -1: + index = self.read_source_field_cb.findText('Tag') + self.read_source_field_cb.setCurrentIndex(index) + + # Text fields else: getattr(self, opt[0]).setText(opt_value) + # Init self.read_source_field + cs = str(self.read_source_field_cb.currentText()) + read_source_spec = self.read_source_fields[str(cs)] + self.read_source_field = read_source_spec['field'] + def options(self): # Save/return the current options # exclude_genre stores literally @@ -55,16 +103,60 @@ class PluginWidget(QWidget,Ui_Form): # others store as lists opts_dict = {} for opt in self.OPTION_FIELDS: - if opt[0] in ['numbers_as_text','generate_titles','generate_series','generate_recently_added']: + # Save values to gprefs + if opt[0] in [ + 'generate_recently_added', + 'generate_series', + 'generate_titles', + 'numbers_as_text', + ]: opt_value = getattr(self,opt[0]).isChecked() + + # Combo box uses .currentText() + elif opt[0] in ['read_source_field_cb']: + opt_value = unicode(getattr(self, opt[0]).currentText()) + + # text fields use .text() else: opt_value = unicode(getattr(self, opt[0]).text()) gprefs.set(self.name + '_' + opt[0], opt_value) - if opt[0] in ['exclude_genre','numbers_as_text','generate_titles','generate_series','generate_recently_added']: + # Construct opts + if opt[0] in [ + 'exclude_genre', + 'generate_recently_added', + 'generate_series', + 'generate_titles', + 'numbers_as_text', + ]: opts_dict[opt[0]] = opt_value else: opts_dict[opt[0]] = opt_value.split(',') - opts_dict['output_profile'] = [load_defaults('page_setup')['output_profile']] + # Generate read_book_marker + opts_dict['read_book_marker'] = "%s:%s" % (self.read_source_field, self.read_pattern.text()) + + # Append the output profile + opts_dict['output_profile'] = [load_defaults('page_setup')['output_profile']] return opts_dict + + def read_source_field_changed(self,new_index): + ''' + Process changes in the read_source_field combo box + Currently using QLineEdit for all field types + Possible to modify to switch QWidget type + ''' + new_source = str(self.read_source_field_cb.currentText()) + read_source_spec = self.read_source_fields[str(new_source)] + self.read_source_field = read_source_spec['field'] + + # Change pattern input widget to match the source field datatype + if read_source_spec['datatype'] in ['bool','composite','datetime','text']: + if type(self.read_pattern) != type(QtGui.QLineEdit()): + self.read_spec_hl.removeWidget(self.read_pattern) + dw = QtGui.QLineEdit() + dw.setObjectName('read_pattern') + dw.setToolTip('Pattern for read book') + self.read_pattern = dw + self.read_spec_hl.addWidget(dw) + diff --git a/src/calibre/gui2/catalog/catalog_epub_mobi.ui b/src/calibre/gui2/catalog/catalog_epub_mobi.ui index 3956886c4a..d72566f581 100644 --- a/src/calibre/gui2/catalog/catalog_epub_mobi.ui +++ b/src/calibre/gui2/catalog/catalog_epub_mobi.ui @@ -6,8 +6,8 @@ <rect> <x>0</x> <y>0</y> - <width>579</width> - <height>411</height> + <width>627</width> + <height>549</height> </rect> </property> <property name="windowTitle"> @@ -28,42 +28,28 @@ </property> </widget> </item> - <item row="1" column="0"> - <widget class="QLabel" name="label_3"> - <property name="text"> - <string>'Mark this book as read' tag:</string> - </property> - </widget> - </item> - <item row="1" column="1"> - <widget class="QLineEdit" name="read_tag"> - <property name="toolTip"> - <string extracomment="Default: +"/> - </property> - </widget> - </item> - <item row="3" column="0"> + <item row="4" column="0"> <widget class="QLabel" name="label_4"> <property name="text"> <string>Additional note tag prefix:</string> </property> </widget> </item> - <item row="3" column="1"> + <item row="4" column="1"> <widget class="QLineEdit" name="note_tag"> <property name="toolTip"> <string extracomment="Default: *"/> </property> </widget> </item> - <item row="5" column="1"> + <item row="6" column="1"> <widget class="QLineEdit" name="exclude_genre"> <property name="toolTip"> <string extracomment="Default: \[[\w]*\]"/> </property> </widget> </item> - <item row="5" column="0"> + <item row="6" column="0"> <widget class="QLabel" name="label"> <property name="text"> <string>Regex pattern describing tags to exclude as genres:</string> @@ -76,7 +62,7 @@ </property> </widget> </item> - <item row="6" column="1"> + <item row="7" column="1"> <widget class="QLabel" name="label_6"> <property name="text"> <string>Regex tips: @@ -88,7 +74,7 @@ </property> </widget> </item> - <item row="7" column="0"> + <item row="8" column="0"> <spacer name="verticalSpacer"> <property name="orientation"> <enum>Qt::Vertical</enum> @@ -101,44 +87,84 @@ </property> </spacer> </item> - <item row="9" column="0"> + <item row="10" column="0"> <widget class="QCheckBox" name="generate_titles"> <property name="text"> <string>Include 'Titles' Section</string> </property> </widget> </item> - <item row="11" column="0"> + <item row="12" column="0"> <widget class="QCheckBox" name="generate_recently_added"> <property name="text"> <string>Include 'Recently Added' Section</string> </property> </widget> </item> - <item row="12" column="0"> + <item row="13" column="0"> <widget class="QCheckBox" name="numbers_as_text"> <property name="text"> <string>Sort numbers as text</string> </property> </widget> </item> - <item row="10" column="0"> + <item row="11" column="0"> <widget class="QCheckBox" name="generate_series"> <property name="text"> <string>Include 'Series' Section</string> </property> </widget> </item> - <item row="2" column="1"> + <item row="3" column="1"> <widget class="QLineEdit" name="wishlist_tag"/> </item> - <item row="2" column="0"> + <item row="3" column="0"> <widget class="QLabel" name="label_5"> <property name="text"> <string>Wishlist tag:</string> </property> </widget> </item> + <item row="2" column="1"> + <layout class="QHBoxLayout" name="read_spec_hl"> + <property name="sizeConstraint"> + <enum>QLayout::SetMinimumSize</enum> + </property> + <item> + <widget class="QComboBox" name="read_source_field_cb"> + <property name="sizePolicy"> + <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="toolTip"> + <string>Source column for read book</string> + </property> + <property name="statusTip"> + <string/> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="read_pattern"> + <property name="toolTip"> + <string>Pattern for read book</string> + </property> + <property name="statusTip"> + <string/> + </property> + </widget> + </item> + </layout> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="label_3"> + <property name="text"> + <string>Books marked as read:</string> + </property> + </widget> + </item> </layout> </widget> <resources/> diff --git a/src/calibre/library/catalog.py b/src/calibre/library/catalog.py index 2ee55851de..b7dbd3c35f 100644 --- a/src/calibre/library/catalog.py +++ b/src/calibre/library/catalog.py @@ -606,12 +606,12 @@ class EPUB_MOBI(CatalogPlugin): help=_("Specifies the output profile. In some cases, an output profile is required to optimize the catalog for the device. For example, 'kindle' or 'kindle_dx' creates a structured Table of Contents with Sections and Articles.\n" "Default: '%default'\n" "Applies to: ePub, MOBI output formats")), - Option('--read-tag', - default='+', - dest='read_tag', + Option('--read-book-marker', + default='tag:+', + dest='read_book_marker', action = None, - help=_("Tag indicating book has been read.\n" "Default: '%default'\n" - "Applies to: ePub, MOBI output formats")), + help=_("field:pattern indicating book has been read.\n" "Default: '%default'\n" + "Applies to ePub, MOBI output formats")), Option('--wishlist-tag', default='Wishlist', dest='wishlist_tag', @@ -898,6 +898,8 @@ class EPUB_MOBI(CatalogPlugin): self.__plugin = plugin self.__progressInt = 0.0 self.__progressString = '' + self.__read_book_marker = {'field':opts.read_book_marker.split(':')[0], + 'pattern':opts.read_book_marker.split(':')[1]} self.__reporter = report_progress self.__stylesheet = stylesheet self.__thumbs = None @@ -936,7 +938,6 @@ class EPUB_MOBI(CatalogPlugin): if self.opts.generate_series: self.__totalSteps += 2 - # Accessors if True: ''' @@ -1402,7 +1403,7 @@ class EPUB_MOBI(CatalogPlugin): this_title['cover'] = re.sub('&', '&', record['cover']) # This may be updated in self.processSpecialTags() - this_title['read'] = False + this_title['read'] = self.discoverReadStatus(record) if record['tags']: this_title['tags'] = self.processSpecialTags(record['tags'], @@ -2675,13 +2676,14 @@ class EPUB_MOBI(CatalogPlugin): pBookTag = Tag(soup, "p") ptc = 0 + # THIS SHOULDN'T BE NECESSARY # book with read/reading/unread symbol - for tag in book['tags']: - if tag == self.opts.read_tag: - book['read'] = True - break - else: - book['read'] = False +# for tag in book['tags']: +# if tag == self.opts.read_tag: +# book['read'] = True +# break +# else: +# book['read'] = False # book with read|reading|unread symbol or wishlist item if self.opts.wishlist_tag in book.get('tags', []): @@ -4027,6 +4029,37 @@ class EPUB_MOBI(CatalogPlugin): if not os.path.isdir(images_path): os.makedirs(images_path) + def discoverReadStatus(self, record): + ''' + Given a field:pattern spec, discover if this book marked as read + + if field == tag, scan tags for pattern + if custom field, try regex match for pattern + This allows maximum flexibility with fields of type + datatype bool: #field_name:True + datatype text: #field_name:<string> + datatype datetime: #field_name:.* + + ''' + # Legacy handling of special 'read' tag + if self.__read_book_marker['field'] == 'tag': + return self.__read_book_marker['pattern'] in record['tags'] + + # Custom fields + elif self.__read_book_marker['field'].startswith('#'): + field_contents = self.__db.get_field(record['id'], + self.__read_book_marker['field'], + index_is_id=True) + if field_contents == '': + field_contents = None + + if field_contents is not None: + if re.match(self.__read_book_marker['pattern'],str(field_contents), re.IGNORECASE): + return True + + return False + + def filterDbTags(self, tags): # Remove the special marker tags from the database's tag list, # return sorted list of normalized genre tags @@ -4648,10 +4681,12 @@ class EPUB_MOBI(CatalogPlugin): tag = self.convertHTMLEntities(tag) if tag.startswith(opts.note_tag): this_title['notes'] = tag[len(self.opts.note_tag):] - elif tag == opts.read_tag: - this_title['read'] = True elif re.search(opts.exclude_genre, tag): continue + elif self.__read_book_marker['field'] == 'tag' and \ + tag == self.__read_book_marker['pattern']: + # remove 'read' tag + continue else: tag_list.append(tag) return tag_list @@ -4760,7 +4795,7 @@ class EPUB_MOBI(CatalogPlugin): for key in keys: if key in ['catalog_title','authorClip','connected_kindle','descriptionClip', 'exclude_genre','exclude_tags','note_tag','numbers_as_text', - 'output_profile','read_tag', + 'output_profile','read_book_marker','read_tag', 'search_text','sort_by','sort_descriptions_by_author','sync', 'wishlist_tag']: build_log.append(" %s: %s" % (key, opts_dict[key])) diff --git a/src/calibre/library/cli.py b/src/calibre/library/cli.py index 7d3fb329e0..747cd59abb 100644 --- a/src/calibre/library/cli.py +++ b/src/calibre/library/cli.py @@ -640,7 +640,7 @@ def catalog_option_parser(args): log = Log() parser = get_parser(_( ''' - %prog catalog /path/to/destination.(csv|epub|mobi|xml ...) [options] + %prog catalog /path/to/destination.(CSV|EPUB|MOBI|XML ...) [options] Export a catalog in format specified by path/to/destination extension. Options control how entries are displayed in the generated catalog ouput. From bfdc51a2dda552c99b5570c5a2becc61165d4dfe Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Tue, 30 Nov 2010 17:37:56 +0000 Subject: [PATCH 205/375] Make the 'clear' button respect the search emit flag. --- src/calibre/gui2/search_box.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py index 6624acf35f..065520b4c5 100644 --- a/src/calibre/gui2/search_box.py +++ b/src/calibre/gui2/search_box.py @@ -107,6 +107,7 @@ class SearchBox2(QComboBox): return self.currentText() def clear(self, emit_search=True): + print 'in clear', emit_search self.normalize_state() self.setEditText('') if emit_search: @@ -318,7 +319,7 @@ class SearchBoxMixin(object): self.search.cleared.connect(self.search_box_cleared) self.search.changed.connect(self.search_box_changed) self.search.focus_to_library.connect(self.focus_to_library) - self.clear_button.clicked.connect(self.search.clear) + self.clear_button.clicked.connect(lambda:self.search.clear(True)) self.advanced_search_button.clicked[bool].connect(self.do_advanced_search) self.search.clear() From ff978282c72f6fea76d79a5d90dab5af00298b95 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Tue, 30 Nov 2010 18:03:52 +0000 Subject: [PATCH 206/375] Remove widgets with removing the layout in bulk edit. --- src/calibre/gui2/dialogs/metadata_bulk.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/calibre/gui2/dialogs/metadata_bulk.py b/src/calibre/gui2/dialogs/metadata_bulk.py index f2a2394e9e..e67a80e5d1 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.py +++ b/src/calibre/gui2/dialogs/metadata_bulk.py @@ -210,6 +210,11 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): # Remove all controls from the dialog box by deleting the top layout if self.layout(): import sip + while True: + child = self.layout().takeAt(0) + if not child: + break; + sip.delete(child) sip.delete(self.layout()) self.setupUi(self) From 566d56e71e7ca8fabb3ffa812a9b9e59ed790de0 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Tue, 30 Nov 2010 18:55:24 +0000 Subject: [PATCH 207/375] Another attempt at apply in bulk edit --- src/calibre/gui2/actions/edit_metadata.py | 9 +++- src/calibre/gui2/dialogs/metadata_bulk.py | 51 ++++++++--------------- 2 files changed, 24 insertions(+), 36 deletions(-) diff --git a/src/calibre/gui2/actions/edit_metadata.py b/src/calibre/gui2/actions/edit_metadata.py index 9b3f2c5bb9..8b57b4b455 100644 --- a/src/calibre/gui2/actions/edit_metadata.py +++ b/src/calibre/gui2/actions/edit_metadata.py @@ -162,9 +162,14 @@ class EditMetadataAction(InterfaceAction): return # Prevent the TagView from updating due to signals from the database self.gui.tags_view.blockSignals(True) + changed = False try: - changed = MetadataBulkDialog(self.gui, rows, - self.gui.library_view.model()).changed + while True: + dialog = MetadataBulkDialog(self.gui, rows, self.gui.library_view.model()) + if dialog.changed: + changed = True + if not dialog.do_again: + break finally: self.gui.tags_view.blockSignals(False) if changed: diff --git a/src/calibre/gui2/dialogs/metadata_bulk.py b/src/calibre/gui2/dialogs/metadata_bulk.py index e67a80e5d1..4fd34e4c4c 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.py +++ b/src/calibre/gui2/dialogs/metadata_bulk.py @@ -198,35 +198,15 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): ] def __init__(self, window, rows, model): - self.model = model - self.db = self.model.db - self.ids = [self.db.id(r) for r in rows] QDialog.__init__(self, window) Ui_MetadataBulkDialog.__init__(self) - self._initialize() - self.exec_() - - def _initialize(self): - # Remove all controls from the dialog box by deleting the top layout - if self.layout(): - import sip - while True: - child = self.layout().takeAt(0) - if not child: - break; - sip.delete(child) - sip.delete(self.layout()) - self.setupUi(self) - self.button_box.clicked.connect(self.button_clicked) - self.button_box.button(QDialogButtonBox.Apply).setToolTip(_( - 'Immediately make all changes without closing the dialog. ' - 'This operation cannot be canceled or undone')) - + self.model = model + self.db = model.db + self.ids = [self.db.id(r) for r in rows] self.box_title.setText('<p>' + _('Editing meta information for <b>%d books</b>') % - len(self.ids)) - + len(rows)) self.write_series = False self.changed = False @@ -253,10 +233,17 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): self.prepare_search_and_replace() + self.button_box.clicked.connect(self.button_clicked) + self.button_box.button(QDialogButtonBox.Apply).setToolTip(_( + 'Immediately make all changes without closing the dialog. ' + 'This operation cannot be canceled or undone')) + self.do_again = False + self.exec_() + def button_clicked(self, which): if which == self.button_box.button(QDialogButtonBox.Apply): - self._do_the_work() - self._initialize() + self.do_again = True + self.accept() def prepare_search_and_replace(self): self.search_for.initialize('bulk_edit_search_for') @@ -651,7 +638,10 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): self.series_start_number.setEnabled(False) self.series_start_number.setValue(1) - def _do_the_work(self): + def accept(self): + 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, @@ -711,13 +701,6 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): dynamic['s_r_search_mode'] = self.search_mode.currentIndex() self.db.clean() - return True - - def accept(self): - if len(self.ids) < 1: - return QDialog.accept(self) - if not self._do_the_work(): - return False return QDialog.accept(self) def series_changed(self, *args): From 5fa54ef9adda206a6022be495095dfaec1001ef5 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Tue, 30 Nov 2010 13:52:58 -0700 Subject: [PATCH 208/375] Use the same MIME database on all platforms that calibre runs on --- resources/mime.types | 1381 +++++++++++++++++++++++++++++++++++++++ src/calibre/__init__.py | 35 +- src/calibre/startup.py | 5 + 3 files changed, 1390 insertions(+), 31 deletions(-) create mode 100644 resources/mime.types diff --git a/resources/mime.types b/resources/mime.types new file mode 100644 index 0000000000..ab98b3bf4a --- /dev/null +++ b/resources/mime.types @@ -0,0 +1,1381 @@ +## Mimetypes from my linux system + +application/activemessage +application/andrew-inset ez +application/applefile +application/applixware aw +application/atom+xml atom +application/atomcat+xml atomcat +application/atomicmail +application/atomsvc+xml atomsvc +application/auth-policy+xml +application/batch-smtp +application/beep+xml +application/cals-1840 +application/ccxml+xml ccxml +application/cea-2018+xml +application/cellml+xml +application/cnrp+xml +application/commonground +application/conference-info+xml +application/cpl+xml +application/csta+xml +application/cstadata+xml +application/cu-seeme cu +application/cybercash +application/davmount+xml davmount +application/dca-rft +application/dec-dx +application/dialog-info+xml +application/dicom +application/dns +application/dsptype tsp +application/dvcs +application/ecmascript ecma +application/edi-consent +application/edi-x12 +application/edifact +application/emma+xml emma +application/epp+xml +application/epub+zip epub +application/eshop +application/example +application/fastinfoset +application/fastsoap +application/fits +application/font-tdpfr pfr +application/futuresplash spl +application/h224 +application/hta hta +application/http +application/hyperstudio stk +application/ibe-key-request+xml +application/ibe-pkg-reply+xml +application/ibe-pp-data +application/iges +application/im-iscomposing+xml +application/index +application/index.cmd +application/index.obj +application/index.response +application/index.vnd +application/iotp +application/ipp +application/isup +application/java-archive jar +application/java-serialized-object ser +application/java-vm class +application/javascript js +application/json json +application/kpml-request+xml +application/kpml-response+xml +application/lost+xml lostxml +application/mac-binhex40 hqx +application/mac-compactpro cpt +application/macwriteii +application/marc mrc +application/mathematica ma mb nb +application/mathml+xml mathml +application/mbms-associated-procedure-description+xml +application/mbms-deregister+xml +application/mbms-envelope+xml +application/mbms-msk+xml +application/mbms-msk-response+xml +application/mbms-protection-description+xml +application/mbms-reception-report+xml +application/mbms-register+xml +application/mbms-register-response+xml +application/mbms-user-service-description+xml +application/mbox mbox +application/media_control+xml +application/mediaservercontrol+xml mscml +application/mikey +application/moss-keys +application/moss-signature +application/mosskey-data +application/mosskey-request +application/mp4 mp4s +application/mpeg4-generic +application/mpeg4-iod +application/mpeg4-iod-xmt +application/msaccess mdb +application/msword doc dot +application/mxf mxf +application/nasdata +application/news-checkgroups +application/news-groupinfo +application/news-transmission +application/nss +application/ocsp-request +application/ocsp-response +application/octet-stream bin bpk deploy dist distz dmg dms dump elc iso lha lrf lzh pkg so +application/oda oda +application/oebps-package+xml opf +application/ogg ogg ogx +application/onenote onepkg onetmp onetoc onetoc2 +application/parityfec +application/patch-ops-error+xml xer +application/pdf pdf +application/pgp-encrypted pgp +application/pgp-keys key +application/pgp-signature asc pgp sig +application/pics-rules prf +application/pidf+xml +application/pidf-diff+xml +application/pkcs10 p10 +application/pkcs7-mime p7c p7m +application/pkcs7-signature p7s +application/pkix-cert cer +application/pkix-crl crl +application/pkix-pkipath pkipath +application/pkixcmp pki +application/pls+xml pls +application/poc-settings+xml +application/postscript ai eps ps +application/prs.alvestrand.titrax-sheet +application/prs.cww cww +application/prs.nprend +application/prs.plucker +application/qsig +application/rar rar +application/rdf+xml rdf +application/reginfo+xml rif +application/relax-ng-compact-syntax rnc +application/remote-printing +application/resource-lists+xml rl +application/resource-lists-diff+xml rld +application/riscos +application/rlmi+xml +application/rls-services+xml rs +application/rsd+xml rsd +application/rss+xml rss +application/rtf rtf +application/rtx +application/samlassertion+xml +application/samlmetadata+xml +application/sbml+xml sbml +application/scvp-cv-request scq +application/scvp-cv-response scs +application/scvp-vp-request spq +application/scvp-vp-response spp +application/sdp sdp +application/set-payment +application/set-payment-initiation setpay +application/set-registration +application/set-registration-initiation setreg +application/sgml +application/sgml-open-catalog +application/shf+xml shf +application/sieve +application/simple-filter+xml +application/simple-message-summary +application/simplesymbolcontainer +application/slate +application/smil smi smil +application/smil+xml smi smil +application/soap+fastinfoset +application/soap+xml +application/sparql-query rq +application/sparql-results+xml srx +application/spirits-event+xml +application/srgs gram +application/srgs+xml grxml +application/ssml+xml ssml +application/timestamp-query +application/timestamp-reply +application/tve-trigger +application/ulpfec +application/vemmi +application/vividence.scriptfile +application/vnd.3gpp.bsf+xml +application/vnd.3gpp.pic-bw-large plb +application/vnd.3gpp.pic-bw-small psb +application/vnd.3gpp.pic-bw-var pvb +application/vnd.3gpp.sms +application/vnd.3gpp2.bcmcsinfo+xml +application/vnd.3gpp2.sms +application/vnd.3gpp2.tcap tcap +application/vnd.3m.post-it-notes pwn +application/vnd.accpac.simply.aso aso +application/vnd.accpac.simply.imp imp +application/vnd.acucobol acu +application/vnd.acucorp acutc atc +application/vnd.adobe.air-application-installer-package+zip air +application/vnd.adobe.xdp+xml xdp +application/vnd.adobe.xfdf xfdf +application/vnd.aether.imp +application/vnd.airzip.filesecure.azf azf +application/vnd.airzip.filesecure.azs azs +application/vnd.amazon.ebook azw +application/vnd.americandynamics.acc acc +application/vnd.amiga.ami ami +application/vnd.android.package-archive apk +application/vnd.anser-web-certificate-issue-initiation cii +application/vnd.anser-web-funds-transfer-initiation fti +application/vnd.antix.game-component atx +application/vnd.apple.installer+xml mpkg +application/vnd.arastra.swi swi +application/vnd.audiograph aep +application/vnd.autopackage +application/vnd.avistar+xml +application/vnd.blueice.multipass mpm +application/vnd.bluetooth.ep.oob +application/vnd.bmi bmi +application/vnd.businessobjects rep +application/vnd.cab-jscript +application/vnd.canon-cpdl +application/vnd.canon-lips +application/vnd.cendio.thinlinc.clientconf +application/vnd.chemdraw+xml cdxml +application/vnd.chipnuts.karaoke-mmd mmd +application/vnd.cinderella cdy +application/vnd.cirpack.isdn-ext +application/vnd.claymore cla +application/vnd.clonk.c4group c4d c4f c4g c4p c4u +application/vnd.commerce-battelle +application/vnd.commonspace csp +application/vnd.contact.cmsg cdbcmsg +application/vnd.cosmocaller cmc +application/vnd.crick.clicker clkx +application/vnd.crick.clicker.keyboard clkk +application/vnd.crick.clicker.palette clkp +application/vnd.crick.clicker.template clkt +application/vnd.crick.clicker.wordbank clkw +application/vnd.criticaltools.wbs+xml wbs +application/vnd.ctc-posml pml +application/vnd.ctct.ws+xml +application/vnd.cups-pdf +application/vnd.cups-postscript +application/vnd.cups-ppd ppd +application/vnd.cups-raster +application/vnd.cups-raw +application/vnd.curl.car car +application/vnd.curl.pcurl pcurl +application/vnd.cybank +application/vnd.data-vision.rdz rdz +application/vnd.denovo.fcselayout-link fe_launch +application/vnd.dir-bi.plate-dl-nosuffix +application/vnd.dna dna +application/vnd.dolby.mlp mlp +application/vnd.dolby.mobile.1 +application/vnd.dolby.mobile.2 +application/vnd.dpgraph dpg +application/vnd.dreamfactory dfac +application/vnd.dvb.esgcontainer +application/vnd.dvb.ipdcdftnotifaccess +application/vnd.dvb.ipdcesgaccess +application/vnd.dvb.ipdcroaming +application/vnd.dvb.iptv.alfec-base +application/vnd.dvb.iptv.alfec-enhancement +application/vnd.dvb.notif-aggregate-root+xml +application/vnd.dvb.notif-container+xml +application/vnd.dvb.notif-generic+xml +application/vnd.dvb.notif-ia-msglist+xml +application/vnd.dvb.notif-ia-registration-request+xml +application/vnd.dvb.notif-ia-registration-response+xml +application/vnd.dvb.notif-init+xml +application/vnd.dxr +application/vnd.dynageo geo +application/vnd.ecdis-update +application/vnd.ecowin.chart mag +application/vnd.ecowin.filerequest +application/vnd.ecowin.fileupdate +application/vnd.ecowin.series +application/vnd.ecowin.seriesrequest +application/vnd.ecowin.seriesupdate +application/vnd.emclient.accessrequest+xml +application/vnd.enliven nml +application/vnd.epson.esf esf +application/vnd.epson.msf msf +application/vnd.epson.quickanime qam +application/vnd.epson.salt slt +application/vnd.epson.ssf ssf +application/vnd.ericsson.quickcall +application/vnd.eszigno3+xml es3 et3 +application/vnd.etsi.aoc+xml +application/vnd.etsi.cug+xml +application/vnd.etsi.iptvcommand+xml +application/vnd.etsi.iptvdiscovery+xml +application/vnd.etsi.iptvprofile+xml +application/vnd.etsi.iptvsad-bc+xml +application/vnd.etsi.iptvsad-cod+xml +application/vnd.etsi.iptvsad-npvr+xml +application/vnd.etsi.iptvueprofile+xml +application/vnd.etsi.mcid+xml +application/vnd.etsi.sci+xml +application/vnd.etsi.simservs+xml +application/vnd.eudora.data +application/vnd.ezpix-album ez2 +application/vnd.ezpix-package ez3 +application/vnd.f-secure.mobile +application/vnd.fdf fdf +application/vnd.fdsn.mseed mseed +application/vnd.fdsn.seed dataless seed +application/vnd.ffsns +application/vnd.fints +application/vnd.flographit gph +application/vnd.fluxtime.clip ftc +application/vnd.font-fontforge-sfd +application/vnd.framemaker book fm frame maker +application/vnd.frogans.fnc fnc +application/vnd.frogans.ltf ltf +application/vnd.fsc.weblaunch fsc +application/vnd.fujitsu.oasys oas +application/vnd.fujitsu.oasys2 oa2 +application/vnd.fujitsu.oasys3 oa3 +application/vnd.fujitsu.oasysgp fg5 +application/vnd.fujitsu.oasysprs bh2 +application/vnd.fujixerox.art-ex +application/vnd.fujixerox.art4 +application/vnd.fujixerox.ddd ddd +application/vnd.fujixerox.docuworks xdw +application/vnd.fujixerox.docuworks.binder xbd +application/vnd.fujixerox.hbpl +application/vnd.fut-misnet +application/vnd.fuzzysheet fzs +application/vnd.genomatix.tuxedo txd +application/vnd.geogebra.file ggb +application/vnd.geogebra.tool ggt +application/vnd.geometry-explorer gex gre +application/vnd.gmx gmx +application/vnd.google-earth.kml+xml kml +application/vnd.google-earth.kmz kmz +application/vnd.grafeq gqf gqs +application/vnd.gridmp +application/vnd.groove-account gac +application/vnd.groove-help ghf +application/vnd.groove-identity-message gim +application/vnd.groove-injector grv +application/vnd.groove-tool-message gtm +application/vnd.groove-tool-template tpl +application/vnd.groove-vcard vcg +application/vnd.handheld-entertainment+xml zmm +application/vnd.hbci hbci +application/vnd.hcl-bireports +application/vnd.hhe.lesson-player les +application/vnd.hp-hpgl hpgl +application/vnd.hp-hpid hpid +application/vnd.hp-hps hps +application/vnd.hp-jlyt jlt +application/vnd.hp-pcl pcl +application/vnd.hp-pclxl pclxl +application/vnd.httphone +application/vnd.hydrostatix.sof-data sfd-hdstx +application/vnd.hzn-3d-crossword x3d +application/vnd.ibm.afplinedata +application/vnd.ibm.electronic-media +application/vnd.ibm.minipay mpy +application/vnd.ibm.modcap afp list3820 listafp +application/vnd.ibm.rights-management irm +application/vnd.ibm.secure-container sc +application/vnd.iccprofile icc icm +application/vnd.igloader igl +application/vnd.immervision-ivp ivp +application/vnd.immervision-ivu ivu +application/vnd.informedcontrol.rms+xml +application/vnd.informix-visionary +application/vnd.intercon.formnet xpw xpx +application/vnd.intertrust.digibox +application/vnd.intertrust.nncp +application/vnd.intu.qbo qbo +application/vnd.intu.qfx qfx +application/vnd.iptc.g2.conceptitem+xml +application/vnd.iptc.g2.knowledgeitem+xml +application/vnd.iptc.g2.newsitem+xml +application/vnd.iptc.g2.packageitem+xml +application/vnd.ipunplugged.rcprofile rcprofile +application/vnd.irepository.package+xml irp +application/vnd.is-xpr xpr +application/vnd.jam jam +application/vnd.japannet-directory-service +application/vnd.japannet-jpnstore-wakeup +application/vnd.japannet-payment-wakeup +application/vnd.japannet-registration +application/vnd.japannet-registration-wakeup +application/vnd.japannet-setstore-wakeup +application/vnd.japannet-verification +application/vnd.japannet-verification-wakeup +application/vnd.jcp.javame.midlet-rms rms +application/vnd.jisp jisp +application/vnd.joost.joda-archive joda +application/vnd.kahootz ktr ktz +application/vnd.kde.karbon karbon +application/vnd.kde.kchart chrt +application/vnd.kde.kformula kfo +application/vnd.kde.kivio flw +application/vnd.kde.kontour kon +application/vnd.kde.kpresenter kpr kpt +application/vnd.kde.kspread ksp +application/vnd.kde.kword kwd kwt +application/vnd.kenameaapp htke +application/vnd.kidspiration kia +application/vnd.kinar kne knp +application/vnd.koan skd skm skp skt +application/vnd.kodak-descriptor sse +application/vnd.liberty-request+xml +application/vnd.llamagraphics.life-balance.desktop lbd +application/vnd.llamagraphics.life-balance.exchange+xml lbe +application/vnd.lotus-1-2-3 123 +application/vnd.lotus-approach apr +application/vnd.lotus-freelance pre +application/vnd.lotus-notes nsf +application/vnd.lotus-organizer org +application/vnd.lotus-screencam scm +application/vnd.lotus-wordpro lwp +application/vnd.macports.portpkg portpkg +application/vnd.marlin.drm.actiontoken+xml +application/vnd.marlin.drm.conftoken+xml +application/vnd.marlin.drm.license+xml +application/vnd.marlin.drm.mdcf +application/vnd.mcd mcd +application/vnd.medcalcdata mc1 +application/vnd.mediastation.cdkey cdkey +application/vnd.meridian-slingshot +application/vnd.mfer mwf +application/vnd.mfmp mfm +application/vnd.micrografx.flo flo +application/vnd.micrografx.igx igx +application/vnd.mif mif +application/vnd.minisoft-hp3000-save +application/vnd.mitsubishi.misty-guard.trustweb +application/vnd.mobius.daf daf +application/vnd.mobius.dis dis +application/vnd.mobius.mbk mbk +application/vnd.mobius.mqy mqy +application/vnd.mobius.msl msl +application/vnd.mobius.plc plc +application/vnd.mobius.txf txf +application/vnd.mophun.application mpn +application/vnd.mophun.certificate mpc +application/vnd.motorola.flexsuite +application/vnd.motorola.flexsuite.adsi +application/vnd.motorola.flexsuite.fis +application/vnd.motorola.flexsuite.gotap +application/vnd.motorola.flexsuite.kmr +application/vnd.motorola.flexsuite.ttc +application/vnd.motorola.flexsuite.wem +application/vnd.motorola.iprm +application/vnd.mozilla.xul+xml xul +application/vnd.ms-artgalry cil +application/vnd.ms-asf +application/vnd.ms-cab-compressed cab +application/vnd.ms-excel xla xlb xlc xlm xls xlt xlw +application/vnd.ms-excel.addin.macroenabled.12 xlam +application/vnd.ms-excel.sheet.binary.macroenabled.12 xlsb +application/vnd.ms-excel.sheet.macroenabled.12 xlsm +application/vnd.ms-excel.template.macroenabled.12 xltm +application/vnd.ms-fontobject eot +application/vnd.ms-htmlhelp chm +application/vnd.ms-ims ims +application/vnd.ms-lrm lrm +application/vnd.ms-pki.seccat cat +application/vnd.ms-pki.stl stl +application/vnd.ms-playready.initiator+xml +application/vnd.ms-powerpoint pot pps ppt +application/vnd.ms-powerpoint.addin.macroenabled.12 ppam +application/vnd.ms-powerpoint.presentation.macroenabled.12 pptm +application/vnd.ms-powerpoint.slide.macroenabled.12 sldm +application/vnd.ms-powerpoint.slideshow.macroenabled.12 ppsm +application/vnd.ms-powerpoint.template.macroenabled.12 potm +application/vnd.ms-project mpp mpt +application/vnd.ms-tnef +application/vnd.ms-wmdrm.lic-chlg-req +application/vnd.ms-wmdrm.lic-resp +application/vnd.ms-wmdrm.meter-chlg-req +application/vnd.ms-wmdrm.meter-resp +application/vnd.ms-word.document.macroenabled.12 docm +application/vnd.ms-word.template.macroenabled.12 dotm +application/vnd.ms-works wcm wdb wks wps +application/vnd.ms-wpl wpl +application/vnd.ms-xpsdocument xps +application/vnd.mseq mseq +application/vnd.msign +application/vnd.multiad.creator +application/vnd.multiad.creator.cif +application/vnd.music-niff +application/vnd.musician mus +application/vnd.muvee.style msty +application/vnd.ncd.control +application/vnd.ncd.reference +application/vnd.nervana +application/vnd.netfpx +application/vnd.neurolanguage.nlu nlu +application/vnd.noblenet-directory nnd +application/vnd.noblenet-sealer nns +application/vnd.noblenet-web nnw +application/vnd.nokia.catalogs +application/vnd.nokia.conml+wbxml +application/vnd.nokia.conml+xml +application/vnd.nokia.iptv.config+xml +application/vnd.nokia.isds-radio-presets +application/vnd.nokia.landmark+wbxml +application/vnd.nokia.landmark+xml +application/vnd.nokia.landmarkcollection+xml +application/vnd.nokia.n-gage.ac+xml +application/vnd.nokia.n-gage.data ngdat +application/vnd.nokia.n-gage.symbian.install n-gage +application/vnd.nokia.ncd +application/vnd.nokia.pcd+wbxml +application/vnd.nokia.pcd+xml +application/vnd.nokia.radio-preset rpst +application/vnd.nokia.radio-presets rpss +application/vnd.novadigm.edm edm +application/vnd.novadigm.edx edx +application/vnd.novadigm.ext ext +application/vnd.oasis.opendocument.chart odc +application/vnd.oasis.opendocument.chart-template otc +application/vnd.oasis.opendocument.database odb +application/vnd.oasis.opendocument.formula odf +application/vnd.oasis.opendocument.formula-template odft +application/vnd.oasis.opendocument.graphics odg +application/vnd.oasis.opendocument.graphics-template otg +application/vnd.oasis.opendocument.image odi +application/vnd.oasis.opendocument.image-template oti +application/vnd.oasis.opendocument.presentation odp +application/vnd.oasis.opendocument.presentation-template otp +application/vnd.oasis.opendocument.spreadsheet ods +application/vnd.oasis.opendocument.spreadsheet-template ots +application/vnd.oasis.opendocument.text odt +application/vnd.oasis.opendocument.text-master odm otm +application/vnd.oasis.opendocument.text-template ott +application/vnd.oasis.opendocument.text-web oth +application/vnd.obn +application/vnd.olpc-sugar xo +application/vnd.oma-scws-config +application/vnd.oma-scws-http-request +application/vnd.oma-scws-http-response +application/vnd.oma.bcast.associated-procedure-parameter+xml +application/vnd.oma.bcast.drm-trigger+xml +application/vnd.oma.bcast.imd+xml +application/vnd.oma.bcast.ltkm +application/vnd.oma.bcast.notification+xml +application/vnd.oma.bcast.provisioningtrigger +application/vnd.oma.bcast.sgboot +application/vnd.oma.bcast.sgdd+xml +application/vnd.oma.bcast.sgdu +application/vnd.oma.bcast.simple-symbol-container +application/vnd.oma.bcast.smartcard-trigger+xml +application/vnd.oma.bcast.sprov+xml +application/vnd.oma.bcast.stkm +application/vnd.oma.dcd +application/vnd.oma.dcdc +application/vnd.oma.dd2+xml dd2 +application/vnd.oma.drm.risd+xml +application/vnd.oma.group-usage-list+xml +application/vnd.oma.poc.detailed-progress-report+xml +application/vnd.oma.poc.final-report+xml +application/vnd.oma.poc.groups+xml +application/vnd.oma.poc.invocation-descriptor+xml +application/vnd.oma.poc.optimized-progress-report+xml +application/vnd.oma.xcap-directory+xml +application/vnd.omads-email+xml +application/vnd.omads-file+xml +application/vnd.omads-folder+xml +application/vnd.omaloc-supl-init +application/vnd.openofficeorg.extension oxt +application/vnd.openxmlformats-officedocument.presentationml.presentation pptx +application/vnd.openxmlformats-officedocument.presentationml.slide sldx +application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx +application/vnd.openxmlformats-officedocument.presentationml.template potx +application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx +application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx +application/vnd.openxmlformats-officedocument.wordprocessingml.document docx +application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx +application/vnd.osa.netdeploy +application/vnd.osgi.bundle +application/vnd.osgi.dp dp +application/vnd.otps.ct-kip+xml +application/vnd.palm oprc pdb pqa +application/vnd.paos.xml +application/vnd.pg.format str +application/vnd.pg.osasli ei6 +application/vnd.piaccess.application-licence +application/vnd.picsel efif +application/vnd.poc.group-advertisement+xml +application/vnd.pocketlearn plf +application/vnd.powerbuilder6 pbd +application/vnd.powerbuilder6-s +application/vnd.powerbuilder7 +application/vnd.powerbuilder7-s +application/vnd.powerbuilder75 +application/vnd.powerbuilder75-s +application/vnd.preminet +application/vnd.previewsystems.box box +application/vnd.proteus.magazine mgz +application/vnd.publishare-delta-tree qps +application/vnd.pvi.ptid1 ptid +application/vnd.pwg-multiplexed +application/vnd.pwg-xhtml-print+xml +application/vnd.qualcomm.brew-app-res +application/vnd.quark.quarkxpress qwd qwt qxb qxd qxl qxt +application/vnd.rapid +application/vnd.recordare.musicxml mxl +application/vnd.recordare.musicxml+xml musicxml +application/vnd.renlearn.rlprint +application/vnd.rim.cod cod +application/vnd.rn-realmedia rm +application/vnd.route66.link66+xml link66 +application/vnd.ruckus.download +application/vnd.s3sms +application/vnd.sbm.cid +application/vnd.sbm.mid2 +application/vnd.scribus +application/vnd.sealed.3df +application/vnd.sealed.csf +application/vnd.sealed.doc +application/vnd.sealed.eml +application/vnd.sealed.mht +application/vnd.sealed.net +application/vnd.sealed.ppt +application/vnd.sealed.tiff +application/vnd.sealed.xls +application/vnd.sealedmedia.softseal.html +application/vnd.sealedmedia.softseal.pdf +application/vnd.seemail see +application/vnd.sema sema +application/vnd.semd semd +application/vnd.semf semf +application/vnd.shana.informed.formdata ifm +application/vnd.shana.informed.formtemplate itp +application/vnd.shana.informed.interchange iif +application/vnd.shana.informed.package ipk +application/vnd.simtech-mindmapper twd twds +application/vnd.smaf mmf +application/vnd.smart.teacher teacher +application/vnd.software602.filler.form+xml +application/vnd.software602.filler.form-xml-zip +application/vnd.solent.sdkm+xml sdkd sdkm +application/vnd.spotfire.dxp dxp +application/vnd.spotfire.sfs sfs +application/vnd.sss-cod +application/vnd.sss-dtf +application/vnd.sss-ntf +application/vnd.stardivision.calc sdc +application/vnd.stardivision.draw sda +application/vnd.stardivision.impress sdd sdp +application/vnd.stardivision.math sdf smf +application/vnd.stardivision.writer sdw vor +application/vnd.stardivision.writer-global sgl +application/vnd.street-stream +application/vnd.sun.wadl+xml +application/vnd.sun.xml.calc sxc +application/vnd.sun.xml.calc.template stc +application/vnd.sun.xml.draw sxd +application/vnd.sun.xml.draw.template std +application/vnd.sun.xml.impress sxi +application/vnd.sun.xml.impress.template sti +application/vnd.sun.xml.math sxm +application/vnd.sun.xml.writer sxw +application/vnd.sun.xml.writer.global sxg +application/vnd.sun.xml.writer.template stw +application/vnd.sus-calendar sus susp +application/vnd.svd svd +application/vnd.swiftview-ics +application/vnd.symbian.install sis sisx +application/vnd.syncml+xml xsm +application/vnd.syncml.dm+wbxml bdm +application/vnd.syncml.dm+xml xdm +application/vnd.syncml.dm.notification +application/vnd.syncml.ds.notification +application/vnd.tao.intent-module-archive tao +application/vnd.tmobile-livetv tmo +application/vnd.trid.tpt tpt +application/vnd.triscape.mxs mxs +application/vnd.trueapp tra +application/vnd.truedoc +application/vnd.ufdl ufd ufdl +application/vnd.uiq.theme utz +application/vnd.umajin umj +application/vnd.unity unityweb +application/vnd.uoml+xml uoml +application/vnd.uplanet.alert +application/vnd.uplanet.alert-wbxml +application/vnd.uplanet.bearer-choice +application/vnd.uplanet.bearer-choice-wbxml +application/vnd.uplanet.cacheop +application/vnd.uplanet.cacheop-wbxml +application/vnd.uplanet.channel +application/vnd.uplanet.channel-wbxml +application/vnd.uplanet.list +application/vnd.uplanet.list-wbxml +application/vnd.uplanet.listcmd +application/vnd.uplanet.listcmd-wbxml +application/vnd.uplanet.signal +application/vnd.vcx vcx +application/vnd.vd-study +application/vnd.vectorworks +application/vnd.vidsoft.vidconference +application/vnd.visio vsd vss vst vsw +application/vnd.visionary vis +application/vnd.vividence.scriptfile +application/vnd.vsf vsf +application/vnd.wap.sic +application/vnd.wap.slc +application/vnd.wap.wbxml wbxml +application/vnd.wap.wmlc wmlc +application/vnd.wap.wmlscriptc wmlsc +application/vnd.webturbo wtb +application/vnd.wfa.wsc +application/vnd.wmc +application/vnd.wmf.bootstrap +application/vnd.wordperfect wpd +application/vnd.wqd wqd +application/vnd.wrq-hp3000-labelled +application/vnd.wt.stf stf +application/vnd.wv.csp+wbxml +application/vnd.wv.csp+xml +application/vnd.wv.ssp+xml +application/vnd.xara xar +application/vnd.xfdl xfdl +application/vnd.xfdl.webform +application/vnd.xmi+xml +application/vnd.xmpie.cpkg +application/vnd.xmpie.dpkg +application/vnd.xmpie.plan +application/vnd.xmpie.ppkg +application/vnd.xmpie.xlim +application/vnd.yamaha.hv-dic hvd +application/vnd.yamaha.hv-script hvs +application/vnd.yamaha.hv-voice hvp +application/vnd.yamaha.openscoreformat osf +application/vnd.yamaha.openscoreformat.osfpvg+xml osfpvg +application/vnd.yamaha.smaf-audio saf +application/vnd.yamaha.smaf-phrase spf +application/vnd.yellowriver-custom-menu cmp +application/vnd.zul zir zirz +application/vnd.zzazz.deck+xml zaz +application/voicexml+xml vxml +application/watcherinfo+xml +application/whoispp-query +application/whoispp-response +application/winhlp hlp +application/wita +application/wordperfect wpd +application/wordperfect5.1 wp5 +application/wsdl+xml wsdl +application/wspolicy+xml wspolicy +application/x-123 wk +application/x-abiword abw +application/x-ace-compressed ace +application/x-apple-diskimage dmg +application/x-authorware-bin aab u32 vox x32 +application/x-authorware-map aam +application/x-authorware-seg aas +application/x-bcpio bcpio +application/x-bittorrent torrent +application/x-bzip bz +application/x-bzip2 boz bz2 +application/x-cdf cdf +application/x-cdlink vcd +application/x-chat chat +application/x-chess-pgn pgn +application/x-compress +application/x-cpio cpio +application/x-csh csh +application/x-debian-package deb udeb +application/x-director cct cst cxt dcr dir dxr fgd swa w3d +application/x-dms dms +application/x-doom wad +application/x-dtbncx+xml ncx +application/x-dtbook+xml dtb +application/x-dtbresource+xml res +application/x-dvi dvi +application/x-flac flac +application/x-font gsf pcf pcf.Z pfa pfb +application/x-font-bdf bdf +application/x-font-dos +application/x-font-framemaker +application/x-font-ghostscript gsf +application/x-font-libgrx +application/x-font-linux-psf psf +application/x-font-otf otf +application/x-font-pcf pcf +application/x-font-snf snf +application/x-font-speedo +application/x-font-sunos-news +application/x-font-ttf ttc ttf +application/x-font-type1 afm pfa pfb pfm +application/x-font-vfont +application/x-freemind mm +application/x-futuresplash spl +application/x-gnumeric gnumeric +application/x-go-sgf sgf +application/x-graphing-calculator gcf +application/x-gtar gtar taz tgz +application/x-gzip +application/x-hdf hdf +application/x-ica ica +application/x-internet-signup ins isp +application/x-iphone iii +application/x-iso9660-image iso +application/x-java-jnlp-file jnlp +application/x-javascript js +application/x-jmol jmz +application/x-kchart chrt +application/x-killustrator kil +application/x-koan skd skm skp skt +application/x-kpresenter kpr kpt +application/x-kspread ksp +application/x-kword kwd kwt +application/x-latex latex +application/x-lha lha +application/x-lzh lzh +application/x-lzx lzx +application/x-maker book fb fbdoc fm frame frm maker +application/x-mif mif +application/x-mobipocket-ebook mobi prc +application/x-ms-application application +application/x-ms-wmd wmd +application/x-ms-wmz wmz +application/x-ms-xbap xbap +application/x-msaccess mdb +application/x-msbinder obd +application/x-mscardfile crd +application/x-msclip clp +application/x-msdos-program bat com dll exe +application/x-msdownload bat com dll exe msi +application/x-msi msi +application/x-msmediaview m13 m14 mvb +application/x-msmetafile wmf +application/x-msmoney mny +application/x-mspublisher pub +application/x-msschedule scd +application/x-msterminal trm +application/x-mswrite wri +application/x-netcdf cdf nc +application/x-ns-proxy-autoconfig pac +application/x-nwc nwc +application/x-object o +application/x-oz-application oza +application/x-pkcs12 p12 pfx +application/x-pkcs7-certificates p7b spc +application/x-pkcs7-certreqresp p7r +application/x-pkcs7-crl crl +application/x-python-code pyc pyo +application/x-quicktimeplayer qtl +application/x-rar-compressed rar +application/x-redhat-package-manager rpm +application/x-sh sh +application/x-shar shar +application/x-shockwave-flash swf swfl +application/x-silverlight-app xap +application/x-stuffit sit sitx +application/x-stuffitx sitx +application/x-sv4cpio sv4cpio +application/x-sv4crc sv4crc +application/x-tar tar +application/x-tcl tcl +application/x-tex tex +application/x-tex-gf gf +application/x-tex-pk pk +application/x-tex-tfm tfm +application/x-texinfo texi texinfo +application/x-trash % bak old sik ~ +application/x-troff roff t tr +application/x-troff-man man +application/x-troff-me me +application/x-troff-ms ms +application/x-ustar ustar +application/x-wais-source src +application/x-wingz wz +application/x-x509-ca-cert crt der +application/x-xcf xcf +application/x-xfig fig +application/x-xpinstall xpi +application/x400-bp +application/xcap-att+xml +application/xcap-caps+xml +application/xcap-el+xml +application/xcap-error+xml +application/xcap-ns+xml +application/xcon-conference-info+xml +application/xcon-conference-info-diff+xml +application/xenc+xml xenc +application/xhtml+xml xht xhtml +application/xhtml-voice+xml +application/xml xml xsl +application/xml-dtd dtd +application/xml-external-parsed-entity +application/xmpp+xml +application/xop+xml xop +application/xslt+xml xslt +application/xspf+xml xspf +application/xv+xml mxml xhvml xvm xvml +application/zip zip +audio/32kadpcm +audio/3gpp +audio/3gpp2 +audio/ac3 +audio/adpcm adp +audio/amr +audio/amr-wb +audio/amr-wb+ +audio/asc +audio/basic au snd +audio/bv16 +audio/bv32 +audio/clearmode +audio/cn +audio/dat12 +audio/dls +audio/dsr-es201108 +audio/dsr-es202050 +audio/dsr-es202211 +audio/dsr-es202212 +audio/dvi4 +audio/eac3 +audio/evrc +audio/evrc-qcp +audio/evrc0 +audio/evrc1 +audio/evrcb +audio/evrcb0 +audio/evrcb1 +audio/evrcwb +audio/evrcwb0 +audio/evrcwb1 +audio/example +audio/g719 +audio/g722 +audio/g7221 +audio/g723 +audio/g726-16 +audio/g726-24 +audio/g726-32 +audio/g726-40 +audio/g728 +audio/g729 +audio/g7291 +audio/g729d +audio/g729e +audio/gsm +audio/gsm-efr +audio/ilbc +audio/l16 +audio/l20 +audio/l24 +audio/l8 +audio/lpc +audio/midi kar mid midi rmi +audio/mobile-xmf +audio/mp4 mp4a +audio/mp4a-latm +audio/mpa +audio/mpa-robust +audio/mpeg m2a m3a m4a mp2 mp2a mp3 mpega mpga +audio/mpeg4-generic +audio/mpegurl m3u +audio/ogg oga ogg spx +audio/parityfec +audio/pcma +audio/pcma-wb +audio/pcmu +audio/pcmu-wb +audio/prs.sid sid +audio/qcelp +audio/red +audio/rtp-enc-aescm128 +audio/rtp-midi +audio/rtx +audio/smv +audio/smv-qcp +audio/smv0 +audio/sp-midi +audio/t140c +audio/t38 +audio/telephone-event +audio/tone +audio/ulpfec +audio/vdvi +audio/vmr-wb +audio/vnd.3gpp.iufp +audio/vnd.4sb +audio/vnd.audiokoz +audio/vnd.celp +audio/vnd.cisco.nse +audio/vnd.cmles.radio-events +audio/vnd.cns.anp1 +audio/vnd.cns.inf1 +audio/vnd.digital-winds eol +audio/vnd.dlna.adts +audio/vnd.dolby.heaac.1 +audio/vnd.dolby.heaac.2 +audio/vnd.dolby.mlp +audio/vnd.dolby.mps +audio/vnd.dolby.pl2 +audio/vnd.dolby.pl2x +audio/vnd.dolby.pl2z +audio/vnd.dts dts +audio/vnd.dts.hd dtshd +audio/vnd.everad.plj +audio/vnd.hns.audio +audio/vnd.lucent.voice lvp +audio/vnd.ms-playready.media.pya pya +audio/vnd.nokia.mobile-xmf +audio/vnd.nortel.vbk +audio/vnd.nuera.ecelp4800 ecelp4800 +audio/vnd.nuera.ecelp7470 ecelp7470 +audio/vnd.nuera.ecelp9600 ecelp9600 +audio/vnd.octel.sbc +audio/vnd.qcelp +audio/vnd.rhetorex.32kadpcm +audio/vnd.sealedmedia.softseal.mpeg +audio/vnd.vmx.cvsd +audio/vorbis +audio/vorbis-config +audio/x-aac aac +audio/x-aiff aif aifc aiff +audio/x-gsm gsm +audio/x-mpegurl m3u +audio/x-ms-wax wax +audio/x-ms-wma wma +audio/x-pn-realaudio ra ram rm +audio/x-pn-realaudio-plugin rmp +audio/x-realaudio ra +audio/x-scpls pls +audio/x-sd2 sd2 +audio/x-wav wav +chemical/x-alchemy alc +chemical/x-cache cac cache +chemical/x-cache-csf csf +chemical/x-cactvs-binary cascii cbin ctab +chemical/x-cdx cdx +chemical/x-cerius cer +chemical/x-chem3d c3d +chemical/x-chemdraw chm +chemical/x-cif cif +chemical/x-cmdf cmdf +chemical/x-cml cml +chemical/x-compass cpa +chemical/x-crossfire bsd +chemical/x-csml csm csml +chemical/x-ctx ctx +chemical/x-cxf cef cxf +chemical/x-embl-dl-nucleotide emb embl +chemical/x-galactic-spc spc +chemical/x-gamess-input gam gamin inp +chemical/x-gaussian-checkpoint fch fchk +chemical/x-gaussian-cube cub +chemical/x-gaussian-input gau gjc gjf +chemical/x-gaussian-log gal +chemical/x-gcg8-sequence gcg +chemical/x-genbank gen +chemical/x-hin hin +chemical/x-isostar ist istr +chemical/x-jcamp-dx dx jdx +chemical/x-kinemage kin +chemical/x-macmolecule mcm +chemical/x-macromodel-input mmd mmod +chemical/x-mdl-molfile mol +chemical/x-mdl-rdfile rd +chemical/x-mdl-rxnfile rxn +chemical/x-mdl-sdfile sd sdf +chemical/x-mdl-tgf tgf +chemical/x-mmcif mcif +chemical/x-mol2 mol2 +chemical/x-molconn-Z b +chemical/x-mopac-graph gpt +chemical/x-mopac-input dat mop mopcrt mpc zmt +chemical/x-mopac-out moo +chemical/x-mopac-vib mvb +chemical/x-ncbi-asn1 asn +chemical/x-ncbi-asn1-ascii ent prt +chemical/x-ncbi-asn1-binary aso val +chemical/x-ncbi-asn1-spec asn +chemical/x-pdb ent pdb +chemical/x-rosdal ros +chemical/x-swissprot sw +chemical/x-vamas-iso14976 vms +chemical/x-vmd vmd +chemical/x-xtel xtel +chemical/x-xyz xyz +image/bmp bmp +image/cgm cgm +image/example +image/fits +image/g3fax g3 +image/gif gif +image/ief ief +image/jp2 +image/jpeg jpe jpeg jpg +image/jpm +image/jpx +image/naplps +image/pcx pcx +image/png png +image/prs.btif btif +image/prs.pti +image/svg+xml svg svgz +image/t38 +image/tiff tif tiff +image/tiff-fx +image/vnd.adobe.photoshop psd +image/vnd.cns.inf2 +image/vnd.djvu djv djvu +image/vnd.dwg dwg +image/vnd.dxf dxf +image/vnd.fastbidsheet fbs +image/vnd.fpx fpx +image/vnd.fst fst +image/vnd.fujixerox.edmics-mmr mmr +image/vnd.fujixerox.edmics-rlc rlc +image/vnd.globalgraphics.pgb +image/vnd.microsoft.icon +image/vnd.mix +image/vnd.ms-modi mdi +image/vnd.net-fpx npx +image/vnd.radiance +image/vnd.sealed.png +image/vnd.sealedmedia.softseal.gif +image/vnd.sealedmedia.softseal.jpg +image/vnd.svf +image/vnd.wap.wbmp wbmp +image/vnd.xiff xif +image/x-cmu-raster ras +image/x-cmx cmx +image/x-coreldraw cdr +image/x-coreldrawpattern pat +image/x-coreldrawtemplate cdt +image/x-corelphotopaint cpt +image/x-freehand fh fh4 fh5 fh7 fhc +image/x-icon ico +image/x-jg art +image/x-jng jng +image/x-ms-bmp bmp +image/x-pcx pcx +image/x-photoshop psd +image/x-pict pct pic +image/x-portable-anymap pnm +image/x-portable-bitmap pbm +image/x-portable-graymap pgm +image/x-portable-pixmap ppm +image/x-rgb rgb +image/x-xbitmap xbm +image/x-xpixmap xpm +image/x-xwindowdump xwd +message/cpim +message/delivery-status +message/disposition-notification +message/example +message/external-body +message/global +message/global-delivery-status +message/global-disposition-notification +message/global-headers +message/http +message/imdn+xml +message/news +message/partial +message/rfc822 eml mime +message/s-http +message/sip +message/sipfrag +message/tracking-status +message/vnd.si.simp +model/example +model/iges iges igs +model/mesh mesh msh silo +model/vnd.dwf dwf +model/vnd.flatland.3dml +model/vnd.gdl gdl +model/vnd.gs-gdl +model/vnd.gs.gdl +model/vnd.gtw gtw +model/vnd.moml+xml +model/vnd.mts mts +model/vnd.parasolid.transmit.binary +model/vnd.parasolid.transmit.text +model/vnd.vtu vtu +model/vrml vrml wrl +multipart/alternative +multipart/appledouble +multipart/byteranges +multipart/digest +multipart/encrypted +multipart/example +multipart/form-data +multipart/header-set +multipart/mixed +multipart/parallel +multipart/related +multipart/report +multipart/signed +multipart/voice-message +text/calendar ics icz ifb +text/comma-separated-values csv +text/css css +text/csv csv +text/directory +text/dns +text/ecmascript +text/enriched +text/example +text/h323 323 +text/html htm html shtml +text/iuls uls +text/javascript +text/mathml mml +text/parityfec +text/plain asc conf def diff in list log pot text txt +text/prs.fallenstein.rst +text/prs.lines.tag dsc +text/red +text/rfc822-headers +text/richtext rtx +text/rtf rtf +text/rtp-enc-aescm128 +text/rtx +text/scriptlet sct wsc +text/sgml sgm sgml +text/t140 +text/tab-separated-values tsv +text/texmacs tm ts +text/troff man me ms roff t tr +text/ulpfec +text/uri-list uri uris urls +text/vnd.abc +text/vnd.curl curl +text/vnd.curl.dcurl dcurl +text/vnd.curl.mcurl mcurl +text/vnd.curl.scurl scurl +text/vnd.dmclientscript +text/vnd.esmertec.theme-descriptor +text/vnd.fly fly +text/vnd.fmi.flexstor flx +text/vnd.graphviz gv +text/vnd.in3d.3dml 3dml +text/vnd.in3d.spot spot +text/vnd.iptc.newsml +text/vnd.iptc.nitf +text/vnd.latex-z +text/vnd.motorola.reflex +text/vnd.ms-mediapackage +text/vnd.net2phone.commcenter.command +text/vnd.si.uricatalogue +text/vnd.sun.j2me.app-descriptor jad +text/vnd.trolltech.linguist +text/vnd.wap.si +text/vnd.wap.sl +text/vnd.wap.wml wml +text/vnd.wap.wmlscript wmls +text/x-asm asm s +text/x-bibtex bib +text/x-c c cc cpp cxx dic h hh +text/x-c++hdr h++ hh hpp hxx +text/x-c++src c++ cc cpp cxx +text/x-chdr h +text/x-csh csh +text/x-csrc c +text/x-fortran f f77 f90 for +text/x-haskell hs +text/x-java java +text/x-java-source java +text/x-literate-haskell lhs +text/x-moc moc +text/x-pascal p pas +text/x-pcs-gcd gcd +text/x-perl pl pm +text/x-psp psp +text/x-python py +text/x-setext etx +text/x-sh sh +text/x-tcl tcl tk +text/x-tex cls ltx sty tex +text/x-uuencode uu +text/x-vcalendar vcs +text/x-vcard vcf +text/xml +text/xml-external-parsed-entity +video/3gpp 3gp +video/3gpp-tt +video/3gpp2 3g2 +video/bmpeg +video/bt656 +video/celb +video/dl dl +video/dv dif dv +video/example +video/fli fli +video/gl gl +video/h261 h261 +video/h263 h263 +video/h263-1998 +video/h263-2000 +video/h264 h264 +video/jpeg jpgv +video/jpeg2000 +video/jpm jpgm jpm +video/mj2 mj2 mjp2 +video/mp1s +video/mp2p +video/mp2t +video/mp4 mp4 mp4v mpg4 +video/mp4v-es +video/mpeg m1v m2v mpe mpeg mpg +video/mpeg4-generic +video/mpv +video/nv +video/ogg ogv +video/parityfec +video/pointer +video/quicktime mov qt +video/raw +video/rtp-enc-aescm128 +video/rtx +video/smpte292m +video/ulpfec +video/vc1 +video/vnd.cctv +video/vnd.dlna.mpeg-tts +video/vnd.fvt fvt +video/vnd.hns.video +video/vnd.iptvforum.1dparityfec-1010 +video/vnd.iptvforum.1dparityfec-2005 +video/vnd.iptvforum.2dparityfec-1010 +video/vnd.iptvforum.2dparityfec-2005 +video/vnd.iptvforum.ttsavc +video/vnd.iptvforum.ttsmpeg2 +video/vnd.motorola.video +video/vnd.motorola.videop +video/vnd.mpegurl m4u mxu +video/vnd.ms-playready.media.pyv pyv +video/vnd.nokia.interleaved-multimedia +video/vnd.nokia.videovoip +video/vnd.objectvideo +video/vnd.sealed.mpeg1 +video/vnd.sealed.mpeg4 +video/vnd.sealed.swf +video/vnd.sealedmedia.softseal.mov +video/vnd.vivo viv +video/x-f4v f4v +video/x-fli fli +video/x-flv flv +video/x-la-asf lsf lsx +video/x-m4v m4v +video/x-mng mng +video/x-ms-asf asf asx +video/x-ms-wm wm +video/x-ms-wmv wmv +video/x-ms-wmx wmx +video/x-ms-wvx wvx +video/x-msvideo avi +video/x-sgi-movie movie +x-conference/x-cooltalk ice +x-world/x-vrml vrm vrml wrl + + + +## calibre specific mime types + +text/fb2+xml fb2 +text/x-sony-bbeb+xml lrs +application/x-sony-bbeb lrf lrx +application/adobe-page-template+xml xpgt +application/x-font-opentype otf +application/x-font-truetype ttf +application/x-mobipocket-ebook mobi prc azw +application/x-cbz cbz +application/x-cbr cbr +application/x-cb7 cb7 +application/x-koboreader-ebook kobo +image/wmf wmf diff --git a/src/calibre/__init__.py b/src/calibre/__init__.py index 688d7793a4..096a02854f 100644 --- a/src/calibre/__init__.py +++ b/src/calibre/__init__.py @@ -3,7 +3,7 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal <kovid@kovidgoyal.net>' __docformat__ = 'restructuredtext en' -import uuid, sys, os, re, logging, time, mimetypes, \ +import uuid, sys, os, re, logging, time, \ __builtin__, warnings, multiprocessing from urllib import getproxies __builtin__.__dict__['dynamic_property'] = lambda(func): func(None) @@ -19,43 +19,16 @@ from calibre.constants import iswindows, isosx, islinux, isfreebsd, isfrozen, \ __appname__, __version__, __author__, \ win32event, win32api, winerror, fcntl, \ filesystem_encoding, plugins, config_dir -from calibre.startup import winutil, winutilerror +from calibre.startup import winutil, winutilerror, guess_type uuid.uuid4() # Imported before PyQt4 to workaround PyQt4 util-linux conflict on gentoo if False: + # Prevent pyflakes from complaining winutil, winutilerror, __appname__, islinux, __version__ fcntl, win32event, isfrozen, __author__, terminal_controller - winerror, win32api, isfreebsd + winerror, win32api, isfreebsd, guess_type -mimetypes.add_type('application/epub+zip', '.epub') -mimetypes.add_type('text/x-sony-bbeb+xml', '.lrs') -mimetypes.add_type('application/xhtml+xml', '.xhtml') -mimetypes.add_type('image/svg+xml', '.svg') -mimetypes.add_type('text/fb2+xml', '.fb2') -mimetypes.add_type('application/x-sony-bbeb', '.lrf') -mimetypes.add_type('application/x-sony-bbeb', '.lrx') -mimetypes.add_type('application/x-dtbncx+xml', '.ncx') -mimetypes.add_type('application/adobe-page-template+xml', '.xpgt') -mimetypes.add_type('application/x-font-opentype', '.otf') -mimetypes.add_type('application/x-font-truetype', '.ttf') -mimetypes.add_type('application/oebps-package+xml', '.opf') -mimetypes.add_type('application/vnd.palm', '.pdb') -mimetypes.add_type('application/x-mobipocket-ebook', '.mobi') -mimetypes.add_type('application/x-mobipocket-ebook', '.prc') -mimetypes.add_type('application/x-mobipocket-ebook', '.azw') -mimetypes.add_type('application/x-cbz', '.cbz') -mimetypes.add_type('application/x-cbr', '.cbr') -mimetypes.add_type('application/x-koboreader-ebook', '.kobo') -mimetypes.add_type('image/wmf', '.wmf') -mimetypes.add_type('image/jpeg', '.jpg') -mimetypes.add_type('image/jpeg', '.jpeg') -mimetypes.add_type('image/png', '.png') -mimetypes.add_type('image/gif', '.gif') -mimetypes.add_type('image/bmp', '.bmp') -mimetypes.add_type('image/svg+xml', '.svg') - -guess_type = mimetypes.guess_type import cssutils cssutils.log.setLevel(logging.WARN) diff --git a/src/calibre/startup.py b/src/calibre/startup.py index e74660d0bc..9c9c7651b7 100644 --- a/src/calibre/startup.py +++ b/src/calibre/startup.py @@ -199,6 +199,11 @@ if not _run_once: __builtin__.__dict__['lopen'] = local_open + + import mimetypes + mimetypes.init([P('mime.types')]) + guess_type = mimetypes.guess_type + def test_lopen(): from calibre.ptempfile import TemporaryDirectory from calibre import CurrentDir From 788138cd97cf4cc44f33748e377311e183e581b5 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Tue, 30 Nov 2010 14:40:31 -0700 Subject: [PATCH 209/375] ... --- setup/installer/linux/freeze2.py | 2 ++ src/calibre/__init__.py | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/setup/installer/linux/freeze2.py b/setup/installer/linux/freeze2.py index 0379c0d839..684b33b80d 100644 --- a/setup/installer/linux/freeze2.py +++ b/setup/installer/linux/freeze2.py @@ -340,6 +340,8 @@ class LinuxFreeze(Command): __builtin__.help = _Helper() def set_qt_plugin_path(): + import uuid + uuid.uuid4() # Workaround for libuuid/PyQt conflict from PyQt4.Qt import QCoreApplication paths = list(map(unicode, QCoreApplication.libraryPaths())) paths.insert(0, sys.frozen_path + '/lib/qt_plugins') diff --git a/src/calibre/__init__.py b/src/calibre/__init__.py index 096a02854f..a8cbe87e3e 100644 --- a/src/calibre/__init__.py +++ b/src/calibre/__init__.py @@ -21,7 +21,9 @@ from calibre.constants import iswindows, isosx, islinux, isfreebsd, isfrozen, \ filesystem_encoding, plugins, config_dir from calibre.startup import winutil, winutilerror, guess_type -uuid.uuid4() # Imported before PyQt4 to workaround PyQt4 util-linux conflict on gentoo +if islinux and not getattr(sys, 'frozen', False): + # Imported before PyQt4 to workaround PyQt4 util-linux conflict on gentoo + uuid.uuid4() if False: # Prevent pyflakes from complaining From 065edc6a1f8680f2c7bc5f2c851cd4a1a1fbfff4 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Tue, 30 Nov 2010 15:38:40 -0700 Subject: [PATCH 210/375] Fix #7751 (Does not detect after 2.2 upgrade on Android) --- src/calibre/devices/android/driver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/devices/android/driver.py b/src/calibre/devices/android/driver.py index 2d944c8519..811acbe55b 100644 --- a/src/calibre/devices/android/driver.py +++ b/src/calibre/devices/android/driver.py @@ -19,7 +19,7 @@ class ANDROID(USBMS): VENDOR_ID = { # HTC - 0x0bb4 : { 0x0c02 : [0x100, 0x0227], 0x0c01 : [0x100, 0x0227], 0x0ff9 + 0x0bb4 : { 0x0c02 : [0x100, 0x0227, 0x0226], 0x0c01 : [0x100, 0x0227], 0x0ff9 : [0x0100, 0x0227, 0x0226], 0x0c87: [0x0100, 0x0227, 0x0226], 0xc92 : [0x100]}, From a4649e5e31cd5da2421b6d6184da53adbd7c8d23 Mon Sep 17 00:00:00 2001 From: GRiker <griker@hotmail.com> Date: Tue, 30 Nov 2010 15:42:40 -0700 Subject: [PATCH 211/375] GwR fixes for read tag code --- src/calibre/gui2/catalog/catalog_epub_mobi.py | 1 - src/calibre/library/catalog.py | 10 +--------- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/src/calibre/gui2/catalog/catalog_epub_mobi.py b/src/calibre/gui2/catalog/catalog_epub_mobi.py index 7ac6010896..4a330900b1 100644 --- a/src/calibre/gui2/catalog/catalog_epub_mobi.py +++ b/src/calibre/gui2/catalog/catalog_epub_mobi.py @@ -82,7 +82,6 @@ class PluginWidget(QWidget,Ui_Form): elif opt[0] in ['read_source_field_cb']: # Look for last-stored combo box value index = self.read_source_field_cb.findText(opt_value) - print "last index: %d" % index if index == -1: index = self.read_source_field_cb.findText('Tag') self.read_source_field_cb.setCurrentIndex(index) diff --git a/src/calibre/library/catalog.py b/src/calibre/library/catalog.py index b7dbd3c35f..631e635937 100644 --- a/src/calibre/library/catalog.py +++ b/src/calibre/library/catalog.py @@ -2676,14 +2676,7 @@ class EPUB_MOBI(CatalogPlugin): pBookTag = Tag(soup, "p") ptc = 0 - # THIS SHOULDN'T BE NECESSARY - # book with read/reading/unread symbol -# for tag in book['tags']: -# if tag == self.opts.read_tag: -# book['read'] = True -# break -# else: -# book['read'] = False + book['read'] = self.discoverReadStatus(book) # book with read|reading|unread symbol or wishlist item if self.opts.wishlist_tag in book.get('tags', []): @@ -4552,7 +4545,6 @@ class EPUB_MOBI(CatalogPlugin): markerTags = [] markerTags.extend(self.opts.exclude_tags.split(',')) markerTags.extend(self.opts.note_tag.split(',')) - markerTags.extend(self.opts.read_tag.split(',')) return markerTags def letter_or_symbol(self,char): From acac5a479b925bc8b981b42e395b8fa9279517b0 Mon Sep 17 00:00:00 2001 From: John Schember <john@nachtimwald.com> Date: Tue, 30 Nov 2010 18:27:09 -0500 Subject: [PATCH 212/375] Implement bug #7738: FB2 Output option to create section per HTML file. Implement FB2 options to wrap h1-3 tags with title elments. --- src/calibre/ebooks/fb2/fb2ml.py | 14 +++++++++++- src/calibre/ebooks/fb2/output.py | 14 ++++++++++++ src/calibre/gui2/convert/fb2_output.py | 4 +++- src/calibre/gui2/convert/fb2_output.ui | 30 +++++++++++++++++++++++++- 4 files changed, 59 insertions(+), 3 deletions(-) diff --git a/src/calibre/ebooks/fb2/fb2ml.py b/src/calibre/ebooks/fb2/fb2ml.py index 3987ffa1b8..2a9a92612e 100644 --- a/src/calibre/ebooks/fb2/fb2ml.py +++ b/src/calibre/ebooks/fb2/fb2ml.py @@ -91,6 +91,10 @@ class FB2MLizer(object): return u'<?xml version="1.0" encoding="UTF-8"?>\n%s' % etree.tostring(etree.fromstring(output), encoding=unicode, pretty_print=True) def clean_text(self, text): + text = re.sub(r'(?miu)<section>\s*</section>', '', text) + text = re.sub(r'(?miu)\s+</section>', '</section>', text) + text = re.sub(r'(?miu)</section><section>', '</section>\n\n<section>', text) + text = re.sub(r'(?miu)<p>\s*</p>', '', text) text = re.sub(r'(?miu)\s+</p>', '</p>', text) text = re.sub(r'(?miu)</p><p>', '</p>\n\n<p>', text) @@ -166,11 +170,15 @@ class FB2MLizer(object): def get_text(self): text = [] - for item in self.oeb_book.spine: + for i, item in enumerate(self.oeb_book.spine): + if self.opts.sectionize_chapters_using_file_structure and i is not 0: + text.append('<section>') self.log.debug('Converting %s to FictionBook2 XML' % item.href) stylizer = Stylizer(item.data, item.href, self.oeb_book, self.opts, self.opts.output_profile) text.append(self.add_page_anchor(item)) text += self.dump_text(item.data.find(XHTML('body')), stylizer, item) + if self.opts.sectionize_chapters_using_file_structure and i is not len(self.oeb_book.spine) - 1: + text.append('</section>') return ''.join(text) def fb2_body_footer(self): @@ -258,6 +266,10 @@ class FB2MLizer(object): if id_name: fb2_text.append(self.get_anchor(page, id_name)) + if tag == 'h1' and self.opts.h1_to_title or tag == 'h2' and self.opts.h2_to_title or tag == 'h3' and self.opts.h3_to_title: + fb2_text.append('<title>') + tags.append('title') + fb2_tag = TAG_MAP.get(tag, None) if fb2_tag == 'p': if 'p' in tag_stack+tags: diff --git a/src/calibre/ebooks/fb2/output.py b/src/calibre/ebooks/fb2/output.py index d6c7a25a90..bacaf0da91 100644 --- a/src/calibre/ebooks/fb2/output.py +++ b/src/calibre/ebooks/fb2/output.py @@ -25,6 +25,20 @@ class FB2Output(OutputFormatPlugin): 'WARNING: ' \ 'This option is experimental. It can cause conversion ' \ 'to fail. It can also produce unexpected output.')), + OptionRecommendation(name='sectionize_chapters_using_file_structure', + recommended_value=False, level=OptionRecommendation.LOW, + help=_('Try to turn chapters into individual sections using the ' \ + 'internal structure of the ebook. This works well for EPUB ' \ + 'books that have been internally split by chapter.')), + OptionRecommendation(name='h1_to_title', + recommended_value=False, level=OptionRecommendation.LOW, + help=_('Wrap all h1 tags with fb2 title elements.')), + OptionRecommendation(name='h2_to_title', + recommended_value=False, level=OptionRecommendation.LOW, + help=_('Wrap all h2 tags with fb2 title elements.')), + OptionRecommendation(name='h3_to_title', + recommended_value=False, level=OptionRecommendation.LOW, + help=_('Wrap all h3 tags with fb2 title elements.')), ]) def convert(self, oeb_book, output_path, input_plugin, opts, log): diff --git a/src/calibre/gui2/convert/fb2_output.py b/src/calibre/gui2/convert/fb2_output.py index a3cbe0e647..5d927146a5 100644 --- a/src/calibre/gui2/convert/fb2_output.py +++ b/src/calibre/gui2/convert/fb2_output.py @@ -17,6 +17,8 @@ class PluginWidget(Widget, Ui_Form): ICON = I('mimetypes/fb2.png') def __init__(self, parent, get_option, get_help, db=None, book_id=None): - Widget.__init__(self, parent, ['inline_toc', 'sectionize_chapters']) + Widget.__init__(self, parent, ['inline_toc', 'sectionize_chapters', + 'sectionize_chapters_using_file_structure', 'h1_to_title', + 'h2_to_title', 'h3_to_title']) self.db, self.book_id = db, book_id self.initialize_options(get_option, get_help, db, book_id) diff --git a/src/calibre/gui2/convert/fb2_output.ui b/src/calibre/gui2/convert/fb2_output.ui index a43a8b72ea..a90ecd615e 100644 --- a/src/calibre/gui2/convert/fb2_output.ui +++ b/src/calibre/gui2/convert/fb2_output.ui @@ -14,7 +14,7 @@ <string>Form</string> </property> <layout class="QGridLayout" name="gridLayout"> - <item row="2" column="0"> + <item row="6" column="0"> <spacer name="verticalSpacer"> <property name="orientation"> <enum>Qt::Vertical</enum> @@ -41,6 +41,34 @@ </property> </widget> </item> + <item row="2" column="0"> + <widget class="QCheckBox" name="opt_sectionize_chapters_using_file_structure"> + <property name="text"> + <string>Sectionize Chapters using file structure</string> + </property> + </widget> + </item> + <item row="3" column="0"> + <widget class="QCheckBox" name="opt_h1_to_title"> + <property name="text"> + <string>Wrap h1 tags with <title> elements</string> + </property> + </widget> + </item> + <item row="4" column="0"> + <widget class="QCheckBox" name="opt_h2_to_title"> + <property name="text"> + <string>Wrap h2 tags with <title> elements</string> + </property> + </widget> + </item> + <item row="5" column="0"> + <widget class="QCheckBox" name="opt_h3_to_title"> + <property name="text"> + <string>Wrap h3 tags with <title> elements</string> + </property> + </widget> + </item> </layout> </widget> <resources/> From 37cde21c6d96b9b385f85d543227b0b3806db879 Mon Sep 17 00:00:00 2001 From: John Schember <john@nachtimwald.com> Date: Tue, 30 Nov 2010 18:48:21 -0500 Subject: [PATCH 213/375] Fix bug #7745: PML output should ignore external links as it is not support by the spec. Fix part of bug #7742: PML output extra % sign. --- src/calibre/ebooks/pml/pmlml.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/calibre/ebooks/pml/pmlml.py b/src/calibre/ebooks/pml/pmlml.py index 560a132ce1..f97f74f4a0 100644 --- a/src/calibre/ebooks/pml/pmlml.py +++ b/src/calibre/ebooks/pml/pmlml.py @@ -216,7 +216,7 @@ class PMLMLizer(object): w = '\\w' width = elem.get('width') if width: - w += '="%s%%"' % width + w += '="%s"' % width else: w += '="50%"' text.append(w) @@ -252,8 +252,8 @@ class PMLMLizer(object): if href not in self.link_hrefs.keys(): self.link_hrefs[href] = 'calibre_link-%s' % len(self.link_hrefs.keys()) href = '#%s' % self.link_hrefs[href] - text.append('\\q="%s"' % href) - tags.append('q') + text.append('\\q="%s"' % href) + tags.append('q') # Anchor ids id_name = elem.get('id') From c38eb08018ca9eb404247de0ccc84bf73196ed20 Mon Sep 17 00:00:00 2001 From: John Schember <john@nachtimwald.com> Date: Tue, 30 Nov 2010 19:04:26 -0500 Subject: [PATCH 214/375] PML Output: ensure \w always ends with a %. --- src/calibre/ebooks/pml/pmlml.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/calibre/ebooks/pml/pmlml.py b/src/calibre/ebooks/pml/pmlml.py index f97f74f4a0..ceb7f36124 100644 --- a/src/calibre/ebooks/pml/pmlml.py +++ b/src/calibre/ebooks/pml/pmlml.py @@ -216,6 +216,8 @@ class PMLMLizer(object): w = '\\w' width = elem.get('width') if width: + if not width.endswith('%'): + width += '%' w += '="%s"' % width else: w += '="50%"' From fa0799597d686a4e870bf0a6d76a9addb8114756 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Tue, 30 Nov 2010 18:35:14 -0700 Subject: [PATCH 215/375] Fix #7746 (Converting prc->epub: names of streets and lakes) --- src/calibre/ebooks/mobi/reader.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/calibre/ebooks/mobi/reader.py b/src/calibre/ebooks/mobi/reader.py index f80d15359c..48ece79f45 100644 --- a/src/calibre/ebooks/mobi/reader.py +++ b/src/calibre/ebooks/mobi/reader.py @@ -504,6 +504,9 @@ class MobiReader(object): 'x-large': '5', 'xx-large': '6', } + def barename(x): + return x.rpartition(':')[-1] + mobi_version = self.book_header.mobi_version for x in root.xpath('//ncx'): x.getparent().remove(x) @@ -512,8 +515,9 @@ class MobiReader(object): for x in tag.attrib: if ':' in x: del tag.attrib[x] - if tag.tag in ('country-region', 'place', 'placetype', 'placename', - 'state', 'city', 'street', 'address', 'content', 'form'): + if tag.tag and barename(tag.tag.lower()) in \ + ('country-region', 'place', 'placetype', 'placename', + 'state', 'city', 'street', 'address', 'content', 'form'): tag.tag = 'div' if tag.tag in ('content', 'form') else 'span' for key in tag.attrib.keys(): tag.attrib.pop(key) From 983da070950ca74aab2d9f05cda3b4143cd66322 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Tue, 30 Nov 2010 18:37:34 -0700 Subject: [PATCH 216/375] Fix #7753 (setPlaceholderText not found) --- src/calibre/gui2/search_box.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py index 4d598a3bbb..94c9bbe33d 100644 --- a/src/calibre/gui2/search_box.py +++ b/src/calibre/gui2/search_box.py @@ -236,7 +236,11 @@ class SavedSearchBox(QComboBox): def initialize(self, _search_box, colorize=False, help_text=_('Search')): self.search_box = _search_box - self.line_edit.setPlaceholderText(help_text) + try: + self.line_edit.setPlaceholderText(help_text) + except: + # Using Qt < 4.7 + pass self.colorize = colorize self.clear() From ba831d21e38f0d0bad7ff0f791126d95ec2c417a Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Tue, 30 Nov 2010 19:03:01 -0700 Subject: [PATCH 217/375] Search box: Remove select all on focus event as focus events are fired when completion fails/succeeds. Instead select all only when search box is focussed via the keyboard shortcut --- src/calibre/gui2/search_box.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py index 94c9bbe33d..dabd88ff9f 100644 --- a/src/calibre/gui2/search_box.py +++ b/src/calibre/gui2/search_box.py @@ -28,10 +28,6 @@ class SearchLineEdit(QLineEdit): QLineEdit.mouseReleaseEvent(self, event) QLineEdit.selectAll(self) - def focusInEvent(self, event): - QLineEdit.focusInEvent(self, event) - QLineEdit.selectAll(self) - def dropEvent(self, ev): self.parent().normalize_state() return QLineEdit.dropEvent(self, ev) @@ -334,14 +330,17 @@ class SearchBoxMixin(object): shortcuts = QKeySequence.keyBindings(QKeySequence.Find) shortcuts = list(shortcuts) + [QKeySequence('/'), QKeySequence('Alt+S')] self.action_focus_search.setShortcuts(shortcuts) - self.action_focus_search.triggered.connect(lambda x: - self.search.setFocus(Qt.OtherFocusReason)) + self.action_focus_search.triggered.connect(self.focus_search_box) self.addAction(self.action_focus_search) self.search.setStatusTip(re.sub(r'<\w+>', ' ', unicode(self.search.toolTip()))) self.advanced_search_button.setStatusTip(self.advanced_search_button.toolTip()) self.clear_button.setStatusTip(self.clear_button.toolTip()) + def focus_search_box(self, *args): + self.search.setFocus(Qt.OtherFocusReason) + self.search.lineEdit().selectAll() + def search_box_cleared(self): self.tags_view.clear() self.saved_search.clear() From 4ab34dff95f00ce8d76af0873975e8648a4fc3bf Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Tue, 30 Nov 2010 19:12:24 -0700 Subject: [PATCH 218/375] Fix #7749 (Book details panel does not always display correct selected book) --- src/calibre/gui2/book_details.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/calibre/gui2/book_details.py b/src/calibre/gui2/book_details.py index 4ffc8da650..b101d4c44f 100644 --- a/src/calibre/gui2/book_details.py +++ b/src/calibre/gui2/book_details.py @@ -208,8 +208,9 @@ class BookInfo(QWebView): rows = u'\n'.join([u'<tr><td valign="top"><b>%s:</b></td><td valign="top">%s</td></tr>'%(k,t) for k, t in rows]) comments = data.get(_('Comments'), '') - if comments and comments != u'None': - self.renderer.queue.put((rows, comments)) + if not comments or comments == u'None': + comments = '' + self.renderer.queue.put((rows, comments)) self._show_data(rows, '') From c63425f0b030811981b89ce1185b84588ec5176e Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Tue, 30 Nov 2010 19:43:16 -0700 Subject: [PATCH 219/375] Fix #7686 (Updated recipes for Newswek Polska and Polityka, new recipes for Esensja, Histmag and Wprost) --- resources/recipes/esenja.recipe | 87 ++++++++++++++++++++++ resources/recipes/histmag.recipe | 59 +++++++++++++++ resources/recipes/newsweek_polska.recipe | 53 ++++++++++---- resources/recipes/polityka.recipe | 7 +- resources/recipes/wprost.recipe | 91 ++++++++++++++++++++++++ 5 files changed, 278 insertions(+), 19 deletions(-) create mode 100644 resources/recipes/esenja.recipe create mode 100644 resources/recipes/histmag.recipe create mode 100644 resources/recipes/wprost.recipe diff --git a/resources/recipes/esenja.recipe b/resources/recipes/esenja.recipe new file mode 100644 index 0000000000..b8b94ad66e --- /dev/null +++ b/resources/recipes/esenja.recipe @@ -0,0 +1,87 @@ +#!/usr/bin/env python + +__license__ = 'GPL v3' +__copyright__ = '2010, matek09, matek09@gmail.com' + +from calibre.web.feeds.news import BasicNewsRecipe +import re + +class Esensja(BasicNewsRecipe): + + title = u'Esensja' + __author__ = 'matek09' + description = 'Monthly magazine' + encoding = 'utf-8' + no_stylesheets = True + language = 'pl' + remove_javascript = True + HREF = '0' + + #keep_only_tags =[] + #keep_only_tags.append(dict(name = 'div', attrs = {'class' : 'article'}) + remove_tags_before = dict(dict(name = 'div', attrs = {'class' : 't-title'})) + remove_tags_after = dict(dict(name = 'img', attrs = {'src' : '../../../2000/01/img/tab_bot.gif'})) + + remove_tags =[] + remove_tags.append(dict(name = 'img', attrs = {'src' : '../../../2000/01/img/tab_top.gif'})) + remove_tags.append(dict(name = 'img', attrs = {'src' : '../../../2000/01/img/tab_bot.gif'})) + remove_tags.append(dict(name = 'div', attrs = {'class' : 't-title2 nextpage'})) + + extra_css = ''' + .t-title {font-size: x-large; font-weight: bold; text-align: left} + .t-author {font-size: x-small; text-align: left} + .t-title2 {font-size: x-small; font-style: italic; text-align: left} + .text {font-size: small; text-align: left} + .annot-ref {font-style: italic; text-align: left} + ''' + + preprocess_regexps = [(re.compile(r'alt="[^"]*"'), + lambda match: '')] + + def parse_index(self): + soup = self.index_to_soup('http://www.esensja.pl/magazyn/') + a = soup.find('a', attrs={'href' : re.compile('.*/index.html')}) + year = a['href'].split('/')[0] + month = a['href'].split('/')[1] + self.HREF = 'http://www.esensja.pl/magazyn/' + year + '/' + month + '/iso/' + soup = self.index_to_soup(self.HREF + '01.html') + self.cover_url = 'http://www.esensja.pl/magazyn/' + year + '/' + month + '/img/ilustr/cover_b.jpg' + feeds = [] + intro = soup.find('div', attrs={'class' : 'n-title'}) + introduction = {'title' : self.tag_to_string(intro.a), + 'url' : self.HREF + intro.a['href'], + 'date' : '', + 'description' : ''} + chapter = 'Wprowadzenie' + subchapter = '' + articles = [] + articles.append(introduction) + for tag in intro.findAllNext(attrs={'class': ['chapter', 'subchapter', 'n-title']}): + if tag.name in 'td': + if len(articles) > 0: + section = chapter + if len(subchapter) > 0: + section += ' - ' + subchapter + feeds.append((section, articles)) + articles = [] + if tag['class'] == 'chapter': + chapter = self.tag_to_string(tag).capitalize() + subchapter = '' + else: + subchapter = self.tag_to_string(tag) + subchapter = self.tag_to_string(tag) + continue + articles.append({'title' : self.tag_to_string(tag.a), 'url' : self.HREF + tag.a['href'], 'date' : '', 'description' : ''}) + + a = self.index_to_soup(self.HREF + tag.a['href']) + i = 1 + while True: + div = a.find('div', attrs={'class' : 't-title2 nextpage'}) + if div is not None: + a = self.index_to_soup(self.HREF + div.a['href']) + articles.append({'title' : self.tag_to_string(tag.a) + ' c. d. ' + str(i), 'url' : self.HREF + div.a['href'], 'date' : '', 'description' : ''}) + i = i + 1 + else: + break + + return feeds diff --git a/resources/recipes/histmag.recipe b/resources/recipes/histmag.recipe new file mode 100644 index 0000000000..38956e7995 --- /dev/null +++ b/resources/recipes/histmag.recipe @@ -0,0 +1,59 @@ +#!/usr/bin/env python + +__license__ = 'GPL v3' +__copyright__ = '2010, matek09, matek09@gmail.com' + +from calibre.web.feeds.news import BasicNewsRecipe +import re + +class Histmag(BasicNewsRecipe): + + title = u'Histmag' + __author__ = 'matek09' + description = u"Artykuly historyczne i publicystyczne" + encoding = 'utf-8' + no_stylesheets = True + language = 'pl' + remove_javascript = True + #max_articles_per_feed = 1 + remove_tags_before = dict(dict(name = 'div', attrs = {'id' : 'article'})) + remove_tags_after = dict(dict(name = 'h2', attrs = {'class' : 'komentarze'})) + #keep_only_tags =[] + #keep_only_tags.append(dict(name = 'h2')) + #keep_only_tags.append(dict(name = 'p')) + + remove_tags =[] + remove_tags.append(dict(name = 'p', attrs = {'class' : 'podpis'})) + remove_tags.append(dict(name = 'h2', attrs = {'class' : 'komentarze'})) + remove_tags.append(dict(name = 'img', attrs = {'src' : 'style/buttons/wesprzyjnas-1.jpg'})) + + preprocess_regexps = [(re.compile(r'</span>'), lambda match: '</span><br><br>'), + (re.compile(r'<span>'), lambda match: '<br><br><span>')] + extra_css = ''' + .left {font-size: x-small} + .right {font-size: x-small} + ''' + + def find_articles(self, soup): + articles = [] + for div in soup.findAll('div', attrs={'class' : 'text'}): + articles.append({ + 'title' : self.tag_to_string(div.h3.a), + 'url' : 'http://www.histmag.org/' + div.h3.a['href'], + 'date' : self.tag_to_string(div.next('p')).split('|')[0], + 'description' : self.tag_to_string(div.next('p', podpis=False)), + }) + return articles + + def parse_index(self): + soup = self.index_to_soup('http://histmag.org/?arc=4&dx=0') + feeds = [] + feeds.append((u"Artykuly historyczne", self.find_articles(soup))) + soup = self.index_to_soup('http://histmag.org/?arc=5&dx=0') + feeds.append((u"Artykuly publicystyczne", self.find_articles(soup))) + soup = self.index_to_soup('http://histmag.org/?arc=1&dx=0') + feeds.append((u"Wydarzenia", self.find_articles(soup))) + + return feeds + + diff --git a/resources/recipes/newsweek_polska.recipe b/resources/recipes/newsweek_polska.recipe index 31dd8ccddd..4227a88026 100644 --- a/resources/recipes/newsweek_polska.recipe +++ b/resources/recipes/newsweek_polska.recipe @@ -1,19 +1,22 @@ #!/usr/bin/env python __license__ = 'GPL v3' -__copyright__ = '2010, Mateusz Kielar, matek09@gmail.com' +__copyright__ = '2010, matek09, matek09@gmail.com' from calibre.web.feeds.news import BasicNewsRecipe class Newsweek(BasicNewsRecipe): - EDITION = 0 + FIND_LAST_FULL_ISSUE = True + EDITION = '0' + EXCLUDE_LOCKED = True + LOCKED_ICO = 'http://www.newsweek.pl/bins/media/static/newsweek/img/ico_locked.gif' title = u'Newsweek Polska' - __author__ = 'Mateusz Kielar' + __author__ = 'matek09' description = 'Weekly magazine' encoding = 'utf-8' no_stylesheets = True - language = 'en' + language = 'pl' remove_javascript = True keep_only_tags =[] @@ -33,34 +36,54 @@ class Newsweek(BasicNewsRecipe): def print_version(self, url): return url.replace("http://www.newsweek.pl/artykuly/wydanie/" + str(self.EDITION), "http://www.newsweek.pl/artykuly") + '/print' + def is_locked(self, a): + if a.findNext('img')['src'] == 'http://www.newsweek.pl/bins/media/static/newsweek/img/ico_locked.gif': + return True + else: + return False + + def is_full(self, issue_soup): + if len(issue_soup.findAll('img', attrs={'src' : 'http://www.newsweek.pl/bins/media/static/newsweek/img/ico_locked.gif'})) > 1: + return False + else: + return True + def find_last_full_issue(self): - page = self.index_to_soup('http://www.newsweek.pl/Frames/IssueCover.aspx') - issue = 'http://www.newsweek.pl/Frames/' + page.find(lambda tag: tag.name == 'span' and not tag.attrs).a['href'] - page = self.index_to_soup(issue) - issue = 'http://www.newsweek.pl/Frames/' + page.find(lambda tag: tag.name == 'span' and not tag.attrs).a['href'] - page = self.index_to_soup(issue) - self.EDITION = page.find('a', attrs={'target' : '_parent'})['href'].replace('/wydania/','') + frame_url = 'http://www.newsweek.pl/Frames/IssueCover.aspx' + while True: + frame_soup = self.index_to_soup(frame_url) + self.EDITION = frame_soup.find('a', attrs={'target' : '_parent'})['href'].replace('/wydania/','') + issue_soup = self.index_to_soup('http://www.newsweek.pl/wydania/' + self.EDITION) + if self.is_full(issue_soup): + break + frame_url = 'http://www.newsweek.pl/Frames/' + frame_soup.find(lambda tag: tag.name == 'span' and not tag.attrs).a['href'] + + def parse_index(self): - self.find_last_full_issue() - soup = self.index_to_soup('http://www.newsweek.pl/wydania/' + str(self.EDITION)) + if self.FIND_LAST_FULL_ISSUE: + self.find_last_full_issue() + soup = self.index_to_soup('http://www.newsweek.pl/wydania/' + self.EDITION) img = soup.find('img', id="ctl00_C1_PaperIsssueView_IssueImage", src=True) self.cover_url = img['src'] feeds = [] parent = soup.find(id='content-left-big') for txt in parent.findAll(attrs={'class':'txt_normal_red strong'}): - section = self.tag_to_string(txt).capitalize() articles = list(self.find_articles(txt)) - feeds.append((section, articles)) + if len(articles) > 0: + section = self.tag_to_string(txt).capitalize() + feeds.append((section, articles)) return feeds def find_articles(self, txt): for a in txt.findAllNext( attrs={'class':['strong','hr']}): if a.name in "div": break + if (not self.FIND_LAST_FULL_ISSUE) & self.EXCLUDE_LOCKED & self.is_locked(a): + continue yield { 'title' : self.tag_to_string(a), - 'url' : 'http://www.newsweek.pl'+a['href'], + 'url' : 'http://www.newsweek.pl' + a['href'], 'date' : '', 'description' : '' } diff --git a/resources/recipes/polityka.recipe b/resources/recipes/polityka.recipe index ab31e148aa..16ccae6085 100644 --- a/resources/recipes/polityka.recipe +++ b/resources/recipes/polityka.recipe @@ -1,18 +1,18 @@ #!/usr/bin/env python __license__ = 'GPL v3' -__copyright__ = '2010, Mateusz Kielar, matek09@gmail.com' +__copyright__ = '2010, matek09, matek09@gmail.com' from calibre.web.feeds.news import BasicNewsRecipe class Polityka(BasicNewsRecipe): title = u'Polityka' - __author__ = 'Mateusz Kielar' + __author__ = 'matek09' description = 'Weekly magazine. Last archive issue' encoding = 'utf-8' no_stylesheets = True - language = 'en' + language = 'pl' remove_javascript = True remove_tags_before = dict(dict(name = 'h2', attrs = {'class' : 'box_nag'})) @@ -48,7 +48,6 @@ class Polityka(BasicNewsRecipe): for div in box.findAll('div', attrs={'class': 'list_tresc'}): article_page = self.index_to_soup('http://archiwum.polityka.pl' + div.a['href'],) section = self.tag_to_string(article_page.find('h2', attrs = {'class' : 'box_nag'})).split('/')[0].lstrip().rstrip() - print section if not articles.has_key(section): articles[section] = [] articles[section].append( { diff --git a/resources/recipes/wprost.recipe b/resources/recipes/wprost.recipe new file mode 100644 index 0000000000..b317571981 --- /dev/null +++ b/resources/recipes/wprost.recipe @@ -0,0 +1,91 @@ +#!/usr/bin/env python + +__license__ = 'GPL v3' +__copyright__ = '2010, matek09, matek09@gmail.com' + +from calibre.web.feeds.news import BasicNewsRecipe +import re + +class Wprost(BasicNewsRecipe): + EDITION = 0 + FIND_LAST_FULL_ISSUE = True + EXCLUDE_LOCKED = True + ICO_BLOCKED = 'http://www.wprost.pl/G/icons/ico_blocked.gif' + + title = u'Wprost' + __author__ = 'matek09' + description = 'Weekly magazine' + encoding = 'ISO-8859-2' + no_stylesheets = True + language = 'pl' + remove_javascript = True + + remove_tags_before = dict(dict(name = 'div', attrs = {'id' : 'print-layer'})) + remove_tags_after = dict(dict(name = 'div', attrs = {'id' : 'print-layer'})) + + '''keep_only_tags =[] + keep_only_tags.append(dict(name = 'table', attrs = {'id' : 'title-table'})) + keep_only_tags.append(dict(name = 'div', attrs = {'class' : 'div-header'})) + keep_only_tags.append(dict(name = 'div', attrs = {'class' : 'div-content'})) + keep_only_tags.append(dict(name = 'div', attrs = {'class' : 'def element-autor'}))''' + + preprocess_regexps = [(re.compile(r'style="display: none;"'), lambda match: ''), + (re.compile(r'display: block;'), lambda match: '')] + + + remove_tags =[] + remove_tags.append(dict(name = 'div', attrs = {'class' : 'def element-date'})) + remove_tags.append(dict(name = 'div', attrs = {'class' : 'def silver'})) + remove_tags.append(dict(name = 'div', attrs = {'id' : 'content-main-column-right'})) + + + extra_css = ''' + .div-header {font-size: x-small; font-weight: bold} + ''' +#h2 {font-size: x-large; font-weight: bold} + def is_blocked(self, a): + if a.findNextSibling('img') is None: + return False + else: + return True + + + + def find_last_issue(self): + soup = self.index_to_soup('http://www.wprost.pl/archiwum/') + a = 0 + if self.FIND_LAST_FULL_ISSUE: + ico_blocked = soup.findAll('img', attrs={'src' : self.ICO_BLOCKED}) + a = ico_blocked[-1].findNext('a', attrs={'title' : re.compile('Zobacz spis tre.ci')}) + else: + a = soup.find('a', attrs={'title' : re.compile('Zobacz spis tre.ci')}) + self.EDITION = a['href'].replace('/tygodnik/?I=', '') + self.cover_url = a.img['src'] + + + + def parse_index(self): + self.find_last_issue() + soup = self.index_to_soup('http://www.wprost.pl/tygodnik/?I=' + self.EDITION) + feeds = [] + for main_block in soup.findAll(attrs={'class':'main-block-s3 s3-head head-red3'}): + articles = list(self.find_articles(main_block)) + if len(articles) > 0: + section = self.tag_to_string(main_block) + feeds.append((section, articles)) + return feeds + + def find_articles(self, main_block): + for a in main_block.findAllNext( attrs={'style':['','padding-top: 15px;']}): + if a.name in "td": + break + if self.EXCLUDE_LOCKED & self.is_blocked(a): + continue + yield { + 'title' : self.tag_to_string(a), + 'url' : 'http://www.wprost.pl' + a['href'], + 'date' : '', + 'description' : '' + } + + From aef657b0993aaad9647c13a6970963938e8c8268 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Tue, 30 Nov 2010 19:53:21 -0700 Subject: [PATCH 220/375] Fix #7723 (View Specific Format Does Not Allow More Than One Selection) --- src/calibre/gui2/actions/view.py | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/src/calibre/gui2/actions/view.py b/src/calibre/gui2/actions/view.py index 5f4f7ce428..0a26653771 100644 --- a/src/calibre/gui2/actions/view.py +++ b/src/calibre/gui2/actions/view.py @@ -12,7 +12,7 @@ from PyQt4.Qt import Qt, QMenu from calibre.constants import isosx from calibre.gui2 import error_dialog, Dispatcher, question_dialog, config, \ - open_local_file + open_local_file, info_dialog from calibre.gui2.dialogs.choose_format import ChooseFormatDialog from calibre.utils.config import prefs from calibre.ptempfile import PersistentTemporaryFile @@ -89,18 +89,34 @@ class ViewAction(InterfaceAction): self._launch_viewer(name, viewer, internal) def view_specific_format(self, triggered): - rows = self.gui.library_view.selectionModel().selectedRows() + rows = list(self.gui.library_view.selectionModel().selectedRows()) if not rows or len(rows) == 0: d = error_dialog(self.gui, _('Cannot view'), _('No book selected')) d.exec_() return - row = rows[0].row() - formats = self.gui.library_view.model().db.formats(row).upper().split(',') - d = ChooseFormatDialog(self.gui, _('Choose the format to view'), formats) + db = self.gui.library_view.model().db + rows = [r.row() for r in rows] + formats = [db.formats(row) for row in rows] + formats = [list(f.upper().split(',')) if f else None for f in formats] + all_fmts = set([]) + for x in formats: + for f in x: all_fmts.add(f) + d = ChooseFormatDialog(self.gui, _('Choose the format to view'), + list(sorted(all_fmts))) if d.exec_() == d.Accepted: - format = d.format() - self.view_format(row, format) + fmt = d.format() + orig_num = len(rows) + rows = [rows[i] for i in range(len(rows)) if formats[i] and fmt in + formats[i]] + if self._view_check(len(rows)): + for row in rows: + self.view_format(row, fmt) + if len(rows) < orig_num: + info_dialog(self.gui, _('Format unavailable'), + _('Not all the selected books were available in' + ' the %s format. You should convert' + ' them first.')%fmt, show=True) def _view_check(self, num, max_=3): if num <= max_: From 50b082fa8f9ed5ef14530dc57b0a3a412c5944b4 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Tue, 30 Nov 2010 19:55:24 -0700 Subject: [PATCH 221/375] Fix #7704 (Updated recipe for NIN) --- resources/recipes/nin.recipe | 79 +++++++++++++++++++++++++++++++----- 1 file changed, 69 insertions(+), 10 deletions(-) diff --git a/resources/recipes/nin.recipe b/resources/recipes/nin.recipe index 70fd998a09..27942f7d43 100644 --- a/resources/recipes/nin.recipe +++ b/resources/recipes/nin.recipe @@ -8,12 +8,15 @@ www.nin.co.rs import re from calibre import strftime from calibre.web.feeds.news import BasicNewsRecipe +from contextlib import nested, closing +from calibre.ebooks.BeautifulSoup import BeautifulSoup, NavigableString, CData, Tag +from calibre import entity_to_unicode class Nin(BasicNewsRecipe): title = 'NIN online' __author__ = 'Darko Miletic' description = 'Nedeljne Informativne Novine' - publisher = 'NIN d.o.o.' + publisher = 'NIN d.o.o. - Ringier d.o.o.' category = 'news, politics, Serbia' no_stylesheets = True delay = 1 @@ -26,18 +29,29 @@ class Nin(BasicNewsRecipe): use_embedded_content = False language = 'sr' publication_type = 'magazine' - extra_css = ' @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)} body{font-family: Verdana, Lucida, sans1, sans-serif} .article_description{font-family: Verdana, Lucida, sans1, sans-serif} .artTitle{font-size: x-large; font-weight: bold; color: #900} .izjava{font-size: x-large; font-weight: bold} .columnhead{font-size: small; font-weight: bold;} img{margin-top:0.5em; margin-bottom: 0.7em} b{margin-top: 1em} ' + extra_css = """ + @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)} + body{font-family: Verdana, Lucida, sans1, sans-serif} + .article_description{font-family: Verdana, Lucida, sans1, sans-serif} + .artTitle{font-size: x-large; font-weight: bold; color: #900} + .izjava{font-size: x-large; font-weight: bold} + .columnhead{font-size: small; font-weight: bold;} + img{margin-top:0.5em; margin-bottom: 0.7em; display: block} + b{margin-top: 1em} + """ conversion_options = { - 'comment' : description - , 'tags' : category - , 'publisher' : publisher - , 'language' : language - , 'linearize_tables' : True + 'comment' : description + , 'tags' : category + , 'publisher' : publisher + , 'language' : language } - preprocess_regexps = [(re.compile(u'\u0110'), lambda match: u'\u00D0')] - remove_attributes = ['height','width'] + preprocess_regexps = [ + (re.compile(r'</body>.*?<html>', re.DOTALL|re.IGNORECASE),lambda match: '</body>') + ,(re.compile(r'</html>.*?</html>', re.DOTALL|re.IGNORECASE),lambda match: '</html>') + ,(re.compile(u'\u0110'), lambda match: u'\u00D0') + ] def get_browser(self): br = BasicNewsRecipe.get_browser() @@ -50,7 +64,10 @@ class Nin(BasicNewsRecipe): return br keep_only_tags =[dict(name='td', attrs={'width':'520'})] + remove_tags_before =dict(name='span', attrs={'class':'izjava'}) remove_tags_after =dict(name='html') + remove_tags = [dict(name=['object','link','iframe','meta','base'])] + remove_attributes=['border','background','height','width','align','valign'] def get_cover_url(self): cover_url = None @@ -63,7 +80,7 @@ class Nin(BasicNewsRecipe): def parse_index(self): articles = [] count = 0 - soup = self.index_to_soup(self.PREFIX) + soup = self.index_to_soup(self.INDEX) for item in soup.findAll('a',attrs={'class':'lmeninavFont'}): count = count +1 if self.test and count > 2: @@ -90,3 +107,45 @@ class Nin(BasicNewsRecipe): articles.append((section,inarts)) return articles + def index_to_soup(self, url_or_raw, raw=False): + if re.match(r'\w+://', url_or_raw): + open_func = getattr(self.browser, 'open_novisit', self.browser.open) + with closing(open_func(url_or_raw)) as f: + _raw = f.read() + if not _raw: + raise RuntimeError('Could not fetch index from %s'%url_or_raw) + else: + _raw = url_or_raw + if raw: + return _raw + if not isinstance(_raw, unicode) and self.encoding: + if callable(self.encoding): + _raw = self.encoding(_raw) + else: + _raw = _raw.decode(self.encoding, 'replace') + massage = list(BeautifulSoup.MARKUP_MASSAGE) + enc = 'cp1252' if callable(self.encoding) or self.encoding is None else self.encoding + massage.append((re.compile(r'&(\S+?);'), lambda match: + entity_to_unicode(match, encoding=enc))) + massage.append((re.compile(r'[\x00-\x08]+'), lambda match: + '')) + return BeautifulSoup(_raw, markupMassage=massage) + + def preprocess_html(self, soup): + for item in soup.findAll(style=True): + del item['style'] + for item in soup.findAll('div'): + if len(item.contents) == 0: + item.extract() + for item in soup.findAll(['td','tr']): + item.name='div' + for item in soup.findAll('img'): + if not item.has_key('alt'): + item['alt'] = 'image' + for tbl in soup.findAll('table'): + img = tbl.find('img') + if img: + img.extract() + tbl.replaceWith(img) + return soup + \ No newline at end of file From ab63633295b892cc18b58cc2427c85351b1d4ca2 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Tue, 30 Nov 2010 20:29:54 -0700 Subject: [PATCH 222/375] ABC Australia by Dean Cording --- resources/recipes/abc_au.recipe | 54 +++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 resources/recipes/abc_au.recipe diff --git a/resources/recipes/abc_au.recipe b/resources/recipes/abc_au.recipe new file mode 100644 index 0000000000..1330f8e4b5 --- /dev/null +++ b/resources/recipes/abc_au.recipe @@ -0,0 +1,54 @@ +__license__ = 'GPL v3' +__copyright__ = '2010, Dean Cording' +''' +abc.net.au/news +''' +import re +from calibre.web.feeds.recipes import BasicNewsRecipe + +class ABCNews(BasicNewsRecipe): + title = 'ABC News' + __author__ = 'Dean Cording' + description = 'News from Australia' + masthead_url = 'http://www.abc.net.au/news/assets/v5/images/common/logo-news.png' + cover_url = 'http://www.abc.net.au/news/assets/v5/images/common/logo-news.png' + + oldest_article = 2 + max_articles_per_feed = 100 + no_stylesheets = False + #delay = 1 + use_embedded_content = False + encoding = 'utf8' + publisher = 'ABC News' + category = 'News, Australia, World' + language = 'en_AU' + publication_type = 'newsportal' + preprocess_regexps = [(re.compile(r'<!--.*?-->', re.DOTALL), lambda m: '')] + conversion_options = { + 'comments' : description + ,'tags' : category + ,'language' : language + ,'publisher' : publisher + ,'linearize_tables': False + } + + keep_only_tags = dict(id='article') + + remove_tags = [dict(attrs={'class':['related', 'tags']}), + dict(id='statepromo') + ] + + remove_attributes = ['width','height'] + + feeds = [ + ('Top Stories', 'http://www.abc.net.au/news/syndicate/topstoriesrss.xml'), + ('Canberra', 'http://www.abc.net.au/news/indexes/idx-act/rss.xml'), + ('Sydney', 'http://www.abc.net.au/news/indexes/sydney/rss.xml'), + ('Melbourne', 'http://www.abc.net.au/news/indexes/melbourne/rss.xml'), + ('Brisbane', 'http://www.abc.net.au/news/indexes/brisbane/rss.xml'), + ('Perth', 'http://www.abc.net.au/news/indexes/perth/rss.xml'), + ('Australia', 'http://www.abc.net.au/news/indexes/idx-australia/rss.xml'), + ('World', 'http://www.abc.net.au/news/indexes/world/rss.xml'), + ('Business', 'http://www.abc.net.au/news/indexes/business/rss.xml'), + ('Science and Technology', 'http://www.abc.net.au/news/tag/science-and-technology/rss.xml'), + ] From d5b9dd944a9041d416c54748b5d080b151c92a9b Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Tue, 30 Nov 2010 20:30:43 -0700 Subject: [PATCH 223/375] Business Spectator by Dean Cording --- resources/recipes/business_spectator.recipe | 48 +++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 resources/recipes/business_spectator.recipe diff --git a/resources/recipes/business_spectator.recipe b/resources/recipes/business_spectator.recipe new file mode 100644 index 0000000000..ef58424c6c --- /dev/null +++ b/resources/recipes/business_spectator.recipe @@ -0,0 +1,48 @@ +__license__ = 'GPL v3' +__copyright__ = '2010, Dean Cording' +''' +abc.net.au/news +''' +import re +from calibre.web.feeds.recipes import BasicNewsRecipe + +class BusinessSpectator(BasicNewsRecipe): + title = 'Business Spectator' + __author__ = 'Dean Cording' + description = 'Australian Business News & commentary delivered the way you want it.' + masthead_url = 'http://www.businessspectator.com.au/bs.nsf/logo-business-spectator.gif' + cover_url = masthead_url + + oldest_article = 2 + max_articles_per_feed = 100 + no_stylesheets = True + #delay = 1 + use_embedded_content = False + encoding = 'utf8' + publisher = 'Business Spectator' + category = 'News, Australia, Business' + language = 'en_AU' + publication_type = 'newsportal' + preprocess_regexps = [(re.compile(r'<!--.*?-->', re.DOTALL), lambda m: '')] + conversion_options = { + 'comments' : description + ,'tags' : category + ,'language' : language + ,'publisher' : publisher + ,'linearize_tables': False + } + + keep_only_tags = [dict(id='storyHeader'), dict(id='body-html')] + + remove_tags = [dict(attrs={'class':'hql'})] + + remove_attributes = ['width','height','style'] + + feeds = [ + ('Top Stories', 'http://www.businessspectator.com.au/top-stories.rss'), + ('Alan Kohler', 'http://www.businessspectator.com.au/bs.nsf/RSS?readform&type=spectators&cat=Alan%20Kohler'), + ('Robert Gottliebsen', 'http://www.businessspectator.com.au/bs.nsf/RSS?readform&type=spectators&cat=Robert%20Gottliebsen'), + ('Stephen Bartholomeusz', 'http://www.businessspectator.com.au/bs.nsf/RSS?readform&type=spectators&cat=Stephen%20Bartholomeusz'), + ('Daily Dossier', 'http://www.businessspectator.com.au/bs.nsf/RSS?readform&type=kgb&cat=dossier'), + ('Australia', 'http://www.businessspectator.com.au/bs.nsf/RSS?readform&type=region&cat=australia'), + ] From c14726e5bb98b9f40912c414a17a63ea209827a7 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Tue, 30 Nov 2010 20:38:32 -0700 Subject: [PATCH 224/375] Update Frankfurter Rundschau --- resources/recipes/fr_online.recipe | 106 ++++++++++++++--------------- 1 file changed, 50 insertions(+), 56 deletions(-) diff --git a/resources/recipes/fr_online.recipe b/resources/recipes/fr_online.recipe index e4a817d0d6..b3448c17dc 100644 --- a/resources/recipes/fr_online.recipe +++ b/resources/recipes/fr_online.recipe @@ -1,67 +1,61 @@ -__license__ = 'GPL v3' -__copyright__ = '2009, Justus Bisser <justus.bisser at gmail.com>' +#!/usr/bin/env python + +__license__ = 'GPL v3' +__copyright__ = '2010, Christian Schmitt' + ''' fr-online.de ''' -import re -from calibre.web.feeds.news import BasicNewsRecipe +from calibre.web.feeds.recipes import BasicNewsRecipe -class Spiegel_ger(BasicNewsRecipe): - title = 'Frankfurter Rundschau' - __author__ = 'Justus Bisser' - description = "Dies ist die Online-Ausgabe der Frankfurter Rundschau. Um die abgerufenen individuell einzustellen bearbeiten sie die Liste im erweiterten Modus. Die Feeds findet man auf http://www.fr-online.de/verlagsservice/fr_newsreader/?em_cnt=574255" - publisher = 'Druck- und Verlagshaus Frankfurt am Main GmbH' - category = 'FR Online, Frankfurter Rundschau, Nachrichten, News,Dienste, RSS, RSS, Feedreader, Newsfeed, iGoogle, Netvibes, Widget' - oldest_article = 7 - max_articles_per_feed = 100 - language = 'de' - lang = 'de-DE' - no_stylesheets = True - use_embedded_content = False - #encoding = 'cp1252' +class FROnlineRecipe(BasicNewsRecipe): + title = 'Frankfurter Rundschau' + __author__ = 'maccs' + description = 'Nachrichten aus D und aller Welt' + encoding = 'utf-8' + masthead_url = 'http://www.fr-online.de/image/view/-/1474018/data/823552/-/logo.png' + publisher = 'Druck- und Verlagshaus Frankfurt am Main GmbH' + category = 'news, germany, world' + language = 'de' + publication_type = 'newspaper' + use_embedded_content = False + remove_javascript = True + no_stylesheets = True + oldest_article = 1 # Increase this number if you're interested in older articles + max_articles_per_feed = 50 # Seems a reasonable number to me + extra_css = ''' + body { font-family: "arial", "verdana", "geneva", sans-serif; font-size: 12px; margin: 0px; background-color: #ffffff;} + .imgSubline{background-color: #f4f4f4; font-size: 0.8em;} + .p--heading-1 {font-weight: bold;} + .calibre_navbar {font-size: 0.8em; font-family: "arial", "verdana", "geneva", sans-serif;} + ''' + remove_tags = [dict(name='div', attrs={'id':'Logo'})] + cover_url = 'http://www.fr-online.de/image/view/-/1474018/data/823552/-/logo.png' + cover_margins = (100, 150, '#ffffff') - conversion_options = { - 'comment' : description - , 'tags' : category - , 'publisher' : publisher - , 'language' : lang - } - recursions = 0 - max_articles_per_feed = 100 - #keep_only_tags = [dict(name='div', attrs={'class':'text'})] - #tags_remove = [dict(name='div', attrs={'style':'text-align: left; margin: 4px 0px 0px 4px; width: 200px; float: right;'})] - remove_attributes = ['style'] - feeds = [] - #remove_tags_before = [dict(name='div', attrs={'style':'padding-left: 0px;'})] - #remove_tags_after = [dict(name='div', attrs={'class':'box_head_text'})] + feeds = [] + feeds.append(('Startseite', u'http://www.fr-online.de/home/-/1472778/1472778/-/view/asFeed/-/index.xml')) + feeds.append(('Politik', u'http://www.fr-online.de/politik/-/1472596/1472596/-/view/asFeed/-/index.xml')) + feeds.append(('Meinung', u'http://www.fr-online.de/politik/meinung/-/1472602/1472602/-/view/asFeed/-/index.xml')) + feeds.append(('Wirtschaft', u'http://www.fr-online.de/wirtschaft/-/1472780/1472780/-/view/asFeed/-/index.xml')) + feeds.append(('Sport', u'http://www.fr-online.de/sport/-/1472784/1472784/-/view/asFeed/-/index.xml')) + feeds.append(('Eintracht Frankfurt', u'http://www.fr-online.de/sport/eintracht-frankfurt/-/1473446/1473446/-/view/asFeed/-/index.xml')) + feeds.append(('Kultur und Medien', u'http://www.fr-online.de/kultur/-/1472786/1472786/-/view/asFeed/-/index.xml')) + feeds.append(('Panorama', u'http://www.fr-online.de/panorama/-/1472782/1472782/-/view/asFeed/-/index.xml')) + feeds.append(('Frankfurt', u'http://www.fr-online.de/frankfurt/-/1472798/1472798/-/view/asFeed/-/index.xml')) + feeds.append(('Rhein-Main', u'http://www.fr-online.de/rhein-main/-/1472796/1472796/-/view/asFeed/-/index.xml')) + feeds.append(('Hanau', u'http://www.fr-online.de/rhein-main/hanau/-/1472866/1472866/-/view/asFeed/-/index.xml')) + feeds.append(('Darmstadt', u'http://www.fr-online.de/rhein-main/darmstadt/-/1472858/1472858/-/view/asFeed/-/index.xml')) + feeds.append(('Wiesbaden', u'http://www.fr-online.de/rhein-main/wiesbaden/-/1472860/1472860/-/view/asFeed/-/index.xml')) + feeds.append(('Offenbach', u'http://www.fr-online.de/rhein-main/offenbach/-/1472856/1472856/-/view/asFeed/-/index.xml')) + feeds.append(('Bad Homburg', u'http://www.fr-online.de/rhein-main/bad-homburg/-/1472864/1472864/-/view/asFeed/-/index.xml')) + feeds.append(('Digital', u'http://www.fr-online.de/digital/-/1472406/1472406/-/view/asFeed/-/index.xml')) + feeds.append(('Wissenschaft', u'http://www.fr-online.de/wissenschaft/-/1472788/1472788/-/view/asFeed/-/index.xml')) - # enable for all news - allNews = 0 - if allNews: - feeds = [(u'Frankfurter Rundschau', u'http://www.fr-online.de/rss/sport/index.xml')] - else: - #select the feeds you like - feeds = [(u'Nachrichten', u'http://www.fr-online.de/rss/politik/index.xml')] - feeds.append((u'Kommentare und Analysen', u'http://www.fr-online.de/rss/meinung/index.xml')) - feeds.append((u'Dokumentationen', u'http://www.fr-online.de/rss/dokumentation/index.xml')) - feeds.append((u'Deutschlandtrend', u'http://www.fr-online.de/rss/deutschlandtrend/index.xml')) - feeds.append((u'Wirtschaft', u'http://www.fr-online.de/rss/wirtschaft/index.xml')) - feeds.append((u'Sport', u'http://www.fr-online.de/rss/sport/index.xml')) - feeds.append((u'Feuilleton', u'http://www.fr-online.de/rss/feuilleton/index.xml')) - feeds.append((u'Panorama', u'http://www.fr-online.de/rss/panorama/index.xml')) - feeds.append((u'Rhein Main und Hessen', u'http://www.fr-online.de/rss/hessen/index.xml')) - feeds.append((u'Fitness und Gesundheit', u'http://www.fr-online.de/rss/fit/index.xml')) - feeds.append((u'Multimedia', u'http://www.fr-online.de/rss/multimedia/index.xml')) - feeds.append((u'Wissen und Bildung', u'http://www.fr-online.de/rss/wissen/index.xml')) - def get_article_url(self, article): - url = article.link - regex = re.compile("0C[0-9]{6,8}0A?") + def print_version(self, url): + return url.replace('index.html', 'view/printVersion/-/index.html') - liste = regex.findall(url) - string = liste.pop(0) - string = string[2:len(string)-1] - return "http://www.fr-online.de/_em_cms/_globals/print.php?em_cnt=" + string From db760d3005bf5123f478c903aa314c5ec4db9fb5 Mon Sep 17 00:00:00 2001 From: Translators <> Date: Wed, 1 Dec 2010 04:56:17 +0000 Subject: [PATCH 225/375] Launchpad automatic translations update. --- src/calibre/translations/he.po | 8 ++++---- src/calibre/translations/zh_CN.po | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/calibre/translations/he.po b/src/calibre/translations/he.po index 2ceaca90cb..9e7e4296ad 100644 --- a/src/calibre/translations/he.po +++ b/src/calibre/translations/he.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" "POT-Creation-Date: 2010-11-27 20:21+0000\n" -"PO-Revision-Date: 2010-11-30 00:56+0000\n" -"Last-Translator: Eran Cohen <Unknown>\n" +"PO-Revision-Date: 2010-11-30 11:45+0000\n" +"Last-Translator: Ddorda <Ddorda@ubuntu.com>\n" "Language-Team: Hebrew <he@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-30 04:45+0000\n" +"X-Launchpad-Export-Date: 2010-12-01 04:56+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -190,7 +190,7 @@ msgstr "פעולה בממשק משתמש" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:283 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:206 msgid "Preferences" -msgstr "הגדרות" +msgstr "העדפות" #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:15 msgid "" diff --git a/src/calibre/translations/zh_CN.po b/src/calibre/translations/zh_CN.po index 7ae2090006..3100aa4ecf 100644 --- a/src/calibre/translations/zh_CN.po +++ b/src/calibre/translations/zh_CN.po @@ -14,7 +14,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-30 04:46+0000\n" +"X-Launchpad-Export-Date: 2010-12-01 04:56+0000\n" "X-Generator: Launchpad (build Unknown)\n" "X-Poedit-Country: CHINA\n" "X-Poedit-Language: Chinese\n" From 5d254ef842fac1eab35260f294a69c74aa85c1ff Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Wed, 1 Dec 2010 08:18:36 +0000 Subject: [PATCH 226/375] Restore the focus to the library view when the search button is clicked --- src/calibre/gui2/layout.py | 2 +- src/calibre/gui2/search_box.py | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/calibre/gui2/layout.py b/src/calibre/gui2/layout.py index fd42bfe671..aaaf1b0267 100644 --- a/src/calibre/gui2/layout.py +++ b/src/calibre/gui2/layout.py @@ -182,7 +182,7 @@ class SearchBar(QWidget): # {{{ l.addWidget(self.search_button) self.search_button.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum) - self.search_button.clicked.connect(parent.search.do_search) + self.search_button.clicked.connect(parent.do_search_button) self.search_button.setToolTip( _('Do Quick Search (you can also press the Enter key)')) diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py index 4d598a3bbb..fbb52e5781 100644 --- a/src/calibre/gui2/search_box.py +++ b/src/calibre/gui2/search_box.py @@ -352,6 +352,10 @@ class SearchBoxMixin(object): if d.exec_() == QDialog.Accepted: self.search.set_search_string(d.search_string()) + def do_search_button(self): + self.search.do_search() + self.focus_to_library() + def focus_to_library(self): self.current_view().setFocus(Qt.OtherFocusReason) From 6132fa1385b9d647ac03d1e9b8b23fdf8688c38e Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Wed, 1 Dec 2010 08:54:41 +0000 Subject: [PATCH 227/375] Make completion and search_as_you_type play together more nicely --- src/calibre/gui2/search_box.py | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py index fbb52e5781..2c40665187 100644 --- a/src/calibre/gui2/search_box.py +++ b/src/calibre/gui2/search_box.py @@ -9,7 +9,8 @@ __docformat__ = 'restructuredtext en' import re from PyQt4.Qt import QComboBox, Qt, QLineEdit, QStringList, pyqtSlot, QDialog, \ - pyqtSignal, QCompleter, QAction, QKeySequence, QTimer + pyqtSignal, QCompleter, QAction, QKeySequence, QTimer, \ + QString from calibre.gui2 import config from calibre.gui2.dialogs.confirm_delete import confirm @@ -70,8 +71,11 @@ class SearchBox2(QComboBox): self.normal_background = 'rgb(255, 255, 255, 0%)' self.line_edit = SearchLineEdit(self) self.setLineEdit(self.line_edit) + c = self.line_edit.completer() c.setCompletionMode(c.PopupCompletion) + c.highlighted[QString].connect(self.completer_used) + self.line_edit.key_pressed.connect(self.key_pressed, type=Qt.DirectConnection) self.activated.connect(self.history_selected) self.setEditable(True) @@ -130,6 +134,7 @@ class SearchBox2(QComboBox): col = self.normal_background self.line_edit.setStyleSheet('QLineEdit{color:black;background-color:%s;}' % col) + # Comes from the lineEdit control def key_pressed(self, event): k = event.key() if k in (Qt.Key_Left, Qt.Key_Right, Qt.Key_Up, Qt.Key_Down, @@ -146,6 +151,21 @@ class SearchBox2(QComboBox): elif self.as_you_type and unicode(event.text()): self.timer.start(1500) + # Comes from the combobox itself + def keyPressEvent(self, event): + k = event.key() + if k not in (Qt.Key_Up, Qt.Key_Down): + QComboBox.keyPressEvent(self, event) + else: + self.blockSignals(True) + self.normalize_state() + QComboBox.keyPressEvent(self, event) + self.blockSignals(False) + + def completer_used(self, text): + self.timer.stop() + self.normalize_state() + def timer_event(self): self.do_search() From 4bf7bc6b7b3a7b5ae6d0c675d57afeb64a643d70 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Wed, 1 Dec 2010 11:08:51 +0000 Subject: [PATCH 228/375] Remember current tab when using apply in bulk edit --- src/calibre/gui2/actions/edit_metadata.py | 5 ++++- src/calibre/gui2/dialogs/metadata_bulk.py | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/calibre/gui2/actions/edit_metadata.py b/src/calibre/gui2/actions/edit_metadata.py index 8b57b4b455..559ea4a6f7 100644 --- a/src/calibre/gui2/actions/edit_metadata.py +++ b/src/calibre/gui2/actions/edit_metadata.py @@ -164,12 +164,15 @@ class EditMetadataAction(InterfaceAction): self.gui.tags_view.blockSignals(True) changed = False try: + current_tab = 0 while True: - dialog = MetadataBulkDialog(self.gui, rows, self.gui.library_view.model()) + dialog = MetadataBulkDialog(self.gui, rows, + self.gui.library_view.model(), current_tab) if dialog.changed: changed = True if not dialog.do_again: break + current_tab = dialog.central_widget.currentIndex() finally: self.gui.tags_view.blockSignals(False) if changed: diff --git a/src/calibre/gui2/dialogs/metadata_bulk.py b/src/calibre/gui2/dialogs/metadata_bulk.py index 4fd34e4c4c..e30e0e16e1 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.py +++ b/src/calibre/gui2/dialogs/metadata_bulk.py @@ -197,7 +197,7 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): _('Append to field'), ] - def __init__(self, window, rows, model): + def __init__(self, window, rows, model, tab): QDialog.__init__(self, window) Ui_MetadataBulkDialog.__init__(self) self.setupUi(self) @@ -238,6 +238,7 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): 'Immediately make all changes without closing the dialog. ' 'This operation cannot be canceled or undone')) self.do_again = False + self.central_widget.setCurrentIndex(tab) self.exec_() def button_clicked(self, which): From 7e76be47b9bd34c2e4143c095dee7650dbb65c21 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Wed, 1 Dec 2010 14:57:32 +0000 Subject: [PATCH 229/375] fix focus problems when using tags browser and keyboard shortcuts to initiate searching --- src/calibre/gui2/search_box.py | 22 +++++++------------- src/calibre/gui2/search_restriction_mixin.py | 3 +++ 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py index ab5b1e06e9..16c697a8fd 100644 --- a/src/calibre/gui2/search_box.py +++ b/src/calibre/gui2/search_box.py @@ -203,14 +203,16 @@ class SearchBox2(QComboBox): self.set_search_string(joiner.join(tags)) def set_search_string(self, txt): + self.setFocus(Qt.OtherFocusReason) if not txt: self.clear() - return - self.normalize_state() - self.setEditText(txt) - self.search.emit(txt) - self.line_edit.end(False) - self.initial_state = False + else: + self.normalize_state() + self.setEditText(txt) + self.search.emit(txt) + self.line_edit.end(False) + self.initial_state = False + self.focus_to_library.emit() def search_as_you_type(self, enabled): self.as_you_type = enabled @@ -228,7 +230,6 @@ class SavedSearchBox(QComboBox): ''' changed = pyqtSignal() - focus_to_library = pyqtSignal() def __init__(self, parent=None): QComboBox.__init__(self, parent) @@ -273,7 +274,6 @@ class SavedSearchBox(QComboBox): def key_pressed(self, event): if event.key() in (Qt.Key_Return, Qt.Key_Enter): self.saved_search_selected(self.currentText()) - self.focus_to_library.emit() def saved_search_selected(self, qname): qname = unicode(qname) @@ -287,7 +287,6 @@ class SavedSearchBox(QComboBox): self.search_box.set_search_string(u'search:"%s"' % qname) self.setEditText(qname) self.setToolTip(saved_searches().lookup(qname)) - self.focus_to_library.emit() def initialize_saved_search_names(self): qnames = saved_searches().names() @@ -387,7 +386,6 @@ class SavedSearchBoxMixin(object): def __init__(self): self.saved_search.changed.connect(self.saved_searches_changed) self.clear_button.clicked.connect(self.saved_search.clear) - self.saved_search.focus_to_library.connect(self.focus_to_library) self.save_search_button.clicked.connect( self.saved_search.save_search_button_clicked) self.delete_search_button.clicked.connect( @@ -422,7 +420,3 @@ class SavedSearchBoxMixin(object): if d.result() == d.Accepted: self.saved_searches_changed() self.saved_search.clear() - - def focus_to_library(self): - self.current_view().setFocus(Qt.OtherFocusReason) - diff --git a/src/calibre/gui2/search_restriction_mixin.py b/src/calibre/gui2/search_restriction_mixin.py index 6373e452e5..74132ae610 100644 --- a/src/calibre/gui2/search_restriction_mixin.py +++ b/src/calibre/gui2/search_restriction_mixin.py @@ -4,6 +4,8 @@ Created on 10 Jun 2010 @author: charles ''' +from PyQt4.Qt import Qt + class SearchRestrictionMixin(object): def __init__(self): @@ -53,6 +55,7 @@ class SearchRestrictionMixin(object): self.saved_search.clear() self.tags_view.set_search_restriction(restriction) self.set_number_of_books_shown() + self.current_view().setFocus(Qt.OtherFocusReason) def set_number_of_books_shown(self): if self.current_view() == self.library_view and self.restriction_in_effect: From 450a39413727d101bfc4a3c625db1d337308b643 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Wed, 1 Dec 2010 08:59:08 -0700 Subject: [PATCH 230/375] Driver for PocketBook 902 --- src/calibre/devices/eb600/driver.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/calibre/devices/eb600/driver.py b/src/calibre/devices/eb600/driver.py index 4b3d4498c4..54d73d9c1d 100644 --- a/src/calibre/devices/eb600/driver.py +++ b/src/calibre/devices/eb600/driver.py @@ -229,7 +229,7 @@ class POCKETBOOK301(USBMS): class POCKETBOOK602(USBMS): - name = 'PocketBook Pro 602 Device Interface' + name = 'PocketBook Pro 602/902 Device Interface' description = _('Communicate with the PocketBook 602 reader.') author = 'Kovid Goyal' supported_platforms = ['windows', 'osx', 'linux'] @@ -244,5 +244,5 @@ class POCKETBOOK602(USBMS): BCD = [0x0324] VENDOR_NAME = '' - WINDOWS_MAIN_MEM = WINDOWS_CARD_A_MEM = 'PB602' + WINDOWS_MAIN_MEM = WINDOWS_CARD_A_MEM = ['PB602', 'PB902'] From c6410c1fcbff8dc1c573aad29687b4cc53c5501f Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Wed, 1 Dec 2010 09:04:07 -0700 Subject: [PATCH 231/375] Fix #7682 (Cybook Orizon not detected) --- src/calibre/devices/cybook/driver.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/calibre/devices/cybook/driver.py b/src/calibre/devices/cybook/driver.py index becb7912a9..c1a62fdbf3 100644 --- a/src/calibre/devices/cybook/driver.py +++ b/src/calibre/devices/cybook/driver.py @@ -65,8 +65,8 @@ class ORIZON(CYBOOK): BCD = [0x319] - WINDOWS_MAIN_MEM = re.compile(r'CYBOOK_ORIZON__-FD') - WINDOWS_CARD_A_MEM = re.compile('CYBOOK_ORIZON__-SD') + WINDOWS_MAIN_MEM = re.compile(r'(CYBOOK_ORIZON__-FD)|(FILE-STOR_GADGET)') + WINDOWS_CARD_A_MEM = re.compile('(CYBOOK_ORIZON__-SD)|(FILE-STOR_GADGET)') EBOOK_DIR_MAIN = EBOOK_DIR_CARD_A = 'Digital Editions' From b5901ead756753dcb9df75d9f3d6f46f09063d4d Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Wed, 1 Dec 2010 16:53:23 +0000 Subject: [PATCH 232/375] More search box changes --- src/calibre/devices/cybook/driver.py | 4 ++-- src/calibre/devices/eb600/driver.py | 4 ++-- src/calibre/gui2/search_box.py | 5 +---- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/calibre/devices/cybook/driver.py b/src/calibre/devices/cybook/driver.py index becb7912a9..c1a62fdbf3 100644 --- a/src/calibre/devices/cybook/driver.py +++ b/src/calibre/devices/cybook/driver.py @@ -65,8 +65,8 @@ class ORIZON(CYBOOK): BCD = [0x319] - WINDOWS_MAIN_MEM = re.compile(r'CYBOOK_ORIZON__-FD') - WINDOWS_CARD_A_MEM = re.compile('CYBOOK_ORIZON__-SD') + WINDOWS_MAIN_MEM = re.compile(r'(CYBOOK_ORIZON__-FD)|(FILE-STOR_GADGET)') + WINDOWS_CARD_A_MEM = re.compile('(CYBOOK_ORIZON__-SD)|(FILE-STOR_GADGET)') EBOOK_DIR_MAIN = EBOOK_DIR_CARD_A = 'Digital Editions' diff --git a/src/calibre/devices/eb600/driver.py b/src/calibre/devices/eb600/driver.py index 4b3d4498c4..54d73d9c1d 100644 --- a/src/calibre/devices/eb600/driver.py +++ b/src/calibre/devices/eb600/driver.py @@ -229,7 +229,7 @@ class POCKETBOOK301(USBMS): class POCKETBOOK602(USBMS): - name = 'PocketBook Pro 602 Device Interface' + name = 'PocketBook Pro 602/902 Device Interface' description = _('Communicate with the PocketBook 602 reader.') author = 'Kovid Goyal' supported_platforms = ['windows', 'osx', 'linux'] @@ -244,5 +244,5 @@ class POCKETBOOK602(USBMS): BCD = [0x0324] VENDOR_NAME = '' - WINDOWS_MAIN_MEM = WINDOWS_CARD_A_MEM = 'PB602' + WINDOWS_MAIN_MEM = WINDOWS_CARD_A_MEM = ['PB602', 'PB902'] diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py index 16c697a8fd..1832520cec 100644 --- a/src/calibre/gui2/search_box.py +++ b/src/calibre/gui2/search_box.py @@ -25,10 +25,6 @@ class SearchLineEdit(QLineEdit): self.key_pressed.emit(event) QLineEdit.keyPressEvent(self, event) - def mouseReleaseEvent(self, event): - QLineEdit.mouseReleaseEvent(self, event) - QLineEdit.selectAll(self) - def dropEvent(self, ev): self.parent().normalize_state() return QLineEdit.dropEvent(self, ev) @@ -71,6 +67,7 @@ class SearchBox2(QComboBox): c = self.line_edit.completer() c.setCompletionMode(c.PopupCompletion) c.highlighted[QString].connect(self.completer_used) + c.activated[QString].connect(self.history_selected) self.line_edit.key_pressed.connect(self.key_pressed, type=Qt.DirectConnection) self.activated.connect(self.history_selected) From e74606e35f382ecc7bf93c67c4e71786e7e7a12e Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Wed, 1 Dec 2010 17:10:49 +0000 Subject: [PATCH 233/375] Fix (I hope) strange selection behavior in viewer when searching --- src/calibre/gui2/viewer/main.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/calibre/gui2/viewer/main.py b/src/calibre/gui2/viewer/main.py index 70fa99b4b6..7c19567804 100644 --- a/src/calibre/gui2/viewer/main.py +++ b/src/calibre/gui2/viewer/main.py @@ -253,6 +253,7 @@ class EbookViewer(MainWindow, Ui_EbookViewer): self.connect(self.vertical_scrollbar, SIGNAL('valueChanged(int)'), lambda x: self.goto_page(x/100.)) self.search.search.connect(self.find) + self.search.focus_to_library.connect(lambda: self.view.setFocus(Qt.OtherFocusReason)) self.connect(self.toc, SIGNAL('clicked(QModelIndex)'), self.toc_clicked) self.connect(self.reference, SIGNAL('goto(PyQt_PyObject)'), self.goto) From 8cc1c798f5896d704c260eb82059f48840f108bf Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Wed, 1 Dec 2010 10:40:25 -0700 Subject: [PATCH 234/375] Fix #7758 (Add device: samsung fascinate android running aldiko and wordplayer) --- src/calibre/devices/android/driver.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/calibre/devices/android/driver.py b/src/calibre/devices/android/driver.py index 811acbe55b..0deef5eb92 100644 --- a/src/calibre/devices/android/driver.py +++ b/src/calibre/devices/android/driver.py @@ -38,7 +38,7 @@ class ANDROID(USBMS): 0x227]}, # Samsung - 0x04e8 : { 0x681d : [0x0222, 0x0224, 0x0400], + 0x04e8 : { 0x681d : [0x0222, 0x0223, 0x0224, 0x0400], 0x681c : [0x0222, 0x0224, 0x0400], 0x6640 : [0x0100], }, @@ -62,7 +62,8 @@ class ANDROID(USBMS): 'GT-I5700', 'SAMSUNG', 'DELL', 'LINUX'] WINDOWS_MAIN_MEM = ['ANDROID_PHONE', 'A855', 'A853', 'INC.NEXUS_ONE', '__UMS_COMPOSITE', '_MB200', 'MASS_STORAGE', '_-_CARD', 'SGH-I897', - 'GT-I9000', 'FILE-STOR_GADGET', 'SGH-T959', 'SAMSUNG_ANDROID'] + 'GT-I9000', 'FILE-STOR_GADGET', 'SGH-T959', 'SAMSUNG_ANDROID', + 'SCH-I500_CARD'] WINDOWS_CARD_A_MEM = ['ANDROID_PHONE', 'GT-I9000_CARD', 'SGH-I897', 'FILE-STOR_GADGET', 'SGH-T959', 'SAMSUNG_ANDROID'] From 039d4653b0def7f3bedf07fa3e59b858ce3efac4 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Wed, 1 Dec 2010 12:02:42 -0700 Subject: [PATCH 235/375] Fix #7616 (Add "similar books" searches to the search history) --- src/calibre/gui2/actions/similar_books.py | 3 +- src/calibre/gui2/search_box.py | 83 +++++++++++++---------- src/calibre/gui2/tag_view.py | 17 +++-- 3 files changed, 64 insertions(+), 39 deletions(-) diff --git a/src/calibre/gui2/actions/similar_books.py b/src/calibre/gui2/actions/similar_books.py index 644cd3160a..b1ee04a4d4 100644 --- a/src/calibre/gui2/actions/similar_books.py +++ b/src/calibre/gui2/actions/similar_books.py @@ -58,6 +58,7 @@ class SimilarBooksAction(InterfaceAction): for a in authors.split(',')] join = ' or ' if search: - self.gui.search.set_search_string(join.join(search)) + self.gui.search.set_search_string(join.join(search), + store_in_history=True) diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py index 1832520cec..0c8eb84a37 100644 --- a/src/calibre/gui2/search_box.py +++ b/src/calibre/gui2/search_box.py @@ -18,7 +18,7 @@ from calibre.gui2.dialogs.saved_search_editor import SavedSearchEditor from calibre.gui2.dialogs.search import SearchDialog from calibre.utils.search_query_parser import saved_searches -class SearchLineEdit(QLineEdit): +class SearchLineEdit(QLineEdit): # {{{ key_pressed = pyqtSignal(object) def keyPressEvent(self, event): @@ -37,17 +37,23 @@ class SearchLineEdit(QLineEdit): def paste(self, *args): self.parent().normalize_state() return QLineEdit.paste(self) +# }}} -class SearchBox2(QComboBox): +class SearchBox2(QComboBox): # {{{ ''' To use this class: * Call initialize() * Connect to the search() and cleared() signals from this widget. - * Connect to the cleared() signal to know when the box content changes - * Connect to focus_to_library signal to be told to manually change focus + * Connect to the changed() signal to know when the box content changes + * Connect to focus_to_library() signal to be told to manually change focus * Call search_done() after every search is complete + * Call set_search_string() to perform a search programmatically + * You can use the current_text property to get the current search text + Be aware that if you are using it in a slow connected to the + changed() signal, if the connection is not queued it will not be + accurate. ''' INTERVAL = 1500 #: Time to wait before emitting search signal @@ -166,49 +172,43 @@ class SearchBox2(QComboBox): self.changed.emit() self.do_search() - def do_search(self, *args): + def _do_search(self, store_in_history=True): text = unicode(self.currentText()).strip() if not text: return self.clear() self.search.emit(text) - idx = self.findText(text, Qt.MatchFixedString) - self.block_signals(True) - if idx < 0: - self.insertItem(0, text) - else: - t = self.itemText(idx) - self.removeItem(idx) - self.insertItem(0, t) + if store_in_history: + idx = self.findText(text, Qt.MatchFixedString) + self.block_signals(True) + if idx < 0: + self.insertItem(0, text) + else: + t = self.itemText(idx) + self.removeItem(idx) + self.insertItem(0, t) self.setCurrentIndex(0) - self.block_signals(False) - config[self.opt_name] = [unicode(self.itemText(i)) for i in - range(self.count())] + self.block_signals(False) + config[self.opt_name] = [unicode(self.itemText(i)) for i in + range(self.count())] + + def do_search(self, *args): + self._do_search() def block_signals(self, yes): self.blockSignals(yes) self.line_edit.blockSignals(yes) - def search_from_tokens(self, tokens, all): - ans = u' '.join([u'%s:%s'%x for x in tokens]) - if not all: - ans = '[' + ans + ']' - self.set_search_string(ans) - - def search_from_tags(self, tags, all): - joiner = ' and ' if all else ' or ' - self.set_search_string(joiner.join(tags)) - - def set_search_string(self, txt): + def set_search_string(self, txt, store_in_history=False): self.setFocus(Qt.OtherFocusReason) if not txt: self.clear() else: self.normalize_state() self.setEditText(txt) - self.search.emit(txt) self.line_edit.end(False) - self.initial_state = False + self.changed.emit() + self._do_search(store_in_history=store_in_history) self.focus_to_library.emit() def search_as_you_type(self, enabled): @@ -217,7 +217,13 @@ class SearchBox2(QComboBox): def in_a_search(self): return self._in_a_search -class SavedSearchBox(QComboBox): + @property + def current_text(self): + return unicode(self.lineEdit().text()) + + # }}} + +class SavedSearchBox(QComboBox): # {{{ ''' To use this class: @@ -329,13 +335,17 @@ class SavedSearchBox(QComboBox): return self.search_box.set_search_string(saved_searches().lookup(unicode(self.currentText()))) -class SearchBoxMixin(object): + # }}} + +class SearchBoxMixin(object): # {{{ def __init__(self): self.search.initialize('main_search_history', colorize=True, help_text=_('Search (For Advanced Search click the button to the left)')) self.search.cleared.connect(self.search_box_cleared) - self.search.changed.connect(self.search_box_changed) + # Queued so that search.current_text will be correct + self.search.changed.connect(self.search_box_changed, + type=Qt.QueuedConnection) self.search.focus_to_library.connect(self.focus_to_library) self.clear_button.clicked.connect(self.search.clear_clicked) self.advanced_search_button.clicked[bool].connect(self.do_advanced_search) @@ -364,7 +374,7 @@ class SearchBoxMixin(object): def search_box_changed(self): self.saved_search.clear() - self.tags_view.clear() + self.tags_view.conditional_clear(self.search.current_text) def do_advanced_search(self, *args): d = SearchDialog(self, self.library_view.model().db) @@ -378,7 +388,9 @@ class SearchBoxMixin(object): def focus_to_library(self): self.current_view().setFocus(Qt.OtherFocusReason) -class SavedSearchBoxMixin(object): + # }}} + +class SavedSearchBoxMixin(object): # {{{ def __init__(self): self.saved_search.changed.connect(self.saved_searches_changed) @@ -417,3 +429,6 @@ class SavedSearchBoxMixin(object): if d.result() == d.Accepted: self.saved_searches_changed() self.saved_search.clear() + + # }}} + diff --git a/src/calibre/gui2/tag_view.py b/src/calibre/gui2/tag_view.py index b841706439..972a1eeba3 100644 --- a/src/calibre/gui2/tag_view.py +++ b/src/calibre/gui2/tag_view.py @@ -60,7 +60,7 @@ class TagDelegate(QItemDelegate): # {{{ class TagsView(QTreeView): # {{{ refresh_required = pyqtSignal() - tags_marked = pyqtSignal(object, object) + tags_marked = pyqtSignal(object) user_category_edit = pyqtSignal(object) tag_list_edit = pyqtSignal(object, object) saved_search_edit = pyqtSignal(object) @@ -135,11 +135,21 @@ class TagsView(QTreeView): # {{{ # swallow these to avoid toggling and editing at the same time pass + @property + def search_string(self): + tokens = self._model.tokens() + joiner = ' and ' if self.match_all else ' or ' + return joiner.join(tokens) + def toggle(self, index): modifiers = int(QApplication.keyboardModifiers()) exclusive = modifiers not in (Qt.CTRL, Qt.SHIFT) if self._model.toggle(index, exclusive): - self.tags_marked.emit(self._model.tokens(), self.match_all) + self.tags_marked.emit(self.search_string) + + def conditional_clear(self, search_string): + if search_string != self.search_string: + self.clear() def context_menu_handler(self, action=None, category=None, key=None, index=None): @@ -842,8 +852,7 @@ class TagBrowserMixin(object): # {{{ self.library_view.model().count_changed_signal.connect(self.tags_view.recount) self.tags_view.set_database(self.library_view.model().db, self.tag_match, self.sort_by) - self.tags_view.tags_marked.connect(self.search.search_from_tags) - self.tags_view.tags_marked.connect(self.saved_search.clear) + self.tags_view.tags_marked.connect(self.search.set_search_string) self.tags_view.tag_list_edit.connect(self.do_tags_list_edit) self.tags_view.user_category_edit.connect(self.do_user_categories_edit) self.tags_view.saved_search_edit.connect(self.do_saved_search_edit) From 7704ca4a0534885e66e4a0d371a46aff76d9159b Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Wed, 1 Dec 2010 19:07:29 +0000 Subject: [PATCH 236/375] First pass at enum custom type --- src/calibre/gui2/custom_column_widgets.py | 82 +++++++++++++++++++ src/calibre/gui2/library/delegates.py | 33 ++++++++ src/calibre/gui2/library/models.py | 4 +- src/calibre/gui2/library/views.py | 6 +- .../gui2/preferences/create_custom_column.py | 17 +++- .../gui2/preferences/create_custom_column.ui | 44 ++++++++-- src/calibre/library/custom_columns.py | 7 +- src/calibre/library/field_metadata.py | 2 +- 8 files changed, 176 insertions(+), 19 deletions(-) diff --git a/src/calibre/gui2/custom_column_widgets.py b/src/calibre/gui2/custom_column_widgets.py index 053dd7a743..7ea4fa679f 100644 --- a/src/calibre/gui2/custom_column_widgets.py +++ b/src/calibre/gui2/custom_column_widgets.py @@ -310,6 +310,37 @@ class Series(Base): self.db.set_custom(book_id, val, extra=s_index, num=self.col_id, notify=notify, commit=False) +class Enumeration(Base): + + def setup_ui(self, parent): + self.widgets = [QLabel('&'+self.col_metadata['name']+':', parent), + QComboBox(parent)] + w = self.widgets[1] + print self.col_metadata['display'] + vals = self.col_metadata['display']['enum_values'] + w.addItem('') + for v in vals: + w.addItem(v) + + def initialize(self, book_id): + val = self.db.get_custom(book_id, num=self.col_id, index_is_id=True) + if val is None: + val = '' + self.initial_val = val + val = self.normalize_db_val(val) + idx = self.widgets[1].findText(val) + if idx < 0: + idx = 0 + self.widgets[1].setCurrentIndex(idx) + + def setter(self, val): + if val is None: + val = '' + self.widgets[1].setCurrentIndex(self.widgets[1].findText(val)) + + def getter(self): + return unicode(self.widgets[1].currentText()) + widgets = { 'bool' : Bool, 'rating' : Rating, @@ -319,6 +350,7 @@ widgets = { 'text' : Text, 'comments': Comments, 'series': Series, + 'enumeration': Enumeration } def field_sort(y, z, x=None): @@ -551,6 +583,55 @@ class BulkSeries(BulkBase): self.db.set_custom_bulk(book_ids, val, extras=extras, num=self.col_id, notify=notify) +class BulkEnumeration(BulkBase, Enumeration): + + def get_initial_value(self, book_ids): + value = None + for book_id in book_ids: + val = self.db.get_custom(book_id, num=self.col_id, index_is_id=True) + if value is not None and value != val: + return ' nochange ' + value = val + return value + + def setup_ui(self, parent): + self.widgets = [QLabel('&'+self.col_metadata['name']+':', parent), + QComboBox(parent)] + w = self.widgets[1] + print self.col_metadata['display'] + vals = self.col_metadata['display']['enum_values'] + w.addItem('Do Not Change') + w.addItem('') + for v in vals: + w.addItem(v) + + def getter(self): + if self.widgets[1].currentIndex() == 0: + return ' nochange ' + return unicode(self.widgets[1].currentText()) + + def setter(self, val): + if val == ' nochange ': + self.widgets[1].setCurrentIndex(0) + else: + self.widgets[1].setCurrentIndex(self.widgets[1].findText(val)) + + def commit(self, book_ids, notify=False): + val = self.gui_val + val = self.normalize_ui_val(val) + if val != self.initial_val and val != ' nochange ': + self.db.set_custom_bulk(book_ids, val, num=self.col_id, notify=notify) + + def normalize_ui_val(self, val): + if val == '': + return None + return val + + def normalize_db_val(self, val): + if val is None: + return '' + return val + class RemoveTags(QWidget): def __init__(self, parent, values): @@ -656,4 +737,5 @@ bulk_widgets = { 'datetime': BulkDateTime, 'text' : BulkText, 'series': BulkSeries, + 'enumeration': BulkEnumeration, } diff --git a/src/calibre/gui2/library/delegates.py b/src/calibre/gui2/library/delegates.py index f9ba612bc9..f5610bf849 100644 --- a/src/calibre/gui2/library/delegates.py +++ b/src/calibre/gui2/library/delegates.py @@ -254,6 +254,39 @@ class CcTextDelegate(QStyledItemDelegate): # {{{ # }}} +class CcEnumDelegate(QStyledItemDelegate): # {{{ + ''' + Delegate for text/int/float data. + ''' + + def createEditor(self, parent, option, index): + m = index.model() + col = m.column_map[index.column()] + print 'delegate' + editor = QComboBox(parent) + editor.addItem('') + for v in m.custom_columns[col]['display']['enum_values']: + editor.addItem(v) + return editor + + def setModelData(self, editor, model, index): + val = unicode(editor.currentText()) + if val == '': + val = None + model.setData(index, QVariant(val), Qt.EditRole) + + def setEditorData(self, editor, index): + m = index.model() + val = m.db.data[index.row()][m.custom_columns[m.column_map[index.column()]]['rec_index']] + if val is None: + val = '' + idx = editor.findText(val) + if idx < 0: + editor.setCurrentIndex(0) + else: + editor.setCurrentIndex(idx) +# }}} + class CcCommentsDelegate(QStyledItemDelegate): # {{{ ''' Delegate for comments data. diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index 4ef2c34c03..99639ed0a7 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -634,7 +634,7 @@ class BooksModel(QAbstractTableModel): # {{{ for col in self.custom_columns: idx = self.custom_columns[col]['rec_index'] datatype = self.custom_columns[col]['datatype'] - if datatype in ('text', 'comments', 'composite'): + if datatype in ('text', 'comments', 'composite', 'enumeration'): self.dc[col] = functools.partial(text_type, idx=idx, mult=self.custom_columns[col]['is_multiple']) elif datatype in ('int', 'float'): @@ -719,7 +719,7 @@ class BooksModel(QAbstractTableModel): # {{{ typ = cc['datatype'] label=self.db.field_metadata.key_to_label(colhead) s_index = None - if typ in ('text', 'comments'): + if typ in ('text', 'comments', 'enumeration'): val = unicode(value.toString()).strip() val = val if val else None if typ == 'bool': diff --git a/src/calibre/gui2/library/views.py b/src/calibre/gui2/library/views.py index fadb8314e3..f724ca7b58 100644 --- a/src/calibre/gui2/library/views.py +++ b/src/calibre/gui2/library/views.py @@ -14,7 +14,8 @@ from PyQt4.Qt import QTableView, Qt, QAbstractItemView, QMenu, pyqtSignal, \ from calibre.gui2.library.delegates import RatingDelegate, PubDateDelegate, \ TextDelegate, DateDelegate, TagsDelegate, CcTextDelegate, \ - CcBoolDelegate, CcCommentsDelegate, CcDateDelegate, CcTemplateDelegate + CcBoolDelegate, CcCommentsDelegate, CcDateDelegate, CcTemplateDelegate, \ + CcEnumDelegate from calibre.gui2.library.models import BooksModel, DeviceBooksModel from calibre.utils.config import tweaks, prefs from calibre.gui2 import error_dialog, gprefs @@ -76,6 +77,7 @@ class BooksView(QTableView): # {{{ self.publisher_delegate = TextDelegate(self) self.text_delegate = TextDelegate(self) self.cc_text_delegate = CcTextDelegate(self) + self.cc_enum_delegate = CcEnumDelegate(self) self.cc_bool_delegate = CcBoolDelegate(self) self.cc_comments_delegate = CcCommentsDelegate(self) self.cc_template_delegate = CcTemplateDelegate(self) @@ -427,6 +429,8 @@ class BooksView(QTableView): # {{{ self.setItemDelegateForColumn(cm.index(colhead), self.rating_delegate) elif cc['datatype'] == 'composite': self.setItemDelegateForColumn(cm.index(colhead), self.cc_template_delegate) + elif cc['datatype'] == 'enumeration': + self.setItemDelegateForColumn(cm.index(colhead), self.cc_enum_delegate) else: dattr = colhead+'_delegate' delegate = colhead if hasattr(self, dattr) else 'text' diff --git a/src/calibre/gui2/preferences/create_custom_column.py b/src/calibre/gui2/preferences/create_custom_column.py index ebf33784d4..d4d2b2678c 100644 --- a/src/calibre/gui2/preferences/create_custom_column.py +++ b/src/calibre/gui2/preferences/create_custom_column.py @@ -40,6 +40,8 @@ class CreateCustomColumn(QDialog, Ui_QCreateCustomColumn): 'text':_('Yes/No'), 'is_multiple':False}, 9:{'datatype':'composite', 'text':_('Column built from other columns'), 'is_multiple':False}, + 10:{'datatype':'enumeration', + 'text':_('Fixed set of text values'), 'is_multiple':False}, } def __init__(self, parent, editing, standard_colheads, standard_colnames): @@ -90,7 +92,7 @@ class CreateCustomColumn(QDialog, Ui_QCreateCustomColumn): if c['display'].get('date_format', None): self.date_format_box.setText(c['display'].get('date_format', '')) elif ct == 'composite': - self.composite_box.setText(c['display'].get('composite_template', '')) + self.composite_box.setText(c['display'].get('enum_values', '')) self.datatype_changed() self.exec_() @@ -103,7 +105,8 @@ class CreateCustomColumn(QDialog, Ui_QCreateCustomColumn): getattr(self, 'date_format_'+x).setVisible(col_type == 'datetime') for x in ('box', 'default_label', 'label'): getattr(self, 'composite_'+x).setVisible(col_type == 'composite') - + for x in ('box', 'default_label', 'label'): + getattr(self, 'enum_'+x).setVisible(col_type == 'enumeration') def accept(self): col = unicode(self.column_name_box.text()) @@ -145,17 +148,23 @@ class CreateCustomColumn(QDialog, Ui_QCreateCustomColumn): return self.simple_error('', _('The heading %s is already used')%col_heading) display_dict = {} + if col_type == 'datetime': if self.date_format_box.text(): display_dict = {'date_format':unicode(self.date_format_box.text())} else: display_dict = {'date_format': None} - - if col_type == 'composite': + elif col_type == 'composite': if not self.composite_box.text(): return self.simple_error('', _('You must enter a template for' ' composite columns')) display_dict = {'composite_template':unicode(self.composite_box.text())} + elif col_type == 'enumeration': + if not self.enum_box.text(): + return self.simple_error('', _('You must enter at least one' + ' value for enumeration columns')) + display_dict = {'enum_values': + [v.strip() for v in unicode(self.enum_box.text()).split(',')]} db = self.parent.gui.library_view.model().db key = db.field_metadata.custom_field_prefix+col diff --git a/src/calibre/gui2/preferences/create_custom_column.ui b/src/calibre/gui2/preferences/create_custom_column.ui index 640becca8c..03c191d34e 100644 --- a/src/calibre/gui2/preferences/create_custom_column.ui +++ b/src/calibre/gui2/preferences/create_custom_column.ui @@ -10,7 +10,7 @@ <x>0</x> <y>0</y> <width>528</width> - <height>199</height> + <height>212</height> </rect> </property> <property name="sizePolicy"> @@ -24,7 +24,7 @@ </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> - <layout class="QGridLayout" name="gridLayout_2" rowstretch="0,0,0,0"> + <layout class="QGridLayout" name="gridLayout_2" rowstretch="0,0,0,0,0,0,0,0,0,0,0,0"> <property name="sizeConstraint"> <enum>QLayout::SetDefaultConstraint</enum> </property> @@ -56,7 +56,7 @@ </property> </widget> </item> - <item row="0" column="1"> + <item row="0" column="2"> <widget class="QLineEdit" name="column_name_box"> <property name="minimumSize"> <size> @@ -69,7 +69,7 @@ </property> </widget> </item> - <item row="1" column="1"> + <item row="1" column="2"> <widget class="QLineEdit" name="column_heading_box"> <property name="toolTip"> <string>Column heading in the library view and category name in the tag browser</string> @@ -86,7 +86,7 @@ </property> </widget> </item> - <item row="2" column="1"> + <item row="2" column="2"> <widget class="QComboBox" name="column_type_box"> <property name="sizePolicy"> <sizepolicy hsizetype="Maximum" vsizetype="Fixed"> @@ -105,7 +105,7 @@ </property> </widget> </item> - <item row="4" column="1"> + <item row="4" column="2"> <layout class="QHBoxLayout" name="horizontalLayout_3"> <item> <widget class="QLineEdit" name="date_format_box"> @@ -147,7 +147,7 @@ </property> </widget> </item> - <item row="5" column="1"> + <item row="5" column="2"> <layout class="QHBoxLayout" name="horizontalLayout_4"> <item> <widget class="QLineEdit" name="composite_box"> @@ -184,7 +184,7 @@ </property> </widget> </item> - <item row="10" column="0" colspan="3"> + <item row="11" column="0" colspan="4"> <spacer name="verticalSpacer_2"> <property name="orientation"> <enum>Qt::Vertical</enum> @@ -197,6 +197,34 @@ </property> </spacer> </item> + <item row="6" column="0"> + <widget class="QLabel" name="enum_label"> + <property name="text"> + <string>Values</string> + </property> + </widget> + </item> + <item row="6" column="2"> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <widget class="QLineEdit" name="enum_box"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Maximum" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="enum_default_label"> + <property name="text"> + <string>Default: (nothing)</string> + </property> + </widget> + </item> + </layout> + </item> </layout> </item> <item row="11" column="0"> diff --git a/src/calibre/library/custom_columns.py b/src/calibre/library/custom_columns.py index fdd78e89f8..b477c89fe5 100644 --- a/src/calibre/library/custom_columns.py +++ b/src/calibre/library/custom_columns.py @@ -18,7 +18,7 @@ from calibre.utils.date import parse_date class CustomColumns(object): CUSTOM_DATA_TYPES = frozenset(['rating', 'text', 'comments', 'datetime', - 'int', 'float', 'bool', 'series', 'composite']) + 'int', 'float', 'bool', 'series', 'composite', 'enumeration']) def custom_table_names(self, num): return 'custom_column_%d'%num, 'books_custom_column_%d_link'%num @@ -144,7 +144,8 @@ class CustomColumns(object): 'comments': lambda x,d: adapt_text(x, {'is_multiple':False}), 'datetime' : adapt_datetime, 'text':adapt_text, - 'series':adapt_text + 'series':adapt_text, + 'enumeration': adapt_text } # Create Tag Browser categories for custom columns @@ -558,7 +559,7 @@ class CustomColumns(object): if datatype in ('rating', 'int'): dt = 'INT' - elif datatype in ('text', 'comments', 'series', 'composite'): + elif datatype in ('text', 'comments', 'series', 'composite', 'enumeration'): dt = 'TEXT' elif datatype in ('float',): dt = 'REAL' diff --git a/src/calibre/library/field_metadata.py b/src/calibre/library/field_metadata.py index d10dc5da71..f5a156d3a7 100644 --- a/src/calibre/library/field_metadata.py +++ b/src/calibre/library/field_metadata.py @@ -83,7 +83,7 @@ class FieldMetadata(dict): ''' VALID_DATA_TYPES = frozenset([None, 'rating', 'text', 'comments', 'datetime', - 'int', 'float', 'bool', 'series', 'composite']) + 'int', 'float', 'bool', 'series', 'composite', 'enumeration']) # Builtin metadata {{{ From 1a0d182067fbf02a8bf3e5f06e912c4ced52f406 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Wed, 1 Dec 2010 12:19:32 -0700 Subject: [PATCH 237/375] After a search, always select the first result row --- src/calibre/gui2/init.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/calibre/gui2/init.py b/src/calibre/gui2/init.py index 223efcf95b..27a6a2352a 100644 --- a/src/calibre/gui2/init.py +++ b/src/calibre/gui2/init.py @@ -86,6 +86,10 @@ class LibraryViewMixin(object): # {{{ if view is self.current_view(): self.search.search_done(ok) self.set_number_of_books_shown() + if ok: + v = self.current_view() + if hasattr(v, 'set_current_row'): + v.set_current_row(0) # }}} From 769d4e9502e2e46641e0b32bee083703a625b690 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Wed, 1 Dec 2010 12:55:15 -0700 Subject: [PATCH 238/375] Fix #7726 (Search history incorrect when closing/reopening calibre) --- src/calibre/gui2/search_box.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py index 0c8eb84a37..a0faa4c0a1 100644 --- a/src/calibre/gui2/search_box.py +++ b/src/calibre/gui2/search_box.py @@ -92,7 +92,11 @@ class SearchBox2(QComboBox): # {{{ def initialize(self, opt_name, colorize=False, help_text=_('Search')): self.as_you_type = config['search_as_you_type'] self.opt_name = opt_name - self.addItems(QStringList(list(set(config[opt_name])))) + items = [] + for item in config[opt_name]: + if item not in items: + items.append(item) + self.addItems(QStringList(items)) try: self.line_edit.setPlaceholderText(help_text) except: @@ -189,8 +193,9 @@ class SearchBox2(QComboBox): # {{{ self.insertItem(0, t) self.setCurrentIndex(0) self.block_signals(False) - config[self.opt_name] = [unicode(self.itemText(i)) for i in + history = [unicode(self.itemText(i)) for i in range(self.count())] + config[self.opt_name] = history def do_search(self, *args): self._do_search() From 8460d35fa7be2637e722db79aa4d89d079380b5e Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Wed, 1 Dec 2010 13:01:42 -0700 Subject: [PATCH 239/375] Fix #7715 (OS X - Viewer window taller than non-standard display, can't resize) --- src/calibre/gui2/viewer/main.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/calibre/gui2/viewer/main.py b/src/calibre/gui2/viewer/main.py index 7c19567804..1ea1aca733 100644 --- a/src/calibre/gui2/viewer/main.py +++ b/src/calibre/gui2/viewer/main.py @@ -17,7 +17,7 @@ from calibre.gui2.viewer.bookmarkmanager import BookmarkManager from calibre.gui2.widgets import ProgressIndicator from calibre.gui2.main_window import MainWindow from calibre.gui2 import Application, ORG_NAME, APP_UID, choose_files, \ - info_dialog, error_dialog, open_url + info_dialog, error_dialog, open_url, available_height from calibre.ebooks.oeb.iterator import EbookIterator from calibre.ebooks import DRMError from calibre.constants import islinux, isfreebsd, isosx @@ -694,6 +694,9 @@ class EbookViewer(MainWindow, Ui_EbookViewer): if ss is not None: self.splitter.restoreState(ss) self.show_toc_on_open = dynamic.get('viewer_toc_isvisible', False) + av = available_height() - 30 + if self.height() > av: + self.resize(self.width(), av) def config(defaults=None): desc = _('Options to control the ebook viewer') From 0c7df44df5bbe78dcb7740d6a2e941f23b2591ff Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Wed, 1 Dec 2010 13:22:54 -0700 Subject: [PATCH 240/375] ... --- src/calibre/gui2/search_box.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py index a0faa4c0a1..1cdf622537 100644 --- a/src/calibre/gui2/search_box.py +++ b/src/calibre/gui2/search_box.py @@ -51,7 +51,7 @@ class SearchBox2(QComboBox): # {{{ * Call search_done() after every search is complete * Call set_search_string() to perform a search programmatically * You can use the current_text property to get the current search text - Be aware that if you are using it in a slow connected to the + Be aware that if you are using it in a slot connected to the changed() signal, if the connection is not queued it will not be accurate. ''' From 6143392ee9c21f118a90c397fea8ce5af05833e6 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Wed, 1 Dec 2010 16:27:17 -0700 Subject: [PATCH 241/375] Fix #7706 (show cover Image info in tool tip) --- src/calibre/gui2/dialogs/metadata_single.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/calibre/gui2/dialogs/metadata_single.py b/src/calibre/gui2/dialogs/metadata_single.py index 2b951a7b2b..7beeb56378 100644 --- a/src/calibre/gui2/dialogs/metadata_single.py +++ b/src/calibre/gui2/dialogs/metadata_single.py @@ -98,9 +98,16 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): COVER_FETCH_TIMEOUT = 240 # seconds view_format = pyqtSignal(object) + def update_cover_tooltip(self): + p = self.cover.pixmap() + self.cover.setToolTip(_('Cover size: %dx%d pixels') % + (p.width(), p.height())) + + def do_reset_cover(self, *args): pix = QPixmap(I('default_cover.png')) self.cover.setPixmap(pix) + self.update_cover_tooltip() self.cover_changed = True self.cover_data = None @@ -136,6 +143,7 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): else: self.cover_path.setText(_file) self.cover.setPixmap(pix) + self.update_cover_tooltip() self.cover_changed = True self.cpixmap = pix self.cover_data = cover @@ -161,6 +169,7 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): pix = QPixmap() pix.loadFromData(self.cover_data) self.cover.setPixmap(pix) + self.update_cover_tooltip() self.cover_changed = True self.cpixmap = pix @@ -296,6 +305,7 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): _('The cover in the %s format is invalid')%ext).exec_() return self.cover.setPixmap(pix) + self.update_cover_tooltip() self.cover_changed = True self.cpixmap = pix self.cover_data = cdata @@ -312,6 +322,7 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): pix = QPixmap() pix.loadFromData(cdata) self.cover.setPixmap(pix) + self.update_cover_tooltip() self.cover_changed = True self.cpixmap = pix self.cover_data = cdata @@ -472,6 +483,7 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): else: self.cover_data = cover self.cover.setPixmap(pm) + self.update_cover_tooltip() self.original_series_name = unicode(self.series.text()).strip() if len(db.custom_column_label_map) == 0: self.central_widget.tabBar().setVisible(False) @@ -677,6 +689,7 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): _('The cover is not a valid picture')).exec_() else: self.cover.setPixmap(pix) + self.update_cover_tooltip() self.cover_changed = True self.cpixmap = pix self.cover_data = self.cover_fetcher.cover_data From 88a60c1610d5ccd0c154d5aa3df08faebb9f873a Mon Sep 17 00:00:00 2001 From: John Schember <john@nachtimwald.com> Date: Wed, 1 Dec 2010 18:27:33 -0500 Subject: [PATCH 242/375] TXT Output: Turn br tags into spaces. --- src/calibre/ebooks/txt/txtml.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/calibre/ebooks/txt/txtml.py b/src/calibre/ebooks/txt/txtml.py index 3ecb6940f8..48c94c2543 100644 --- a/src/calibre/ebooks/txt/txtml.py +++ b/src/calibre/ebooks/txt/txtml.py @@ -35,6 +35,7 @@ BLOCK_STYLES = [ SPACE_TAGS = [ 'td', + 'br', ] class TXTMLizer(object): From 04e3ba0e812c0b2443d19a6eb6a331b94695ed56 Mon Sep 17 00:00:00 2001 From: John Schember <john@nachtimwald.com> Date: Wed, 1 Dec 2010 18:51:49 -0500 Subject: [PATCH 243/375] TXT Output: Basic Markdown formatted output. --- src/calibre/ebooks/txt/output.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/calibre/ebooks/txt/output.py b/src/calibre/ebooks/txt/output.py index 15db4b1974..3c0d475460 100644 --- a/src/calibre/ebooks/txt/output.py +++ b/src/calibre/ebooks/txt/output.py @@ -8,6 +8,7 @@ import os from calibre.customize.conversion import OutputFormatPlugin, \ OptionRecommendation +from calibre.ebooks.txt.markdownml import MarkdownMLizer from calibre.ebooks.txt.txtml import TXTMLizer from calibre.ebooks.txt.newlines import TxtNewlines, specified_newlines @@ -44,10 +45,17 @@ class TXTOutput(OutputFormatPlugin): recommended_value=False, level=OptionRecommendation.LOW, help=_('Force splitting on the max-line-length value when no space ' 'is present. Also allows max-line-length to be below the minimum')), + OptionRecommendation(name='markdown_format', + recommended_value=False, level=OptionRecommendation.LOW, + help=_('Produce Markdown formatted text.')), ]) def convert(self, oeb_book, output_path, input_plugin, opts, log): - writer = TXTMLizer(log) + if opts.markdown_format: + writer = MarkdownMLizer(log) + else: + writer = TXTMLizer(log) + txt = writer.extract_content(oeb_book, opts) log.debug('\tReplacing newlines with selected type...') From 113ff417d66c6997aaf8428733026d8a50c61c2e Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Wed, 1 Dec 2010 18:05:35 -0700 Subject: [PATCH 244/375] Conversion pipeline: Respect max-width and max-height when calculating the effective size of an element --- src/calibre/ebooks/oeb/stylizer.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/calibre/ebooks/oeb/stylizer.py b/src/calibre/ebooks/oeb/stylizer.py index 4f8ae68943..84bce3864e 100644 --- a/src/calibre/ebooks/oeb/stylizer.py +++ b/src/calibre/ebooks/oeb/stylizer.py @@ -253,7 +253,10 @@ class Stylizer(object): upd = {} for prop in ('width', 'height'): val = elem.get(prop, '').strip() - del elem.attrib[prop] + try: + del elem.attrib[prop] + except: + pass if val: if num_pat.match(val) is not None: val += 'px' @@ -584,6 +587,13 @@ class Style(object): if isinstance(result, (unicode, str, bytes)): result = self._profile.width self._width = result + if 'max-width' in self._style: + result = self._unit_convert(self._style['max-width'], base=base) + if isinstance(result, (unicode, str, bytes)): + result = self._width + if result < self._width: + self._width = result + return self._width @property @@ -607,6 +617,13 @@ class Style(object): if isinstance(result, (unicode, str, bytes)): result = self._profile.height self._height = result + if 'max-height' in self._style: + result = self._unit_convert(self._style['max-height'], base=base) + if isinstance(result, (unicode, str, bytes)): + result = self._height + if result < self._height: + self._height = result + return self._height @property From 98a0970f02ed7d953085377f5b5afa69563546e3 Mon Sep 17 00:00:00 2001 From: John Schember <john@nachtimwald.com> Date: Wed, 1 Dec 2010 20:33:52 -0500 Subject: [PATCH 245/375] Add markdownml.py. TXT Output: Remove links option to make markdown output cleaner. --- src/calibre/ebooks/txt/markdownml.py | 40 ++++++++++++++++++++++++++++ src/calibre/ebooks/txt/output.py | 5 ++++ 2 files changed, 45 insertions(+) create mode 100644 src/calibre/ebooks/txt/markdownml.py diff --git a/src/calibre/ebooks/txt/markdownml.py b/src/calibre/ebooks/txt/markdownml.py new file mode 100644 index 0000000000..2ea3e7dafe --- /dev/null +++ b/src/calibre/ebooks/txt/markdownml.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- + +__license__ = 'GPL 3' +__copyright__ = '2009, John Schember <john@nachtimwald.com>' +__docformat__ = 'restructuredtext en' + +''' +Transform OEB content into Markdown formatted plain text +''' + +import re + +from lxml import etree + +from calibre.utils.html2text import html2text + +class MarkdownMLizer(object): + + def __init__(self, log): + self.log = log + + def extract_content(self, oeb_book, opts): + self.log.info('Converting XHTML to Markdown formatted TXT...') + self.oeb_book = oeb_book + self.opts = opts + + return self.mlize_spine() + + def mlize_spine(self): + output = [u''] + for item in self.oeb_book.spine: + self.log.debug('Converting %s to Markdown formatted TXT...' % item.href) + html = unicode(etree.tostring(item.data, encoding=unicode)) + if self.opts.remove_links: + html = re.sub(r'<\s*a[^>]*>', '', html) + html = re.sub(r'<\s*/\s*a\s*>', '', html) + output += html2text(html) + output = u''.join(output) + + return output diff --git a/src/calibre/ebooks/txt/output.py b/src/calibre/ebooks/txt/output.py index 3c0d475460..a6f52f92ca 100644 --- a/src/calibre/ebooks/txt/output.py +++ b/src/calibre/ebooks/txt/output.py @@ -48,6 +48,11 @@ class TXTOutput(OutputFormatPlugin): OptionRecommendation(name='markdown_format', recommended_value=False, level=OptionRecommendation.LOW, help=_('Produce Markdown formatted text.')), + OptionRecommendation(name='remove_links', + recommended_value=False, level=OptionRecommendation.LOW, + help=_('Remove links within the document. This is only ' \ + 'useful when paried with the markdown-format option because' \ + 'links are removed with plain text output.')), ]) def convert(self, oeb_book, output_path, input_plugin, opts, log): From f078aceb6cf5f9b1a1c589303ca6f24d5adb0d71 Mon Sep 17 00:00:00 2001 From: John Schember <john@nachtimwald.com> Date: Wed, 1 Dec 2010 21:03:54 -0500 Subject: [PATCH 246/375] TXT Output: Add GUI support for new markdown related options. --- src/calibre/gui2/convert/txt_output.py | 2 +- src/calibre/gui2/convert/txt_output.ui | 18 ++++++++++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/calibre/gui2/convert/txt_output.py b/src/calibre/gui2/convert/txt_output.py index 8b2e131ec6..3d35151bb8 100644 --- a/src/calibre/gui2/convert/txt_output.py +++ b/src/calibre/gui2/convert/txt_output.py @@ -21,7 +21,7 @@ class PluginWidget(Widget, Ui_Form): def __init__(self, parent, get_option, get_help, db=None, book_id=None): Widget.__init__(self, parent, ['newline', 'max_line_length', 'force_max_line_length', - 'inline_toc']) + 'inline_toc', 'markdown_format', 'remove_links']) self.db, self.book_id = db, book_id self.initialize_options(get_option, get_help, db, book_id) diff --git a/src/calibre/gui2/convert/txt_output.ui b/src/calibre/gui2/convert/txt_output.ui index 9eae5a8115..75eac8f5fc 100644 --- a/src/calibre/gui2/convert/txt_output.ui +++ b/src/calibre/gui2/convert/txt_output.ui @@ -6,7 +6,7 @@ <rect> <x>0</x> <y>0</y> - <width>400</width> + <width>470</width> <height>300</height> </rect> </property> @@ -27,7 +27,7 @@ <item row="0" column="1"> <widget class="QComboBox" name="opt_newline"/> </item> - <item row="4" column="0"> + <item row="6" column="0"> <spacer name="verticalSpacer"> <property name="orientation"> <enum>Qt::Vertical</enum> @@ -67,6 +67,20 @@ </property> </widget> </item> + <item row="4" column="0"> + <widget class="QCheckBox" name="opt_markdown_format"> + <property name="text"> + <string>Apply Markdown formatting to text</string> + </property> + </widget> + </item> + <item row="5" column="0"> + <widget class="QCheckBox" name="opt_remove_links"> + <property name="text"> + <string>Remove links (<a> tags) before processing</string> + </property> + </widget> + </item> </layout> </widget> <resources/> From b343837f65305b2729f78383260cc3944472d78d Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Wed, 1 Dec 2010 20:31:01 -0700 Subject: [PATCH 247/375] Conversion pipeline: Fix bug that caused height/width specified in %/em of screen size to be incorrectly calculated by a factor of 72./DPI --- src/calibre/customize/profiles.py | 2 ++ src/calibre/ebooks/oeb/stylizer.py | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/calibre/customize/profiles.py b/src/calibre/customize/profiles.py index 2ca3bb0c54..0a3945304a 100644 --- a/src/calibre/customize/profiles.py +++ b/src/calibre/customize/profiles.py @@ -37,6 +37,8 @@ class Plugin(_Plugin): self.fsizes.append((name, num, float(size))) self.fnames = dict((name, sz) for name, _, sz in self.fsizes if name) self.fnums = dict((num, sz) for _, num, sz in self.fsizes if num) + self.width_pts = self.width * 72./self.dpi + self.height_pts = self.height * 72./self.dpi # Input profiles {{{ class InputProfile(Plugin): diff --git a/src/calibre/ebooks/oeb/stylizer.py b/src/calibre/ebooks/oeb/stylizer.py index 84bce3864e..6c0c384eb3 100644 --- a/src/calibre/ebooks/oeb/stylizer.py +++ b/src/calibre/ebooks/oeb/stylizer.py @@ -575,7 +575,7 @@ class Style(object): if parent is not None: base = parent.width else: - base = self._profile.width + base = self._profile.width_pts if 'width' in self._element.attrib: width = self._element.attrib['width'] elif 'width' in self._style: @@ -605,7 +605,7 @@ class Style(object): if parent is not None: base = parent.height else: - base = self._profile.height + base = self._profile.height_pts if 'height' in self._element.attrib: height = self._element.attrib['height'] elif 'height' in self._style: From 63ef5a542510cc4556560cc2ace0b2395b5e7dc2 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Wed, 1 Dec 2010 20:35:08 -0700 Subject: [PATCH 248/375] MOBI Output: When the input document does not explicitly specify a size for images, set the size to be the natural size of the image. This works around Amazon's *truly wonderful* MOBI renderer's tendency to expand images that do not have a width and height specified. --- src/calibre/ebooks/mobi/mobiml.py | 41 ++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/src/calibre/ebooks/mobi/mobiml.py b/src/calibre/ebooks/mobi/mobiml.py index 98e7b6023c..8d20179250 100644 --- a/src/calibre/ebooks/mobi/mobiml.py +++ b/src/calibre/ebooks/mobi/mobiml.py @@ -10,9 +10,10 @@ import copy import re from lxml import etree from calibre.ebooks.oeb.base import namespace, barename -from calibre.ebooks.oeb.base import XHTML, XHTML_NS, OEB_DOCS +from calibre.ebooks.oeb.base import XHTML, XHTML_NS, OEB_DOCS, urlnormalize from calibre.ebooks.oeb.stylizer import Stylizer from calibre.ebooks.oeb.transforms.flatcss import KeyMapper +from calibre.utils.magick.draw import identify_data MBP_NS = 'http://mobipocket.com/ns/mbp' def MBP(name): return '{%s}%s' % (MBP_NS, name) @@ -121,6 +122,7 @@ class MobiMLizer(object): body = item.data.find(XHTML('body')) nroot = etree.Element(XHTML('html'), nsmap=MOBI_NSMAP) nbody = etree.SubElement(nroot, XHTML('body')) + self.current_spine_item = item self.mobimlize_elem(body, stylizer, BlockState(nbody), [FormatState()]) item.data = nroot @@ -357,8 +359,9 @@ class MobiMLizer(object): if tag == 'img' and 'src' in elem.attrib: istate.attrib['src'] = elem.attrib['src'] istate.attrib['align'] = 'baseline' + cssdict = style.cssdict() for prop in ('width', 'height'): - if style[prop] != 'auto': + if cssdict[prop] != 'auto': value = style[prop] if value == getattr(self.profile, prop): result = '100%' @@ -371,8 +374,40 @@ class MobiMLizer(object): (72./self.profile.dpi))) except: continue - result = "%d"%pixs + result = str(pixs) istate.attrib[prop] = result + if 'width' not in istate.attrib or 'height' not in istate.attrib: + href = self.current_spine_item.abshref(elem.attrib['src']) + try: + item = self.oeb.manifest.hrefs[urlnormalize(href)] + except: + self.oeb.logger.warn('Failed to find image:', + href) + else: + try: + width, height = identify_data(item.data)[:2] + except: + self.oeb.logger.warn('Invalid image:', href) + else: + if 'width' not in istate.attrib and 'height' not in \ + istate.attrib: + istate.attrib['width'] = str(width) + istate.attrib['height'] = str(height) + else: + ar = float(width)/float(height) + if 'width' not in istate.attrib: + try: + width = int(istate.attrib['height'])*ar + except: + pass + istate.attrib['width'] = str(int(width)) + else: + try: + height = int(istate.attrib['width'])/ar + except: + pass + istate.attrib['height'] = str(int(height)) + item.unload_data_from_memory() elif tag == 'hr' and asfloat(style['width']) > 0: prop = style['width'] / self.profile.width istate.attrib['width'] = "%d%%" % int(round(prop * 100)) From 51a2f3d65208060e3470f78a4754631234a02872 Mon Sep 17 00:00:00 2001 From: Translators <> Date: Thu, 2 Dec 2010 04:45:22 +0000 Subject: [PATCH 249/375] Launchpad automatic translations update. --- src/calibre/translations/cs.po | 28 ++++++++++++++++++++++++++-- src/calibre/translations/fr.po | 24 +++++++++++++++++------- 2 files changed, 43 insertions(+), 9 deletions(-) diff --git a/src/calibre/translations/cs.po b/src/calibre/translations/cs.po index 830d85b321..919be301bc 100644 --- a/src/calibre/translations/cs.po +++ b/src/calibre/translations/cs.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: calibre\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" "POT-Creation-Date: 2010-11-27 20:21+0000\n" -"PO-Revision-Date: 2010-11-29 19:40+0000\n" +"PO-Revision-Date: 2010-12-01 22:11+0000\n" "Last-Translator: Marek Sušický <Unknown>\n" "Language-Team: Czech <cs@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-30 04:45+0000\n" +"X-Launchpad-Export-Date: 2010-12-02 04:45+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 @@ -5011,6 +5011,10 @@ msgid "" "- A regex pattern of a single dot excludes all genre tags, generating no " "Genre Section" msgstr "" +"Tipy k regulárním výrazům:\n" +"- Výchozí regex - \\[.+\\] - vylučuje žánrové tagy z formy [tag], t.j. " +"[Amazon Freebie]\n" +"- Vzor regexpu . vylučuje všechny tagy žánrů, negeneruje sekci žánrů" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:90 msgid "Include 'Titles' Section" @@ -7296,6 +7300,10 @@ msgid "" "Using this button to create author sort will change author sort from red to " "green." msgstr "" +"Automaticky vytvoří třídění dle autora založené na aktuálně zadaných " +"autorech.\n" +"Použitím tohoto tlačítka k vytvoření třídění dle autora změní třídění z " +"červené na zelenou." #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:396 msgid "Remove unused series (Series that have no books)" @@ -11277,6 +11285,10 @@ msgid "" "Default: '%default'\n" "Applies to: BIBTEX output format" msgstr "" +"BibTeX flag kódování.\n" +"Dostupné typy: strict, replace, ignore, backslashreplace.\n" +"Výchozí: '%default'\n" +"Použije se na: BIBTEX výstupní formát" #: /home/kovid/work/calibre/src/calibre/library/catalog.py:270 msgid "" @@ -11341,6 +11353,9 @@ msgid "" "Default: '%default'\n" "Applies to: ePub, MOBI output formats" msgstr "" +"Zahrnout 'Série' sekci do katalogu.\n" +"Výchozí: '%default'\n" +"Použije se na: ePub, MOBI výstupní formáty" #: /home/kovid/work/calibre/src/calibre/library/catalog.py:585 msgid "" @@ -11358,6 +11373,10 @@ msgid "" "Default: '%default'\n" "Applies to: ePub, MOBI output formats" msgstr "" +"Tag předpona pro uživatelské poznámky, např. '*Jeff might enjoy reading " +"this'.\n" +"Výchozí: '%default'\n" +"Použije se na: ePub, MOBI výstupní formáty" #: /home/kovid/work/calibre/src/calibre/library/catalog.py:599 msgid "" @@ -11628,6 +11647,11 @@ msgid "" "id.\n" "id is an id number from the list command.\n" msgstr "" +"\n" +"%prog show_metadata [options] id\n" +"\n" +"Ukázat metadata uložená v calibre databázi pro knihu identifikovanou id.\n" +"id je číslo ze seznamu příkazů.\n" #: /home/kovid/work/calibre/src/calibre/library/cli.py:439 msgid "Print metadata in OPF form (XML)" diff --git a/src/calibre/translations/fr.po b/src/calibre/translations/fr.po index 38933f4a69..cca9e97072 100644 --- a/src/calibre/translations/fr.po +++ b/src/calibre/translations/fr.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: calibre 0.4.22\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-11-27 20:21+0000\n" -"PO-Revision-Date: 2010-11-29 05:41+0000\n" -"Last-Translator: Vincent C. <Unknown>\n" +"PO-Revision-Date: 2010-12-02 02:39+0000\n" +"Last-Translator: sengian <Unknown>\n" "Language-Team: Français <kde-i18n-doc@kde.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-30 04:45+0000\n" +"X-Launchpad-Export-Date: 2010-12-02 04:45+0000\n" "X-Generator: Launchpad (build Unknown)\n" "X-Poedit-Bookmarks: 1177,1104,-1,-1,-1,-1,-1,-1,-1,-1\n" "Generated-By: pygettext.py 1.5\n" @@ -837,7 +837,7 @@ msgstr "Communiquer avec le lecteur PocketBook 301" #: /home/kovid/work/calibre/src/calibre/devices/eb600/driver.py:233 msgid "Communicate with the PocketBook 602 reader." -msgstr "" +msgstr "Communiquer avec le lecteur PocketBook 602." #: /home/kovid/work/calibre/src/calibre/devices/edge/driver.py:17 msgid "Entourage Edge" @@ -1052,7 +1052,7 @@ msgstr "Communiquer avec le GM2000" #: /home/kovid/work/calibre/src/calibre/devices/misc.py:180 msgid "Communicate with the Acer Lumiread" -msgstr "" +msgstr "Communiquer avec l'Acer Lumiread" #: /home/kovid/work/calibre/src/calibre/devices/nokia/driver.py:17 msgid "Communicate with the Nokia 770 internet tablet." @@ -6529,6 +6529,14 @@ msgid "" "enter the full path to the file after a <code>>></code>. For example:</p>\n" "<p><code>9788842915232 >> %s</code></p>" msgstr "" +"<p>Entrer une liste d'ISBNs dans la boite à gauche, une par ligne. Calibre " +"va automatiquement créer des entrées pour ces livres à partir de l'ISBN et " +"télécharger les métadonnées et la couverture correspondantes.</p>\n" +"<p>Tous les ISBNs invalides de la liste seront ignorés.</p>\n" +"<p>Vous pouvez aussi spécifier un fichier qui sera ajouté avec chaque ISBN. " +"Pour faire celà, entrez le chemin complet du fichier après <code>>></code>. " +"Par exemple :</p>\n" +"<p><code>9788842915232 >> %s</code></p>" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_from_isbn_ui.py:53 msgid "&Paste from clipboard" @@ -8451,7 +8459,7 @@ msgstr "News :" #: /home/kovid/work/calibre/src/calibre/gui2/email.py:189 msgid "Attached is the %s periodical downloaded by calibre." -msgstr "" +msgstr "Trouvez en pièce jointe le périodique %s téléchargé par Calibre." #: /home/kovid/work/calibre/src/calibre/gui2/email.py:242 msgid "E-book:" @@ -8489,7 +8497,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/email.py:303 msgid "Failed to email book" -msgstr "" +msgstr "Echec de l'envoi du livre par mél" #: /home/kovid/work/calibre/src/calibre/gui2/email.py:306 msgid "sent" @@ -11549,6 +11557,8 @@ msgstr "&SSL" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:143 msgid "WARNING: Using no encryption is highly insecure" msgstr "" +"ATTENTION : Ne pas utiliser de système d'encryptage présente un fort risque " +"au niveau de la sécurité" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:144 msgid "&None" From 28732ccbdbd17e7946a0cfea67bdcc9f9d50893b Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Wed, 1 Dec 2010 21:55:02 -0700 Subject: [PATCH 250/375] Fix #7424 (Formats hyperlinks are inconsistently launched) --- src/calibre/gui2/actions/show_book_details.py | 3 ++- src/calibre/gui2/dialogs/book_info.py | 8 +++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/calibre/gui2/actions/show_book_details.py b/src/calibre/gui2/actions/show_book_details.py index 18b0a694bf..67903a7d58 100644 --- a/src/calibre/gui2/actions/show_book_details.py +++ b/src/calibre/gui2/actions/show_book_details.py @@ -29,5 +29,6 @@ class ShowBookDetailsAction(InterfaceAction): return index = self.gui.library_view.currentIndex() if index.isValid(): - BookInfo(self.gui, self.gui.library_view, index).show() + BookInfo(self.gui, self.gui.library_view, index, + self.gui.iactions['View'].view_format_by_id).show() diff --git a/src/calibre/gui2/dialogs/book_info.py b/src/calibre/gui2/dialogs/book_info.py index 4cbe0ace7f..df21314712 100644 --- a/src/calibre/gui2/dialogs/book_info.py +++ b/src/calibre/gui2/dialogs/book_info.py @@ -15,12 +15,13 @@ from calibre.library.comments import comments_to_html class BookInfo(QDialog, Ui_BookInfo): - def __init__(self, parent, view, row): + def __init__(self, parent, view, row, view_func): QDialog.__init__(self, parent) Ui_BookInfo.__init__(self) self.setupUi(self) self.cover_pixmap = None self.comments.sizeHint = self.comments_size_hint + self.view_func = view_func desktop = QCoreApplication.instance().desktop() screen_height = desktop.availableGeometry().height() - 100 @@ -58,10 +59,7 @@ class BookInfo(QDialog, Ui_BookInfo): if os.sep in path: open_local_file(path) else: - path = self.view.model().db.format_abspath(self.current_row, path) - if path is not None: - open_local_file(path) - + self.view_func(self.view.model().id(self.current_row), path) def next(self): row = self.view.currentIndex().row() From 882d16ffd19db7926eb0fc2457cec1269de1f75b Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Thu, 2 Dec 2010 09:15:11 +0000 Subject: [PATCH 251/375] Make advanced_search save history --- src/calibre/gui2/search_box.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py index 1cdf622537..c85dafc6d8 100644 --- a/src/calibre/gui2/search_box.py +++ b/src/calibre/gui2/search_box.py @@ -384,7 +384,7 @@ class SearchBoxMixin(object): # {{{ def do_advanced_search(self, *args): d = SearchDialog(self, self.library_view.model().db) if d.exec_() == QDialog.Accepted: - self.search.set_search_string(d.search_string()) + self.search.set_search_string(d.search_string(), store_in_history=True) def do_search_button(self): self.search.do_search() From 6ba2d854fa5253900a61a04576ff5b91ffe78be4 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Thu, 2 Dec 2010 09:16:27 +0000 Subject: [PATCH 252/375] Fix #7740: CC ratings showing doubled on book info (and mobile browser) --- src/calibre/ebooks/metadata/book/base.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index 125cd542b8..f0844e3711 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -531,6 +531,8 @@ class Metadata(object): res = format_date(res, cmeta['display'].get('date_format','dd MMM yyyy')) elif datatype == 'bool': res = _('Yes') if res else _('No') + elif datatype == 'rating': + res = res/2 return (name, unicode(res), orig_res, cmeta) # Translate aliases into the standard field name From 438e0d5305c314c55768b6f3996a7c6f45a6226d Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Thu, 2 Dec 2010 09:16:45 +0000 Subject: [PATCH 253/375] Better enum-type help text --- .../gui2/preferences/create_custom_column.py | 17 +++++++++-------- .../gui2/preferences/create_custom_column.ui | 5 ++++- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/calibre/gui2/preferences/create_custom_column.py b/src/calibre/gui2/preferences/create_custom_column.py index ff44080022..47fcb58afb 100644 --- a/src/calibre/gui2/preferences/create_custom_column.py +++ b/src/calibre/gui2/preferences/create_custom_column.py @@ -27,21 +27,21 @@ class CreateCustomColumn(QDialog, Ui_QCreateCustomColumn): 3:{'datatype':'series', 'text':_('Text column for keeping series-like information'), 'is_multiple':False}, - 4:{'datatype':'datetime', + 4:{'datatype':'enumeration', + 'text':_('Text, but with a fixed set of permitted values'), 'is_multiple':False}, + 5:{'datatype':'datetime', 'text':_('Date'), 'is_multiple':False}, - 5:{'datatype':'float', + 6:{'datatype':'float', 'text':_('Floating point numbers'), 'is_multiple':False}, - 6:{'datatype':'int', + 7:{'datatype':'int', 'text':_('Integers'), 'is_multiple':False}, - 7:{'datatype':'rating', + 8:{'datatype':'rating', 'text':_('Ratings, shown with stars'), 'is_multiple':False}, - 8:{'datatype':'bool', + 9:{'datatype':'bool', 'text':_('Yes/No'), 'is_multiple':False}, - 9:{'datatype':'composite', + 10:{'datatype':'composite', 'text':_('Column built from other columns'), 'is_multiple':False}, - 10:{'datatype':'enumeration', - 'text':_('Fixed set of text values'), 'is_multiple':False}, } def __init__(self, parent, editing, standard_colheads, standard_colnames): @@ -61,6 +61,7 @@ class CreateCustomColumn(QDialog, Ui_QCreateCustomColumn): self.editing_col = editing self.standard_colheads = standard_colheads self.standard_colnames = standard_colnames + self.column_type_box.setMaxVisibleItems(len(self.column_types)) for t in self.column_types: self.column_type_box.addItem(self.column_types[t]['text']) self.column_type_box.currentIndexChanged.connect(self.datatype_changed) diff --git a/src/calibre/gui2/preferences/create_custom_column.ui b/src/calibre/gui2/preferences/create_custom_column.ui index 3e4c6f59ca..1328f99690 100644 --- a/src/calibre/gui2/preferences/create_custom_column.ui +++ b/src/calibre/gui2/preferences/create_custom_column.ui @@ -212,7 +212,7 @@ <item> <widget class="QLineEdit" name="enum_box"> <property name="toolTip"> - <string>A comma-separated list of valid values.</string> + <string>A comma-separated list of permitted values. The empty value is always permitted</string> </property> <property name="sizePolicy"> <sizepolicy hsizetype="Maximum" vsizetype="Fixed"> @@ -227,6 +227,9 @@ <property name="text"> <string>Default: (nothing)</string> </property> + <property name="toolTip"> + <string>Note that the empty value is always permitted, but is not shown in the list</string> + </property> </widget> </item> </layout> From d744fb698b96870249a72402cc1db39d0fe81cc2 Mon Sep 17 00:00:00 2001 From: John Schember <john@nachtimwald.com> Date: Thu, 2 Dec 2010 06:54:36 -0500 Subject: [PATCH 254/375] TXT Output: change remove links to keep links and remove links by default with Markdown format output. TXT Output: Add keep image references option and remove images by default with Markdown format output. --- src/calibre/ebooks/txt/markdownml.py | 5 ++++- src/calibre/ebooks/txt/output.py | 13 +++++++++---- src/calibre/gui2/convert/txt_output.py | 2 +- src/calibre/gui2/convert/txt_output.ui | 15 +++++++++++---- 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/calibre/ebooks/txt/markdownml.py b/src/calibre/ebooks/txt/markdownml.py index 2ea3e7dafe..2f7960e94c 100644 --- a/src/calibre/ebooks/txt/markdownml.py +++ b/src/calibre/ebooks/txt/markdownml.py @@ -31,9 +31,12 @@ class MarkdownMLizer(object): for item in self.oeb_book.spine: self.log.debug('Converting %s to Markdown formatted TXT...' % item.href) html = unicode(etree.tostring(item.data, encoding=unicode)) - if self.opts.remove_links: + if not self.opts.keep_links: html = re.sub(r'<\s*a[^>]*>', '', html) html = re.sub(r'<\s*/\s*a\s*>', '', html) + if not self.opts.keep_image_references: + html = re.sub(r'<\s*img[^>]*>', '', html) + html = re.sub(r'<\s*img\s*>', '', html) output += html2text(html) output = u''.join(output) diff --git a/src/calibre/ebooks/txt/output.py b/src/calibre/ebooks/txt/output.py index a6f52f92ca..a6369b6f0b 100644 --- a/src/calibre/ebooks/txt/output.py +++ b/src/calibre/ebooks/txt/output.py @@ -48,11 +48,16 @@ class TXTOutput(OutputFormatPlugin): OptionRecommendation(name='markdown_format', recommended_value=False, level=OptionRecommendation.LOW, help=_('Produce Markdown formatted text.')), - OptionRecommendation(name='remove_links', + OptionRecommendation(name='keep_links', recommended_value=False, level=OptionRecommendation.LOW, - help=_('Remove links within the document. This is only ' \ - 'useful when paried with the markdown-format option because' \ - 'links are removed with plain text output.')), + help=_('Do not remove links within the document. This is only ' \ + 'useful when paired with the markdown-format option because' \ + 'links are always removed with plain text output.')), + OptionRecommendation(name='keep_image_references', + recommended_value=False, level=OptionRecommendation.LOW, + help=_('Do not remove image references within the document. This is only ' \ + 'useful when paired with the markdown-format option because' \ + 'image references are always removed with plain text output.')), ]) def convert(self, oeb_book, output_path, input_plugin, opts, log): diff --git a/src/calibre/gui2/convert/txt_output.py b/src/calibre/gui2/convert/txt_output.py index 3d35151bb8..2fafad4b43 100644 --- a/src/calibre/gui2/convert/txt_output.py +++ b/src/calibre/gui2/convert/txt_output.py @@ -21,7 +21,7 @@ class PluginWidget(Widget, Ui_Form): def __init__(self, parent, get_option, get_help, db=None, book_id=None): Widget.__init__(self, parent, ['newline', 'max_line_length', 'force_max_line_length', - 'inline_toc', 'markdown_format', 'remove_links']) + 'inline_toc', 'markdown_format', 'keep_links', 'keep_image_references']) self.db, self.book_id = db, book_id self.initialize_options(get_option, get_help, db, book_id) diff --git a/src/calibre/gui2/convert/txt_output.ui b/src/calibre/gui2/convert/txt_output.ui index 75eac8f5fc..19e4ec52a1 100644 --- a/src/calibre/gui2/convert/txt_output.ui +++ b/src/calibre/gui2/convert/txt_output.ui @@ -6,7 +6,7 @@ <rect> <x>0</x> <y>0</y> - <width>470</width> + <width>477</width> <height>300</height> </rect> </property> @@ -27,7 +27,7 @@ <item row="0" column="1"> <widget class="QComboBox" name="opt_newline"/> </item> - <item row="6" column="0"> + <item row="7" column="0"> <spacer name="verticalSpacer"> <property name="orientation"> <enum>Qt::Vertical</enum> @@ -75,9 +75,16 @@ </widget> </item> <item row="5" column="0"> - <widget class="QCheckBox" name="opt_remove_links"> + <widget class="QCheckBox" name="opt_keep_links"> <property name="text"> - <string>Remove links (<a> tags) before processing</string> + <string>Do not remove links (<a> tags) before processing</string> + </property> + </widget> + </item> + <item row="6" column="0"> + <widget class="QCheckBox" name="opt_keep_image_references"> + <property name="text"> + <string>Do not remove image references before processing</string> </property> </widget> </item> From 5cdc87fc8962a830d940db7bfbf1756feb4ccfbe Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Thu, 2 Dec 2010 12:25:16 +0000 Subject: [PATCH 255/375] Enumeration type custom columns --- src/calibre/gui2/custom_column_widgets.py | 42 +++++++++++++------ src/calibre/gui2/library/delegates.py | 12 ++++-- .../gui2/preferences/create_custom_column.ui | 4 +- src/calibre/library/custom_columns.py | 39 +++++++++++------ src/calibre/library/sqlite.py | 13 ++++++ 5 files changed, 78 insertions(+), 32 deletions(-) diff --git a/src/calibre/gui2/custom_column_widgets.py b/src/calibre/gui2/custom_column_widgets.py index 0b2065888c..b0b68033bb 100644 --- a/src/calibre/gui2/custom_column_widgets.py +++ b/src/calibre/gui2/custom_column_widgets.py @@ -15,7 +15,7 @@ from PyQt4.Qt import QComboBox, QLabel, QSpinBox, QDoubleSpinBox, QDateEdit, \ from calibre.utils.date import qt_to_dt, now from calibre.gui2.widgets import TagsLineEdit, EnComboBox -from calibre.gui2 import UNDEFINED_QDATE +from calibre.gui2 import UNDEFINED_QDATE, error_dialog from calibre.utils.config import tweaks class Base(object): @@ -313,22 +313,29 @@ class Series(Base): class Enumeration(Base): def setup_ui(self, parent): + self.parent = parent self.widgets = [QLabel('&'+self.col_metadata['name']+':', parent), QComboBox(parent)] w = self.widgets[1] vals = self.col_metadata['display']['enum_values'] - w.addItem('') for v in vals: w.addItem(v) def initialize(self, book_id): val = self.db.get_custom(book_id, num=self.col_id, index_is_id=True) if val is None: - val = '' + # This really shouldn't happen + val = self.col_metadata['display']['enum_values'][0] self.initial_val = val val = self.normalize_db_val(val) idx = self.widgets[1].findText(val) if idx < 0: + error_dialog(self.parent, '', + _('The enumeration "{0}" contains an invalid value ' + 'that will be set to the default').format( + self.col_metadata['name']), + show=True, show_copy_button=False) + idx = 0 self.widgets[1].setCurrentIndex(idx) @@ -586,20 +593,33 @@ class BulkEnumeration(BulkBase, Enumeration): def get_initial_value(self, book_ids): value = None + ret_value = None + dialog_shown = False for book_id in book_ids: val = self.db.get_custom(book_id, num=self.col_id, index_is_id=True) - if value is not None and value != val: - return ' nochange ' + if val not in self.col_metadata['display']['enum_values']: + if not dialog_shown: + error_dialog(self.parent, '', + _('The enumeration "{0}" contains invalid values ' + 'that will not appear in the list').format( + self.col_metadata['name']), + show=True, show_copy_button=False) + dialog_shown = True + ret_value = ' nochange ' + elif value is not None and value != val: + ret_value = ' nochange ' value = val - return value + if ret_value is None: + return value + return ret_value def setup_ui(self, parent): + self.parent = parent self.widgets = [QLabel('&'+self.col_metadata['name']+':', parent), QComboBox(parent)] w = self.widgets[1] vals = self.col_metadata['display']['enum_values'] w.addItem('Do Not Change') - w.addItem('') for v in vals: w.addItem(v) @@ -620,14 +640,10 @@ class BulkEnumeration(BulkBase, Enumeration): if val != self.initial_val and val != ' nochange ': self.db.set_custom_bulk(book_ids, val, num=self.col_id, notify=notify) - def normalize_ui_val(self, val): - if val == '': - return None - return val - def normalize_db_val(self, val): if val is None: - return '' + # this really shouldn't happen + val = self.col_metadata['display']['enum_values'][0] return val class RemoveTags(QWidget): diff --git a/src/calibre/gui2/library/delegates.py b/src/calibre/gui2/library/delegates.py index f5610bf849..73d722e485 100644 --- a/src/calibre/gui2/library/delegates.py +++ b/src/calibre/gui2/library/delegates.py @@ -262,9 +262,7 @@ class CcEnumDelegate(QStyledItemDelegate): # {{{ def createEditor(self, parent, option, index): m = index.model() col = m.column_map[index.column()] - print 'delegate' editor = QComboBox(parent) - editor.addItem('') for v in m.custom_columns[col]['display']['enum_values']: editor.addItem(v) return editor @@ -272,14 +270,20 @@ class CcEnumDelegate(QStyledItemDelegate): # {{{ def setModelData(self, editor, model, index): val = unicode(editor.currentText()) if val == '': - val = None + # This shouldn't happen ... + m = index.model() + col = m.column_map[index.column()] + val = m.custom_columns[col]['display']['enum_values'][0] model.setData(index, QVariant(val), Qt.EditRole) def setEditorData(self, editor, index): m = index.model() val = m.db.data[index.row()][m.custom_columns[m.column_map[index.column()]]['rec_index']] if val is None: - val = '' + # This shouldn't happen + m = index.model() + col = m.column_map[index.column()] + val = m.custom_columns[col]['display']['enum_values'][0] idx = editor.findText(val) if idx < 0: editor.setCurrentIndex(0) diff --git a/src/calibre/gui2/preferences/create_custom_column.ui b/src/calibre/gui2/preferences/create_custom_column.ui index 1328f99690..54003cd770 100644 --- a/src/calibre/gui2/preferences/create_custom_column.ui +++ b/src/calibre/gui2/preferences/create_custom_column.ui @@ -212,7 +212,7 @@ <item> <widget class="QLineEdit" name="enum_box"> <property name="toolTip"> - <string>A comma-separated list of permitted values. The empty value is always permitted</string> + <string>A comma-separated list of permitted values. The first value is the default</string> </property> <property name="sizePolicy"> <sizepolicy hsizetype="Maximum" vsizetype="Fixed"> @@ -228,7 +228,7 @@ <string>Default: (nothing)</string> </property> <property name="toolTip"> - <string>Note that the empty value is always permitted, but is not shown in the list</string> + <string>The first value entered will be the default value for this enumeration</string> </property> </widget> </item> diff --git a/src/calibre/library/custom_columns.py b/src/calibre/library/custom_columns.py index 258b18e7ff..9444746c2a 100644 --- a/src/calibre/library/custom_columns.py +++ b/src/calibre/library/custom_columns.py @@ -177,6 +177,8 @@ class CustomColumns(object): ans = ans.split('|') if ans else [] if data['display'].get('sort_alpha', False): ans.sort(cmp=lambda x,y:cmp(x.lower(), y.lower())) + elif data['datatype'] == 'enumeration' and ans is None: + ans = data['display']['enum_values'][0] return ans def get_custom_extra(self, idx, label=None, num=None, index_is_id=False): @@ -442,7 +444,6 @@ class CustomColumns(object): if data['normalized']: if data['datatype'] == 'enumeration' and \ val not in data['display']['enum_values']: - print 'attempt to set enum to', val return None if not append or not data['is_multiple']: self.conn.execute('DELETE FROM %s WHERE book=?'%lt, (id_,)) @@ -524,18 +525,30 @@ class CustomColumns(object): display = data['display'] table, lt = self.custom_table_names(data['num']) if data['normalized']: - query = '%s.value' - if data['is_multiple']: - query = 'group_concat(%s.value, "|")' - if not display.get('sort_alpha', False): - query = 'sort_concat(link.id, %s.value)' - line = '''(SELECT {query} FROM {lt} AS link INNER JOIN - {table} ON(link.value={table}.id) WHERE link.book=books.id) - custom_{num} - '''.format(query=query%table, lt=lt, table=table, num=data['num']) - if data['datatype'] == 'series': - line += ''',(SELECT extra FROM {lt} WHERE {lt}.book=books.id) - custom_index_{num}'''.format(lt=lt, num=data['num']) + if data['datatype'] == 'enumeration': + query = '%s.value' + line = ''' + val_for_enum(\' + SELECT {table}.value FROM {lt} + AS link INNER JOIN {table} ON(link.value={table}.id) + WHERE link.book=?\', + \'{default}\', books.id) custom_{num} + '''.format(lt=lt, table=table, + default=data['display']['enum_values'][0], + num=data['num']) + else: + query = '%s.value' + if data['is_multiple']: + query = 'group_concat(%s.value, "|")' + if not display.get('sort_alpha', False): + query = 'sort_concat(link.id, %s.value)' + line = '''(SELECT {query} FROM {lt} AS link INNER JOIN + {table} ON(link.value={table}.id) WHERE link.book=books.id) + custom_{num} + '''.format(query=query%table, lt=lt, table=table, num=data['num']) + if data['datatype'] == 'series': + line += ''',(SELECT extra FROM {lt} WHERE {lt}.book=books.id) + custom_index_{num}'''.format(lt=lt, num=data['num']) else: line = ''' (SELECT value FROM {table} WHERE book=books.id) custom_{num} diff --git a/src/calibre/library/sqlite.py b/src/calibre/library/sqlite.py index 8aa76b2643..9682bd7ec6 100644 --- a/src/calibre/library/sqlite.py +++ b/src/calibre/library/sqlite.py @@ -115,6 +115,17 @@ def pynocase(one, two, encoding='utf-8'): pass return cmp(one.lower(), two.lower()) +def enum_col_value(select, def_val, id, conn=None): + try: + v = conn.get(select, (id,), all=False) + if v is None: + v = def_val + except Exception, e: + if DEBUG: + print 'enum_col_value failed' + print e + v = def_val + return v def load_c_extensions(conn, debug=DEBUG): try: @@ -165,6 +176,8 @@ class DBThread(Thread): self.conn.create_function('author_to_author_sort', 1, _author_to_author_sort) self.conn.create_function('uuid4', 0, lambda : str(uuid.uuid4())) + self.conn.create_function('val_for_enum', 3, + partial(enum_col_value, conn=self.conn)) # Dummy functions for dynamically created filters self.conn.create_function('books_list_filter', 1, lambda x: 1) From 8032890d0f352034b95bdf0482fbbf34b1d9f22d Mon Sep 17 00:00:00 2001 From: John Schember <john@nachtimwald.com> Date: Thu, 2 Dec 2010 07:37:38 -0500 Subject: [PATCH 256/375] TXT Output: Markdown output, ensure separation between sections. --- src/calibre/ebooks/txt/markdownml.py | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/calibre/ebooks/txt/markdownml.py b/src/calibre/ebooks/txt/markdownml.py index 2f7960e94c..116561f355 100644 --- a/src/calibre/ebooks/txt/markdownml.py +++ b/src/calibre/ebooks/txt/markdownml.py @@ -28,16 +28,36 @@ class MarkdownMLizer(object): def mlize_spine(self): output = [u''] + for item in self.oeb_book.spine: self.log.debug('Converting %s to Markdown formatted TXT...' % item.href) + html = unicode(etree.tostring(item.data, encoding=unicode)) + if not self.opts.keep_links: html = re.sub(r'<\s*a[^>]*>', '', html) html = re.sub(r'<\s*/\s*a\s*>', '', html) if not self.opts.keep_image_references: html = re.sub(r'<\s*img[^>]*>', '', html) html = re.sub(r'<\s*img\s*>', '', html) - output += html2text(html) + + text = html2text(html) + + # Ensure the section ends with at least two new line characters. + # This is to prevent the last paragraph from a section being + # combined into the fist paragraph of the next. + end_chars = text[-4:] + # Convert all newlines to \n + end_chars = end_chars.replace('\r\n', '\n') + end_chars = end_chars.replace('\r', '\n') + end_chars = end_chars[-2:] + if not end_chars[1] == '\n': + text += '\n\n' + if end_chars[1] == '\n' and not end_chars[0] == '\n': + text += '\n' + + output += text + output = u''.join(output) return output From da750b141071dab819145610a23d302181ac8ec8 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Thu, 2 Dec 2010 14:07:39 +0000 Subject: [PATCH 257/375] Some random changes: 1) added a 'count' function to the template language 2) changed the template language faq 3) made author_sort searchable 4) improved the help in calibredb create_custom_column --- src/calibre/library/cli.py | 6 ++++-- src/calibre/library/field_metadata.py | 2 +- src/calibre/manual/template_lang.rst | 5 +++-- src/calibre/utils/formatter.py | 13 +++++++++++-- 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/calibre/library/cli.py b/src/calibre/library/cli.py index 747cd59abb..5049476226 100644 --- a/src/calibre/library/cli.py +++ b/src/calibre/library/cli.py @@ -565,8 +565,9 @@ datatype is one of: {0} 'applies if datatype is text.')) parser.add_option('--display', default='{}', help=_('A dictionary of options to customize how ' - 'the data in this column will be interpreted.')) - + 'the data in this column will be interpreted. This is a JSON ' + ' string. For enumeration columns, use ' + '--display=\'{"enum_values":["val1", "val2"]}\'')) return parser @@ -579,6 +580,7 @@ def command_add_custom_column(args, dbpath): print print >>sys.stderr, _('You must specify label, name and datatype') return 1 + print opts.display do_add_custom_column(get_db(dbpath, opts), args[0], args[1], args[2], opts.is_multiple, json.loads(opts.display)) # Re-open the DB so that field_metadata is reflects the column changes diff --git a/src/calibre/library/field_metadata.py b/src/calibre/library/field_metadata.py index f5a156d3a7..1be6604d5d 100644 --- a/src/calibre/library/field_metadata.py +++ b/src/calibre/library/field_metadata.py @@ -177,7 +177,7 @@ class FieldMetadata(dict): 'is_multiple':None, 'kind':'field', 'name':None, - 'search_terms':[], + 'search_terms':['author_sort'], 'is_custom':False, 'is_category':False}), ('comments', {'table':None, diff --git a/src/calibre/manual/template_lang.rst b/src/calibre/manual/template_lang.rst index e1eb876cb7..1bef32fbd6 100644 --- a/src/calibre/manual/template_lang.rst +++ b/src/calibre/manual/template_lang.rst @@ -119,10 +119,11 @@ The functions available are: * ``ifempty(text)`` -- if the field is not empty, return the value of the field. Otherwise return `text`. * ``test(text if not empty, text if empty)`` -- return `text if not empty` if the field is not empty, otherwise return `text if empty`. * ``contains(pattern, text if match, text if not match`` -- checks if field contains matches for the regular expression `pattern`. Returns `text if match` if matches are found, otherwise it returns `text if no match`. - * ``switch(pattern, value, pattern, value, ..., else_value)`` -- for each ``pattern, value`` pair, checks if the field matches the regular expression ``pattern`` and if so, returns that ``value``. If no ``pattern`` matches, then ``else_value`` is returned. You can have as many ``pattern, value`` pairs as you want. + * ``count(separator)`` -- interprets the value as a list of items separated by `separator`, returning the number of items in the list. Most lists use a comma as the separator, but authors uses an ampersand. Examples: `{tags:count(,)}`, `{authors:count(&)}` + * ``lookup(pattern, field, pattern, field, ..., else_field)`` -- like switch, except the arguments are field (metadata) names, not text. The value of the appropriate field will be fetched and used. Note that because composite columns are fields, you can use this function in one composite field to use the value of some other composite field. This is extremely useful when constructing variable save paths (more later). * ``re(pattern, replacement)`` -- return the field after applying the regular expression. All instances of `pattern` are replaced with `replacement`. As in all of |app|, these are python-compatible regular expressions. * ``shorten(left chars, middle text, right chars)`` -- Return a shortened version of the field, consisting of `left chars` characters from the beginning of the field, followed by `middle text`, followed by `right chars` characters from the end of the string. `Left chars` and `right chars` must be integers. For example, assume the title of the book is `Ancient English Laws in the Times of Ivanhoe`, and you want it to fit in a space of at most 15 characters. If you use ``{title:shorten(9,-,5)}``, the result will be `Ancient E-nhoe`. If the field's length is less than ``left chars`` + ``right chars`` + the length of ``middle text``, then the field will be used intact. For example, the title `The Dome` would not be changed. - * ``lookup(pattern, field, pattern, field, ..., else_field)`` -- like switch, except the arguments are field (metadata) names, not text. The value of the appropriate field will be fetched and used. Note that because composite columns are fields, you can use this function in one composite field to use the value of some other composite field. This is extremely useful when constructing variable save paths (more later). + * ``switch(pattern, value, pattern, value, ..., else_value)`` -- for each ``pattern, value`` pair, checks if the field matches the regular expression ``pattern`` and if so, returns that ``value``. If no ``pattern`` matches, then ``else_value`` is returned. You can have as many ``pattern, value`` pairs as you want. Now, about using functions and formatting in the same field. Suppose you have an integer custom column called ``#myint`` that you want to see with leading zeros, as in ``003``. To do this, you would use a format of ``0>3s``. However, by default, if a number (integer or float) equals zero then the field produces the empty value, so zero values will produce nothing, not ``000``. If you really want to see ``000`` values, then you use both the format string and the ``ifempty`` function to change the empty value back to a zero. The field reference would be:: diff --git a/src/calibre/utils/formatter.py b/src/calibre/utils/formatter.py index 336ac2390b..15534a9c8a 100644 --- a/src/calibre/utils/formatter.py +++ b/src/calibre/utils/formatter.py @@ -79,6 +79,9 @@ class TemplateFormatter(string.Formatter): else: return val + def _count(self, val, sep): + return unicode(len(val.split(sep))) + functions = { 'uppercase' : (0, lambda s,x: x.upper()), 'lowercase' : (0, lambda s,x: x.lower()), @@ -91,6 +94,7 @@ class TemplateFormatter(string.Formatter): 'shorten' : (3, _shorten), 'switch' : (-1, _switch), 'test' : (2, _test), + 'count' : (1, _count), } format_string_re = re.compile(r'^(.*)\|(.*)\|(.*)$') @@ -136,8 +140,13 @@ class TemplateFormatter(string.Formatter): if fmt[colon:p] in self.functions: field = fmt[colon:p] func = self.functions[field] - args = self.arg_parser.scan(fmt[p+1:])[0] - args = [self.backslash_comma_to_comma.sub(',', a) for a in args] + if func[0] == 1: + # only one arg expected. Don't bother to scan. Avoids need + # for escaping characters + args = [fmt[p+1:-1]] + else: + args = self.arg_parser.scan(fmt[p+1:])[0] + args = [self.backslash_comma_to_comma.sub(',', a) for a in args] if (func[0] == 0 and (len(args) != 1 or args[0])) or \ (func[0] > 0 and func[0] != len(args)): raise ValueError('Incorrect number of arguments for function '+ fmt[0:p]) From 9c025f4736d477b8478ae0684dff8aeeca41fe4c Mon Sep 17 00:00:00 2001 From: Hiroshi Miura <miurahr@linux.com> Date: Fri, 3 Dec 2010 00:43:59 +0900 Subject: [PATCH 258/375] recipe: fix japanese recipes - mainichi news: handle ad pages - yomiuri: remove table tag - nikkei life: reduce feeds --- resources/recipes/mainichi.recipe | 16 ++++++++++++++++ resources/recipes/mainichi_it_news.recipe | 16 +++++++++++++++- resources/recipes/nikkei_sub_life.recipe | 5 +---- resources/recipes/yomiuri.recipe | 2 +- resources/recipes/yomiuri_world.recipe | 2 +- 5 files changed, 34 insertions(+), 7 deletions(-) diff --git a/resources/recipes/mainichi.recipe b/resources/recipes/mainichi.recipe index 2a44fa0980..baa7f409ec 100644 --- a/resources/recipes/mainichi.recipe +++ b/resources/recipes/mainichi.recipe @@ -4,6 +4,7 @@ __copyright__ = '2010, Hiroshi Miura <miurahr@linux.com>' www.mainichi.jp ''' +import re from calibre.web.feeds.news import BasicNewsRecipe class MainichiDailyNews(BasicNewsRecipe): @@ -22,3 +23,18 @@ class MainichiDailyNews(BasicNewsRecipe): remove_tags = [{'class':"RelatedArticle"}] remove_tags_after = {'class':"Credit"} + def parse_feeds(self): + + feeds = BasicNewsRecipe.parse_feeds(self) + + for curfeed in feeds: + delList = [] + for a,curarticle in enumerate(curfeed.articles): + if re.search(r'pheedo.jp', curarticle.url): + delList.append(curarticle) + if len(delList)>0: + for d in delList: + index = curfeed.articles.index(d) + curfeed.articles[index:index+1] = [] + + return feeds diff --git a/resources/recipes/mainichi_it_news.recipe b/resources/recipes/mainichi_it_news.recipe index 8e15496e57..4c285a2c01 100644 --- a/resources/recipes/mainichi_it_news.recipe +++ b/resources/recipes/mainichi_it_news.recipe @@ -14,5 +14,19 @@ class MainichiDailyITNews(BasicNewsRecipe): remove_tags_before = {'class':"NewsTitle"} remove_tags = [{'class':"RelatedArticle"}] - remove_tags_after = {'class':"Credit"} + def parse_feeds(self): + + feeds = BasicNewsRecipe.parse_feeds(self) + + for curfeed in feeds: + delList = [] + for a,curarticle in enumerate(curfeed.articles): + if re.search(r'pheedo.jp', curarticle.url): + delList.append(curarticle) + if len(delList)>0: + for d in delList: + index = curfeed.articles.index(d) + curfeed.articles[index:index+1] = [] + + return feeds remove_tags_after = {'class':"Credit"} diff --git a/resources/recipes/nikkei_sub_life.recipe b/resources/recipes/nikkei_sub_life.recipe index 1bfa08a55f..60e5b170ca 100644 --- a/resources/recipes/nikkei_sub_life.recipe +++ b/resources/recipes/nikkei_sub_life.recipe @@ -32,12 +32,9 @@ class NikkeiNet_sub_life(BasicNewsRecipe): remove_tags_after = {'class':"cmn-pr_list"} feeds = [ (u'\u304f\u3089\u3057', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=kurashi'), - (u'\u30b9\u30dd\u30fc\u30c4', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=sports'), - (u'\u793e\u4f1a', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=shakai'), (u'\u30a8\u30b3', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=eco'), (u'\u5065\u5eb7', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=kenkou'), - (u'\u7279\u96c6', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=special'), - (u'\u30e9\u30f3\u30ad\u30f3\u30b0', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=ranking') + (u'\u7279\u96c6', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=special') ] def get_browser(self): diff --git a/resources/recipes/yomiuri.recipe b/resources/recipes/yomiuri.recipe index d30aa9066f..fb17bb1210 100644 --- a/resources/recipes/yomiuri.recipe +++ b/resources/recipes/yomiuri.recipe @@ -21,7 +21,7 @@ class YOLNews(BasicNewsRecipe): remove_javascript = True masthead_title = u'YOMIURI ONLINE' - remove_tags_before = {'class':"article-def"} + keep_only_tags = [{'class':"article-def"}] remove_tags = [{'class':"RelatedArticle"}, {'class':"sbtns"} ] diff --git a/resources/recipes/yomiuri_world.recipe b/resources/recipes/yomiuri_world.recipe index f5f21c4aab..41ee4fd23d 100644 --- a/resources/recipes/yomiuri_world.recipe +++ b/resources/recipes/yomiuri_world.recipe @@ -21,7 +21,7 @@ class YOLNews(BasicNewsRecipe): remove_javascript = True masthead_title = u"YOMIURI ONLINE" - remove_tags_before = {'class':"article-def"} + keep_only_tags = [{'class':"article-def"}] remove_tags = [{'class':"RelatedArticle"}, {'class':"sbtns"} ] From 6173ff8c591f5205555758a5cc94dc0b8a44eb94 Mon Sep 17 00:00:00 2001 From: Hiroshi Miura <miurahr@linux.com> Date: Fri, 3 Dec 2010 00:46:25 +0900 Subject: [PATCH 259/375] recipe: add nikkei news about social --- resources/recipes/nikkei_sub_shakai.recipe | 102 +++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 resources/recipes/nikkei_sub_shakai.recipe diff --git a/resources/recipes/nikkei_sub_shakai.recipe b/resources/recipes/nikkei_sub_shakai.recipe new file mode 100644 index 0000000000..ed86493265 --- /dev/null +++ b/resources/recipes/nikkei_sub_shakai.recipe @@ -0,0 +1,102 @@ +__license__ = 'GPL v3' +__copyright__ = '2010, Hiroshi Miura <miurahr@linux.com>' +''' +www.nikkei.com +''' + +import re +from calibre.web.feeds.recipes import BasicNewsRecipe +import mechanize +from calibre.ptempfile import PersistentTemporaryFile + + +class NikkeiNet_sub_life(BasicNewsRecipe): + title = u'\u65e5\u7d4c\u65b0\u805e\u96fb\u5b50\u7248(\u751f\u6d3b)' + __author__ = 'Hiroshi Miura' + description = 'News and current market affairs from Japan' + cover_url = 'http://parts.nikkei.com/parts/ds/images/common/logo_r1.svg' + masthead_url = 'http://parts.nikkei.com/parts/ds/images/common/logo_r1.svg' + needs_subscription = True + oldest_article = 2 + max_articles_per_feed = 20 + language = 'ja' + remove_javascript = False + temp_files = [] + + remove_tags_before = {'class':"cmn-section cmn-indent"} + remove_tags = [ + {'class':"JSID_basePageMove JSID_baseAsyncSubmit cmn-form_area JSID_optForm_utoken"}, + {'class':"cmn-article_keyword cmn-clearfix"}, + {'class':"cmn-print_headline cmn-clearfix"}, + ] + remove_tags_after = {'class':"cmn-pr_list"} + + feeds = [ + (u'\u793e\u4f1a', u'http://www.zou3.net/php/rss/nikkei2rss.php?head=shakai') + ] + + def get_browser(self): + br = BasicNewsRecipe.get_browser() + + cj = mechanize.LWPCookieJar() + br.set_cookiejar(cj) + + #br.set_debug_http(True) + #br.set_debug_redirects(True) + #br.set_debug_responses(True) + + if self.username is not None and self.password is not None: + #print "----------------------------get login form--------------------------------------------" + # open login form + br.open('https://id.nikkei.com/lounge/nl/base/LA0010.seam') + response = br.response() + #print "----------------------------get login form---------------------------------------------" + #print "----------------------------set login form---------------------------------------------" + # remove disabled input which brings error on mechanize + response.set_data(response.get_data().replace("<input id=\"j_id48\"", "<!-- ")) + response.set_data(response.get_data().replace("gm_home_on.gif\" />", " -->")) + br.set_response(response) + br.select_form(name='LA0010Form01') + br['LA0010Form01:LA0010Email'] = self.username + br['LA0010Form01:LA0010Password'] = self.password + br.form.find_control(id='LA0010Form01:LA0010AutoLoginOn',type="checkbox").get(nr=0).selected = True + br.submit() + br.response() + #print "----------------------------send login form---------------------------------------------" + #print "----------------------------open news main page-----------------------------------------" + # open news site + br.open('http://www.nikkei.com/') + br.response() + #print "----------------------------www.nikkei.com BODY --------------------------------------" + #print response2.get_data() + #print "-------------------------^^-got auto redirect form----^^--------------------------------" + # forced redirect in default + br.select_form(nr=0) + br.submit() + response3 = br.response() + # return some cookie which should be set by Javascript + #print response3.geturl() + raw = response3.get_data() + #print "---------------------------response to form --------------------------------------------" + # grab cookie from JS and set it + redirectflag = re.search(r"var checkValue = '(\d+)';", raw, re.M).group(1) + br.select_form(nr=0) + + self.temp_files.append(PersistentTemporaryFile('_fa.html')) + self.temp_files[-1].write("#LWP-Cookies-2.0\n") + + self.temp_files[-1].write("Set-Cookie3: Cookie-dummy=Cookie-value; domain=\".nikkei.com\"; path=\"/\"; path_spec; secure; expires=\"2029-12-21 05:07:59Z\"; version=0\n") + self.temp_files[-1].write("Set-Cookie3: redirectFlag="+redirectflag+"; domain=\".nikkei.com\"; path=\"/\"; path_spec; secure; expires=\"2029-12-21 05:07:59Z\"; version=0\n") + self.temp_files[-1].close() + cj.load(self.temp_files[-1].name) + + br.submit() + + #br.set_debug_http(False) + #br.set_debug_redirects(False) + #br.set_debug_responses(False) + return br + + + + From ac23ca750309ce5802cde2ab2c8f789506027235 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Thu, 2 Dec 2010 09:07:23 -0700 Subject: [PATCH 260/375] Poughkeepsie Journal by weebl --- resources/recipes/poughkeepsie_journal.recipe | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 resources/recipes/poughkeepsie_journal.recipe diff --git a/resources/recipes/poughkeepsie_journal.recipe b/resources/recipes/poughkeepsie_journal.recipe new file mode 100644 index 0000000000..2fa5c1951b --- /dev/null +++ b/resources/recipes/poughkeepsie_journal.recipe @@ -0,0 +1,19 @@ +from calibre.web.feeds.news import BasicNewsRecipe + +class AdvancedUserRecipe1291143841(BasicNewsRecipe): + title = u'Poughkeepsipe Journal' + language = 'en' + __author__ = 'weebl' + oldest_article = 7 + max_articles_per_feed = 100 + no_stylesheets = True + timefmt = ' [%a, %d %b, %Y]' + feeds = [(u'Local News', u'http://poughkeepsiejournal.com/apps/pbcs.dll/oversikt?Category=RSS01&mime=xml'), + (u'Local Business', u'http://poughkeepsiejournal.com/apps/pbcs.dll/oversikt?Category=RSS02&mime=xml'), + (u'Local Sports', u'http://poughkeepsiejournal.com/apps/pbcs.dll/oversikt?Category=RSS03&mime=xml'), + (u'Life', u'http://poughkeepsiejournal.com/apps/pbcs.dll/oversikt?Category=RSS04&mime=xml')] + remove_tags = [dict(name='img', attrs={'src':'/graphics/mastlogo.gif'})] + + def print_version(self, url): + return url.replace('http://www.poughkeepsiejournal.com', 'http://www.poughkeepsiejournal.com/print') + From b7518b0b4e2c980be583a9aa25423fffea2177f0 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Thu, 2 Dec 2010 09:12:03 -0700 Subject: [PATCH 261/375] Fix #7740 (Star count from added columns doubled in book detatils block). Also store queries generated by the advanced search dialog in the search history --- src/calibre/ebooks/metadata/book/base.py | 2 ++ src/calibre/gui2/search_box.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index 125cd542b8..f0844e3711 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -531,6 +531,8 @@ class Metadata(object): res = format_date(res, cmeta['display'].get('date_format','dd MMM yyyy')) elif datatype == 'bool': res = _('Yes') if res else _('No') + elif datatype == 'rating': + res = res/2 return (name, unicode(res), orig_res, cmeta) # Translate aliases into the standard field name diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py index 1cdf622537..c85dafc6d8 100644 --- a/src/calibre/gui2/search_box.py +++ b/src/calibre/gui2/search_box.py @@ -384,7 +384,7 @@ class SearchBoxMixin(object): # {{{ def do_advanced_search(self, *args): d = SearchDialog(self, self.library_view.model().db) if d.exec_() == QDialog.Accepted: - self.search.set_search_string(d.search_string()) + self.search.set_search_string(d.search_string(), store_in_history=True) def do_search_button(self): self.search.do_search() From 3b71c89655aacc563e85823b7b0fada24e755042 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Thu, 2 Dec 2010 09:15:34 -0700 Subject: [PATCH 262/375] Add a count function to the template language. Make author_sort searchable. --- src/calibre/library/cli.py | 5 +++-- src/calibre/library/field_metadata.py | 2 +- src/calibre/manual/template_lang.rst | 5 +++-- src/calibre/utils/formatter.py | 13 +++++++++++-- 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/calibre/library/cli.py b/src/calibre/library/cli.py index 747cd59abb..01e8ad449b 100644 --- a/src/calibre/library/cli.py +++ b/src/calibre/library/cli.py @@ -565,8 +565,9 @@ datatype is one of: {0} 'applies if datatype is text.')) parser.add_option('--display', default='{}', help=_('A dictionary of options to customize how ' - 'the data in this column will be interpreted.')) - + 'the data in this column will be interpreted. This is a JSON ' + ' string. For enumeration columns, use ' + '--display=\'{"enum_values":["val1", "val2"]}\'')) return parser diff --git a/src/calibre/library/field_metadata.py b/src/calibre/library/field_metadata.py index d10dc5da71..9217aca566 100644 --- a/src/calibre/library/field_metadata.py +++ b/src/calibre/library/field_metadata.py @@ -177,7 +177,7 @@ class FieldMetadata(dict): 'is_multiple':None, 'kind':'field', 'name':None, - 'search_terms':[], + 'search_terms':['author_sort'], 'is_custom':False, 'is_category':False}), ('comments', {'table':None, diff --git a/src/calibre/manual/template_lang.rst b/src/calibre/manual/template_lang.rst index e1eb876cb7..1bef32fbd6 100644 --- a/src/calibre/manual/template_lang.rst +++ b/src/calibre/manual/template_lang.rst @@ -119,10 +119,11 @@ The functions available are: * ``ifempty(text)`` -- if the field is not empty, return the value of the field. Otherwise return `text`. * ``test(text if not empty, text if empty)`` -- return `text if not empty` if the field is not empty, otherwise return `text if empty`. * ``contains(pattern, text if match, text if not match`` -- checks if field contains matches for the regular expression `pattern`. Returns `text if match` if matches are found, otherwise it returns `text if no match`. - * ``switch(pattern, value, pattern, value, ..., else_value)`` -- for each ``pattern, value`` pair, checks if the field matches the regular expression ``pattern`` and if so, returns that ``value``. If no ``pattern`` matches, then ``else_value`` is returned. You can have as many ``pattern, value`` pairs as you want. + * ``count(separator)`` -- interprets the value as a list of items separated by `separator`, returning the number of items in the list. Most lists use a comma as the separator, but authors uses an ampersand. Examples: `{tags:count(,)}`, `{authors:count(&)}` + * ``lookup(pattern, field, pattern, field, ..., else_field)`` -- like switch, except the arguments are field (metadata) names, not text. The value of the appropriate field will be fetched and used. Note that because composite columns are fields, you can use this function in one composite field to use the value of some other composite field. This is extremely useful when constructing variable save paths (more later). * ``re(pattern, replacement)`` -- return the field after applying the regular expression. All instances of `pattern` are replaced with `replacement`. As in all of |app|, these are python-compatible regular expressions. * ``shorten(left chars, middle text, right chars)`` -- Return a shortened version of the field, consisting of `left chars` characters from the beginning of the field, followed by `middle text`, followed by `right chars` characters from the end of the string. `Left chars` and `right chars` must be integers. For example, assume the title of the book is `Ancient English Laws in the Times of Ivanhoe`, and you want it to fit in a space of at most 15 characters. If you use ``{title:shorten(9,-,5)}``, the result will be `Ancient E-nhoe`. If the field's length is less than ``left chars`` + ``right chars`` + the length of ``middle text``, then the field will be used intact. For example, the title `The Dome` would not be changed. - * ``lookup(pattern, field, pattern, field, ..., else_field)`` -- like switch, except the arguments are field (metadata) names, not text. The value of the appropriate field will be fetched and used. Note that because composite columns are fields, you can use this function in one composite field to use the value of some other composite field. This is extremely useful when constructing variable save paths (more later). + * ``switch(pattern, value, pattern, value, ..., else_value)`` -- for each ``pattern, value`` pair, checks if the field matches the regular expression ``pattern`` and if so, returns that ``value``. If no ``pattern`` matches, then ``else_value`` is returned. You can have as many ``pattern, value`` pairs as you want. Now, about using functions and formatting in the same field. Suppose you have an integer custom column called ``#myint`` that you want to see with leading zeros, as in ``003``. To do this, you would use a format of ``0>3s``. However, by default, if a number (integer or float) equals zero then the field produces the empty value, so zero values will produce nothing, not ``000``. If you really want to see ``000`` values, then you use both the format string and the ``ifempty`` function to change the empty value back to a zero. The field reference would be:: diff --git a/src/calibre/utils/formatter.py b/src/calibre/utils/formatter.py index 336ac2390b..15534a9c8a 100644 --- a/src/calibre/utils/formatter.py +++ b/src/calibre/utils/formatter.py @@ -79,6 +79,9 @@ class TemplateFormatter(string.Formatter): else: return val + def _count(self, val, sep): + return unicode(len(val.split(sep))) + functions = { 'uppercase' : (0, lambda s,x: x.upper()), 'lowercase' : (0, lambda s,x: x.lower()), @@ -91,6 +94,7 @@ class TemplateFormatter(string.Formatter): 'shorten' : (3, _shorten), 'switch' : (-1, _switch), 'test' : (2, _test), + 'count' : (1, _count), } format_string_re = re.compile(r'^(.*)\|(.*)\|(.*)$') @@ -136,8 +140,13 @@ class TemplateFormatter(string.Formatter): if fmt[colon:p] in self.functions: field = fmt[colon:p] func = self.functions[field] - args = self.arg_parser.scan(fmt[p+1:])[0] - args = [self.backslash_comma_to_comma.sub(',', a) for a in args] + if func[0] == 1: + # only one arg expected. Don't bother to scan. Avoids need + # for escaping characters + args = [fmt[p+1:-1]] + else: + args = self.arg_parser.scan(fmt[p+1:])[0] + args = [self.backslash_comma_to_comma.sub(',', a) for a in args] if (func[0] == 0 and (len(args) != 1 or args[0])) or \ (func[0] > 0 and func[0] != len(args)): raise ValueError('Incorrect number of arguments for function '+ fmt[0:p]) From 46614c19e0feded0aad7f3fd39aa5730c8be8af4 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Thu, 2 Dec 2010 16:19:09 +0000 Subject: [PATCH 263/375] Fixes to allow an empty value in an enum --- src/calibre/gui2/library/delegates.py | 7 ++++--- src/calibre/gui2/library/models.py | 6 ++++-- src/calibre/gui2/preferences/create_custom_column.py | 8 ++++++-- src/calibre/gui2/preferences/create_custom_column.ui | 5 ++++- src/calibre/library/cli.py | 1 - 5 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/calibre/gui2/library/delegates.py b/src/calibre/gui2/library/delegates.py index 73d722e485..bb73a55fc9 100644 --- a/src/calibre/gui2/library/delegates.py +++ b/src/calibre/gui2/library/delegates.py @@ -269,10 +269,11 @@ class CcEnumDelegate(QStyledItemDelegate): # {{{ def setModelData(self, editor, model, index): val = unicode(editor.currentText()) - if val == '': + m = index.model() + col = m.column_map[index.column()] + if val not in m.custom_columns[col]['display']['enum_values']: # This shouldn't happen ... - m = index.model() - col = m.column_map[index.column()] + print 'shouldnt happen' val = m.custom_columns[col]['display']['enum_values'][0] model.setData(index, QVariant(val), Qt.EditRole) diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index 99639ed0a7..bee90fc44c 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -719,10 +719,12 @@ class BooksModel(QAbstractTableModel): # {{{ typ = cc['datatype'] label=self.db.field_metadata.key_to_label(colhead) s_index = None - if typ in ('text', 'comments', 'enumeration'): + if typ in ('text', 'comments'): val = unicode(value.toString()).strip() val = val if val else None - if typ == 'bool': + elif typ == 'enumeration': + val = unicode(value.toString()).strip() + elif typ == 'bool': val = value.toPyObject() elif typ == 'rating': val = value.toInt()[0] diff --git a/src/calibre/gui2/preferences/create_custom_column.py b/src/calibre/gui2/preferences/create_custom_column.py index 47fcb58afb..419fed046d 100644 --- a/src/calibre/gui2/preferences/create_custom_column.py +++ b/src/calibre/gui2/preferences/create_custom_column.py @@ -166,8 +166,12 @@ class CreateCustomColumn(QDialog, Ui_QCreateCustomColumn): if not self.enum_box.text(): return self.simple_error('', _('You must enter at least one' ' value for enumeration columns')) - display_dict = {'enum_values': - [v.strip() for v in unicode(self.enum_box.text()).split(',')]} + l = [v.strip() for v in unicode(self.enum_box.text()).split(',')] + for i in range(0, len(l)-1): + if l[i] in l[i+1:]: + return self.simple_error('', _('The value "{0}" is in the ' + 'list more than once').format(l[i])) + display_dict = {'enum_values': l} db = self.parent.gui.library_view.model().db key = db.field_metadata.custom_field_prefix+col diff --git a/src/calibre/gui2/preferences/create_custom_column.ui b/src/calibre/gui2/preferences/create_custom_column.ui index 54003cd770..360c1a4345 100644 --- a/src/calibre/gui2/preferences/create_custom_column.ui +++ b/src/calibre/gui2/preferences/create_custom_column.ui @@ -212,7 +212,10 @@ <item> <widget class="QLineEdit" name="enum_box"> <property name="toolTip"> - <string>A comma-separated list of permitted values. The first value is the default</string> + <string>A comma-separated list of permitted values. You can specify +empty values by entering only the comma. For example, the list +',one,two,three' has 4 valid values, one of them empty. The first +value in the list is the default.</string> </property> <property name="sizePolicy"> <sizepolicy hsizetype="Maximum" vsizetype="Fixed"> diff --git a/src/calibre/library/cli.py b/src/calibre/library/cli.py index 5049476226..01e8ad449b 100644 --- a/src/calibre/library/cli.py +++ b/src/calibre/library/cli.py @@ -580,7 +580,6 @@ def command_add_custom_column(args, dbpath): print print >>sys.stderr, _('You must specify label, name and datatype') return 1 - print opts.display do_add_custom_column(get_db(dbpath, opts), args[0], args[1], args[2], opts.is_multiple, json.loads(opts.display)) # Re-open the DB so that field_metadata is reflects the column changes From d3aacc01d563c0eed79ab00fdafca2c3c439a33f Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Thu, 2 Dec 2010 09:29:30 -0700 Subject: [PATCH 264/375] ... --- resources/recipes/nin.recipe | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/resources/recipes/nin.recipe b/resources/recipes/nin.recipe index 27942f7d43..66dd58330e 100644 --- a/resources/recipes/nin.recipe +++ b/resources/recipes/nin.recipe @@ -8,8 +8,8 @@ www.nin.co.rs import re from calibre import strftime from calibre.web.feeds.news import BasicNewsRecipe -from contextlib import nested, closing -from calibre.ebooks.BeautifulSoup import BeautifulSoup, NavigableString, CData, Tag +from contextlib import closing +from calibre.ebooks.BeautifulSoup import BeautifulSoup from calibre import entity_to_unicode class Nin(BasicNewsRecipe): @@ -29,14 +29,14 @@ class Nin(BasicNewsRecipe): use_embedded_content = False language = 'sr' publication_type = 'magazine' - extra_css = """ + extra_css = """ @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)} - body{font-family: Verdana, Lucida, sans1, sans-serif} - .article_description{font-family: Verdana, Lucida, sans1, sans-serif} - .artTitle{font-size: x-large; font-weight: bold; color: #900} - .izjava{font-size: x-large; font-weight: bold} - .columnhead{font-size: small; font-weight: bold;} - img{margin-top:0.5em; margin-bottom: 0.7em; display: block} + body{font-family: Verdana, Lucida, sans1, sans-serif} + .article_description{font-family: Verdana, Lucida, sans1, sans-serif} + .artTitle{font-size: x-large; font-weight: bold; color: #900} + .izjava{font-size: x-large; font-weight: bold} + .columnhead{font-size: small; font-weight: bold;} + img{margin-top:0.5em; margin-bottom: 0.7em; display: block} b{margin-top: 1em} """ @@ -148,4 +148,4 @@ class Nin(BasicNewsRecipe): img.extract() tbl.replaceWith(img) return soup - \ No newline at end of file + From e6db8b13a67164040c68529e4a67296bfbdb143a Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Thu, 2 Dec 2010 10:43:42 -0700 Subject: [PATCH 265/375] Clean up metadata_single.py --- src/calibre/gui2/dialogs/metadata_single.py | 242 ++++++++++---------- 1 file changed, 127 insertions(+), 115 deletions(-) diff --git a/src/calibre/gui2/dialogs/metadata_single.py b/src/calibre/gui2/dialogs/metadata_single.py index 7beeb56378..b57ff318ad 100644 --- a/src/calibre/gui2/dialogs/metadata_single.py +++ b/src/calibre/gui2/dialogs/metadata_single.py @@ -31,7 +31,7 @@ from calibre.gui2.preferences.social import SocialMetadata from calibre.gui2.custom_column_widgets import populate_metadata_page from calibre import strftime -class CoverFetcher(QThread): +class CoverFetcher(QThread): # {{{ def __init__(self, username, password, isbn, timeout, title, author): self.username = username.strip() if username else username @@ -74,9 +74,9 @@ class CoverFetcher(QThread): self.traceback = traceback.format_exc() print self.traceback +# }}} - -class Format(QListWidgetItem): +class Format(QListWidgetItem): # {{{ def __init__(self, parent, ext, size, path=None, timestamp=None): self.path = path @@ -92,12 +92,60 @@ class Format(QListWidgetItem): self.setToolTip(text) self.setStatusTip(text) +# }}} + class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): COVER_FETCH_TIMEOUT = 240 # seconds view_format = pyqtSignal(object) + # Cover processing {{{ + + def set_cover(self): + mi, ext = self.get_selected_format_metadata() + if mi is None: + return + cdata = None + if mi.cover and os.access(mi.cover, os.R_OK): + cdata = open(mi.cover).read() + elif mi.cover_data[1] is not None: + cdata = mi.cover_data[1] + if cdata is None: + error_dialog(self, _('Could not read cover'), + _('Could not read cover from %s format')%ext).exec_() + return + pix = QPixmap() + pix.loadFromData(cdata) + if pix.isNull(): + error_dialog(self, _('Could not read cover'), + _('The cover in the %s format is invalid')%ext).exec_() + return + self.cover.setPixmap(pix) + self.update_cover_tooltip() + self.cover_changed = True + 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('png') + pix = QPixmap() + pix.loadFromData(cdata) + self.cover.setPixmap(pix) + self.update_cover_tooltip() + self.cover_changed = True + self.cpixmap = pix + self.cover_data = cdata + + + def update_cover_tooltip(self): p = self.cover.pixmap() self.cover.setToolTip(_('Cover size: %dx%d pixels') % @@ -173,6 +221,76 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): self.cover_changed = True self.cpixmap = pix + def cover_dropped(self, cover_data): + self.cover_changed = True + self.cover_data = cover_data + self.update_cover_tooltip() + + def fetch_cover(self): + isbn = re.sub(r'[^0-9a-zA-Z]', '', unicode(self.isbn.text())).strip() + self.fetch_cover_button.setEnabled(False) + self.setCursor(Qt.WaitCursor) + title, author = map(unicode, (self.title.text(), self.authors.text())) + self.cover_fetcher = CoverFetcher(None, None, isbn, + self.timeout, title, author) + self.cover_fetcher.start() + self._hangcheck = QTimer(self) + self.connect(self._hangcheck, SIGNAL('timeout()'), self.hangcheck) + self.cf_start_time = time.time() + self.pi.start(_('Downloading cover...')) + self._hangcheck.start(100) + + def hangcheck(self): + if not self.cover_fetcher.isFinished() and \ + time.time()-self.cf_start_time < self.COVER_FETCH_TIMEOUT: + return + + self._hangcheck.stop() + try: + if self.cover_fetcher.isRunning(): + self.cover_fetcher.terminate() + error_dialog(self, _('Cannot fetch cover'), + _('<b>Could not fetch cover.</b><br/>')+ + _('The download timed out.')).exec_() + return + if self.cover_fetcher.needs_isbn: + error_dialog(self, _('Cannot fetch cover'), + _('Could not find cover for this book. Try ' + 'specifying the ISBN first.')).exec_() + return + if self.cover_fetcher.exception is not None: + err = self.cover_fetcher.exception + error_dialog(self, _('Cannot fetch cover'), + _('<b>Could not fetch cover.</b><br/>')+unicode(err)).exec_() + return + if self.cover_fetcher.errors and self.cover_fetcher.cover_data is None: + details = u'\n\n'.join([e[-1] + ': ' + e[1] for e in self.cover_fetcher.errors]) + error_dialog(self, _('Cannot fetch cover'), + _('<b>Could not fetch cover.</b><br/>') + + _('For the error message from each cover source, ' + 'click Show details below.'), det_msg=details, show=True) + return + + pix = QPixmap() + pix.loadFromData(self.cover_fetcher.cover_data) + if pix.isNull(): + error_dialog(self, _('Bad cover'), + _('The cover is not a valid picture')).exec_() + else: + self.cover.setPixmap(pix) + self.update_cover_tooltip() + self.cover_changed = True + self.cpixmap = pix + self.cover_data = self.cover_fetcher.cover_data + finally: + self.fetch_cover_button.setEnabled(True) + self.unsetCursor() + self.pi.stop() + + + # }}} + + # Formats processing {{{ def add_format(self, x): files = choose_files(self, 'add formats dialog', _("Choose formats for ") + unicode((self.title.text())), @@ -285,50 +403,6 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): self.comments.setPlainText(mi.comments) - def set_cover(self): - mi, ext = self.get_selected_format_metadata() - if mi is None: - return - cdata = None - if mi.cover and os.access(mi.cover, os.R_OK): - cdata = open(mi.cover).read() - elif mi.cover_data[1] is not None: - cdata = mi.cover_data[1] - if cdata is None: - error_dialog(self, _('Could not read cover'), - _('Could not read cover from %s format')%ext).exec_() - return - pix = QPixmap() - pix.loadFromData(cdata) - if pix.isNull(): - error_dialog(self, _('Could not read cover'), - _('The cover in the %s format is invalid')%ext).exec_() - return - self.cover.setPixmap(pix) - self.update_cover_tooltip() - self.cover_changed = True - 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('png') - pix = QPixmap() - pix.loadFromData(cdata) - self.cover.setPixmap(pix) - self.update_cover_tooltip() - 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()): @@ -349,6 +423,12 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): if ext not in extensions: self.db.remove_format(self.row, ext, notify=False) + def show_format(self, item, *args): + fmt = item.ext + self.view_format.emit(fmt) + + # }}} + def do_cancel_all(self): self.cancel_all = True self.reject() @@ -543,10 +623,6 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): self.isbn.setStyleSheet('QLineEdit { background-color: rgba(255,0,0,20%) }') self.isbn.setToolTip(_('This ISBN number is invalid')) - def show_format(self, item, *args): - fmt = item.ext - self.view_format.emit(fmt) - def deduce_author_sort(self): au = unicode(self.authors.text()) au = re.sub(r'\s+et al\.$', '', au) @@ -559,9 +635,6 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): self.authors.setText(title) self.author_sort.setText('') - def cover_dropped(self, cover_data): - self.cover_changed = True - self.cover_data = cover_data def initialize_combos(self): self.initalize_authors() @@ -637,67 +710,6 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): self.tags.setText(tag_string) self.tags.update_tags_cache(self.db.all_tags()) - def fetch_cover(self): - isbn = re.sub(r'[^0-9a-zA-Z]', '', unicode(self.isbn.text())).strip() - self.fetch_cover_button.setEnabled(False) - self.setCursor(Qt.WaitCursor) - title, author = map(unicode, (self.title.text(), self.authors.text())) - self.cover_fetcher = CoverFetcher(None, None, isbn, - self.timeout, title, author) - self.cover_fetcher.start() - self._hangcheck = QTimer(self) - self.connect(self._hangcheck, SIGNAL('timeout()'), self.hangcheck) - self.cf_start_time = time.time() - self.pi.start(_('Downloading cover...')) - self._hangcheck.start(100) - - def hangcheck(self): - if not self.cover_fetcher.isFinished() and \ - time.time()-self.cf_start_time < self.COVER_FETCH_TIMEOUT: - return - - self._hangcheck.stop() - try: - if self.cover_fetcher.isRunning(): - self.cover_fetcher.terminate() - error_dialog(self, _('Cannot fetch cover'), - _('<b>Could not fetch cover.</b><br/>')+ - _('The download timed out.')).exec_() - return - if self.cover_fetcher.needs_isbn: - error_dialog(self, _('Cannot fetch cover'), - _('Could not find cover for this book. Try ' - 'specifying the ISBN first.')).exec_() - return - if self.cover_fetcher.exception is not None: - err = self.cover_fetcher.exception - error_dialog(self, _('Cannot fetch cover'), - _('<b>Could not fetch cover.</b><br/>')+unicode(err)).exec_() - return - if self.cover_fetcher.errors and self.cover_fetcher.cover_data is None: - details = u'\n\n'.join([e[-1] + ': ' + e[1] for e in self.cover_fetcher.errors]) - error_dialog(self, _('Cannot fetch cover'), - _('<b>Could not fetch cover.</b><br/>') + - _('For the error message from each cover source, ' - 'click Show details below.'), det_msg=details, show=True) - return - - pix = QPixmap() - pix.loadFromData(self.cover_fetcher.cover_data) - if pix.isNull(): - error_dialog(self, _('Bad cover'), - _('The cover is not a valid picture')).exec_() - else: - self.cover.setPixmap(pix) - self.update_cover_tooltip() - self.cover_changed = True - self.cpixmap = pix - self.cover_data = self.cover_fetcher.cover_data - finally: - self.fetch_cover_button.setEnabled(True) - self.unsetCursor() - self.pi.stop() - def fetch_metadata(self): isbn = re.sub(r'[^0-9a-zA-Z]', '', unicode(self.isbn.text())) From 2633b89d63644d36302ba801106815b7b1da82fd Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Thu, 2 Dec 2010 11:09:45 -0700 Subject: [PATCH 266/375] Implement #7711 (Add "Previous" Button to edit metadata form) --- src/calibre/gui2/actions/edit_metadata.py | 41 ++++++++++++++------- src/calibre/gui2/dialogs/metadata_single.py | 40 +++++++++++++------- 2 files changed, 54 insertions(+), 27 deletions(-) diff --git a/src/calibre/gui2/actions/edit_metadata.py b/src/calibre/gui2/actions/edit_metadata.py index 559ea4a6f7..725bf35993 100644 --- a/src/calibre/gui2/actions/edit_metadata.py +++ b/src/calibre/gui2/actions/edit_metadata.py @@ -8,7 +8,7 @@ __docformat__ = 'restructuredtext en' import os from functools import partial -from PyQt4.Qt import Qt, QMenu +from PyQt4.Qt import Qt, QMenu, QModelIndex from calibre.gui2 import error_dialog, config from calibre.gui2.dialogs.metadata_single import MetadataSingleDialog @@ -126,20 +126,35 @@ class EditMetadataAction(InterfaceAction): if bulk or (bulk is None and len(rows) > 1): return self.edit_bulk_metadata(checked) - def accepted(id): - self.gui.library_view.model().refresh_ids([id]) + row_list = [r.row() for r in rows] + current_row = 0 + changed = set([]) + db = self.gui.library_view.model().db - for row in rows: - self.gui.iactions['View'].metadata_view_id = self.gui.library_view.model().db.id(row.row()) - d = MetadataSingleDialog(self.gui, row.row(), - self.gui.library_view.model().db, - accepted_callback=accepted, - cancel_all=rows.index(row) < len(rows)-1) - d.view_format.connect(self.gui.iactions['View'].metadata_view_format) - d.exec_() - if d.cancel_all: + if len(row_list) == 1: + cr = row_list[0] + row_list = \ + list(range(self.gui.library_view.model().rowCount(QModelIndex()))) + current_row = row_list.index(cr) + + while True: + prev = next_ = None + if current_row > 0: + prev = db.title(row_list[current_row-1]) + if current_row < len(row_list) - 1: + next_ = db.title(row_list[current_row+1]) + + d = MetadataSingleDialog(self.gui, row_list[current_row], db, + prev=prev, next_=next_) + if d.exec_() != d.Accepted: break - if rows: + changed.add(d.id) + if d.row_delta == 0: + break + current_row += d.row_delta + + if changed: + self.gui.library_view.model().refresh_ids(list(changed)) current = self.gui.library_view.currentIndex() m = self.gui.library_view.model() if self.gui.cover_flow: diff --git a/src/calibre/gui2/dialogs/metadata_single.py b/src/calibre/gui2/dialogs/metadata_single.py index b57ff318ad..2c08252266 100644 --- a/src/calibre/gui2/dialogs/metadata_single.py +++ b/src/calibre/gui2/dialogs/metadata_single.py @@ -7,9 +7,11 @@ add/remove formats ''' import os, re, time, traceback, textwrap +from functools import partial from PyQt4.Qt import SIGNAL, QObject, Qt, QTimer, QThread, QDate, \ - QPixmap, QListWidgetItem, QDialog, pyqtSignal, QMessageBox + QPixmap, QListWidgetItem, QDialog, pyqtSignal, QMessageBox, QIcon, \ + QPushButton from calibre.gui2 import error_dialog, file_icon_provider, dynamic, \ choose_files, choose_images, ResizableDialog, \ @@ -429,11 +431,8 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): # }}} - def do_cancel_all(self): - self.cancel_all = True - self.reject() - - def __init__(self, window, row, db, accepted_callback=None, cancel_all=False): + def __init__(self, window, row, db, prev=None, + next_=None): ResizableDialog.__init__(self, window) self.bc_box.layout().setAlignment(self.cover, Qt.AlignCenter|Qt.AlignHCenter) self.cancel_all = False @@ -445,16 +444,27 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): _(' 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')) - self.connect(self.__abort_button, SIGNAL('clicked()'), - self.do_cancel_all) + self.row_delta = 0 + if prev: + self.prev_button = QPushButton(QIcon(I('back.png')), _('Previous'), + self) + self.button_box.addButton(self.prev_button, self.button_box.ActionRole) + tip = _('Edit the metadata of %s')%prev + self.prev_button.setToolTip(tip) + self.prev_button.clicked.connect(partial(self.next_triggered, + -1)) + if next_: + self.next_button = QPushButton(QIcon(I('forward.png')), _('Next'), + self) + self.button_box.addButton(self.next_button, self.button_box.ActionRole) + tip = _('Edit the metadata of %s')%next_ + self.next_button.setToolTip(tip) + self.next_button.clicked.connect(partial(self.next_triggered, 1)) + self.splitter.setStretchFactor(100, 1) self.read_state() self.db = db self.pi = ProgressIndicator(self) - self.accepted_callback = accepted_callback self.id = db.id(row) self.row = row self.cover_data = None @@ -801,6 +811,10 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): unicode(self.tags.text()).split(',')], notify=notify, commit=commit) + def next_triggered(self, row_delta, *args): + self.row_delta = row_delta + self.accept() + def accept(self): cf = getattr(self, 'cover_fetcher', None) if cf is not None and hasattr(cf, 'terminate'): @@ -862,8 +876,6 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): raise self.save_state() QDialog.accept(self) - if callable(self.accepted_callback): - self.accepted_callback(self.id) def reject(self, *args): cf = getattr(self, 'cover_fetcher', None) From 37241833663b6b00801a409506ad3b6fc1f251a6 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Thu, 2 Dec 2010 11:21:47 -0700 Subject: [PATCH 267/375] Edit metadata dialog: Only set title and authors if they have changed --- src/calibre/gui2/dialogs/metadata_single.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/calibre/gui2/dialogs/metadata_single.py b/src/calibre/gui2/dialogs/metadata_single.py index 2c08252266..f50be281d7 100644 --- a/src/calibre/gui2/dialogs/metadata_single.py +++ b/src/calibre/gui2/dialogs/metadata_single.py @@ -449,7 +449,7 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): self.prev_button = QPushButton(QIcon(I('back.png')), _('Previous'), self) self.button_box.addButton(self.prev_button, self.button_box.ActionRole) - tip = _('Edit the metadata of %s')%prev + tip = _('Save changes and edit the metadata of %s')%prev self.prev_button.setToolTip(tip) self.prev_button.clicked.connect(partial(self.next_triggered, -1)) @@ -457,7 +457,7 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): self.next_button = QPushButton(QIcon(I('forward.png')), _('Next'), self) self.button_box.addButton(self.next_button, self.button_box.ActionRole) - tip = _('Edit the metadata of %s')%next_ + tip = _('Save changes and edit the metadata of %s')%next_ self.next_button.setToolTip(tip) self.next_button.clicked.connect(partial(self.next_triggered, 1)) @@ -513,6 +513,8 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): self.connect(self.reset_cover, SIGNAL('clicked()'), self.do_reset_cover) self.connect(self.swap_button, SIGNAL('clicked()'), self.swap_title_author) self.timeout = float(prefs['network_timeout']) + + self.title.setText(db.title(row)) isbn = db.isbn(self.id, index_is_id=True) if not isbn: @@ -581,6 +583,9 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): self.create_custom_column_editors() self.generate_cover_button.clicked.connect(self.generate_cover) + self.original_author = unicode(self.authors.text()).strip() + self.original_title = unicode(self.title.text()).strip() + def create_custom_column_editors(self): w = self.central_widget.widget(1) layout = w.layout() @@ -824,9 +829,10 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): if self.formats_changed: self.sync_formats() title = unicode(self.title.text()).strip() - self.db.set_title(self.id, title, notify=False) + if title != self.original_title: + self.db.set_title(self.id, title, notify=False) au = unicode(self.authors.text()).strip() - if au: + if au and au != self.original_author: self.db.set_authors(self.id, string_to_authors(au), notify=False) aus = unicode(self.author_sort.text()).strip() if aus: From 5fa0b8941a2df6cfb5f7e46a77e79cbb0a23256b Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Thu, 2 Dec 2010 19:07:37 +0000 Subject: [PATCH 268/375] Change enums to not use the user defined function in meta2 --- src/calibre/library/caches.py | 18 ++++++++++++++ src/calibre/library/custom_columns.py | 36 +++++++++------------------ src/calibre/library/sqlite.py | 14 ----------- 3 files changed, 30 insertions(+), 38 deletions(-) diff --git a/src/calibre/library/caches.py b/src/calibre/library/caches.py index 7b4c66c8b8..8365cfe773 100644 --- a/src/calibre/library/caches.py +++ b/src/calibre/library/caches.py @@ -254,6 +254,12 @@ class ResultCache(SearchQueryParser): # {{{ if field_metadata[key]['datatype'] == 'composite': self.composites.append((key, field_metadata[key]['rec_index'])) + self.enumerations = [] + for key in field_metadata: + if field_metadata[key]['datatype'] == 'enumeration': + self.enumerations.append((field_metadata[key]['display']['enum_values'][0], + field_metadata[key]['rec_index'])) + def __getitem__(self, row): return self._data[self._map_filtered[row]] @@ -691,6 +697,10 @@ class ResultCache(SearchQueryParser): # {{{ mi = db.get_metadata(id, index_is_id=True) for k,c in self.composites: self._data[id][c] = mi.get(k, None) + if len(self.enumerations) > 0: + for v,c in self.enumerations: + if self._data[id][c] is None: + self._data[id][c] = v except IndexError: return None try: @@ -711,6 +721,10 @@ class ResultCache(SearchQueryParser): # {{{ mi = db.get_metadata(id, index_is_id=True) for k,c in self.composites: self._data[id][c] = mi.get(k) + if len(self.enumerations) > 0: + for v,c in self.self._data[id][c]: + if self._data[id][c] is None: + self._data[id][c] = v self._map[0:0] = ids self._map_filtered[0:0] = ids @@ -740,6 +754,10 @@ class ResultCache(SearchQueryParser): # {{{ mi = db.get_metadata(item[0], index_is_id=True) for k,c in self.composites: item[c] = mi.get(k) + if len(self.enumerations) > 0: + for v,c in self.enumerations: + if item[c] is None: + item[c] = v self._map = [i[0] for i in self._data if i is not None] if field is not None: diff --git a/src/calibre/library/custom_columns.py b/src/calibre/library/custom_columns.py index 9444746c2a..dc3a67e860 100644 --- a/src/calibre/library/custom_columns.py +++ b/src/calibre/library/custom_columns.py @@ -525,30 +525,18 @@ class CustomColumns(object): display = data['display'] table, lt = self.custom_table_names(data['num']) if data['normalized']: - if data['datatype'] == 'enumeration': - query = '%s.value' - line = ''' - val_for_enum(\' - SELECT {table}.value FROM {lt} - AS link INNER JOIN {table} ON(link.value={table}.id) - WHERE link.book=?\', - \'{default}\', books.id) custom_{num} - '''.format(lt=lt, table=table, - default=data['display']['enum_values'][0], - num=data['num']) - else: - query = '%s.value' - if data['is_multiple']: - query = 'group_concat(%s.value, "|")' - if not display.get('sort_alpha', False): - query = 'sort_concat(link.id, %s.value)' - line = '''(SELECT {query} FROM {lt} AS link INNER JOIN - {table} ON(link.value={table}.id) WHERE link.book=books.id) - custom_{num} - '''.format(query=query%table, lt=lt, table=table, num=data['num']) - if data['datatype'] == 'series': - line += ''',(SELECT extra FROM {lt} WHERE {lt}.book=books.id) - custom_index_{num}'''.format(lt=lt, num=data['num']) + query = '%s.value' + if data['is_multiple']: + query = 'group_concat(%s.value, "|")' + if not display.get('sort_alpha', False): + query = 'sort_concat(link.id, %s.value)' + line = '''(SELECT {query} FROM {lt} AS link INNER JOIN + {table} ON(link.value={table}.id) WHERE link.book=books.id) + custom_{num} + '''.format(query=query%table, lt=lt, table=table, num=data['num']) + if data['datatype'] == 'series': + line += ''',(SELECT extra FROM {lt} WHERE {lt}.book=books.id) + custom_index_{num}'''.format(lt=lt, num=data['num']) else: line = ''' (SELECT value FROM {table} WHERE book=books.id) custom_{num} diff --git a/src/calibre/library/sqlite.py b/src/calibre/library/sqlite.py index 9682bd7ec6..7a86447090 100644 --- a/src/calibre/library/sqlite.py +++ b/src/calibre/library/sqlite.py @@ -115,18 +115,6 @@ def pynocase(one, two, encoding='utf-8'): pass return cmp(one.lower(), two.lower()) -def enum_col_value(select, def_val, id, conn=None): - try: - v = conn.get(select, (id,), all=False) - if v is None: - v = def_val - except Exception, e: - if DEBUG: - print 'enum_col_value failed' - print e - v = def_val - return v - def load_c_extensions(conn, debug=DEBUG): try: conn.enable_load_extension(True) @@ -176,8 +164,6 @@ class DBThread(Thread): self.conn.create_function('author_to_author_sort', 1, _author_to_author_sort) self.conn.create_function('uuid4', 0, lambda : str(uuid.uuid4())) - self.conn.create_function('val_for_enum', 3, - partial(enum_col_value, conn=self.conn)) # Dummy functions for dynamically created filters self.conn.create_function('books_list_filter', 1, lambda x: 1) From 1f91663c2255dd6de6444a14d07f26fc4654641b Mon Sep 17 00:00:00 2001 From: John Schember <john@nachtimwald.com> Date: Thu, 2 Dec 2010 18:43:50 -0500 Subject: [PATCH 269/375] PMLZ Output: Reduce image depth and size by default to accommodate Dropbook. Includes option to output un-modified images. --- src/calibre/ebooks/pml/output.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/calibre/ebooks/pml/output.py b/src/calibre/ebooks/pml/output.py index 774fc4c8d1..7e3729aa4a 100644 --- a/src/calibre/ebooks/pml/output.py +++ b/src/calibre/ebooks/pml/output.py @@ -35,6 +35,12 @@ class PMLOutput(OutputFormatPlugin): OptionRecommendation(name='inline_toc', recommended_value=False, level=OptionRecommendation.LOW, help=_('Add Table of Contents to beginning of the book.')), + OptionRecommendation(name='full_image_depth', + recommended_value=False, level=OptionRecommendation.LOW, + help=_('Do not reduce the size or bit depth of images. Images ' \ + 'have their size and depth reduced by default to accommodate ' \ + 'applications that can not convert images on their ' \ + 'own such as Dropbook.')), ]) def convert(self, oeb_book, output_path, input_plugin, opts, log): @@ -44,16 +50,20 @@ class PMLOutput(OutputFormatPlugin): with open(os.path.join(tdir, 'index.pml'), 'wb') as out: out.write(pml.encode(opts.output_encoding, 'replace')) - self.write_images(oeb_book.manifest, pmlmlizer.image_hrefs, tdir) + self.write_images(oeb_book.manifest, pmlmlizer.image_hrefs, tdir, opts) log.debug('Compressing output...') pmlz = ZipFile(output_path, 'w') pmlz.add_dir(tdir) - def write_images(self, manifest, image_hrefs, out_dir): + def write_images(self, manifest, image_hrefs, out_dir, opts): for item in manifest: if item.media_type in OEB_RASTER_IMAGES and item.href in image_hrefs.keys(): - im = Image.open(cStringIO.StringIO(item.data)) + if opts.full_image_depth: + im = Image.open(cStringIO.StringIO(item.data)) + else: + im = Image.open(cStringIO.StringIO(item.data)).convert('P') + im.thumbnail((300,300), Image.ANTIALIAS) data = cStringIO.StringIO() im.save(data, 'PNG') From 6798036d8487844ee5a740e28b3cb68718929f81 Mon Sep 17 00:00:00 2001 From: John Schember <john@nachtimwald.com> Date: Thu, 2 Dec 2010 19:06:35 -0500 Subject: [PATCH 270/375] PMLZ Output: UI options. --- src/calibre/gui2/convert/pml_output.py | 22 ++++++++++++ src/calibre/gui2/convert/pmlz_output.ui | 48 +++++++++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 src/calibre/gui2/convert/pml_output.py create mode 100644 src/calibre/gui2/convert/pmlz_output.ui diff --git a/src/calibre/gui2/convert/pml_output.py b/src/calibre/gui2/convert/pml_output.py new file mode 100644 index 0000000000..61207d3de5 --- /dev/null +++ b/src/calibre/gui2/convert/pml_output.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- + +__license__ = 'GPL 3' +__copyright__ = '2009, John Schember <john@nachtimwald.com>' +__docformat__ = 'restructuredtext en' + +from calibre.gui2.convert.pmlz_output_ui import Ui_Form +from calibre.gui2.convert import Widget + +format_model = None + +class PluginWidget(Widget, Ui_Form): + + TITLE = _('PMLZ Output') + HELP = _('Options specific to')+' PMLZ '+_('output') + COMMIT_NAME = 'pmlz_output' + ICON = I('mimetypes/unknown.png') + + def __init__(self, parent, get_option, get_help, db=None, book_id=None): + Widget.__init__(self, parent, ['inline_toc', 'full_image_depth']) + self.db, self.book_id = db, book_id + self.initialize_options(get_option, get_help, db, book_id) diff --git a/src/calibre/gui2/convert/pmlz_output.ui b/src/calibre/gui2/convert/pmlz_output.ui new file mode 100644 index 0000000000..3573e14210 --- /dev/null +++ b/src/calibre/gui2/convert/pmlz_output.ui @@ -0,0 +1,48 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>Form</class> + <widget class="QWidget" name="Form"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>400</width> + <height>300</height> + </rect> + </property> + <property name="windowTitle"> + <string>Form</string> + </property> + <layout class="QGridLayout" name="gridLayout"> + <item row="2" column="0"> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>246</height> + </size> + </property> + </spacer> + </item> + <item row="0" column="0"> + <widget class="QCheckBox" name="opt_inline_toc"> + <property name="text"> + <string>&Inline TOC</string> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QCheckBox" name="opt_full_image_depth"> + <property name="text"> + <string>Do not reduce image size and depth</string> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> From e87b6e367945d0d31f99e1532c1da41128729104 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Thu, 2 Dec 2010 17:56:55 -0700 Subject: [PATCH 271/375] Global Times by malfi --- resources/recipes/globaltimes.recipe | 46 ++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 resources/recipes/globaltimes.recipe diff --git a/resources/recipes/globaltimes.recipe b/resources/recipes/globaltimes.recipe new file mode 100644 index 0000000000..0d281a01fd --- /dev/null +++ b/resources/recipes/globaltimes.recipe @@ -0,0 +1,46 @@ +from calibre.web.feeds.news import BasicNewsRecipe +import re + +class globaltimes(BasicNewsRecipe): + title = u'Global Times' + __author__ = 'malfi' + language = 'zh' + oldest_article = 7 + max_articles_per_feed = 100 + no_stylesheets = True + cover_url = 'http://enhimg2.huanqiu.com/images/logo.png' + language = 'en' + keep_only_tags = [] + keep_only_tags.append(dict(name = 'div', attrs = {'id': 'content'})) + remove_tags = [] + remove_tags.append(dict(name = 'div', attrs = {'class': 'location'})) + remove_tags.append(dict(name = 'div', attrs = {'class': 'contentpage'})) + remove_tags.append(dict(name = 'li', attrs = {'id': 'pl'})) + + 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;} + ''' + def parse_index(self): + catnames = {} + catnames["http://china.globaltimes.cn/chinanews/"] = "China Politics" + catnames["http://china.globaltimes.cn/diplomacy/"] = "China Diplomacy" + catnames["http://military.globaltimes.cn/china/"] = "China Military" + catnames["http://business.globaltimes.cn/china-economy/"] = "China Economy" + catnames["http://world.globaltimes.cn/asia-pacific/"] = "Asia Pacific" + feeds = [] + + for cat in catnames.keys(): + articles = [] + soup = self.index_to_soup(cat) + for a in soup.findAll('a',attrs={'href' : re.compile(cat+"201[0-9]-[0-1][0-9]/[0-9][0-9][0-9][0-9][0-9][0-9].html")}): + url = a['href'].strip() + myarticle=({'title':self.tag_to_string(a), 'url':url, 'description':'', 'date':''}) + self.log("found %s" % url) + articles.append(myarticle) + self.log("Adding URL %s\n" %url) + if articles: + feeds.append((catnames[cat], articles)) + return feeds From 59d9872a1152eb453c57b5cac5306b1e348ac0dc Mon Sep 17 00:00:00 2001 From: Translators <> Date: Fri, 3 Dec 2010 05:03:00 +0000 Subject: [PATCH 272/375] Launchpad automatic translations update. --- src/calibre/translations/de.po | 8 ++++---- src/calibre/translations/fr.po | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/calibre/translations/de.po b/src/calibre/translations/de.po index 8eaba806fe..3643d34f86 100644 --- a/src/calibre/translations/de.po +++ b/src/calibre/translations/de.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: de\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-11-27 20:21+0000\n" -"PO-Revision-Date: 2010-11-28 12:13+0000\n" -"Last-Translator: Manichean <Unknown>\n" +"PO-Revision-Date: 2010-12-02 13:54+0000\n" +"Last-Translator: miwie <Unknown>\n" "Language-Team: American English <kde-i18n-doc@lists.kde.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-11-29 04:48+0000\n" +"X-Launchpad-Export-Date: 2010-12-03 05:02+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Generated-By: pygettext.py 1.5\n" @@ -13333,7 +13333,7 @@ msgstr "Feeds der Index-Seite erhalten" #: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:869 msgid "Trying to download cover..." -msgstr "Umschlagbild versuchen heruterzuladen ..." +msgstr "Umschlagbild versuchen herunterzuladen ..." #: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:871 msgid "Generating masthead..." diff --git a/src/calibre/translations/fr.po b/src/calibre/translations/fr.po index cca9e97072..9befbd5b16 100644 --- a/src/calibre/translations/fr.po +++ b/src/calibre/translations/fr.po @@ -14,7 +14,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-12-02 04:45+0000\n" +"X-Launchpad-Export-Date: 2010-12-03 05:02+0000\n" "X-Generator: Launchpad (build Unknown)\n" "X-Poedit-Bookmarks: 1177,1104,-1,-1,-1,-1,-1,-1,-1,-1\n" "Generated-By: pygettext.py 1.5\n" From 825a3f984b435b481fcd6c0d38ffa1d4c38fffc5 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Thu, 2 Dec 2010 23:47:29 -0700 Subject: [PATCH 273/375] Fix NYTimes login page change --- resources/recipes/nytimes.recipe | 6 +++--- resources/recipes/nytimes_sub.recipe | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/resources/recipes/nytimes.recipe b/resources/recipes/nytimes.recipe index fbb4641580..eaa428e731 100644 --- a/resources/recipes/nytimes.recipe +++ b/resources/recipes/nytimes.recipe @@ -282,9 +282,9 @@ class NYTimes(BasicNewsRecipe): br = BasicNewsRecipe.get_browser() if self.username is not None and self.password is not None: br.open('http://www.nytimes.com/auth/login') - br.select_form(name='login') - br['USERID'] = self.username - br['PASSWORD'] = self.password + br.form = br.forms().next() + br['userid'] = self.username + br['password'] = self.password raw = br.submit().read() if 'Please try again' in raw: raise Exception('Your username and password are incorrect') diff --git a/resources/recipes/nytimes_sub.recipe b/resources/recipes/nytimes_sub.recipe index ad98b466e1..e56fd9cdec 100644 --- a/resources/recipes/nytimes_sub.recipe +++ b/resources/recipes/nytimes_sub.recipe @@ -282,9 +282,9 @@ class NYTimes(BasicNewsRecipe): br = BasicNewsRecipe.get_browser() if self.username is not None and self.password is not None: br.open('http://www.nytimes.com/auth/login') - br.select_form(name='login') - br['USERID'] = self.username - br['PASSWORD'] = self.password + br.form = br.forms().next() + br['userid'] = self.username + br['password'] = self.password raw = br.submit().read() if 'Please try again' in raw: raise Exception('Your username and password are incorrect') From 741ff46083118dc1f77d84d4611eb094311903b8 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Fri, 3 Dec 2010 09:18:38 +0000 Subject: [PATCH 274/375] Change enums back to having None as the default value --- src/calibre/gui2/custom_column_widgets.py | 32 +++++++++++-------- src/calibre/gui2/library/delegates.py | 14 +++----- src/calibre/gui2/library/models.py | 4 ++- .../gui2/preferences/create_custom_column.py | 4 +++ .../gui2/preferences/create_custom_column.ui | 9 +++--- src/calibre/library/caches.py | 18 ----------- src/calibre/library/custom_columns.py | 14 +++++--- 7 files changed, 42 insertions(+), 53 deletions(-) diff --git a/src/calibre/gui2/custom_column_widgets.py b/src/calibre/gui2/custom_column_widgets.py index b0b68033bb..6b6669f4e0 100644 --- a/src/calibre/gui2/custom_column_widgets.py +++ b/src/calibre/gui2/custom_column_widgets.py @@ -318,16 +318,14 @@ class Enumeration(Base): QComboBox(parent)] w = self.widgets[1] vals = self.col_metadata['display']['enum_values'] + w.addItem('') for v in vals: w.addItem(v) def initialize(self, book_id): val = self.db.get_custom(book_id, num=self.col_id, index_is_id=True) - if val is None: - # This really shouldn't happen - val = self.col_metadata['display']['enum_values'][0] - self.initial_val = val val = self.normalize_db_val(val) + self.initial_val = val idx = self.widgets[1].findText(val) if idx < 0: error_dialog(self.parent, '', @@ -340,13 +338,21 @@ class Enumeration(Base): self.widgets[1].setCurrentIndex(idx) def setter(self, val): - if val is None: - val = '' self.widgets[1].setCurrentIndex(self.widgets[1].findText(val)) def getter(self): return unicode(self.widgets[1].currentText()) + def normalize_db_val(self, val): + if val is None: + val = '' + return val + + def normalize_ui_val(self, val): + if not val: + val = None + return val + widgets = { 'bool' : Bool, 'rating' : Rating, @@ -597,7 +603,7 @@ class BulkEnumeration(BulkBase, Enumeration): dialog_shown = False for book_id in book_ids: val = self.db.get_custom(book_id, num=self.col_id, index_is_id=True) - if val not in self.col_metadata['display']['enum_values']: + if val and val not in self.col_metadata['display']['enum_values']: if not dialog_shown: error_dialog(self.parent, '', _('The enumeration "{0}" contains invalid values ' @@ -620,6 +626,7 @@ class BulkEnumeration(BulkBase, Enumeration): w = self.widgets[1] vals = self.col_metadata['display']['enum_values'] w.addItem('Do Not Change') + w.addItem('') for v in vals: w.addItem(v) @@ -632,7 +639,10 @@ class BulkEnumeration(BulkBase, Enumeration): if val == ' nochange ': self.widgets[1].setCurrentIndex(0) else: - self.widgets[1].setCurrentIndex(self.widgets[1].findText(val)) + if val is None: + self.widgets[1].setCurrentIndex(1) + else: + self.widgets[1].setCurrentIndex(self.widgets[1].findText(val)) def commit(self, book_ids, notify=False): val = self.gui_val @@ -640,12 +650,6 @@ class BulkEnumeration(BulkBase, Enumeration): if val != self.initial_val and val != ' nochange ': self.db.set_custom_bulk(book_ids, val, num=self.col_id, notify=notify) - def normalize_db_val(self, val): - if val is None: - # this really shouldn't happen - val = self.col_metadata['display']['enum_values'][0] - return val - class RemoveTags(QWidget): def __init__(self, parent, values): diff --git a/src/calibre/gui2/library/delegates.py b/src/calibre/gui2/library/delegates.py index bb73a55fc9..03309d1fba 100644 --- a/src/calibre/gui2/library/delegates.py +++ b/src/calibre/gui2/library/delegates.py @@ -263,28 +263,22 @@ class CcEnumDelegate(QStyledItemDelegate): # {{{ m = index.model() col = m.column_map[index.column()] editor = QComboBox(parent) + editor.addItem('') for v in m.custom_columns[col]['display']['enum_values']: editor.addItem(v) return editor def setModelData(self, editor, model, index): val = unicode(editor.currentText()) - m = index.model() - col = m.column_map[index.column()] - if val not in m.custom_columns[col]['display']['enum_values']: - # This shouldn't happen ... - print 'shouldnt happen' - val = m.custom_columns[col]['display']['enum_values'][0] + if not val: + val = None model.setData(index, QVariant(val), Qt.EditRole) def setEditorData(self, editor, index): m = index.model() val = m.db.data[index.row()][m.custom_columns[m.column_map[index.column()]]['rec_index']] if val is None: - # This shouldn't happen - m = index.model() - col = m.column_map[index.column()] - val = m.custom_columns[col]['display']['enum_values'][0] + val = '' idx = editor.findText(val) if idx < 0: editor.setCurrentIndex(0) diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index bee90fc44c..e09f85dc6b 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -724,6 +724,8 @@ class BooksModel(QAbstractTableModel): # {{{ val = val if val else None elif typ == 'enumeration': val = unicode(value.toString()).strip() + if not val: + val = None elif typ == 'bool': val = value.toPyObject() elif typ == 'rating': @@ -732,7 +734,7 @@ class BooksModel(QAbstractTableModel): # {{{ val *= 2 elif typ in ('int', 'float'): val = unicode(value.toString()).strip() - if val is None or not val: + if not val: val = None elif typ == 'datetime': val = value.toDate() diff --git a/src/calibre/gui2/preferences/create_custom_column.py b/src/calibre/gui2/preferences/create_custom_column.py index 419fed046d..3eed04f709 100644 --- a/src/calibre/gui2/preferences/create_custom_column.py +++ b/src/calibre/gui2/preferences/create_custom_column.py @@ -167,6 +167,10 @@ class CreateCustomColumn(QDialog, Ui_QCreateCustomColumn): return self.simple_error('', _('You must enter at least one' ' value for enumeration columns')) l = [v.strip() for v in unicode(self.enum_box.text()).split(',')] + for v in l: + if not v: + return self.simple_error('', _('You cannot provide the empty ' + 'value, as it is included by default')) for i in range(0, len(l)-1): if l[i] in l[i+1:]: return self.simple_error('', _('The value "{0}" is in the ' diff --git a/src/calibre/gui2/preferences/create_custom_column.ui b/src/calibre/gui2/preferences/create_custom_column.ui index 360c1a4345..bdf4f624a4 100644 --- a/src/calibre/gui2/preferences/create_custom_column.ui +++ b/src/calibre/gui2/preferences/create_custom_column.ui @@ -212,10 +212,9 @@ <item> <widget class="QLineEdit" name="enum_box"> <property name="toolTip"> - <string>A comma-separated list of permitted values. You can specify -empty values by entering only the comma. For example, the list -',one,two,three' has 4 valid values, one of them empty. The first -value in the list is the default.</string> + <string>A comma-separated list of permitted values. The empty value is always +included, and is the default. For example, the list 'one,two,three' has +four values, the first of them being the empty value.</string> </property> <property name="sizePolicy"> <sizepolicy hsizetype="Maximum" vsizetype="Fixed"> @@ -231,7 +230,7 @@ value in the list is the default.</string> <string>Default: (nothing)</string> </property> <property name="toolTip"> - <string>The first value entered will be the default value for this enumeration</string> + <string>The empty string is always the first value</string> </property> </widget> </item> diff --git a/src/calibre/library/caches.py b/src/calibre/library/caches.py index 8365cfe773..7b4c66c8b8 100644 --- a/src/calibre/library/caches.py +++ b/src/calibre/library/caches.py @@ -254,12 +254,6 @@ class ResultCache(SearchQueryParser): # {{{ if field_metadata[key]['datatype'] == 'composite': self.composites.append((key, field_metadata[key]['rec_index'])) - self.enumerations = [] - for key in field_metadata: - if field_metadata[key]['datatype'] == 'enumeration': - self.enumerations.append((field_metadata[key]['display']['enum_values'][0], - field_metadata[key]['rec_index'])) - def __getitem__(self, row): return self._data[self._map_filtered[row]] @@ -697,10 +691,6 @@ class ResultCache(SearchQueryParser): # {{{ mi = db.get_metadata(id, index_is_id=True) for k,c in self.composites: self._data[id][c] = mi.get(k, None) - if len(self.enumerations) > 0: - for v,c in self.enumerations: - if self._data[id][c] is None: - self._data[id][c] = v except IndexError: return None try: @@ -721,10 +711,6 @@ class ResultCache(SearchQueryParser): # {{{ mi = db.get_metadata(id, index_is_id=True) for k,c in self.composites: self._data[id][c] = mi.get(k) - if len(self.enumerations) > 0: - for v,c in self.self._data[id][c]: - if self._data[id][c] is None: - self._data[id][c] = v self._map[0:0] = ids self._map_filtered[0:0] = ids @@ -754,10 +740,6 @@ class ResultCache(SearchQueryParser): # {{{ mi = db.get_metadata(item[0], index_is_id=True) for k,c in self.composites: item[c] = mi.get(k) - if len(self.enumerations) > 0: - for v,c in self.enumerations: - if item[c] is None: - item[c] = v self._map = [i[0] for i in self._data if i is not None] if field is not None: diff --git a/src/calibre/library/custom_columns.py b/src/calibre/library/custom_columns.py index dc3a67e860..f544a9bf7e 100644 --- a/src/calibre/library/custom_columns.py +++ b/src/calibre/library/custom_columns.py @@ -136,6 +136,12 @@ class CustomColumns(object): x = bool(int(x)) return x + def adapt_enum(x, d): + v = adapt_text(x, d) + if not v: + v = None + return v + self.custom_data_adapters = { 'float': lambda x,d : x if x is None else float(x), 'int': lambda x,d : x if x is None else int(x), @@ -145,7 +151,7 @@ class CustomColumns(object): 'datetime' : adapt_datetime, 'text':adapt_text, 'series':adapt_text, - 'enumeration': adapt_text + 'enumeration': adapt_enum } # Create Tag Browser categories for custom columns @@ -177,8 +183,6 @@ class CustomColumns(object): ans = ans.split('|') if ans else [] if data['display'].get('sort_alpha', False): ans.sort(cmp=lambda x,y:cmp(x.lower(), y.lower())) - elif data['datatype'] == 'enumeration' and ans is None: - ans = data['display']['enum_values'][0] return ans def get_custom_extra(self, idx, label=None, num=None, index_is_id=False): @@ -442,8 +446,8 @@ class CustomColumns(object): val = self.custom_data_adapters[data['datatype']](val, data) if data['normalized']: - if data['datatype'] == 'enumeration' and \ - val not in data['display']['enum_values']: + if data['datatype'] == 'enumeration' and ( + val and val not in data['display']['enum_values']): return None if not append or not data['is_multiple']: self.conn.execute('DELETE FROM %s WHERE book=?'%lt, (id_,)) From eac8447e478b7e1fad8d3378ec7077c2c163a2b8 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Fri, 3 Dec 2010 13:09:20 +0000 Subject: [PATCH 275/375] Speed up manage_authors by orders of magnitude. In the process, make database_changed notification sane, doing the operation once even if many emits were done. --- src/calibre/gui2/tag_view.py | 10 ++++++++-- src/calibre/library/database2.py | 7 ++++--- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/calibre/gui2/tag_view.py b/src/calibre/gui2/tag_view.py index 972a1eeba3..768b699ca9 100644 --- a/src/calibre/gui2/tag_view.py +++ b/src/calibre/gui2/tag_view.py @@ -106,10 +106,13 @@ class TagsView(QTreeView): # {{{ self.refresh_required.connect(self.recount, type=Qt.QueuedConnection) self.sort_by.currentIndexChanged.connect(self.sort_changed) self.made_connections = True + self.refresh_signal_processed = True db.add_listener(self.database_changed) def database_changed(self, event, ids): - self.refresh_required.emit() + if self.refresh_signal_processed: + self.refresh_signal_processed = False + self.refresh_required.emit() @property def match_all(self): @@ -295,6 +298,7 @@ class TagsView(QTreeView): # {{{ return self.isExpanded(idx) def recount(self, *args): + self.refresh_signal_processed = True ci = self.currentIndex() if not ci.isValid(): ci = self.indexAt(QPoint(10, 10)) @@ -937,7 +941,9 @@ class TagBrowserMixin(object): # {{{ if old_author != new_author: # The id might change if the new author already exists id = db.rename_author(id, new_author) - db.set_sort_field_for_author(id, unicode(new_sort)) + db.set_sort_field_for_author(id, unicode(new_sort), + commit=False, notify=False) + db.commit() self.library_view.model().refresh() self.tags_view.recount() diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index a07e46577e..4e05aa3a95 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -1639,15 +1639,16 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): return [] return result - def set_sort_field_for_author(self, old_id, new_sort): + def set_sort_field_for_author(self, old_id, new_sort, commit=True, notify=False): self.conn.execute('UPDATE authors SET sort=? WHERE id=?', \ (new_sort.strip(), old_id)) - self.conn.commit() + if commit: + self.conn.commit() # Now change all the author_sort fields in books by this author bks = self.conn.get('SELECT book from books_authors_link WHERE author=?', (old_id,)) for (book_id,) in bks: ss = self.author_sort_from_book(book_id, index_is_id=True) - self.set_author_sort(book_id, ss) + self.set_author_sort(book_id, ss, notify=notify, commit=commit) def rename_author(self, old_id, new_name): # Make sure that any commas in new_name are changed to '|'! From 40780b84eab5d6d407ba87782dc3e9880eb7ecb1 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Fri, 3 Dec 2010 09:20:10 -0700 Subject: [PATCH 276/375] Fix #7777 (New recipe for The Philosophers' Magazine) --- resources/images/news/tpm_uk.png | Bin 0 -> 873 bytes resources/recipes/tpm_uk.recipe | 72 +++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 resources/images/news/tpm_uk.png create mode 100644 resources/recipes/tpm_uk.recipe diff --git a/resources/images/news/tpm_uk.png b/resources/images/news/tpm_uk.png new file mode 100644 index 0000000000000000000000000000000000000000..d8c586a296d8e29f285a679177732f8386428e15 GIT binary patch literal 873 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b zK-vS0-A-oPfdtD69Mgd`SU*F|v9*U87?>t`x;TbdoOYeOJ1-_x;CQ|9{ikd8zKNQB zBkV@gf{?Hdm&u_T69k!dE@0qNxu^VyRbxVhf_a{TKyr-5>yGY)g|C@nZl!;p^WI2= z{Y;4QC6WKD&y<z<x(F0ri83?}k<nD0wQS*(rof3=IXNb4!epgv+9qggXw=SMxiu)8 zmBG;I%ab`D?=4<s@jT<Un4scPmWG)R=N6mz9)9~)x4OFe%=6-qsi#kSuUoh7MX>wY zso%x?XZkI_67}<Kzx~hG@3Z&xZz!$5o@ULTV|07l`u#tzg{_P--5g){_iozvZMi_P z<L~!mFP$|tYg*CP^ZS2XQu|((TlL@fvRdB(mgh2-=~DVL4o+6@zj^D{qD-lIw$T%U z+*s!b%QOkAy7jNS{@S{4v4COo_2=sk_VnBTnsDc<ju`i>7m<3?IVJ?LCoP#0@ZR>E zWzhWhM=Wh^9bInRzpw6g{@_8z(@!UD%ROl+oa_?H-gvfU-}{gEKHratk1wvPJIDU} zz483>m0w=u_VxF#-1=zm^4C@&Qzsc^F+G~1_ch}~hlAG4!-t*kRsERYZ~vR6Ve?aM z0ryh|QoSozE_fBVxoMS9vdU5yuhz3?eb1dcXCOS!{(o1Dk-NM5l%NlCd3kvP&sUf( zUgdSYG=bShTxRvQ$4|bb3nW_2<om$Qv%mH1NePKO)(*P|bCS141+Ee_ce}!*ANPmj z!1w!qfgwLf+2ozx*4XO{{hpqiB*5g?8r0MD@zWD^20cB!fUi$%T=q_J((5!=OHSGL z`M{YT0j8~CzxKJia2WC(ESk41SF->3mb<eAn9{!4v&xoTd;Rr-OQ=)Ne=%>3r9w^$ zSDh}KT(P=inO<}*L$kA2LO_tAhT}@s5)+e)XFhCHTwZkj$U)wt)lcOwWMm0^*|w1b zm{e6uTq8<S5=&C8l8aJ-6oZk0p@FWUk*<Mph=HY*p}Cc@sjh*!m4QLwoY&SU8glbf iGSe!NH5eLN8JGc;LNu6~{Z#{MVDNPHb6Mw<&;$U`BYS-S literal 0 HcmV?d00001 diff --git a/resources/recipes/tpm_uk.recipe b/resources/recipes/tpm_uk.recipe new file mode 100644 index 0000000000..aa042de951 --- /dev/null +++ b/resources/recipes/tpm_uk.recipe @@ -0,0 +1,72 @@ +__license__ = 'GPL v3' +__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>' +''' +www.philosophypress.co.uk +''' + +from calibre.web.feeds.news import BasicNewsRecipe + +class TPM_uk(BasicNewsRecipe): + title = "The Philosophers' Magazine" + __author__ = 'Darko Miletic' + description = 'Title says it all' + publisher = "The Philosophers' Magazine" + category = 'philosophy, news' + oldest_article = 25 + max_articles_per_feed = 200 + no_stylesheets = True + encoding = 'utf8' + use_embedded_content = False + language = 'en_GB' + remove_empty_feeds = True + publication_type = 'magazine' + masthead_url = 'http://www.philosophypress.co.uk/wp-content/themes/masterplan/tma/images/bg/sitelogo.png' + extra_css = """ + body{font-family: Helvetica,Arial,"Lucida Grande",Verdana,sans-serif } + img{margin-bottom: 0.4em; display:block} + """ + + conversion_options = { + 'comment' : description + , 'tags' : category + , 'publisher' : publisher + , 'language' : language + } + + remove_tags = [ + dict(name=['meta','link','base','iframe','embed','object','img']) + ,dict(attrs={'id':['respond','sharethis_0']}) + ,dict(attrs={'class':'wp-caption-text'}) + ] + keep_only_tags=[ + dict(attrs={'class':['post_cat','post_name','post_meta','post_text']}) + ,dict(attrs={'id':'comments'}) + ] + remove_attributes=['lang','width','height'] + + + feeds = [ + (u'Columns' , u'http://www.philosophypress.co.uk/?feed=rss2&cat=15' ) + ,(u'Essays' , u'http://www.philosophypress.co.uk/?feed=rss2&cat=19' ) + ,(u"21'st Century" , u'http://www.philosophypress.co.uk/?feed=rss2&cat=101') + ,(u'Interviews' , u'http://www.philosophypress.co.uk/?feed=rss2&cat=9' ) + ,(u'News' , u'http://www.philosophypress.co.uk/?feed=rss2&cat=28' ) + ,(u'Profiles' , u'http://www.philosophypress.co.uk/?feed=rss2&cat=59' ) + ,(u'Reviews' , u'http://www.philosophypress.co.uk/?feed=rss2&cat=12' ) + ] + + def get_cover_url(self): + soup = self.index_to_soup('http://www.philosophypress.co.uk/') + for image in soup.findAll('img',title=True): + if image['title'].startswith('Click to Subscribe'): + return image['src'] + return None + + def preprocess_html(self, soup): + for item in soup.findAll(style=True): + del item['style'] + for alink in soup.findAll('a', rel=True): + if alink.string is not None: + tstr = alink.string + alink.replaceWith(tstr) + return soup From 72a41ea70ce2f547bb836f8d44ca9540f8ce123a Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Fri, 3 Dec 2010 09:20:56 -0700 Subject: [PATCH 277/375] Fix #7776 (Updated recipe for NZZ site) --- resources/recipes/nzz_ger.recipe | 35 +++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/resources/recipes/nzz_ger.recipe b/resources/recipes/nzz_ger.recipe index 66e22f50ef..09e011a1dc 100644 --- a/resources/recipes/nzz_ger.recipe +++ b/resources/recipes/nzz_ger.recipe @@ -1,6 +1,6 @@ __license__ = 'GPL v3' -__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>' +__copyright__ = '2009-2010, Darko Miletic <darko.miletic at gmail.com>' ''' www.nzz.ch @@ -20,6 +20,19 @@ class Nzz(BasicNewsRecipe): encoding = 'utf-8' use_embedded_content = False language = 'de' + extra_css = """ + body{font-family: Georgia,"Times New Roman",Times,serif } + .artikel h3,.artikel h4,.bildLegende,.question,.autor{font-family: Arial,Verdana,Helvetica,sans-serif} + .bildLegende{font-size: small} + .autor{font-size: 0.9375em; color: #666666} + .quote{font-size: large !important; + font-style: italic; + font-weight: normal !important; + border-bottom: 1px dotted #BFBFBF; + border-top: 1px dotted #BFBFBF; + line-height: 1.25em} + .quelle{color: #666666; font-style: italic; white-space: nowrap} + """ conversion_options = { 'comments' : description @@ -28,12 +41,14 @@ class Nzz(BasicNewsRecipe): ,'publisher' : publisher } - keep_only_tags = [dict(name='div', attrs={'class':'article'})] - + keep_only_tags = [dict(name='div', attrs={'class':'zone'})] + remove_tags_before = dict(name='p', attrs={'class':'dachzeile'}) + remove_tags_after=dict(name='p', attrs={'class':'fussnote'}) + remove_attributes=['width','height','lang'] remove_tags = [ - dict(name=['object','link','base']) - ,dict(name='div',attrs={'class':['more','teaser','advXertXoriXals','legal']}) - ,dict(name='div',attrs={'id':['popup-src','readercomments','google-ad','advXertXoriXals']}) + dict(name=['object','link','base','meta','iframe']) + ,dict(attrs={'id':'content_rectangle_1'}) + ,dict(attrs={'class':['weiterfuehrendeLinks','fussnote','video']}) ] feeds = [ @@ -50,7 +65,7 @@ class Nzz(BasicNewsRecipe): ,(u'Reisen' , u'http://www.nzz.ch/magazin/reisen?rss=true') ] - def print_version(self, url): - return url + '?printview=true' - - + def preprocess_html(self, soup): + for item in soup.findAll(style=True): + del item['style'] + return self.adeify_images(soup) From 215007e1600662f049c08a90e16a52fab1d27418 Mon Sep 17 00:00:00 2001 From: Hiroshi Miura <miurahr@linux.com> Date: Sat, 4 Dec 2010 01:33:57 +0900 Subject: [PATCH 278/375] recipe: mainichi_it_news: fix typo --- resources/recipes/mainichi_it_news.recipe | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/recipes/mainichi_it_news.recipe b/resources/recipes/mainichi_it_news.recipe index 4c285a2c01..732e47bf8e 100644 --- a/resources/recipes/mainichi_it_news.recipe +++ b/resources/recipes/mainichi_it_news.recipe @@ -14,6 +14,7 @@ class MainichiDailyITNews(BasicNewsRecipe): remove_tags_before = {'class':"NewsTitle"} remove_tags = [{'class':"RelatedArticle"}] + remove_tags_after = {'class':"Credit"} def parse_feeds(self): @@ -29,4 +30,4 @@ class MainichiDailyITNews(BasicNewsRecipe): index = curfeed.articles.index(d) curfeed.articles[index:index+1] = [] - return feeds remove_tags_after = {'class':"Credit"} + return feeds From a172785529e3c0acd8a22e1999bcf21da9e7ac7c Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Fri, 3 Dec 2010 09:51:35 -0700 Subject: [PATCH 279/375] E-book viewer: Fix broken backwards searching --- src/calibre/ebooks/oeb/iterator.py | 5 ++++- src/calibre/gui2/viewer/documentview.py | 2 +- src/calibre/gui2/viewer/main.py | 13 +++++++++---- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/calibre/ebooks/oeb/iterator.py b/src/calibre/ebooks/oeb/iterator.py index 91028c2bc5..10180541a1 100644 --- a/src/calibre/ebooks/oeb/iterator.py +++ b/src/calibre/ebooks/oeb/iterator.py @@ -96,7 +96,10 @@ class EbookIterator(object): def search(self, text, index, backwards=False): text = text.lower() - for i, path in enumerate(self.spine): + pmap = [(i, path) for i, path in enumerate(self.spine)] + if backwards: + pmap.reverse() + for i, path in pmap: if (backwards and i < index) or (not backwards and i > index): if text in open(path, 'rb').read().decode(path.encoding).lower(): return i diff --git a/src/calibre/gui2/viewer/documentview.py b/src/calibre/gui2/viewer/documentview.py index 92c06a47f0..8ce0b46a6d 100644 --- a/src/calibre/gui2/viewer/documentview.py +++ b/src/calibre/gui2/viewer/documentview.py @@ -614,7 +614,7 @@ class DocumentView(QWebView): def search(self, text, backwards=False): if backwards: - return self.findText(text, self.document.FindBackwards) + return self.findText(text, self.document.FindBackward) return self.findText(text) def path(self): diff --git a/src/calibre/gui2/viewer/main.py b/src/calibre/gui2/viewer/main.py index 1ea1aca733..96fe758ca6 100644 --- a/src/calibre/gui2/viewer/main.py +++ b/src/calibre/gui2/viewer/main.py @@ -172,6 +172,7 @@ class EbookViewer(MainWindow, Ui_EbookViewer): self.iterator = None self.current_page = None self.pending_search = None + self.pending_search_dir= None self.pending_anchor = None self.pending_reference = None self.pending_bookmark = None @@ -435,7 +436,7 @@ class EbookViewer(MainWindow, Ui_EbookViewer): if not text: self.view.search('') return self.search.search_done(False) - if self.view.search(text): + if self.view.search(text, backwards=backwards): self.scrolled(self.view.scroll_fraction) return self.search.search_done(True) index = self.iterator.search(text, self.current_index, @@ -449,11 +450,13 @@ class EbookViewer(MainWindow, Ui_EbookViewer): return self.search.search_done(True) return self.search.search_done(True) self.pending_search = text + self.pending_search_dir = 'backwards' if backwards else 'forwards' self.load_path(self.iterator.spine[index]) - def do_search(self, text): + def do_search(self, text, backwards): self.pending_search = None - if self.view.search(text): + self.pending_search_dir = None + if self.view.search(text, backwards=backwards): self.scrolled(self.view.scroll_fraction) def keyPressEvent(self, event): @@ -499,8 +502,10 @@ class EbookViewer(MainWindow, Ui_EbookViewer): self.current_index = index self.set_page_number(self.view.scroll_fraction) if self.pending_search is not None: - self.do_search(self.pending_search) + self.do_search(self.pending_search, + self.pending_search_dir=='backwards') self.pending_search = None + self.pending_search_dir = None if self.pending_anchor is not None: self.view.scroll_to(self.pending_anchor) self.pending_anchor = None From 2e3e4a254c5fa737cfadbbcc365afcfb38606eda Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Fri, 3 Dec 2010 10:52:39 -0700 Subject: [PATCH 280/375] version 0.7.32 --- Changelog.yaml | 101 +++++++++++++++++++++++++++++++++++++++ src/calibre/constants.py | 2 +- 2 files changed, 102 insertions(+), 1 deletion(-) diff --git a/Changelog.yaml b/Changelog.yaml index 3e5dbb06fc..068afbb42d 100644 --- a/Changelog.yaml +++ b/Changelog.yaml @@ -4,6 +4,107 @@ # for important features/bug fixes. # Also, each release can have new and improved recipes. +- version: 0.7.32 + date: 2010-12-03 + + new features: + - title: "All new linux binary build. With updated libraries and replacing cx_Freeze with my own C python launcher code." + + - title: "Edit metadata dialog: Add Next and Previous buttons and show cover size in tooltip" + tickets: [7706, 7711] + + - title: "A new custom column type: Enumeration. This column can take one of a user defined set of values." + + - title: "PML Output: Add option to reduce image sizes/bit depth to allow PML Output to be used with DropBook" + + - title: "TXT Output: Add option to generate Markdown output. Turn <br> tags into spaces." + + - title: "Add a count function to the template language. Make author_sort searchable." + + - title: "Various consistency and usability enhancements to the search box." + tickets: [7726] + description: > + "Always select first book in result set of a search. Similar books searches added to search history. Search history order is no longer randomized. When focussing the search box with a keyboard shortcut, select all text. If you press enter in the search box, the search is executed and the book list os automatically focussed." + + - title: "Driver for samsung fascinate and PocketBook 902" + + - title: "FB2 Output: Add option to create FB2 sections based on internal file structure of input file (useful for EPUB files that have been split on chapter boundaries). Also add options to mark h1/h2/h3 tags as section titles in the FB2 file." + tickets: [7738] + + - title: "Metadata jacket: Add publisher information to jacket." + + - title: "Catalog generation: Allow use of custom columns as well as tags to indicate read books. Note that your previously saved read books setting will be lost." + + - title: "Bulk metadata edit dialog: Add an Apply button to allow you to perform multiple operations in sequence" + + - title: "Allow drag and drop of books onto user categories. If you drag a book from a particular column (say authors) and drop it onto a user category, the column value will be added to the user category. So for authors, the authros will be added to the user category." + + - title: "Check Library can now check and repair the has_cover cache" + + - title: "Allow GUI plugins to be distributed in ZIP files. See http://www.mobileread.com/forums/showthread.php?t=108774" + + - title: "Allow searching by the number of tags/authors/formats/etc. See User Manual for details." + + - title: "Tiny speed up when loading large libraries and make various metadata editing tasks a little faster by reducing the number of times the Tag Browser is refreshed" + + bug fixes: + - title: "E-book viewer: Fix broken backwards searching" + + - title: "Fix custom ratings column values being displayed incorrectly in book details area" + tickets: [7740] + + - title: "Fix book details dialog not using internal viewer to view ebooks" + tickets: [7424] + + - title: "MOBI Output: When the input document does not explicitly specify a size for images, set the size to be the natural size of the image. This works around Amazon's *truly wonderful* MOBI renderer's tendency to expand images that do not have a width and height specified." + + - title: "Conversion pipeline: Fix bug that caused height/width specified in %/em of screen size to be incorrectly calculated by a factor of 72./DPI" + + - title: "Conversion pipeline: Respect max-width and max-height when calculating the effective size of an element" + + - title: "Conversion pipeline: Do not override CSS for images with the value of the img width/height attributes, unless no CSS is specified for the image" + + - title: "E-book viewer: Resize automatically to fit on smaller screens" + + - title: "Use the same MIME database on all platforms that calibre runs on, works around python 2.7's crazy insistence on reading MIME data from the registry" + + - title: "Kobo driver: Allow html, txt and rtf documents to be deleted" + + - title: "Always overwrite title/author metadata when downloading metadata for books added by ISBN" + + - title: "Nook Color profile: Reduce screen height to 900px" + + - title: "Fix regression that broke RTF conversion on some linux systems" + + - title: "Fix bug that could break searching after copying and deleting a book from the current library" + tickets: [7459] + + improved recipes: + - NZZ + - Frankfurter Rundschau + - JiJi Press + - Revista Muy Intersante + + new recipes: + - title: "Global Times" + author: "malfi" + + - title: "The Philosopher's Magazine" + author: "Darko Miletic" + + - title: "Poughkeepsie Journal" + author: "weebl" + + - title: "Business Spectator and ABC Australia" + author: "Dean Cording" + + - title: "La Rijoa and NacionRed" + author: "Arturo Martinez Nieves" + + - title: "Animal Politico" + author: "leamsi" + + - version: 0.7.31 date: 2010-11-27 diff --git a/src/calibre/constants.py b/src/calibre/constants.py index fc33067f49..197fe5888a 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.31' +__version__ = '0.7.32' __author__ = "Kovid Goyal <kovid@kovidgoyal.net>" import re From 36fc63cf3683b6da59d48f69418a2f8a388af2ac Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Fri, 3 Dec 2010 11:35:08 -0700 Subject: [PATCH 281/375] IGN:Tag release --- src/calibre/translations/calibre.pot | 1377 +++++++++++++++----------- 1 file changed, 779 insertions(+), 598 deletions(-) diff --git a/src/calibre/translations/calibre.pot b/src/calibre/translations/calibre.pot index c513e267e3..0eeae72c07 100644 --- a/src/calibre/translations/calibre.pot +++ b/src/calibre/translations/calibre.pot @@ -4,9 +4,9 @@ # msgid "" msgstr "" -"Project-Id-Version: calibre 0.7.31\n" -"POT-Creation-Date: 2010-11-27 11:31+MST\n" -"PO-Revision-Date: 2010-11-27 11:31+MST\n" +"Project-Id-Version: calibre 0.7.32\n" +"POT-Creation-Date: 2010-12-03 10:53+MST\n" +"PO-Revision-Date: 2010-12-03 10:53+MST\n" "Last-Translator: Automatically generated\n" "Language-Team: LANGUAGE\n" "MIME-Version: 1.0\n" @@ -25,7 +25,7 @@ msgstr "" #: /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/books.py:24 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:448 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:465 #: /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 @@ -49,7 +49,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:71 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:373 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:378 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:606 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:608 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:36 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:61 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:50 @@ -72,9 +72,9 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:78 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:119 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:153 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:627 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:833 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:835 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:631 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:837 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:839 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:913 @@ -83,7 +83,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:143 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:150 #: /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:111 #: /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 @@ -107,12 +107,12 @@ 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:304 -#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:306 +#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:305 +#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:307 #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:355 #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:362 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:279 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:302 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:305 #: /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 @@ -124,25 +124,25 @@ msgstr "" #: /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:571 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:671 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:193 #: /home/kovid/work/calibre/src/calibre/gui2/email.py:235 #: /home/kovid/work/calibre/src/calibre/gui2/email.py:244 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:376 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:395 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:918 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1112 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:922 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1116 #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:112 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:190 #: /home/kovid/work/calibre/src/calibre/library/cli.py:215 #: /home/kovid/work/calibre/src/calibre/library/database.py:914 -#: /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:1254 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1355 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2151 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2153 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2284 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:373 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:385 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1260 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1361 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2158 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2160 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2291 #: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:229 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:139 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:142 @@ -180,7 +180,7 @@ msgstr "" msgid "User Interface Action" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:386 +#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:395 #: /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:189 @@ -273,7 +273,7 @@ msgid "Change the way calibre behaves" msgstr "" #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:740 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:209 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:211 msgid "Add your own columns" msgstr "" @@ -425,124 +425,124 @@ msgstr "" msgid "If specified, the output plugin will try to create output that is as human readable as possible. May not have any effect for some output plugins." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:47 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:49 msgid "Input profile" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:51 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:53 msgid "This profile tries to provide sane defaults and is useful if you know nothing about the input document." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:59 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:444 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:61 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:446 msgid "This profile is intended for the SONY PRS line. The 500/505/600/700 etc." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:71 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:73 msgid "This profile is intended for the SONY PRS 300." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:80 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:484 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:82 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:486 msgid "This profile is intended for the SONY PRS-900." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:88 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:513 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:90 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:515 msgid "This profile is intended for the Microsoft Reader." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:99 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:524 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:101 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:526 msgid "This profile is intended for the Mobipocket books." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:112 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:537 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:114 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:539 msgid "This profile is intended for the Hanlin V3 and its clones." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:124 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:549 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:126 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:551 msgid "This profile is intended for the Hanlin V5 and its clones." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:134 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:557 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:136 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:559 msgid "This profile is intended for the Cybook G3." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:147 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:570 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:149 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:572 msgid "This profile is intended for the Cybook Opus." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:159 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:583 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:161 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:585 msgid "This profile is intended for the Amazon Kindle." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:171 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:631 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:173 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:633 msgid "This profile is intended for the Irex Illiad." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:183 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:644 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:185 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:646 msgid "This profile is intended for the IRex Digital Reader 1000." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:196 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:658 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:198 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:660 msgid "This profile is intended for the IRex Digital Reader 800." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:208 -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:672 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:210 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:674 msgid "This profile is intended for the B&N Nook." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:230 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:232 msgid "Output profile" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:234 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:236 msgid "This profile tries to provide sane defaults and is useful if you want to produce a document intended to be read at a computer or on a range of devices." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:276 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:278 msgid "Intended for the iPad and similar devices with a resolution of 768x1024" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:435 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:437 msgid "Intended for generic tablet devices, does no resizing of images" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:462 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:464 msgid "This profile is intended for the Kobo Reader." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:475 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:477 msgid "This profile is intended for the SONY PRS-300." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:493 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:495 msgid "This profile is intended for the 5-inch JetBook." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:502 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:504 msgid "This profile is intended for the SONY PRS line. The 500/505/700 etc, in landscape mode. Mainly useful for comics." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:609 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:611 msgid "This profile is intended for the Amazon Kindle DX." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:684 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:686 msgid "This profile is intended for the B&N Nook Color." msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:695 +#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:697 msgid "This profile is intended for the Sanda Bambook." msgstr "" @@ -614,7 +614,7 @@ msgstr "" msgid "Comma separated list of directories to send e-books to on the device. The first one that exists will be used" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:98 +#: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:99 msgid "Communicate with S60 phones." msgstr "" @@ -681,19 +681,19 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:882 #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:888 #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:918 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:257 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:264 #: /home/kovid/work/calibre/src/calibre/library/database2.py:187 #: /home/kovid/work/calibre/src/calibre/library/database2.py:200 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2015 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:149 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2022 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:150 msgid "News" msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2554 -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:20 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:21 #: /home/kovid/work/calibre/src/calibre/library/catalog.py:560 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1978 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1996 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1985 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2003 msgid "Catalog" msgstr "" @@ -795,8 +795,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:102 #: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:113 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:268 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:300 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:279 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:311 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:256 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:274 msgid "Removing books from device..." @@ -864,14 +864,14 @@ msgstr "" msgid "Communicate with the Kobo Reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:49 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:51 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:65 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:68 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:71 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:204 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:67 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:70 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:73 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:214 #: /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 @@ -881,26 +881,26 @@ msgstr "" msgid "Getting list of books on device..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:304 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:311 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:315 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:322 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:281 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:286 msgid "Removing books from device metadata listing..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:316 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:351 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:327 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:362 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:219 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:250 msgid "Adding books to device metadata listing..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:428 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:262 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:445 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:268 msgid "Not Implemented" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:429 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:446 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 "" @@ -1578,9 +1578,9 @@ msgstr "" msgid "Start" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/fb2ml.py:147 +#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/fb2ml.py:151 #: /home/kovid/work/calibre/src/calibre/ebooks/rb/rbml.py:102 -#: /home/kovid/work/calibre/src/calibre/ebooks/txt/txtml.py:77 +#: /home/kovid/work/calibre/src/calibre/ebooks/txt/txtml.py:78 msgid "Table of Contents:" msgstr "" @@ -1592,7 +1592,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/pdb/output.py:32 #: /home/kovid/work/calibre/src/calibre/ebooks/pml/output.py:37 #: /home/kovid/work/calibre/src/calibre/ebooks/rb/output.py:21 -#: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:35 +#: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:36 msgid "Add Table of Contents to beginning of the book." msgstr "" @@ -1600,6 +1600,22 @@ msgstr "" msgid "Try to turn chapters into individual sections. WARNING: This option is experimental. It can cause conversion to fail. It can also produce unexpected output." msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/output.py:30 +msgid "Try to turn chapters into individual sections using the internal structure of the ebook. This works well for EPUB books that have been internally split by chapter." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/output.py:35 +msgid "Wrap all h1 tags with fb2 title elements." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/output.py:38 +msgid "Wrap all h2 tags with fb2 title elements." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/output.py:41 +msgid "Wrap all h3 tags with fb2 title elements." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:249 msgid "Traverse links in HTML files breadth first. Normally, they are traversed depth first." msgstr "" @@ -1889,102 +1905,102 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:533 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:59 -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:448 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:492 msgid "No" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:533 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:59 -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:448 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:492 msgid "Yes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:605 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:607 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:45 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:108 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:107 #: /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:373 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:923 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:303 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:927 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:304 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:570 msgid "Title" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:606 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:608 #: /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:378 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:924 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:928 msgid "Author(s)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:607 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:609 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:61 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:72 msgid "Publisher" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:608 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:610 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:49 msgid "Producer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:609 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:611 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:39 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:210 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:189 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:108 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:79 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:325 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1131 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:178 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1135 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:188 msgid "Comments" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:611 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:160 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:613 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:166 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:29 #: /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:313 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1127 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1131 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:161 #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:655 msgid "Tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:613 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:158 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:615 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:164 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:28 #: /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:330 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1136 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1140 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:109 msgid "Series" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:614 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:616 msgid "Language" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:616 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1119 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:618 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1123 msgid "Timestamp" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:618 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:157 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:620 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:163 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:63 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:70 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:258 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:259 msgid "Published" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:620 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:622 msgid "Rights" msgstr "" @@ -2327,7 +2343,7 @@ msgid "%s format books are not supported" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/cover.py:98 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:156 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:214 msgid "Book %s of %s" msgstr "" @@ -2335,7 +2351,11 @@ msgstr "" msgid "HTML TOC generation options." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:159 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:130 +msgid "Unknown publisher" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:165 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:71 #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:653 msgid "Rating" @@ -2597,6 +2617,10 @@ msgstr "" msgid "Specify the character encoding of the output document. The default is cp1252." msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/pml/output.py:40 +msgid "Do not reduce the size or bit depth of images. Images have their size and depth reduced by default to accommodate applications that can not convert images on their own such as Dropbook." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:256 msgid "" "This RTF file has a feature calibre does not support. Convert it to HTML first and then try it.\n" @@ -2609,7 +2633,7 @@ msgid "Specify the character encoding of the output document. The default is utf msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:29 -#: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:38 +#: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:39 msgid "The maximum number of characters per line. This splits on the first space before the specified value. If no space is found the line will be broken at the space after and will exceed the specified value. Also, there is a minimum of 25 characters. Use 0 to disable line splitting." msgstr "" @@ -2655,18 +2679,30 @@ msgstr "" msgid "Do not insert a Table of Contents into the output text." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:24 +#: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:25 msgid "Type of newline to use. Options are %s. Default is 'system'. Use 'old_mac' 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 "" -#: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:30 +#: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:31 msgid "Specify the character encoding of the output document. The default is utf-8. Note: This option is not honored by all formats." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:45 +#: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:46 msgid "Force splitting on the max-line-length value when no space is present. Also allows max-line-length to be below the minimum" msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:50 +msgid "Produce Markdown formatted text." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:53 +msgid "Do not remove links within the document. This is only useful when paired with the markdown-format option becauselinks are always removed with plain text output." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:58 +msgid "Do not remove image references within the document. This is only useful when paired with the markdown-format option becauseimage references are always removed with plain text output." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:67 msgid "Send file to storage card instead of main memory by default" msgstr "" @@ -2792,139 +2828,139 @@ msgstr "" msgid "Choose Files" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:25 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:26 msgid "Add books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:26 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:27 msgid "Add books to the calibre library/device from files on your computer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:28 msgid "A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:33 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:34 msgid "Add books from a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:35 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:36 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:39 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:40 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:43 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:44 msgid "Add Empty book. (Book entry with no formats)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:45 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:46 msgid "Add from ISBN" 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?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:86 msgid "How many empty books should be added?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:147 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:153 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:212 msgid "Uploading books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:164 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:299 msgid "Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:171 msgid "EPUB Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:172 msgid "LRF Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:173 msgid "HTML Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:174 msgid "LIT Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:175 msgid "MOBI Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:176 msgid "Topaz books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:177 msgid "Text books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:178 msgid "PDF Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:179 msgid "SNB Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:180 msgid "Comics" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:181 msgid "Archives" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:185 msgid "Supported books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:221 msgid "Merged some books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:222 msgid "Some duplicates were found and merged into the following existing books:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:231 msgid "Failed to read metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:226 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:232 msgid "Failed to read metadata from the following" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:245 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:250 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:251 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:275 msgid "Add to library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:250 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:256 #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:56 #: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:28 #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:94 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:135 msgid "No book selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:269 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:269 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:275 msgid "No book files found" msgstr "" @@ -2957,8 +2993,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:124 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:75 #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:122 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:160 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:212 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:92 msgid "No books selected" msgstr "" @@ -3000,30 +3036,30 @@ msgstr "" msgid "No books selected to generate catalog for" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:53 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:54 msgid "Generating %s catalog..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:59 #: /home/kovid/work/calibre/src/calibre/gui2/add.py:230 msgid "No books found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:59 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:60 msgid "" "No books to catalog\n" "Check exclude tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:70 msgid "Catalog generated." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:72 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:73 msgid "Export Catalog Directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:74 msgid "Select destination for %s.%s" msgstr "" @@ -3178,7 +3214,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:391 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101 -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:742 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:748 msgid "Not allowed" msgstr "" @@ -3249,7 +3285,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:147 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:664 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:687 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:699 #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:190 msgid "Failed" msgstr "" @@ -3464,28 +3500,28 @@ msgid "Downloading %s for %d book(s)" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:121 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:159 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:174 msgid "Cannot edit metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:188 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:191 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:214 msgid "Cannot merge books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:192 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:215 msgid "At least two books must be selected for merging" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:197 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:220 msgid "Book formats and metadata from the selected books will be added to the <b>first selected book</b> (%s). ISBN will <i>not</i> be merged.<br><br> The second and subsequently selected books will not be deleted or changed.<br><br>Please confirm you want to proceed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:209 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:232 msgid "Book formats and metadata from the selected books will be merged into the <b>first selected book</b> (%s). ISBN will <i>not</i> be merged.<br><br>After merger the second and subsequently selected books will be <b>deleted</b>. <br><br>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 <b>deleted</b> from your computer.<br><br> Are you <b>sure</b> you want to proceed?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:245 msgid "You are about to merge more than 5 books. Are you <b>sure</b> you want to proceed?" msgstr "" @@ -3701,28 +3737,36 @@ 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:158 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:174 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:105 #: /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:116 +msgid "Format unavailable" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:117 +msgid "Not all the selected books were available in the %s format. You should convert them first." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:124 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:125 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 "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:134 msgid "Cannot open folder" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:159 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:175 msgid "%s has no available formats." msgstr "" @@ -3921,32 +3965,32 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:25 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:49 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:58 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:405 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:417 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:124 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:125 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:126 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:127 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:135 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:320 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1117 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1121 msgid "Path" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:127 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:128 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:129 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:130 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:131 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:319 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/emailp.py:24 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:117 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:118 msgid "Formats" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:27 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:927 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1120 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:931 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1124 msgid "Collections" msgstr "" @@ -3959,8 +4003,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:312 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:318 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:324 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1126 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1130 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1134 #: /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 @@ -3968,7 +4012,7 @@ msgstr "" msgid "None" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:404 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:416 msgid "Double-click to open Book Details window" msgstr "" @@ -3978,7 +4022,7 @@ msgstr "" #: /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 -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:18 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:19 #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input.py:16 #: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output.py:16 #: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_input.py:13 @@ -3989,6 +4033,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_output.py:17 #: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_input.py:13 #: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_output.py:18 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/pml_output.py:15 #: /home/kovid/work/calibre/src/calibre/gui2/convert/rb_output.py:15 #: /home/kovid/work/calibre/src/calibre/gui2/convert/snb_output.py:15 #: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input.py:13 @@ -3998,13 +4043,14 @@ msgstr "" #: /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 -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:18 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:19 #: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output.py:16 #: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output.py:15 #: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output.py:20 #: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output.py:21 #: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_output.py:17 #: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_output.py:18 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/pml_output.py:15 #: /home/kovid/work/calibre/src/calibre/gui2/convert/rb_output.py:15 #: /home/kovid/work/calibre/src/calibre/gui2/convert/snb_output.py:15 #: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output.py:17 @@ -4013,13 +4059,13 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex_ui.py:86 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml_ui.py:42 -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:95 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_tab_template_ui.py:32 #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:93 #: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:54 #: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:53 #: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_input_ui.py:33 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:36 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:48 #: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:127 #: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:120 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:171 @@ -4029,12 +4075,13 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_output_ui.py:40 #: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_input_ui.py:43 #: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_output_ui.py:47 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/pmlz_output_ui.py:36 #: /home/kovid/work/calibre/src/calibre/gui2/convert/rb_output_ui.py:33 #: /home/kovid/work/calibre/src/calibre/gui2/convert/snb_output_ui.py:39 #: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:80 #: /home/kovid/work/calibre/src/calibre/gui2/convert/toc_ui.py:67 #: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:51 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:59 #: /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:72 #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:82 @@ -4132,32 +4179,27 @@ msgstr "" msgid "CSV/XML Options" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:17 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:18 msgid "E-book options" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:96 msgid "'Don't include this book' tag:" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:84 -msgid "'Mark this book as read' tag:" -msgstr "" - -#: -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:97 msgid "Additional note tag prefix:" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:98 msgid "Regex pattern describing tags to exclude as genres:" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:87 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:99 msgid "" "Regex tips:\n" "- The default regex - \\[.+\\] - excludes genre tags of the form [tag], e.g., [Amazon Freebie]\n" @@ -4165,30 +4207,45 @@ msgid "" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:102 msgid "Include 'Titles' Section" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:103 msgid "Include 'Recently Added' Section" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:104 msgid "Sort numbers as text" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:105 msgid "Include 'Series' Section" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:106 msgid "Wishlist tag:" msgstr "" +#: +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:107 +msgid "Source column for read book" +msgstr "" + +#: +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:108 +msgid "Pattern for read book" +msgstr "" + +#: +#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:109 +msgid "Books marked as read:" +msgstr "" + #: #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_tab_template_ui.py:33 msgid "Tab template for catalog.ui" @@ -4364,17 +4421,34 @@ msgstr "" msgid "FB2 Output" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:37 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:49 #: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_output_ui.py:42 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/pmlz_output_ui.py:37 #: /home/kovid/work/calibre/src/calibre/gui2/convert/rb_output_ui.py:34 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:61 msgid "&Inline TOC" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:38 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:50 msgid "Sectionize Chapters (Use with care!)" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:51 +msgid "Sectionize Chapters using file structure" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:52 +msgid "Wrap h1 tags with <title> elements" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:53 +msgid "Wrap h2 tags with <title> elements" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:54 +msgid "Wrap h3 tags with <title> elements" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:104 msgid "Font rescaling wizard" msgstr "" @@ -4582,33 +4656,33 @@ msgid "Set the metadata. The output file will contain as much of this metadata a msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:168 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:166 msgid "Choose cover for " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:175 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:173 msgid "Cannot read" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:176 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:174 msgid "You do not have permission to read the file: " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:184 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:191 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:182 msgid "Error reading file" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:185 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:183 msgid "<p>There was an error reading from file: <br /><b>" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:192 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:191 msgid " is not a valid picture" msgstr "" @@ -4818,6 +4892,14 @@ msgstr "" msgid "Preserve &aspect ratio of cover" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/convert/pml_output.py:14 +msgid "PMLZ Output" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/pmlz_output_ui.py:38 +msgid "Do not reduce image size and depth" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/convert/rb_output.py:14 msgid "RB Output" msgstr "" @@ -5037,18 +5119,30 @@ msgstr "" msgid "TXT Output" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:51 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:60 msgid "&Line ending style:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:53 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:62 msgid "&Maximum line length:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:63 msgid "Force maximum line length" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:64 +msgid "Apply Markdown formatting to text" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:65 +msgid "Do not remove links (<a> tags) before processing" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:66 +msgid "Do not remove image references before processing" +msgstr "" + #: /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:77 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:78 @@ -5146,7 +5240,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:145 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:164 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:270 -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:448 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:492 #: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:111 #: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:131 #: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:206 @@ -5171,28 +5265,40 @@ msgstr "" msgid " index:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:493 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:332 +msgid "The enumeration \"{0}\" contains an invalid value that will be set to the default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:492 +msgid "Do not change" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:541 msgid "Remove series" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:496 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:544 msgid "Automatically number books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:499 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:547 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:367 msgid "Force numbers to start with " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:562 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:609 +msgid "The enumeration \"{0}\" contains invalid values that will not appear in the list" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:665 msgid "Remove all tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:583 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:686 msgid "tags to add" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:588 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:691 msgid "tags to remove" msgstr "" @@ -5361,14 +5467,14 @@ msgid "<p>Cannot upload books to device there is no more free space available " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget.py:89 -#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:356 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:234 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:57 msgid "Invalid template" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget.py:90 -#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:325 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:357 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:235 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:58 msgid "The template %s is invalid:" @@ -5463,33 +5569,45 @@ msgstr "" msgid "Copy &to clipboard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:45 +msgid "Delete marked files (checked subitems)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:51 +msgid "Fix marked sections (checked fixable items)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:61 msgid "Names to ignore:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:59 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:66 msgid "Enter comma-separated standard file name wildcards, such as synctoy*.dat" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:62 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:69 msgid "Extensions to ignore" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:74 msgid "Enter comma-separated extensions without a leading dot. Used only in book folders" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:111 +msgid "(fixable)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:134 msgid "Path from library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:134 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/bookmarkmanager.py:89 #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:248 msgid "Name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:136 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:158 msgid "The marked files and folders will be <b>permanently deleted</b>. Are you sure?" msgstr "" @@ -5612,16 +5730,16 @@ 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:925 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:31 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:929 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:33 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:295 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:569 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:1116 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1120 msgid "Format" msgstr "" @@ -5636,13 +5754,13 @@ msgstr "" #: #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:115 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:597 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:684 msgid "Invalid author name" msgstr "" #: #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:598 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:685 msgid "Author names cannot contain & characters." msgstr "" @@ -5819,45 +5937,49 @@ msgstr "" msgid "Editing meta information for <b>%d books</b>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:237 +msgid "Immediately make all changes without closing the dialog. This operation cannot be canceled or undone" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:273 msgid "Book %d:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:288 msgid "<b>You can destroy your library using this feature.</b> Changes are permanent. There is no undo function. You are strongly encouraged to back up your library before proceeding.<p>Search and replace in text fields using character matching or regular expressions. " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:284 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:296 msgid "In character mode, the field is searched for the entered search text. The text is replaced by the specified replacement text everywhere it is found in the specified field. After replacement is finished, the text can be changed to upper-case, lower-case, or title-case. If the case-sensitive check box is checked, the search text must match exactly. If it is unchecked, the search text will match both upper- and lower-case letters" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:307 msgid "In regular expression mode, the search text is an arbitrary python-compatible regular expression. The replacement text can contain backreferences to parenthesized expressions in the pattern. The search is not anchored, and can match and replace multiple times on the same string. The modification functions (lower-case etc) are applied to the matched text, not to the field as a whole. The destination box specifies the field where the result after matching and replacement is to be assigned. You can replace the text in the field, or prepend or append the matched text. See <a href=\"http://docs.python.org/library/re.html\"> this reference</a> for more information on python's regular expressions, and in particular the 'sub' function." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:440 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:452 msgid "You must specify a destination when source is a composite field" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:532 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:540 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:635 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:544 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:552 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:647 msgid "Search/replace invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:533 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:545 msgid "Authors cannot be set to the empty string. Book title %s not processed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:541 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:553 msgid "Title cannot be set to the empty string. Book title %s not processed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:636 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:648 msgid "Search pattern is invalid: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:673 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:685 msgid "" "Applying changes to %d books.\n" "Phase {0} {1}%%." @@ -6085,147 +6207,162 @@ msgstr "" msgid "&Search and replace" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:93 msgid "Last modified: %s" msgstr "" -#: /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:150 -msgid "Specify title and author" -msgstr "" - -#: /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:169 -msgid "Choose formats for " -msgstr "" - -#: /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:201 -msgid "You do not have permission to read the following files:" -msgstr "" - -#: /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:240 -msgid "Could not read metadata" -msgstr "" - -#: /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:289 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:123 msgid "Could not read cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:118 msgid "Could not read cover from %s format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:124 msgid "The cover in the %s format is invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:351 -msgid " The green color indicates that the current author sort matches the current author" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:153 +msgid "Cover size: %dx%d pixels" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:354 -msgid " The red color indicates that the current author sort does not match the current author" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:190 +msgid "Not a valid picture" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:359 -msgid "Abort the editing of all remaining books" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:208 +msgid "Specify title and author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:524 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:529 -msgid "This ISBN number is valid" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:209 +msgid "You must specify a title and author before generating a cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:532 -msgid "This ISBN number is invalid" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:611 -msgid "Tags changed" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:612 -msgid "You have changed the tags. In order to use the tags editor, you must either discard or apply these changes" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:639 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:242 msgid "Downloading cover..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:651 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:656 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:662 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:667 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:254 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:270 msgid "Cannot fetch cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:652 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:663 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:668 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 msgid "<b>Could not fetch cover.</b><br/>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:653 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:256 msgid "The download timed out." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:657 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:260 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:669 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:272 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:676 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:279 msgid "Bad cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:677 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:280 msgid "The cover is not a valid picture" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:710 -msgid "There were errors" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:298 +msgid "Choose formats for " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:329 +msgid "No permission" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:330 +msgid "You do not have permission to read the following files:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:357 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:358 +msgid "No format selected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:369 +msgid "Could not read metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:370 +msgid "Could not read metadata from %s format" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:441 +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:444 +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:449 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:101 +msgid "Previous" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:452 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:460 +msgid "Save changes and edit the metadata of %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:457 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:102 +msgid "Next" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:631 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:636 +msgid "This ISBN number is valid" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:639 +msgid "This ISBN number is invalid" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:711 +msgid "Tags changed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:712 +msgid "You have changed the tags. In order to use the tags editor, you must either discard or apply these changes" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:750 +msgid "There were errors" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:751 msgid "There were errors downloading social metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:742 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:782 msgid "Cannot fetch metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:743 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:783 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:833 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:878 msgid "Permission denied" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:834 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:879 msgid "Could not open %s. Is it being used by another program?" msgstr "" @@ -6401,60 +6538,64 @@ msgstr "" msgid "Change the contents of the saved search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:35 +msgid "&Search:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:133 msgid "Need username and password" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:134 msgid "You must provide a username and/or password to use this news source." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:173 msgid "Account" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:174 msgid "(optional)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:175 msgid "(required)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:192 msgid "Created by: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:192 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:199 msgid "Last downloaded: never" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:214 msgid "%d days, %d hours and %d minutes ago" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:209 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:216 msgid "Last downloaded" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:233 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:240 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:197 msgid "Schedule news download" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:243 msgid "Add a custom news source" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:248 msgid "Download all scheduled new sources" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:348 msgid "No internet connection" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:342 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:349 msgid "Cannot download news as no internet connection is active" msgstr "" @@ -6675,12 +6816,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:97 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:98 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:128 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:129 msgid "Publishers" msgstr "" @@ -6790,12 +6931,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:587 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:674 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:588 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:675 msgid "An item cannot be set to nothing. Delete it instead." msgstr "" @@ -7175,50 +7316,50 @@ msgstr "" msgid "Regular expression (?P<isbn>)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:104 msgid "Cover Browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:109 msgid "Shift+Alt+B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:123 msgid "Tag Browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:125 msgid "Shift+Alt+T" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:145 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:29 msgid "version" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:142 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:146 #: /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:160 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:164 msgid "Connected " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:176 msgid "Update found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:207 -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:221 msgid "Book Details" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:209 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:213 msgid "Alt+D" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/init.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/init.py:223 msgid "Shift+Alt+D" msgstr "" @@ -7307,7 +7448,7 @@ msgid "Show books in the main memory of the device" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:67 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:820 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:826 msgid "Card A" msgstr "" @@ -7316,7 +7457,7 @@ msgid "Show books in storage card A" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:69 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:822 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:828 msgid "Card B" msgstr "" @@ -7368,21 +7509,21 @@ msgstr "" msgid "Delete current saved search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:317 msgid "N" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:285 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:317 msgid "Y" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:66 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:240 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:241 msgid "On Device" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:68 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:285 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:286 msgid "Size (MB)" msgstr "" @@ -7391,77 +7532,77 @@ msgid "Book %s of %s." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:693 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1236 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:414 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1240 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:450 msgid "The lookup/search name is \"{0}\"" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:699 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1238 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1242 msgid "This book's UUID is \"{0}\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:922 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:926 msgid "In Library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:926 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:930 msgid "Size" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1136 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1140 msgid "Book <font face=\"serif\">%s</font> of %s." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1216 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1220 msgid "Marked for deletion" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1219 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1223 msgid "Double click to <b>edit</b> me<br><br>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:147 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:149 msgid "Hide column %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:152 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:154 msgid "Sort on %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:153 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:155 msgid "Ascending" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:156 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:158 msgid "Descending" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 msgid "Change text alignment for %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:172 msgid "Left" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:172 msgid "Right" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:173 msgid "Center" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:190 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:192 msgid "Show column" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:202 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:204 msgid "Restore default layout" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:743 +#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:749 msgid "Dropping onto a device is not supported. First add the book to the calibre library." msgstr "" @@ -7490,7 +7631,7 @@ msgid "<b>No matches</b> for the search phrase <i>%s</i> 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:446 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:448 msgid "No matches found" msgstr "" @@ -7895,118 +8036,138 @@ msgid "Text column for keeping series-like information" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:33 -msgid "Floating point numbers" +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:31 +msgid "Text, but with a fixed set of permitted values" msgstr "" #: #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:35 -msgid "Integers" +msgid "Floating point numbers" msgstr "" #: #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:37 +msgid "Integers" +msgstr "" + +#: +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:39 msgid "Ratings, shown with stars" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:40 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:42 msgid "Yes/No" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:42 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:44 msgid "Column built from other columns" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:74 msgid "No column selected" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:72 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:75 msgid "No column has been selected" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:79 msgid "Selected column is not a user-defined column" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:111 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:117 msgid "No lookup name was provided" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:119 msgid "The lookup name must contain only lower case letters, digits and underscores, and start with a letter" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:122 msgid "Lookup names cannot end with _index, because these names are reserved for the index of a series column." msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:132 msgid "No column heading was provided" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:139 msgid "The lookup name %s is already used" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:145 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:151 msgid "The heading %s is already used" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:156 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:162 msgid "You must enter a template for composite columns" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:127 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:147 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:167 +msgid "You must enter at least one value for enumeration columns" +msgstr "" + +#: +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:172 +msgid "You cannot provide the empty value, as it is included by default" +msgstr "" + +#: +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:176 +msgid "The value \"{0}\" is in the list more than once" +msgstr "" + +#: +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:145 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:172 msgid "Create or edit custom columns" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:146 msgid "&Lookup name" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:129 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:147 msgid "Column &heading" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:148 msgid "Used for searching the column. Must contain only digits and lower case letters." msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:131 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:149 msgid "Column heading in the library view and category name in the tag browser" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:150 msgid "Column &type" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:151 msgid "What kind of information will be kept in the column." msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:152 msgid "" "<p>Date format. Use 1-4 'd's for day, 1-4 'M's for month, and 2 or 4 'y's for year.</p>\n" "<p>For example:\n" @@ -8017,40 +8178,60 @@ msgid "" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:140 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:158 msgid "Use MMM yyyy for month + year, yyyy for year only" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:159 msgid "Default: dd MMM yyyy." msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:142 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:160 msgid "Format for &dates" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:143 -msgid "<p>Field template. Uses the same syntax as save templates." +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:161 +msgid "Field template. Uses the same syntax as save templates." msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:144 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:162 msgid "Similar to save templates. For example, {title} {isbn}" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:145 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:163 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:170 msgid "Default: (nothing)" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:146 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:164 msgid "&Template" msgstr "" +#: +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:165 +msgid "Values" +msgstr "" + +#: +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:166 +msgid "" +"A comma-separated list of permitted values. You can specify\n" +"empty values by entering only the comma. For example, the list\n" +"',one,two,three' has 4 valid values, one of them empty. The first\n" +"value in the list is the default." +msgstr "" + +#: +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:171 +msgid "The first value entered will be the default value for this enumeration" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/preferences/device_debug.py:21 msgid "Getting debug information" msgstr "" @@ -8508,7 +8689,7 @@ msgid "Here you can control how calibre will save your books when you click the msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server.py:75 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:331 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:329 msgid "Failed to start content server" msgstr "" @@ -8683,43 +8864,43 @@ msgstr "" msgid "&Current tweaks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:97 -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:92 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:262 #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:574 #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:272 msgid "Search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:322 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:306 msgid "The selected search will be <b>permanently deleted</b>. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:364 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:349 msgid "Search (For Advanced Search click the button to the left)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:406 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:411 msgid "Saved Searches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:414 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:413 msgid "Choose saved search or enter name for new saved search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_restriction_mixin.py:10 +#: /home/kovid/work/calibre/src/calibre/gui2/search_restriction_mixin.py:12 msgid "Restrict to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_restriction_mixin.py:16 -#: /home/kovid/work/calibre/src/calibre/gui2/search_restriction_mixin.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/search_restriction_mixin.py:18 +#: /home/kovid/work/calibre/src/calibre/gui2/search_restriction_mixin.py:68 msgid "(all books)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_restriction_mixin.py:59 +#: /home/kovid/work/calibre/src/calibre/gui2/search_restriction_mixin.py:62 msgid "({0} of {1})" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_restriction_mixin.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/search_restriction_mixin.py:70 msgid "({0} of all)" msgstr "" @@ -8783,94 +8964,94 @@ msgstr "" msgid "&Alternate shortcut:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:202 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:215 msgid "Rename '%s'" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:219 msgid "Edit sort for '%s'" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:224 msgid "Hide category %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:227 msgid "Show category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:223 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:240 msgid "Manage %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:230 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:243 msgid "Manage Saved Searches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:237 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:250 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:254 msgid "Manage User Categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:248 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:261 msgid "Show all categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:458 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:545 msgid "Changing the authors for several books can take a while. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:463 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:550 msgid "Changing the metadata for that many books can take a while. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:519 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:606 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:294 msgid "Searches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:602 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:689 msgid "Duplicate search name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:603 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:690 msgid "The saved search name %s is already used." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:878 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:971 msgid "Sort by name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:878 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:971 msgid "Sort by popularity" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:879 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:972 msgid "Sort by average rating" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:882 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:975 msgid "Set the sort order for entries in the Tag Browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:888 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:981 msgid "Match all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:888 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:981 msgid "Match any" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:893 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:986 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:897 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:990 msgid "Manage &user categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:900 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:993 msgid "Add your own categories to the Tag Browser" msgstr "" @@ -8909,59 +9090,59 @@ msgstr "" msgid "The following books have already been converted to %s format. Do you wish to reconvert them?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:169 msgid "&Restore" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:171 msgid "&Donate to support calibre" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:177 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:175 msgid "&Eject connected device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:216 msgid "Calibre Quick Start Guide" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:439 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:450 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:437 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:448 msgid "Conversion Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:451 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:449 msgid "<p>Could not convert: %s<p>It is a <a href=\"%s\">DRM</a>ed book. You must first remove the DRM using third party tools." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:465 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:463 msgid "Recipe Disabled" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:481 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:479 msgid "<b>Failed</b>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:517 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:515 msgid "is the result of the efforts of many volunteers from all over the world. If you find it useful, please consider donating to support its development. Your donation helps keep calibre development going." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:543 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:541 msgid "There are active jobs. Are you sure you want to quit?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:546 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:544 msgid "" " is communicating with the device!<br>\n" " Quitting may cause corruption on the device.<br>\n" " Are you sure you want to quit?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:550 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:548 msgid "WARNING: Active jobs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:628 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:626 msgid "will keep running in the system tray. To close it, choose <b>Quit</b> in the context menu of the system tray." msgstr "" @@ -9132,7 +9313,7 @@ msgid "Options to customize the ebook viewer" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:43 -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:711 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:720 msgid "Remember last used window size" msgstr "" @@ -9270,95 +9451,95 @@ msgstr "" msgid "Book format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:188 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:189 msgid "Position in book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:195 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:196 msgid "Go to a reference. To get reference numbers, use the reference mode." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:203 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:204 msgid "Search for text in book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:277 msgid "Print Preview" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:312 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:314 msgid "Connecting to dict.org to lookup: <b>%s</b>…" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:413 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:415 msgid "Choose ebook" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:414 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:416 msgid "Ebooks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:447 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:449 msgid "No matches found for: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:488 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:492 msgid "Loading flow..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:524 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:530 msgid "Laying out %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:555 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:561 msgid "Bookmark #%d" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:559 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:565 msgid "Add bookmark" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:560 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:566 msgid "Enter title for bookmark:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:570 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:576 msgid "Manage Bookmarks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:607 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:613 msgid "Loading ebook..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:615 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:621 msgid "DRM Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:616 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:622 msgid "<p>This book is protected by <a href=\"%s\">DRM</a>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:620 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:626 msgid "Could not open ebook" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:698 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:707 msgid "Options to control the ebook viewer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:705 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:714 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:708 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:717 msgid "If specified, viewer window will try to open full screen when started." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:713 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:722 msgid "Print javascript alert and console messages to the console" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:719 +#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:728 msgid "" "%prog [options] file\n" "\n" @@ -9749,33 +9930,33 @@ msgstr "" msgid "daysago" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:539 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:549 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:554 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:564 msgid "unchecked" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:539 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:549 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:554 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:564 #: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:184 msgid "no" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:542 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:552 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:557 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:567 msgid "checked" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:542 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:552 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:557 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:567 #: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:184 msgid "yes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:546 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:561 msgid "blank" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:546 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:561 msgid "empty" msgstr "" @@ -9927,9 +10108,9 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/library/catalog.py:613 msgid "" -"Tag indicating book has been read.\n" +"field:pattern indicating book has been read.\n" "Default: '%default'\n" -"Applies to: ePub, MOBI output formats" +"Applies to ePub, MOBI output formats" msgstr "" #: /home/kovid/work/calibre/src/calibre/library/catalog.py:619 @@ -9939,35 +10120,43 @@ msgid "" "Applies to: ePub, MOBI output formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/check_library.py:17 +#: /home/kovid/work/calibre/src/calibre/library/check_library.py:26 msgid "Invalid titles" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/check_library.py:18 +#: /home/kovid/work/calibre/src/calibre/library/check_library.py:27 msgid "Extra titles" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/check_library.py:19 +#: /home/kovid/work/calibre/src/calibre/library/check_library.py:28 msgid "Invalid authors" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/check_library.py:20 +#: /home/kovid/work/calibre/src/calibre/library/check_library.py:29 msgid "Extra authors" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/check_library.py:21 +#: /home/kovid/work/calibre/src/calibre/library/check_library.py:30 msgid "Missing book formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/check_library.py:22 +#: /home/kovid/work/calibre/src/calibre/library/check_library.py:31 msgid "Extra book formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/check_library.py:23 +#: /home/kovid/work/calibre/src/calibre/library/check_library.py:32 msgid "Unknown files in books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/check_library.py:24 +#: /home/kovid/work/calibre/src/calibre/library/check_library.py:33 +msgid "Missing covers in books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/check_library.py:34 +msgid "Extra covers in books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/check_library.py:35 msgid "Folders raising exception" msgstr "" @@ -10005,7 +10194,7 @@ msgid "Filter the results by the search query. For the format of the search quer msgstr "" #: /home/kovid/work/calibre/src/calibre/library/cli.py:143 -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1044 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1045 msgid "The maximum width of a single line in the output. Defaults to detecting screen size." msgstr "" @@ -10182,46 +10371,46 @@ msgid "This column stores tag like data (i.e. multiple comma separated values). msgstr "" #: /home/kovid/work/calibre/src/calibre/library/cli.py:567 -msgid "A dictionary of options to customize how the data in this column will be interpreted." +msgid "A dictionary of options to customize how the data in this column will be interpreted. This is a JSON string. For enumeration columns, use --display='{\"enum_values\":[\"val1\", \"val2\"]}'" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:580 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:581 msgid "You must specify label, name and datatype" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:641 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:642 msgid "" "\n" -" %prog catalog /path/to/destination.(csv|epub|mobi|xml ...) [options]\n" +" %prog catalog /path/to/destination.(CSV|EPUB|MOBI|XML ...) [options]\n" "\n" " Export a catalog in format specified by path/to/destination extension.\n" " Options control how entries are displayed in the generated catalog ouput.\n" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:655 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:656 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:659 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:660 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:665 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:666 #: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:499 msgid "Show detailed output information. Useful for debugging" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:678 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:679 msgid "Error: You must specify a catalog output file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:727 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:728 msgid "" "\n" " %prog set_custom [options] column id value\n" @@ -10233,15 +10422,15 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:738 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:739 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:749 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:750 msgid "Error: You must specify a field name, id and value" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:768 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:769 msgid "" "\n" " %prog custom_columns [options]\n" @@ -10250,19 +10439,19 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:775 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:776 msgid "Show details for each column." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:787 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:788 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:789 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:790 msgid "y" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:795 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:796 msgid "" "\n" " %prog remove_custom_column [options] label\n" @@ -10272,15 +10461,15 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:803 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:804 msgid "Do not ask for confirmation" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:813 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:814 msgid "Error: You must specify a column label" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:823 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:824 msgid "" "\n" " %prog saved_searches [options] list\n" @@ -10293,73 +10482,73 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:841 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:842 msgid "Error: You must specify an action (add|remove|list)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:849 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:850 msgid "Name:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:850 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:851 msgid "Search string:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:856 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:857 msgid "Error: You must specify a name and a search string" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:859 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:860 msgid "added" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:864 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:865 msgid "Error: You must specify a name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:867 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:868 msgid "removed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:871 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:872 msgid "Error: Action %s not recognized, must be one of: (add|remove|list)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:879 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:880 msgid "" "%prog check_library [options]\n" "\n" "Perform some checks on the filesystem representing a library. Reports are {0}\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:886 -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1036 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:887 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1037 msgid "Output in CSV" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:889 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:890 msgid "" "Comma-separated list of reports.\n" "Default: all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:893 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:894 msgid "" "Comma-separated list of extensions to ignore.\n" "Default: all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:897 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:898 msgid "" "Comma-separated list of names to ignore.\n" "Default: all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:927 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:928 msgid "Unknown report check" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:960 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:961 msgid "" "%prog restore_database [options]\n" "\n" @@ -10374,15 +10563,15 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:975 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:976 msgid "Really do the recovery. The command will not run unless this option is specified." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:988 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:989 msgid "You must provide the --really-do-it option to do a recovery" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1025 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1026 msgid "" "%prog list_categories [options]\n" "\n" @@ -10390,29 +10579,29 @@ msgid "" "information is the equivalent of what is shown in the tags pane.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1033 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1034 msgid "Output only the number of items in a category instead of the counts per item within the category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1038 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1039 msgid "The character to put around the category value in CSV mode. Default is quotes (\")." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1041 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1042 msgid "" "Comma-separated list of category lookup names.\n" "Default: all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1047 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1048 msgid "The string used to separate fields in CSV mode. Default is a comma." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1085 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1086 msgid "CATEGORY ITEMS" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:1154 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:1155 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -10424,11 +10613,11 @@ msgid "" "For help on an individual command: %%prog command --help\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/custom_columns.py:544 +#: /home/kovid/work/calibre/src/calibre/library/custom_columns.py:554 msgid "No label was provided" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/custom_columns.py:546 +#: /home/kovid/work/calibre/src/calibre/library/custom_columns.py:556 msgid "The label must contain only lower case letters, digits and underscores, and start with a letter" msgstr "" @@ -10436,39 +10625,39 @@ msgstr "" msgid "%sAverage rating is %3.1f" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:818 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:824 msgid "Main" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2310 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2317 msgid "<p>Migrating old database to ebook library in %s<br><center>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2339 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2346 msgid "Copying <b>%s</b>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2356 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2363 msgid "Compacting database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2449 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2456 msgid "Checking SQL integrity..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2488 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2495 msgid "Checking for missing files." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2516 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2523 msgid "Checked id" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:139 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:140 msgid "Ratings" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:276 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:277 msgid "Title Sort" msgstr "" @@ -10635,14 +10824,6 @@ msgstr "" msgid "Last" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:101 -msgid "Previous" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:102 -msgid "Next" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:104 msgid "Browsing %d books" msgstr "" @@ -11184,12 +11365,12 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:73 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:82 -#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:193 +#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:194 msgid "Scheduled" msgstr "" #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:84 -#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:194 +#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:195 msgid "Custom" msgstr "" From ca0df54bf3cd4dc9a2e8342685251e947a4653f6 Mon Sep 17 00:00:00 2001 From: Sengian <sengian1@gmail.com> Date: Fri, 3 Dec 2010 19:37:08 +0100 Subject: [PATCH 282/375] Add provisory fictionwise metadata --- src/calibre/ebooks/metadata/fictionwise.py | 370 +++++++++++++++++++++ 1 file changed, 370 insertions(+) create mode 100644 src/calibre/ebooks/metadata/fictionwise.py diff --git a/src/calibre/ebooks/metadata/fictionwise.py b/src/calibre/ebooks/metadata/fictionwise.py new file mode 100644 index 0000000000..828ea31c3a --- /dev/null +++ b/src/calibre/ebooks/metadata/fictionwise.py @@ -0,0 +1,370 @@ +from __future__ import with_statement +__license__ = 'GPL 3' +__copyright__ = '2010, sengian <sengian1@gmail.com>' +__docformat__ = 'restructuredtext en' + +import sys, textwrap, re +from urllib import urlencode + +from lxml import html, etree +from lxml.html import soupparser +from lxml.etree import tostring + +from calibre import browser, preferred_encoding +from calibre.ebooks.chardet import xml_to_unicode +from calibre.ebooks.metadata import MetaInformation, check_isbn, \ + authors_to_sort_string +from calibre.library.comments import sanitize_comments_html +from calibre.ebooks.metadata.fetch import MetadataSource +from calibre.utils.config import OptionParser +from calibre.utils.date import parse_date, utcnow + +class Fictionwise(MetadataSource): # {{{ + + author = 'Sengian' + name = 'Fictionwise' + description = _('Downloads metadata from Fictionwise') + + has_html_comments = True + + def fetch(self): + try: + self.results = search(self.title, self.book_author, self.publisher, + self.isbn, max_results=10, verbose=self.verbose) + except Exception, e: + self.exception = e + self.tb = traceback.format_exc() + + # }}} + + +def report(verbose): + if verbose: + import traceback + traceback.print_exc() + +class Query(object): + + BASE_URL = 'http://www.fictionwise.com/servlet/mw' + + def __init__(self, title=None, author=None, publisher=None, keywords=None, max_results=20): + assert not(title is None and author is None and publisher is None and keywords is None) + assert (max_results < 21) + + self.max_results = int(max_results) + + q = { 'template' : 'searchresults_adv.htm' , + 'searchtitle' : '', + 'searchauthor' : '', + 'searchpublisher' : '', + 'searchkeyword' : '', + #possibilities startoflast, fullname, lastfirst + 'searchauthortype' : 'startoflast', + 'searchcategory' : '', + 'searchcategory2' : '', + 'searchprice_s' : '0', + 'searchprice_e' : 'ANY', + 'searchformat' : '', + 'searchgeo' : 'US', + 'searchfwdatetype' : '', + #maybe use dates fields if needed? + #'sortorder' : 'DESC', + #many options available: b.SortTitle, a.SortName, + #b.DateFirstPublished, b.FWPublishDate + 'sortby' : 'b.SortTitle' + } + if title is not None: + q['searchtitle'] = title + if author is not None: + q['searchauthor'] = author + if publisher is not None: + q['searchpublisher'] = publisher + if keywords is not None: + q['searchkeyword'] = keywords + + if isinstance(q, unicode): + q = q.encode('utf-8') + self.urldata = urlencode(q) + + def __call__(self, browser, verbose): + if verbose: + print 'Query:', self.BASE_URL+self.urldata + + try: + raw = browser.open_novisit(self.BASE_URL, self.urldata).read() + except Exception, e: + report(verbose) + if callable(getattr(e, 'getcode', None)) and \ + e.getcode() == 404: + return + raise + if '<title>404 - ' in raw: + return + raw = xml_to_unicode(raw, strip_encoding_pats=True, + resolve_entities=True)[0] + try: + feed = soupparser.fromstring(raw) + except: + return + + # get list of results as links + results = feed.xpath("//table[3]/tr/td[2]/table/tr/td/p/table[2]/tr[@valign]") + results = results[:self.max_results] + results = [i.xpath('descendant-or-self::a')[0].get('href') for i in results] + #return feed if no links ie normally a single book or nothing + if not results: + results = [feed] + return results + +class ResultList(list): + + BASE_URL = 'http://www.fictionwise.com' + COLOR_VALUES = {'BLUE': 4, 'GREEN': 3, 'YELLOW': 2, 'RED': 1, 'NA': 0} + + def __init__(self): + self.retitle = re.compile(r'\[[^\[\]]+\]') + self.rechkauth = re.compile(r'.*book\s*by', re.I) + self.redesc = re.compile(r'book\s*description\s*:\s*(<br[^>]+>)*(?P<desc>.*)' \ + + '<br[^>]+>.{,15}publisher\s*:', re.I) + self.repub = re.compile(r'.*publisher\s*:\s*', re.I) + self.redate = re.compile(r'.*release\s*date\s*:\s*', re.I) + self.retag = re.compile(r'.*book\s*category\s*:\s*', re.I) + self.resplitbr = re.compile(r'<br[^>]+>', re.I) + self.recomment = re.compile(r'(?s)<!--.*?-->') + self.reimg = re.compile(r'<img[^>]*>', re.I) + self.resanitize = re.compile(r'\[HTML_REMOVED\]\s*', re.I) + self.renbcom = re.compile('(?P<nbcom>\d+)\s*Reader Ratings:') + self.recolor = re.compile('(?P<ncolor>[^/]+).gif') + self.resplitbrdiv = re.compile(r'(<br[^>]+>|</?div[^>]*>)', re.I) + self.reisbn = re.compile(r'.*ISBN\s*:\s*', re.I) + + def strip_tags_etree(self, etreeobj, invalid_tags): + for itag in invalid_tags: + for elt in etreeobj.getiterator(itag): + elt.drop_tag() + return etreeobj + + def clean_entry(self, entry, + invalid_tags = ('font', 'strong', 'b', 'ul', 'span', 'a'), + remove_tags_trees = ('script',)): + for it in entry[0].iterchildren(tag='table'): + entry[0].remove(it) + entry[0].remove(entry[0].xpath( 'descendant-or-self::p[1]')[0]) + entry = entry[0] + cleantree = self.strip_tags_etree(entry, invalid_tags) + for itag in remove_tags_trees: + for elts in cleantree.getiterator(itag): + elts.drop_tree() + return cleantree + + def output_entry(self, entry, prettyout = True, htmlrm="\d+"): + out = tostring(entry, pretty_print=prettyout) + reclean = re.compile('(\n+|\t+|\r+|&#'+htmlrm+';)') + return reclean.sub('', out) + + def get_title(self, entry): + title = entry.findtext('./') + return self.retitle.sub('', title).strip() + + def get_authors(self, entry): + authortext = entry.find('./br').tail + if not self.rechkauth.search(authortext): + return [] + #TODO: parse all tag if necessary + authortext = self.rechkauth.sub('', authortext) + return [a.strip() for a in authortext.split('&')] + + def get_rating(self, entrytable, verbose): + nbcomment = tostring(entrytable.getprevious()) + try: + nbcomment = self.renbcom.search(nbcomment).group("nbcom") + except: + report(verbose) + return None + hval = dict((self.COLOR_VALUES[self.recolor.search(image.get('src', default='NA.gif')).group("ncolor")], + float(image.get('height', default=0))) \ + for image in entrytable.getiterator('img')) + #ratings as x/5 + return 1.25*sum(k*v for (k, v) in hval.iteritems())/sum(hval.itervalues()) + + def get_description(self, entry): + description = self.output_entry(entry.find('./p'),htmlrm="") + description = self.redesc.search(description) + if not description and not description.group("desc"): + return None + #remove invalid tags + description = self.reimg.sub('', description.group("desc")) + description = self.recomment.sub('', description) + description = self.resanitize.sub('', sanitize_comments_html(description)) + return 'SUMMARY:\n' + re.sub(r'\n\s+</p>','\n</p>', description) + + def get_publisher(self, entry): + publisher = self.output_entry(entry.find('./p')) + publisher = filter(lambda x: self.repub.search(x) is not None, + self.resplitbr.split(publisher)) + if not len(publisher): + return None + publisher = self.repub.sub('', publisher[0]) + return publisher.split(',')[0].strip() + + def get_tags(self, entry): + tag = self.output_entry(entry.find('./p')) + tag = filter(lambda x: self.retag.search(x) is not None, + self.resplitbr.split(tag)) + if not len(tag): + return [] + return map(lambda x: x.strip(), self.retag.sub('', tag[0]).split('/')) + + def get_date(self, entry, verbose): + date = self.output_entry(entry.find('./p')) + date = filter(lambda x: self.redate.search(x) is not None, + self.resplitbr.split(date)) + if not len(date): + return None + #TODO: parse all tag if necessary + try: + d = self.redate.sub('', date[0]) + if d: + default = utcnow().replace(day=15) + d = parse_date(d, assume_utc=True, default=default) + else: + d = None + except: + report(verbose) + d = None + return d + + def get_ISBN(self, entry): + isbns = self.output_entry(entry.getchildren()[2]) + isbns = filter(lambda x: self.reisbn.search(x) is not None, + self.resplitbrdiv.split(isbns)) + if not len(isbns): + return None + #TODO: parse all tag if necessary + isbns = [self.reisbn.sub('', x) for x in isbns if check_isbn(self.reisbn.sub('', x))] + return sorted(isbns, cmp=lambda x,y:cmp(len(x), len(y)))[-1] + + def fill_MI(self, entry, title, authors, ratings, verbose): + mi = MetaInformation(title, authors) + mi.rating = ratings + mi.comments = self.get_description(entry) + mi.publisher = self.get_publisher(entry) + mi.tags = self.get_tags(entry) + mi.pubdate = self.get_date(entry, verbose) + mi.isbn = self.get_ISBN(entry) + mi.author_sort = authors_to_sort_string(authors) + # mi.language = self.get_language(x, verbose) + return mi + + def get_individual_metadata(self, browser, linkdata, verbose): + try: + raw = browser.open_novisit(self.BASE_URL + linkdata).read() + except Exception, e: + report(verbose) + if callable(getattr(e, 'getcode', None)) and \ + e.getcode() == 404: + return + raise + if '<title>404 - ' in raw: + report(verbose) + return + raw = xml_to_unicode(raw, strip_encoding_pats=True, + resolve_entities=True)[0] + try: + feed = soupparser.fromstring(raw) + except: + return + + # get results + return feed.xpath("//table[3]/tr/td[2]/table[1]/tr/td/font/table/tr/td") + + def populate(self, entries, browser, verbose=False): + for x in entries: + try: + entry = self.get_individual_metadata(browser, x, verbose) + entry = self.clean_entry(entry) + title = self.get_title(entry) + #ratings: get table for rating then drop + for elt in entry.getiterator('table'): + ratings = self.get_rating(elt, verbose) + elt.getprevious().drop_tree() + elt.drop_tree() + authors = self.get_authors(entry) + except Exception, e: + if verbose: + print 'Failed to get all details for an entry' + print e + continue + self.append(self.fill_MI(entry, title, authors, ratings, verbose)) + + def populate_single(self, feed, verbose=False): + try: + entry = feed.xpath("//table[3]/tr/td[2]/table[1]/tr/td/font/table/tr/td") + entry = self.clean_entry(entry) + title = self.get_title(entry) + #ratings: get table for rating then drop + for elt in entry.getiterator('table'): + ratings = self.get_rating(elt, verbose) + elt.getprevious().drop_tree() + elt.drop_tree() + authors = self.get_authors(entry) + except Exception, e: + if verbose: + print 'Failed to get all details for an entry' + print e + return + self.append(self.fill_MI(entry, title, authors, ratings, verbose)) + + +def search(title=None, author=None, publisher=None, isbn=None, + min_viewability='none', verbose=False, max_results=5, + keywords=None): + br = browser() + entries = Query(title=title, author=author, publisher=publisher, + keywords=keywords, max_results=max_results)(br, verbose) + + #List of entry + ans = ResultList() + if len(entries) > 1: + ans.populate(entries, br, verbose) + else: + ans.populate_single(entries[0], verbose) + return ans + + +def option_parser(): + parser = OptionParser(textwrap.dedent(\ + '''\ + %prog [options] + + Fetch book metadata from Fictionwise. You must specify one of title, author, + or keywords. No ISBN specification possible. Will fetch a maximum of 20 matches, + so you should make your query as specific as possible. + ''' + )) + parser.add_option('-t', '--title', help='Book title') + parser.add_option('-a', '--author', help='Book author(s)') + parser.add_option('-p', '--publisher', help='Book publisher') + parser.add_option('-k', '--keywords', help='Keywords') + parser.add_option('-m', '--max-results', default=20, + help='Maximum number of results to fetch') + parser.add_option('-v', '--verbose', default=0, action='count', + help='Be more verbose about errors') + return parser + +def main(args=sys.argv): + parser = option_parser() + opts, args = parser.parse_args(args) + try: + results = search(opts.title, opts.author, publisher=opts.publisher, + keywords=opts.keywords, verbose=opts.verbose, max_results=opts.max_results) + except AssertionError: + report(True) + parser.print_help() + return 1 + for result in results: + print unicode(result).encode(preferred_encoding, 'replace') + print + +if __name__ == '__main__': + sys.exit(main()) From 8fea5a64e5495833aac42124352012befefe998f Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Fri, 3 Dec 2010 12:09:31 -0700 Subject: [PATCH 283/375] ... --- src/calibre/utils/magick/magick.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/utils/magick/magick.c b/src/calibre/utils/magick/magick.c index 0aab5f1fd7..9dac37f2ff 100644 --- a/src/calibre/utils/magick/magick.c +++ b/src/calibre/utils/magick/magick.c @@ -414,7 +414,7 @@ magick_Image_load(magick_Image *self, PyObject *args, PyObject *kwargs) { // }}} -// Image.load {{{ +// Image.open {{{ static PyObject * magick_Image_read(magick_Image *self, PyObject *args, PyObject *kwargs) { const char *data; From 55e17f81a0af90476d265140d571d83143b462f3 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Fri, 3 Dec 2010 19:58:10 +0000 Subject: [PATCH 284/375] Fix #7780 - non-expanding boxes in create_custom_column.ui --- .../gui2/preferences/create_custom_column.ui | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/calibre/gui2/preferences/create_custom_column.ui b/src/calibre/gui2/preferences/create_custom_column.ui index bdf4f624a4..d4e85a24c9 100644 --- a/src/calibre/gui2/preferences/create_custom_column.ui +++ b/src/calibre/gui2/preferences/create_custom_column.ui @@ -152,7 +152,7 @@ <item> <widget class="QLineEdit" name="composite_box"> <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Fixed"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> @@ -211,27 +211,27 @@ <layout class="QHBoxLayout" name="horizontalLayout_2"> <item> <widget class="QLineEdit" name="enum_box"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> <property name="toolTip"> <string>A comma-separated list of permitted values. The empty value is always included, and is the default. For example, the list 'one,two,three' has four values, the first of them being the empty value.</string> </property> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> </widget> </item> <item> <widget class="QLabel" name="enum_default_label"> - <property name="text"> - <string>Default: (nothing)</string> - </property> <property name="toolTip"> <string>The empty string is always the first value</string> </property> + <property name="text"> + <string>Default: (nothing)</string> + </property> </widget> </item> </layout> From d4f76eba5b58692fd4be1285cbc5e032f649484d Mon Sep 17 00:00:00 2001 From: John Schember <john@nachtimwald.com> Date: Fri, 3 Dec 2010 19:08:19 -0500 Subject: [PATCH 285/375] FB2 Output: Make FB2 output more compliant. This removes some features such as inline TOC and links. --- src/calibre/ebooks/fb2/fb2ml.py | 218 +++++++++++++------------------- 1 file changed, 87 insertions(+), 131 deletions(-) diff --git a/src/calibre/ebooks/fb2/fb2ml.py b/src/calibre/ebooks/fb2/fb2ml.py index 2a9a92612e..1c24213b46 100644 --- a/src/calibre/ebooks/fb2/fb2ml.py +++ b/src/calibre/ebooks/fb2/fb2ml.py @@ -32,7 +32,7 @@ TAG_MAP = { 'p' : 'p', 'li' : 'p', 'div': 'p', - 'br' : 'p', + 'br' : 'empty-line', } TAG_SPACE = [] @@ -42,7 +42,6 @@ TAG_IMAGES = [ ] TAG_LINKS = [ - 'a', ] BLOCK = [ @@ -56,9 +55,8 @@ STYLES = [ class FB2MLizer(object): ''' - Todo: * Ensure all style tags are inside of the p tags. - * Include more FB2 specific tags in the conversion. - * Handle reopening of a tag properly. + Todo: * Include more FB2 specific tags in the conversion. + * Handle a tags. * Figure out some way to turn oeb_book.toc items into <section><title> <p> to allow for readers to generate toc from the document. ''' @@ -66,7 +64,8 @@ class FB2MLizer(object): def __init__(self, log): self.log = log self.image_hrefs = {} - self.link_hrefs = {} + # Used to ensure text and tags are always within <p> and </p> + self.in_p = False def extract_content(self, oeb_book, opts): self.log.info('Converting XHTML to FB2 markup...') @@ -78,17 +77,13 @@ class FB2MLizer(object): self.image_hrefs = {} self.link_hrefs = {} output = [self.fb2_header()] - output.append(self.get_cover_page()) - output.append(u'ghji87yhjko0Caliblre-toc-placeholder-for-insertion-later8ujko0987yjk') output.append(self.get_text()) output.append(self.fb2_body_footer()) output.append(self.fb2mlize_images()) output.append(self.fb2_footer()) - output = ''.join(output).replace(u'ghji87yhjko0Caliblre-toc-placeholder-for-insertion-later8ujko0987yjk', self.get_toc()) - output = self.clean_text(output) - if self.opts.sectionize_chapters: - output = self.sectionize_chapters(output) - return u'<?xml version="1.0" encoding="UTF-8"?>\n%s' % etree.tostring(etree.fromstring(output), encoding=unicode, pretty_print=True) + output = self.clean_text(u''.join(output)) + #return u'<?xml version="1.0" encoding="UTF-8"?>\n%s' % etree.tostring(etree.fromstring(output), encoding=unicode, pretty_print=True) + return u'<?xml version="1.0" encoding="UTF-8"?>' + output def clean_text(self, text): text = re.sub(r'(?miu)<section>\s*</section>', '', text) @@ -116,88 +111,40 @@ class FB2MLizer(object): author_middle = ' '.join(author_parts[1:-2]) author_last = author_parts[-1] - return u'<FictionBook xmlns:xlink="http://www.w3.org/1999/xlink" ' \ - 'xmlns="http://www.gribuser.ru/xml/fictionbook/2.0">\n' \ - '<description>\n<title-info>\n ' \ - '<author>\n<first-name>%s</first-name>\n<middle-name>%s' \ - '</middle-name>\n<last-name>%s</last-name>\n</author>\n' \ - '<book-title>%s</book-title> ' \ - '</title-info><document-info> ' \ - '<program-used>%s - %s</program-used></document-info>\n' \ - '</description>\n<body>\n<section>' % tuple(map(prepare_string_for_xml, - (author_first, author_middle, - author_last, self.oeb_book.metadata.title[0].value, - __appname__, __version__))) - - def get_cover_page(self): - output = u'' - if 'cover' in self.oeb_book.guide: - output += '<image xlink:href="#cover.jpg" />' - self.image_hrefs[self.oeb_book.guide['cover'].href] = 'cover.jpg' - if 'titlepage' in self.oeb_book.guide: - self.log.debug('Generating cover page...') - href = self.oeb_book.guide['titlepage'].href - item = self.oeb_book.manifest.hrefs[href] - if item.spine_position is None: - stylizer = Stylizer(item.data, item.href, self.oeb_book, - self.opts, self.opts.output_profile) - output += ''.join(self.dump_text(item.data.find(XHTML('body')), stylizer, item)) - return output - - def get_toc(self): - toc = [] - if self.opts.inline_toc: - self.log.debug('Generating table of contents...') - toc.append(u'<p>%s</p>' % _('Table of Contents:')) - for item in self.oeb_book.toc: - if item.href in self.link_hrefs.keys(): - toc.append('<p><a xlink:href="#%s">%s</a></p>\n' % (self.link_hrefs[item.href], item.title)) - else: - self.oeb.warn('Ignoring toc item: %s not found in document.' % item) - return ''.join(toc) - - def sectionize_chapters(self, text): - def remove_p(t): - t = t.replace('<p>', '') - t = t.replace('</p>', '') - return t - text = re.sub(r'(?imsu)(<p>)\s*(?P<anchor><a\s+id="calibre_link-\d+"\s*/>)\s*(</p>)\s*(<p>)\s*(?P<strong><strong>.+?</strong>)\s*(</p>)', lambda mo: '</section><section>%s<title><p>%s</p>' % (mo.group('anchor'), remove_p(mo.group('strong'))), text) - text = re.sub(r'(?imsu)(

    )\s*(?P)\s*(

    )\s*(?P.+?)', lambda mo: '
    %s<p>%s</p>' % (mo.group('anchor'), remove_p(mo.group('strong'))), text) - text = re.sub(r'(?imsu)(?P)\s*(

    )\s*(?P.+?)\s*(

    )', lambda mo: '
    %s<p>%s</p>' % (mo.group('anchor'), remove_p(mo.group('strong'))), text) - text = re.sub(r'(?imsu)(

    )\s*(?P)\s*(?P.+?)\s*(

    )', lambda mo: '
    %s<p>%s</p>' % (mo.group('anchor'), remove_p(mo.group('strong'))), text) - text = re.sub(r'(?imsu)(?P)\s*(?P.+?)', lambda mo: '
    %s<p>%s</p>' % (mo.group('anchor'), remove_p(mo.group('strong'))), text) - return text + return u'' \ + '' \ + '' \ + '' \ + '' \ + '%s' \ + '%s' \ + '%s' \ + '' \ + '%s' \ + '

    ' \ + '' \ + '' \ + '%s - %s' \ + '' \ + '' % tuple(map(prepare_string_for_xml, (author_first, author_middle, author_last, + self.oeb_book.metadata.title[0].value, __appname__, __version__))) def get_text(self): text = [] - for i, item in enumerate(self.oeb_book.spine): - if self.opts.sectionize_chapters_using_file_structure and i is not 0: - text.append('

    ') + for item in self.oeb_book.spine: self.log.debug('Converting %s to FictionBook2 XML' % item.href) stylizer = Stylizer(item.data, item.href, self.oeb_book, self.opts, self.opts.output_profile) - text.append(self.add_page_anchor(item)) + text.append('
    ') text += self.dump_text(item.data.find(XHTML('body')), stylizer, item) - if self.opts.sectionize_chapters_using_file_structure and i is not len(self.oeb_book.spine) - 1: - text.append('
    ') + text.append('
    ') return ''.join(text) def fb2_body_footer(self): - return u'\n
    \n' + return u'' def fb2_footer(self): return u'' - def add_page_anchor(self, page): - return self.get_anchor(page, '') - - def get_anchor(self, page, aid): - aid = prepare_string_for_xml(aid) - aid = '%s#%s' % (page.href, aid) - if aid not in self.link_hrefs.keys(): - self.link_hrefs[aid] = 'calibre_link-%s' % len(self.link_hrefs.keys()) - aid = self.link_hrefs[aid] - return '' % aid - def fb2mlize_images(self): images = [] for item in self.oeb_book.manifest: @@ -218,12 +165,42 @@ class FB2MLizer(object): col = 1 col += 1 data += char - images.append('%s\n' % (self.image_hrefs.get(item.href, '0000.JPEG'), item.media_type, data)) + images.append('%s\n' % (self.image_hrefs.get(item.href, '_0000.JPEG'), item.media_type, data)) except Exception as e: - self.log.error('Error: Could not include file %s becuase ' \ + self.log.error('Error: Could not include file %s because ' \ '%s.' % (item.href, e)) return ''.join(images) + def ensure_p(self): + if self.in_p: + return [], [] + else: + self.in_p = True + return ['

    '], ['p'] + + def close_open_p(self, tags): + text = [''] + added_p = False + + if self.in_p: + # Close all up to p. Close p. Reopen all closed tags including p. + closed_tags = [] + tags.reverse() + for t in tags: + text.append('' % t) + closed_tags.append(t) + if t == 'p': + break + closed_tags.reverse() + for t in closed_tags: + text.append('<%s>' % t) + else: + text.append('

    ') + added_p = True + self.in_p = True + + return text, added_p + def dump_text(self, elem, stylizer, page, tag_stack=[]): if not isinstance(elem.tag, basestring) \ or namespace(elem.tag) != XHTML_NS: @@ -242,53 +219,26 @@ class FB2MLizer(object): if tag in TAG_IMAGES: if elem.attrib.get('src', None): if page.abshref(elem.attrib['src']) not in self.image_hrefs.keys(): - self.image_hrefs[page.abshref(elem.attrib['src'])] = '%s.jpg' % len(self.image_hrefs.keys()) + self.image_hrefs[page.abshref(elem.attrib['src'])] = '_%s.jpg' % len(self.image_hrefs.keys()) + p_txt, p_tag = self.ensure_p() + fb2_text += p_txt + tags += p_tag fb2_text.append('' % self.image_hrefs[page.abshref(elem.attrib['src'])]) - if tag in TAG_LINKS: - href = elem.get('href') - if href: - href = prepare_string_for_xml(page.abshref(href)) - href = href.replace('"', '"') - if '://' in href: - fb2_text.append('' % href) - else: - if href.startswith('#'): - href = href[1:] - if href not in self.link_hrefs.keys(): - self.link_hrefs[href] = 'calibre_link-%s' % len(self.link_hrefs.keys()) - href = self.link_hrefs[href] - fb2_text.append('' % href) - tags.append('a') - - # Anchor ids - id_name = elem.get('id') - if id_name: - fb2_text.append(self.get_anchor(page, id_name)) - if tag == 'h1' and self.opts.h1_to_title or tag == 'h2' and self.opts.h2_to_title or tag == 'h3' and self.opts.h3_to_title: fb2_text.append('') tags.append('title') fb2_tag = TAG_MAP.get(tag, None) if fb2_tag == 'p': - if 'p' in tag_stack+tags: - # Close all up to p. Close p. Reopen all closed tags including p. - all_tags = tag_stack+tags - closed_tags = [] - all_tags.reverse() - for t in all_tags: - fb2_text.append('</%s>' % t) - closed_tags.append(t) - if t == 'p': - break - closed_tags.reverse() - for t in closed_tags: - fb2_text.append('<%s>' % t) - else: - fb2_text.append('<p>') + p_text, added_p = self.close_open_p(tag_stack+tags) + fb2_text += p_text + if added_p: tags.append('p') elif fb2_tag and fb2_tag not in tag_stack+tags: + p_text, p_tags = self.ensure_p() + fb2_text += p_text + tags += p_tags fb2_text.append('<%s>' % fb2_tag) tags.append(fb2_tag) @@ -296,18 +246,21 @@ class FB2MLizer(object): for s in STYLES: style_tag = s[1].get(style[s[0]], None) if style_tag and style_tag not in tag_stack+tags: + p_text, p_tags = self.ensure_p() + fb2_text += p_text + tags += p_tags fb2_text.append('<%s>' % style_tag) tags.append(style_tag) if tag in TAG_SPACE: - if not fb2_text or fb2_text[-1] != ' ' or not fb2_text[-1].endswith(' '): - fb2_text.append(' ') + fb2_text.append(' ') if hasattr(elem, 'text') and elem.text: - if 'p' not in tag_stack+tags: - fb2_text.append('<p>%s</p>' % prepare_string_for_xml(elem.text)) - else: - fb2_text.append(prepare_string_for_xml(elem.text)) + if not self.in_p: + fb2_text.append('<p>') + fb2_text.append(prepare_string_for_xml(elem.text)) + if not self.in_p: + fb2_text.append('</p>') for item in elem: fb2_text += self.dump_text(item, stylizer, page, tag_stack+tags) @@ -316,10 +269,11 @@ class FB2MLizer(object): fb2_text += self.close_tags(tags) if hasattr(elem, 'tail') and elem.tail: - if 'p' not in tag_stack: - fb2_text.append('<p>%s</p>' % prepare_string_for_xml(elem.tail)) - else: - fb2_text.append(prepare_string_for_xml(elem.tail)) + if not self.in_p: + fb2_text.append('<p>') + fb2_text.append(prepare_string_for_xml(elem.tail)) + if not self.in_p: + fb2_text.append('</p>') return fb2_text @@ -327,5 +281,7 @@ class FB2MLizer(object): text = [] for tag in tags: text.append('</%s>' % tag) + if tag == 'p': + self.in_p = False return text From 692b6bcf02e6dbc75f5f5088a122626ece3e4d42 Mon Sep 17 00:00:00 2001 From: John Schember <john@nachtimwald.com> Date: Fri, 3 Dec 2010 19:11:33 -0500 Subject: [PATCH 286/375] FB2 Output: Remove FB2 options that are no longer implemented. --- src/calibre/ebooks/fb2/output.py | 14 ------------- src/calibre/gui2/convert/fb2_output.py | 4 +--- src/calibre/gui2/convert/fb2_output.ui | 27 +++----------------------- 3 files changed, 4 insertions(+), 41 deletions(-) diff --git a/src/calibre/ebooks/fb2/output.py b/src/calibre/ebooks/fb2/output.py index bacaf0da91..88508b83e0 100644 --- a/src/calibre/ebooks/fb2/output.py +++ b/src/calibre/ebooks/fb2/output.py @@ -16,20 +16,6 @@ class FB2Output(OutputFormatPlugin): file_type = 'fb2' options = set([ - OptionRecommendation(name='inline_toc', - recommended_value=False, level=OptionRecommendation.LOW, - help=_('Add Table of Contents to beginning of the book.')), - OptionRecommendation(name='sectionize_chapters', - recommended_value=False, level=OptionRecommendation.LOW, - help=_('Try to turn chapters into individual sections. ' \ - 'WARNING: ' \ - 'This option is experimental. It can cause conversion ' \ - 'to fail. It can also produce unexpected output.')), - OptionRecommendation(name='sectionize_chapters_using_file_structure', - recommended_value=False, level=OptionRecommendation.LOW, - help=_('Try to turn chapters into individual sections using the ' \ - 'internal structure of the ebook. This works well for EPUB ' \ - 'books that have been internally split by chapter.')), OptionRecommendation(name='h1_to_title', recommended_value=False, level=OptionRecommendation.LOW, help=_('Wrap all h1 tags with fb2 title elements.')), diff --git a/src/calibre/gui2/convert/fb2_output.py b/src/calibre/gui2/convert/fb2_output.py index 5d927146a5..6b1497a9db 100644 --- a/src/calibre/gui2/convert/fb2_output.py +++ b/src/calibre/gui2/convert/fb2_output.py @@ -17,8 +17,6 @@ class PluginWidget(Widget, Ui_Form): ICON = I('mimetypes/fb2.png') def __init__(self, parent, get_option, get_help, db=None, book_id=None): - Widget.__init__(self, parent, ['inline_toc', 'sectionize_chapters', - 'sectionize_chapters_using_file_structure', 'h1_to_title', - 'h2_to_title', 'h3_to_title']) + Widget.__init__(self, parent, ['h1_to_title', 'h2_to_title', 'h3_to_title']) self.db, self.book_id = db, book_id self.initialize_options(get_option, get_help, db, book_id) diff --git a/src/calibre/gui2/convert/fb2_output.ui b/src/calibre/gui2/convert/fb2_output.ui index a90ecd615e..436719aed4 100644 --- a/src/calibre/gui2/convert/fb2_output.ui +++ b/src/calibre/gui2/convert/fb2_output.ui @@ -14,7 +14,7 @@ <string>Form</string> </property> <layout class="QGridLayout" name="gridLayout"> - <item row="6" column="0"> + <item row="3" column="0"> <spacer name="verticalSpacer"> <property name="orientation"> <enum>Qt::Vertical</enum> @@ -28,41 +28,20 @@ </spacer> </item> <item row="0" column="0"> - <widget class="QCheckBox" name="opt_inline_toc"> - <property name="text"> - <string>&Inline TOC</string> - </property> - </widget> - </item> - <item row="1" column="0"> - <widget class="QCheckBox" name="opt_sectionize_chapters"> - <property name="text"> - <string>Sectionize Chapters (Use with care!)</string> - </property> - </widget> - </item> - <item row="2" column="0"> - <widget class="QCheckBox" name="opt_sectionize_chapters_using_file_structure"> - <property name="text"> - <string>Sectionize Chapters using file structure</string> - </property> - </widget> - </item> - <item row="3" column="0"> <widget class="QCheckBox" name="opt_h1_to_title"> <property name="text"> <string>Wrap h1 tags with <title> elements</string> </property> </widget> </item> - <item row="4" column="0"> + <item row="1" column="0"> <widget class="QCheckBox" name="opt_h2_to_title"> <property name="text"> <string>Wrap h2 tags with <title> elements</string> </property> </widget> </item> - <item row="5" column="0"> + <item row="2" column="0"> <widget class="QCheckBox" name="opt_h3_to_title"> <property name="text"> <string>Wrap h3 tags with <title> elements</string> From 1fd503a12ea53196d12a1969220e42a23c027a98 Mon Sep 17 00:00:00 2001 From: John Schember <john@nachtimwald.com> Date: Fri, 3 Dec 2010 19:14:09 -0500 Subject: [PATCH 287/375] FB2 Output: Use pretty print option. --- src/calibre/ebooks/fb2/fb2ml.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/calibre/ebooks/fb2/fb2ml.py b/src/calibre/ebooks/fb2/fb2ml.py index 1c24213b46..e658dce25a 100644 --- a/src/calibre/ebooks/fb2/fb2ml.py +++ b/src/calibre/ebooks/fb2/fb2ml.py @@ -82,8 +82,10 @@ class FB2MLizer(object): output.append(self.fb2mlize_images()) output.append(self.fb2_footer()) output = self.clean_text(u''.join(output)) - #return u'<?xml version="1.0" encoding="UTF-8"?>\n%s' % etree.tostring(etree.fromstring(output), encoding=unicode, pretty_print=True) - return u'<?xml version="1.0" encoding="UTF-8"?>' + output + if self.opts.pretty_print: + return u'<?xml version="1.0" encoding="UTF-8"?>\n%s' % etree.tostring(etree.fromstring(output), encoding=unicode, pretty_print=True) + else: + return u'<?xml version="1.0" encoding="UTF-8"?>' + output def clean_text(self, text): text = re.sub(r'(?miu)<section>\s*</section>', '', text) From 9409781f4a4446078e2a1637d7b4303abdc81bff Mon Sep 17 00:00:00 2001 From: John Schember <john@nachtimwald.com> Date: Fri, 3 Dec 2010 19:43:50 -0500 Subject: [PATCH 288/375] FB2 Output: Insert empty lines properly. --- src/calibre/ebooks/fb2/fb2ml.py | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/calibre/ebooks/fb2/fb2ml.py b/src/calibre/ebooks/fb2/fb2ml.py index e658dce25a..252453d25e 100644 --- a/src/calibre/ebooks/fb2/fb2ml.py +++ b/src/calibre/ebooks/fb2/fb2ml.py @@ -32,7 +32,6 @@ TAG_MAP = { 'p' : 'p', 'li' : 'p', 'div': 'p', - 'br' : 'empty-line', } TAG_SPACE = [] @@ -126,7 +125,7 @@ class FB2MLizer(object): '<annotation><p/></annotation>' \ '</title-info>' \ '<document-info>' \ - '<program-used>%s - %s</program-used>' \ + '<program-used>%s %s</program-used>' \ '</document-info>' \ '</description><body>' % tuple(map(prepare_string_for_xml, (author_first, author_middle, author_last, self.oeb_book.metadata.title[0].value, __appname__, __version__))) @@ -180,6 +179,24 @@ class FB2MLizer(object): self.in_p = True return ['<p>'], ['p'] + def insert_empty_line(self, tags): + if self.in_p: + text = [''] + closed_tags = [] + tags.reverse() + for t in tags: + text.append('</%s>' % t) + closed_tags.append(t) + if t == 'p': + break + text.append('<empty-line />') + closed_tags.reverse() + for t in closed_tags: + text.append('<%s>' % t) + return text + else: + return ['<empty-line />'] + def close_open_p(self, tags): text = [''] added_p = False @@ -230,6 +247,8 @@ class FB2MLizer(object): if tag == 'h1' and self.opts.h1_to_title or tag == 'h2' and self.opts.h2_to_title or tag == 'h3' and self.opts.h3_to_title: fb2_text.append('<title>') tags.append('title') + if tag == 'br': + fb2_text += self.insert_empty_line(tag_stack+tags) fb2_tag = TAG_MAP.get(tag, None) if fb2_tag == 'p': From 6ec27b1234d40ac866ab36d4f4d941fbecfc01d2 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Fri, 3 Dec 2010 19:36:31 -0700 Subject: [PATCH 289/375] ... --- setup/installer/linux/freeze2.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup/installer/linux/freeze2.py b/setup/installer/linux/freeze2.py index 684b33b80d..693bf28121 100644 --- a/setup/installer/linux/freeze2.py +++ b/setup/installer/linux/freeze2.py @@ -14,7 +14,7 @@ from setup import Command, modules, basenames, functions, __version__, \ SITE_PACKAGES = ['IPython', 'PIL', 'dateutil', 'dns', 'PyQt4', 'mechanize', 'sip.so', 'BeautifulSoup.py', 'cssutils', 'encutils', 'lxml', - 'sipconfig.py', 'xdg'] + 'sipconfig.py', 'xdg', 'dbus'] QTDIR = '/usr/lib/qt4' QTDLLS = ('QtCore', 'QtGui', 'QtNetwork', 'QtSvg', 'QtXml', 'QtWebKit', 'QtDBus') From 38be2c7fc60dc9f6285494388df3073e81833fc4 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Fri, 3 Dec 2010 20:06:13 -0700 Subject: [PATCH 290/375] ... --- setup/installer/linux/freeze2.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/setup/installer/linux/freeze2.py b/setup/installer/linux/freeze2.py index 693bf28121..cefc193f18 100644 --- a/setup/installer/linux/freeze2.py +++ b/setup/installer/linux/freeze2.py @@ -14,7 +14,8 @@ from setup import Command, modules, basenames, functions, __version__, \ SITE_PACKAGES = ['IPython', 'PIL', 'dateutil', 'dns', 'PyQt4', 'mechanize', 'sip.so', 'BeautifulSoup.py', 'cssutils', 'encutils', 'lxml', - 'sipconfig.py', 'xdg', 'dbus'] + 'sipconfig.py', 'xdg', 'dbus', '_dbus_bindings.so', 'dbus_bindings.py', + '_dbus_glib_bindings.so'] QTDIR = '/usr/lib/qt4' QTDLLS = ('QtCore', 'QtGui', 'QtNetwork', 'QtSvg', 'QtXml', 'QtWebKit', 'QtDBus') From 67367f521d7c640ce046ed614b37f382e55653ec Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Fri, 3 Dec 2010 20:18:56 -0700 Subject: [PATCH 291/375] Use ICU for sorting --- setup/build_environment.py | 4 + setup/extensions.py | 14 +- setup/installer/windows/freeze.py | 2 +- setup/installer/windows/notes.rst | 9 ++ src/calibre/constants.py | 3 +- src/calibre/library/caches.py | 9 +- src/calibre/utils/icu.c | 220 ++++++++++++++++++++++++++++++ src/calibre/utils/icu.py | 53 +++++++ 8 files changed, 306 insertions(+), 8 deletions(-) create mode 100644 src/calibre/utils/icu.c create mode 100644 src/calibre/utils/icu.py diff --git a/setup/build_environment.py b/setup/build_environment.py index c021ebc6a6..d6581a907d 100644 --- a/setup/build_environment.py +++ b/setup/build_environment.py @@ -91,11 +91,15 @@ podofo_inc = '/usr/include/podofo' podofo_lib = '/usr/lib' chmlib_inc_dirs = chmlib_lib_dirs = [] sqlite_inc_dirs = [] +icu_inc_dirs = [] +icu_lib_dirs = [] if iswindows: prefix = r'C:\cygwin\home\kovid\sw' sw_inc_dir = os.path.join(prefix, 'include') sw_lib_dir = os.path.join(prefix, 'lib') + icu_inc_dirs = [sw_inc_dir] + icu_lib_dirs = [sw_lib_dir] sqlite_inc_dirs = [sw_inc_dir] fc_inc = os.path.join(sw_inc_dir, 'fontconfig') fc_lib = sw_lib_dir diff --git a/setup/extensions.py b/setup/extensions.py index d4ac8e188c..3862cce62a 100644 --- a/setup/extensions.py +++ b/setup/extensions.py @@ -18,7 +18,8 @@ from setup.build_environment import fc_inc, fc_lib, chmlib_inc_dirs, \ QMAKE, msvc, MT, win_inc, win_lib, png_inc_dirs, win_ddk, \ magick_inc_dirs, magick_lib_dirs, png_lib_dirs, png_libs, \ magick_error, magick_libs, ft_lib_dirs, ft_libs, jpg_libs, \ - jpg_lib_dirs, chmlib_lib_dirs, sqlite_inc_dirs + jpg_lib_dirs, chmlib_lib_dirs, sqlite_inc_dirs, icu_inc_dirs, \ + icu_lib_dirs MT isunix = islinux or isosx or isfreebsd @@ -56,8 +57,19 @@ pdfreflow_libs = [] if iswindows: pdfreflow_libs = ['advapi32', 'User32', 'Gdi32', 'zlib'] +icu_libs = ['icudata', 'icui18n', 'icuuc', 'icuio'] +if iswindows: + icu_libs = ['icudt', 'icuin', 'icuuc', 'icuio'] + extensions = [ + Extension('icu', + ['calibre/utils/icu.c'], + libraries=icu_libs, + lib_dirs=icu_lib_dirs, + inc_dirs=icu_inc_dirs, + ), + Extension('sqlite_custom', ['calibre/library/sqlite_custom.c'], inc_dirs=sqlite_inc_dirs diff --git a/setup/installer/windows/freeze.py b/setup/installer/windows/freeze.py index 30cc2a97af..7d8ea4d80a 100644 --- a/setup/installer/windows/freeze.py +++ b/setup/installer/windows/freeze.py @@ -199,7 +199,7 @@ class Win32Freeze(Command, WixMixIn): for pat in ('*.dll',): for f in glob.glob(os.path.join(bindir, pat)): ok = True - for ex in ('expatw',): + for ex in ('expatw', 'testplug'): if ex in f.lower(): ok = False if not ok: continue diff --git a/setup/installer/windows/notes.rst b/setup/installer/windows/notes.rst index 9c553c42e8..af4c871dac 100644 --- a/setup/installer/windows/notes.rst +++ b/setup/installer/windows/notes.rst @@ -77,6 +77,15 @@ Test it on the target system with calibre-debug -c "import _imaging, _imagingmath, _imagingft, _imagingcms" +ICU +------- + +Download the win32 msvc9 binary from http://www.icu-project.org/download/4.4.html + +Note that 4.4 is the last version of ICU that can be compiled (is precompiled) with msvc9 + +Put the dlls into sw/bin and the unicode dir into sw/include and the contents of lib int sw/lib + Libunrar ---------- diff --git a/src/calibre/constants.py b/src/calibre/constants.py index 197fe5888a..f9c177e7a8 100644 --- a/src/calibre/constants.py +++ b/src/calibre/constants.py @@ -67,7 +67,8 @@ if plugins is None: 'pdfreflow', 'progress_indicator', 'chmlib', - 'chm_extra' + 'chm_extra', + 'icu', ] + \ (['winutil'] if iswindows else []) + \ (['usbobserver'] if isosx else []): diff --git a/src/calibre/library/caches.py b/src/calibre/library/caches.py index 7b4c66c8b8..7c1dea792c 100644 --- a/src/calibre/library/caches.py +++ b/src/calibre/library/caches.py @@ -796,11 +796,13 @@ class SortKey(object): class SortKeyGenerator(object): def __init__(self, fields, field_metadata, data): + from calibre.utils.icu import sort_key self.field_metadata = field_metadata self.orders = [-1 if x[1] else 1 for x in fields] self.entries = [(x[0], field_metadata[x[0]]) for x in fields] self.library_order = tweaks['title_series_sorting'] == 'library_order' self.data = data + self.string_sort_key = sort_key def __call__(self, record): values = tuple(self.itervals(self.data[record])) @@ -821,17 +823,14 @@ class SortKeyGenerator(object): if val is None: val = ('', 1) else: - val = val.lower() if self.library_order: val = title_sort(val) sidx_fm = self.field_metadata[name + '_index'] sidx = record[sidx_fm['rec_index']] - val = (val, sidx) + val = (self.string_sort_key(val), sidx) elif dt in ('text', 'comments', 'composite', 'enumeration'): - if val is None: - val = '' - val = val.lower() + val = self.string_sort_key(val) elif dt == 'bool': val = {True: 1, False: 2, None: 3}.get(val, 3) diff --git a/src/calibre/utils/icu.c b/src/calibre/utils/icu.c new file mode 100644 index 0000000000..6e06d54dff --- /dev/null +++ b/src/calibre/utils/icu.c @@ -0,0 +1,220 @@ +#define UNICODE +#define PY_SSIZE_T_CLEAN +#include <Python.h> +#include <unicode/utypes.h> +#include <unicode/uclean.h> +#include <unicode/ucol.h> +#include <unicode/ustring.h> + + +// Collator object definition {{{ +typedef struct { + PyObject_HEAD + // Type-specific fields go here. + UCollator *collator; + +} icu_Collator; + +static void +icu_Collator_dealloc(icu_Collator* self) +{ + if (self->collator != NULL) ucol_close(self->collator); + self->collator = NULL; + self->ob_type->tp_free((PyObject*)self); +} + +static PyObject * +icu_Collator_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + icu_Collator *self; + const char *loc; + UErrorCode status = U_ZERO_ERROR; + + if (!PyArg_ParseTuple(args, "s", &loc)) return NULL; + + self = (icu_Collator *)type->tp_alloc(type, 0); + if (self != NULL) { + self->collator = ucol_open(loc, &status); + if (self->collator == NULL || U_FAILURE(status)) { + PyErr_SetString(PyExc_Exception, "Failed to create collator."); + self->collator = NULL; + Py_DECREF(self); + return NULL; + } + } + + return (PyObject *)self; +} + +// Collator.display_name {{{ +static PyObject * +icu_Collator_display_name(icu_Collator *self, void *closure) { + const char *loc = NULL; + UErrorCode status = U_ZERO_ERROR; + UChar dname[400]; + char buf[100]; + + loc = ucol_getLocaleByType(self->collator, ULOC_ACTUAL_LOCALE, &status); + if (loc == NULL || U_FAILURE(status)) { + PyErr_SetString(PyExc_Exception, "Failed to get actual locale"); return NULL; + } + ucol_getDisplayName(loc, "en", dname, 100, &status); + if (U_FAILURE(status)) return PyErr_NoMemory(); + + u_strToUTF8(buf, 100, NULL, dname, -1, &status); + if (U_FAILURE(status)) { + PyErr_SetString(PyExc_Exception, "Failed ot convert dname to UTF-8"); return NULL; + } + return Py_BuildValue("s", buf); +} + +// }}} + +// Collator.actual_locale {{{ +static PyObject * +icu_Collator_actual_locale(icu_Collator *self, void *closure) { + const char *loc = NULL; + UErrorCode status = U_ZERO_ERROR; + + loc = ucol_getLocaleByType(self->collator, ULOC_ACTUAL_LOCALE, &status); + if (loc == NULL || U_FAILURE(status)) { + PyErr_SetString(PyExc_Exception, "Failed to get actual locale"); return NULL; + } + return Py_BuildValue("s", loc); +} + +// }}} + +// Collator.sort_key {{{ +static PyObject * +icu_Collator_sort_key(icu_Collator *self, PyObject *args, PyObject *kwargs) { + PyObject *o; + Py_ssize_t sz; + wchar_t *buf; + UChar *buf2; + uint8_t *buf3; + PyObject *ans; + UErrorCode status = U_ZERO_ERROR; + + if (!PyArg_ParseTuple(args, "U", &o)) return NULL; + + sz = PyUnicode_GetSize(o); + + buf = (wchar_t*)calloc(sz*2 + 1, sizeof(wchar_t)); + buf2 = (UChar*)calloc(sz*2 + 1, sizeof(UChar)); + buf3 = (uint8_t*)calloc(sz*4 + 1, sizeof(uint8_t)); + + if (buf == NULL || buf2 == NULL || buf3 == NULL) return PyErr_NoMemory(); + + PyUnicode_AsWideChar((PyUnicodeObject *)o, buf, sz); + + u_strFromWCS(buf2, 2*sz+1, NULL, buf, -1, &status); + if (U_SUCCESS(status)) + ucol_getSortKey(self->collator, buf2, -1, buf3, sz*4+1); + + ans = PyBytes_FromString((char *)buf3); + free(buf3); free(buf); free(buf2); + if (ans == NULL) return PyErr_NoMemory(); + + return ans; +} + +static PyMethodDef icu_Collator_methods[] = { + {"sort_key", (PyCFunction)icu_Collator_sort_key, METH_VARARGS, + "sort_key(unicode object) -> Return a sort key for the given object as a bytestring. The idea is that these bytestring will sort using the builtin cmp function, just like the original unicode strings would sort in the current locale with ICU." + }, + + {NULL} /* Sentinel */ +}; + +static PyGetSetDef icu_Collator_getsetters[] = { + {(char *)"actual_locale", + (getter)icu_Collator_actual_locale, NULL, + (char *)"Actual locale used by this collator.", + NULL}, + + {(char *)"display_name", + (getter)icu_Collator_display_name, NULL, + (char *)"Display name of this collator in English. The name reflects the actual data source used.", + NULL}, + + {NULL} /* Sentinel */ +}; + +static PyTypeObject icu_CollatorType = { // {{{ + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "icu.Collator", /*tp_name*/ + sizeof(icu_Collator), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + (destructor)icu_Collator_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash */ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + "Collator", /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + icu_Collator_methods, /* tp_methods */ + 0, /* tp_members */ + icu_Collator_getsetters, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + icu_Collator_new, /* tp_new */ +}; // }}} + +// }} + + +// }}} + + +// Module initialization {{{ + +static PyMethodDef icu_methods[] = { + {NULL} /* Sentinel */ +}; + + +PyMODINIT_FUNC +initicu(void) +{ + PyObject* m; + UErrorCode status = U_ZERO_ERROR; + + u_init(&status); + + + if (PyType_Ready(&icu_CollatorType) < 0) + return; + + m = Py_InitModule3("icu", icu_methods, + "Wrapper for the ICU internationalization library"); + + Py_INCREF(&icu_CollatorType); + PyModule_AddObject(m, "Collator", (PyObject *)&icu_CollatorType); + // uint8_t must be the same size as char + PyModule_AddIntConstant(m, "ok", (U_SUCCESS(status) && sizeof(uint8_t) == sizeof(char)) ? 1 : 0); + +} +// }}} diff --git a/src/calibre/utils/icu.py b/src/calibre/utils/icu.py new file mode 100644 index 0000000000..5b432747f0 --- /dev/null +++ b/src/calibre/utils/icu.py @@ -0,0 +1,53 @@ +#!/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' + +from functools import partial + +from calibre.constants import plugins + +_icu = _collator = None + +_none = u'' +_none2 = b'' + +def load_icu(): + global _icu + if _icu is None: + _icu = plugins['icu'][0] + if _icu is None: + print plugins['icu'][1] + else: + if not _icu.ok: + print 'icu not ok' + _icu = None + return _icu + +def load_collator(): + global _collator + from calibre.utils.localization import get_lang + if _collator is None: + icu = load_icu() + if icu is not None: + _collator = icu.Collator(get_lang()) + return _collator + + +def py_sort_key(obj): + if not obj: + return _none + return obj.lower() + +def icu_sort_key(collator, obj): + if not obj: + return _none2 + return collator.sort_key(obj.lower()) + +load_icu() +load_collator() +sort_key = py_sort_key if _icu is None or _collator is None else \ + partial(icu_sort_key, _collator) + From 74a801f4cce869b25cd70277881b006fe3c145d8 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Fri, 3 Dec 2010 20:36:56 -0700 Subject: [PATCH 292/375] Add ICU to linux binary build --- setup/installer/linux/freeze2.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/setup/installer/linux/freeze2.py b/setup/installer/linux/freeze2.py index cefc193f18..df2c1d6480 100644 --- a/setup/installer/linux/freeze2.py +++ b/setup/installer/linux/freeze2.py @@ -50,6 +50,10 @@ binary_includes = [ '/lib/libreadline.so.6', '/usr/lib/libchm.so.0', '/usr/lib/liblcms2.so.2', + '/usr/lib/libicudata.so.46', + '/usr/lib/libicui18n.so.46', + '/usr/lib/libicuuc.so.46', + '/usr/lib/libicuio.so.46', ] binary_includes += [os.path.join(QTDIR, 'lib%s.so.4'%x) for x in QTDLLS] From 0b70f40709fca1197a8fb634b0dfa4958eedb8be Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Sat, 4 Dec 2010 00:06:49 -0700 Subject: [PATCH 293/375] Fix ICU py->UChar string conversion and add support for OS X --- setup/extensions.py | 6 ++++++ src/calibre/utils/icu.c | 37 ++++++++++++++++++++----------------- 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/setup/extensions.py b/setup/extensions.py index 3862cce62a..6a9cce7625 100644 --- a/setup/extensions.py +++ b/setup/extensions.py @@ -58,8 +58,13 @@ if iswindows: pdfreflow_libs = ['advapi32', 'User32', 'Gdi32', 'zlib'] icu_libs = ['icudata', 'icui18n', 'icuuc', 'icuio'] +icu_cflags = [] if iswindows: icu_libs = ['icudt', 'icuin', 'icuuc', 'icuio'] +if isosx: + icu_libs = ['icucore'] + icu_cflags = ['-DU_DISABLE_RENAMING'] # Needed to use system libicucore.dylib + extensions = [ @@ -68,6 +73,7 @@ extensions = [ libraries=icu_libs, lib_dirs=icu_lib_dirs, inc_dirs=icu_inc_dirs, + cflags=icu_cflags ), Extension('sqlite_custom', diff --git a/src/calibre/utils/icu.c b/src/calibre/utils/icu.c index 6e06d54dff..1da14a0252 100644 --- a/src/calibre/utils/icu.c +++ b/src/calibre/utils/icu.c @@ -88,32 +88,34 @@ icu_Collator_actual_locale(icu_Collator *self, void *closure) { // Collator.sort_key {{{ static PyObject * icu_Collator_sort_key(icu_Collator *self, PyObject *args, PyObject *kwargs) { - PyObject *o; + char *input; Py_ssize_t sz; - wchar_t *buf; - UChar *buf2; - uint8_t *buf3; + UChar *buf; + uint8_t *buf2; PyObject *ans; + int32_t key_size; UErrorCode status = U_ZERO_ERROR; - - if (!PyArg_ParseTuple(args, "U", &o)) return NULL; + + if (!PyArg_ParseTuple(args, "es", "UTF-8", &input)) return NULL; - sz = PyUnicode_GetSize(o); + sz = strlen(input); - buf = (wchar_t*)calloc(sz*2 + 1, sizeof(wchar_t)); - buf2 = (UChar*)calloc(sz*2 + 1, sizeof(UChar)); - buf3 = (uint8_t*)calloc(sz*4 + 1, sizeof(uint8_t)); + buf = (UChar*)calloc(sz*4 + 1, sizeof(UChar)); - if (buf == NULL || buf2 == NULL || buf3 == NULL) return PyErr_NoMemory(); + if (buf == NULL) return PyErr_NoMemory(); - PyUnicode_AsWideChar((PyUnicodeObject *)o, buf, sz); + u_strFromUTF8(buf, sz*4 + 1, &key_size, input, sz, &status); - u_strFromWCS(buf2, 2*sz+1, NULL, buf, -1, &status); - if (U_SUCCESS(status)) - ucol_getSortKey(self->collator, buf2, -1, buf3, sz*4+1); + if (U_SUCCESS(status)) { + key_size = ucol_getSortKey(self->collator, buf, -1, NULL, 0); + buf2 = (uint8_t*)calloc(key_size + 1, sizeof(uint8_t)); + if (buf2 == NULL) return PyErr_NoMemory(); + ucol_getSortKey(self->collator, buf, -1, buf2, key_size+1); + ans = PyBytes_FromString((char *)buf2); + free(buf2); + } else ans = PyBytes_FromString(""); - ans = PyBytes_FromString((char *)buf3); - free(buf3); free(buf); free(buf2); + free(buf); if (ans == NULL) return PyErr_NoMemory(); return ans; @@ -188,6 +190,7 @@ static PyTypeObject icu_CollatorType = { // {{{ // }}} +// }}} // Module initialization {{{ From fc9ac1d715a26d0a567349d976c0ba2105032c5d Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Sat, 4 Dec 2010 00:30:42 -0700 Subject: [PATCH 294/375] Add ICU dorting test --- src/calibre/utils/icu.py | 107 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) diff --git a/src/calibre/utils/icu.py b/src/calibre/utils/icu.py index 5b432747f0..74fbe182f5 100644 --- a/src/calibre/utils/icu.py +++ b/src/calibre/utils/icu.py @@ -51,3 +51,110 @@ load_collator() sort_key = py_sort_key if _icu is None or _collator is None else \ partial(icu_sort_key, _collator) + +def test(): # {{{ + # Data {{{ + german = ''' + Sonntag +Montag +Dienstag +Januar +Februar +März +Fuße +Fluße +Flusse +flusse +fluße +flüße +flüsse +''' + german_good = ''' + Dienstag +Februar +flusse +Flusse +fluße +Fluße +flüsse +flüße +Fuße +Januar +März +Montag +Sonntag''' + french = ''' +dimanche +lundi +mardi +janvier +février +mars +déjà +Meme +deja +même +dejà +bpef +bœg +Boef +Mémé +bœf +boef +bnef +pêche +pèché +pêché +pêche +pêché''' + french_good = ''' + bnef + boef + Boef + bœf + bœg + bpef + deja + dejà + déjà + dimanche + février + janvier + lundi + mardi + mars + Meme + Mémé + même + pèché + pêche + pêche + pêché + pêché''' + # }}} + + def create(l): + l = l.decode('utf-8').splitlines() + return [x.strip() for x in l if x.strip()] + + german = create(german) + c = _icu.Collator('de') + print 'Sorted german:: (%s)'%c.actual_locale + gs = list(sorted(german, key=c.sort_key)) + for x in gs: + print '\t', x.encode('utf-8') + if gs != create(german_good): + print 'German failed' + return + print + french = create(french) + c = _icu.Collator('fr') + print 'Sorted french:: (%s)'%c.actual_locale + fs = list(sorted(french, key=c.sort_key)) + for x in fs: + print '\t', x.encode('utf-8') + if fs != create(french_good): + print 'French failed' + return +# }}} + From a9983208d7c992a393ce2c2bc6af965b3d5bc268 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Sat, 4 Dec 2010 00:40:38 -0700 Subject: [PATCH 295/375] ... --- src/calibre/utils/icu.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/utils/icu.py b/src/calibre/utils/icu.py index 74fbe182f5..7c2fd31f78 100644 --- a/src/calibre/utils/icu.py +++ b/src/calibre/utils/icu.py @@ -154,7 +154,7 @@ pêché''' for x in fs: print '\t', x.encode('utf-8') if fs != create(french_good): - print 'French failed' + print 'French failed (note that French fails with icu < 4.6 i.e. on windows and OS X)' return # }}} From f8920d18bb0b0825c0354abcaaebd91c51ba9a00 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sat, 4 Dec 2010 12:26:13 +0000 Subject: [PATCH 296/375] Refactor to use new sort_keys function --- src/calibre/devices/usbms/books.py | 5 ++++- src/calibre/gui2/actions/edit_metadata.py | 4 ++-- src/calibre/gui2/book_details.py | 5 +++-- src/calibre/gui2/convert/metadata.py | 7 ++++--- src/calibre/gui2/custom_column_widgets.py | 11 ++++++----- src/calibre/gui2/dialogs/metadata_bulk.py | 7 ++++--- src/calibre/gui2/dialogs/metadata_single.py | 7 ++++--- src/calibre/gui2/dialogs/saved_search_editor.py | 3 ++- src/calibre/gui2/dialogs/search.py | 4 ++-- src/calibre/gui2/dialogs/tag_categories.py | 7 ++++--- src/calibre/gui2/dialogs/tag_editor.py | 16 +++++++--------- src/calibre/gui2/dialogs/tag_list_editor.py | 4 ++-- src/calibre/gui2/dialogs/user_profiles.py | 3 ++- src/calibre/gui2/library/delegates.py | 7 +++++-- src/calibre/gui2/library/models.py | 16 +++++++++------- src/calibre/gui2/preferences/behavior.py | 4 ++-- src/calibre/gui2/search_box.py | 3 ++- src/calibre/gui2/shortcuts.py | 4 ++-- src/calibre/gui2/tag_view.py | 16 +++++++++------- src/calibre/library/database2.py | 11 +++++++---- src/calibre/library/server/browse.py | 15 +++++---------- src/calibre/library/server/mobile.py | 4 ++-- src/calibre/library/server/opds.py | 9 ++++----- src/calibre/library/server/utils.py | 3 ++- src/calibre/library/server/xml.py | 4 ++-- src/calibre/library/sqlite.py | 5 +++++ src/calibre/utils/search_query_parser.py | 4 ++-- 27 files changed, 104 insertions(+), 84 deletions(-) diff --git a/src/calibre/devices/usbms/books.py b/src/calibre/devices/usbms/books.py index 5063daa29f..4a74f68349 100644 --- a/src/calibre/devices/usbms/books.py +++ b/src/calibre/devices/usbms/books.py @@ -13,6 +13,7 @@ from calibre.devices.interface import BookList as _BookList from calibre.constants import preferred_encoding from calibre import isbytestring from calibre.utils.config import prefs, tweaks +from calibre.utils.icu import sort_key class Book(Metadata): def __init__(self, prefix, lpath, size=None, other=None): @@ -230,14 +231,16 @@ class CollectionsBookList(BookList): x = xx[1] y = yy[1] if x is None and y is None: + # No sort_key needed here, because defaults are ascii return cmp(xx[2], yy[2]) if x is None: return 1 if y is None: return -1 - c = cmp(x, y) + c = cmp(sort_key(x), sort_key(y)) if c != 0: return c + # same as above -- no sort_key needed here return cmp(xx[2], yy[2]) for category, lpaths in collections.items(): diff --git a/src/calibre/gui2/actions/edit_metadata.py b/src/calibre/gui2/actions/edit_metadata.py index 725bf35993..6e2a4054c8 100644 --- a/src/calibre/gui2/actions/edit_metadata.py +++ b/src/calibre/gui2/actions/edit_metadata.py @@ -16,6 +16,7 @@ from calibre.gui2.dialogs.metadata_bulk import MetadataBulkDialog from calibre.gui2.dialogs.confirm_delete import confirm from calibre.gui2.dialogs.tag_list_editor import TagListEditor from calibre.gui2.actions import InterfaceAction +from calibre.utils.icu import sort_key class EditMetadataAction(InterfaceAction): @@ -363,8 +364,7 @@ class EditMetadataAction(InterfaceAction): def edit_device_collections(self, view, oncard=None): model = view.model() result = model.get_collections_with_ids() - compare = (lambda x,y:cmp(x.lower(), y.lower())) - d = TagListEditor(self.gui, tag_to_match=None, data=result, compare=compare) + d = TagListEditor(self.gui, tag_to_match=None, data=result, key=sort_key) d.exec_() if d.result() == d.Accepted: to_rename = d.to_rename # dict of new text to old ids diff --git a/src/calibre/gui2/book_details.py b/src/calibre/gui2/book_details.py index b101d4c44f..5214f1a1d5 100644 --- a/src/calibre/gui2/book_details.py +++ b/src/calibre/gui2/book_details.py @@ -19,6 +19,7 @@ from calibre.ebooks import BOOK_EXTENSIONS from calibre.constants import preferred_encoding from calibre.library.comments import comments_to_html from calibre.gui2 import config, open_local_file +from calibre.utils.icu import sort_key # render_rows(data) {{{ WEIGHTS = collections.defaultdict(lambda : 100) @@ -31,8 +32,8 @@ WEIGHTS[_('Tags')] = 4 def render_rows(data): keys = data.keys() # First sort by name. The WEIGHTS sort will preserve this sub-order - keys.sort(cmp=lambda x, y: cmp(x.lower(), y.lower())) - keys.sort(cmp=lambda x, y: cmp(WEIGHTS[x], WEIGHTS[y])) + keys.sort(key=sort_key) + keys.sort(key=lambda x: WEIGHTS[x]) rows = [] for key in keys: txt = data[key] diff --git a/src/calibre/gui2/convert/metadata.py b/src/calibre/gui2/convert/metadata.py index 7a02cf4429..d3744bb614 100644 --- a/src/calibre/gui2/convert/metadata.py +++ b/src/calibre/gui2/convert/metadata.py @@ -17,6 +17,7 @@ from calibre.ebooks.metadata import authors_to_string, string_to_authors, \ from calibre.ebooks.metadata.opf2 import metadata_to_opf from calibre.ptempfile import PersistentTemporaryFile from calibre.gui2.convert import Widget +from calibre.utils.icu import sort_key def create_opf_file(db, book_id): mi = db.get_metadata(book_id, index_is_id=True) @@ -102,7 +103,7 @@ class MetadataWidget(Widget, Ui_Form): def initalize_authors(self): all_authors = self.db.all_authors() - all_authors.sort(cmp=lambda x, y : cmp(x[1], y[1])) + all_authors.sort(key=lambda x : sort_key(x[1])) for i in all_authors: id, name = i @@ -117,7 +118,7 @@ class MetadataWidget(Widget, Ui_Form): def initialize_series(self): all_series = self.db.all_series() - all_series.sort(cmp=lambda x, y : cmp(x[1], y[1])) + all_series.sort(key=lambda x : sort_key(x[1])) for i in all_series: id, name = i @@ -126,7 +127,7 @@ class MetadataWidget(Widget, Ui_Form): def initialize_publisher(self): all_publishers = self.db.all_publishers() - all_publishers.sort(cmp=lambda x, y : cmp(x[1], y[1])) + all_publishers.sort(key=lambda x : sort_key(x[1])) for i in all_publishers: id, name = i diff --git a/src/calibre/gui2/custom_column_widgets.py b/src/calibre/gui2/custom_column_widgets.py index 6b6669f4e0..8c41e3def1 100644 --- a/src/calibre/gui2/custom_column_widgets.py +++ b/src/calibre/gui2/custom_column_widgets.py @@ -17,6 +17,7 @@ from calibre.utils.date import qt_to_dt, now from calibre.gui2.widgets import TagsLineEdit, EnComboBox from calibre.gui2 import UNDEFINED_QDATE, error_dialog from calibre.utils.config import tweaks +from calibre.utils.icu import sort_key class Base(object): @@ -207,7 +208,7 @@ class Text(Base): def setup_ui(self, parent): values = self.all_values = list(self.db.all_custom(num=self.col_id)) - values.sort(cmp = lambda x,y: cmp(x.lower(), y.lower())) + values.sort(key=sort_key) if self.col_metadata['is_multiple']: w = TagsLineEdit(parent, values) w.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Preferred) @@ -256,7 +257,7 @@ class Series(Base): def setup_ui(self, parent): values = self.all_values = list(self.db.all_custom(num=self.col_id)) - values.sort(cmp = lambda x,y: cmp(x.lower(), y.lower())) + values.sort(key=sort_key) w = EnComboBox(parent) w.setSizeAdjustPolicy(w.AdjustToMinimumContentsLengthWithIcon) w.setMinimumContentsLength(25) @@ -369,7 +370,7 @@ def field_sort(y, z, x=None): m1, m2 = x[y], x[z] n1 = 'zzzzz' if m1['datatype'] == 'comments' else m1['name'] n2 = 'zzzzz' if m2['datatype'] == 'comments' else m2['name'] - return cmp(n1.lower(), n2.lower()) + return cmp(sort_key(n1), sort_key(n2)) def populate_metadata_page(layout, db, book_id, bulk=False, two_column=False, parent=None): def widget_factory(type, col): @@ -526,7 +527,7 @@ class BulkSeries(BulkBase): def setup_ui(self, parent): values = self.all_values = list(self.db.all_custom(num=self.col_id)) - values.sort(cmp = lambda x,y: cmp(x.lower(), y.lower())) + values.sort(key=sort_key) w = EnComboBox(parent) w.setSizeAdjustPolicy(w.AdjustToMinimumContentsLengthWithIcon) w.setMinimumContentsLength(25) @@ -678,7 +679,7 @@ class BulkText(BulkBase): def setup_ui(self, parent): values = self.all_values = list(self.db.all_custom(num=self.col_id)) - values.sort(cmp = lambda x,y: cmp(x.lower(), y.lower())) + values.sort(key=sort_key) if self.col_metadata['is_multiple']: w = TagsLineEdit(parent, values) w.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Preferred) diff --git a/src/calibre/gui2/dialogs/metadata_bulk.py b/src/calibre/gui2/dialogs/metadata_bulk.py index 7c6125d537..362091eb2d 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.py +++ b/src/calibre/gui2/dialogs/metadata_bulk.py @@ -17,6 +17,7 @@ from calibre.gui2 import error_dialog from calibre.gui2.progress_indicator import ProgressIndicator from calibre.utils.config import dynamic from calibre.utils.titlecase import titlecase +from calibre.utils.icu import sort_key class MyBlockingBusy(QDialog): @@ -594,7 +595,7 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): def initalize_authors(self): all_authors = self.db.all_authors() - all_authors.sort(cmp=lambda x, y : cmp(x[1].lower(), y[1].lower())) + all_authors.sort(key=lambda x : sort_key(x[1])) for i in all_authors: id, name = i @@ -604,7 +605,7 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): def initialize_series(self): all_series = self.db.all_series() - all_series.sort(cmp=lambda x, y : cmp(x[1], y[1])) + all_series.sort(key=lambda x : sort_key(x[1])) for i in all_series: id, name = i @@ -613,7 +614,7 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): def initialize_publisher(self): all_publishers = self.db.all_publishers() - all_publishers.sort(cmp=lambda x, y : cmp(x[1], y[1])) + all_publishers.sort(key=lambda x : sort_key(x[1])) for i in all_publishers: id, name = i diff --git a/src/calibre/gui2/dialogs/metadata_single.py b/src/calibre/gui2/dialogs/metadata_single.py index f50be281d7..8f068075cf 100644 --- a/src/calibre/gui2/dialogs/metadata_single.py +++ b/src/calibre/gui2/dialogs/metadata_single.py @@ -28,6 +28,7 @@ from calibre.ebooks.metadata.meta import get_metadata from calibre.ebooks.metadata import MetaInformation from calibre.utils.config import prefs, tweaks from calibre.utils.date import qt_to_dt, local_tz, utcfromtimestamp +from calibre.utils.icu import sort_key from calibre.customize.ui import run_plugins_on_import, get_isbndb_key from calibre.gui2.preferences.social import SocialMetadata from calibre.gui2.custom_column_widgets import populate_metadata_page @@ -660,7 +661,7 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): def initalize_authors(self): all_authors = self.db.all_authors() - all_authors.sort(cmp=lambda x, y : cmp(x[1], y[1])) + all_authors.sort(key=lambda x : sort_key(x[1])) for i in all_authors: id, name = i name = [name.strip().replace('|', ',') for n in name.split(',')] @@ -675,7 +676,7 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): def initialize_series(self): self.series.setSizeAdjustPolicy(self.series.AdjustToContentsOnFirstShow) all_series = self.db.all_series() - all_series.sort(cmp=lambda x, y : cmp(x[1], y[1])) + all_series.sort(key=lambda x : sort_key(x[1])) series_id = self.db.series_id(self.row) idx, c = None, 0 for i in all_series: @@ -692,7 +693,7 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): def initialize_publisher(self): all_publishers = self.db.all_publishers() - all_publishers.sort(cmp=lambda x, y : cmp(x[1], y[1])) + all_publishers.sort(key=lambda x : sort_key(x[1])) publisher_id = self.db.publisher_id(self.row) idx, c = None, 0 for i in all_publishers: diff --git a/src/calibre/gui2/dialogs/saved_search_editor.py b/src/calibre/gui2/dialogs/saved_search_editor.py index 3f9f7ad437..1143a6f06a 100644 --- a/src/calibre/gui2/dialogs/saved_search_editor.py +++ b/src/calibre/gui2/dialogs/saved_search_editor.py @@ -8,6 +8,7 @@ from PyQt4.QtGui import QDialog from calibre.gui2.dialogs.saved_search_editor_ui import Ui_SavedSearchEditor from calibre.utils.search_query_parser import saved_searches +from calibre.utils.icu import sort_key from calibre.gui2.dialogs.confirm_delete import confirm class SavedSearchEditor(QDialog, Ui_SavedSearchEditor): @@ -34,7 +35,7 @@ class SavedSearchEditor(QDialog, Ui_SavedSearchEditor): def populate_search_list(self): self.search_name_box.clear() - for name in sorted(self.searches.keys()): + for name in sorted(self.searches.keys(), key=sort_key): self.search_name_box.addItem(name) def add_search(self): diff --git a/src/calibre/gui2/dialogs/search.py b/src/calibre/gui2/dialogs/search.py index ba09a34a68..8e8fd09652 100644 --- a/src/calibre/gui2/dialogs/search.py +++ b/src/calibre/gui2/dialogs/search.py @@ -8,6 +8,7 @@ from PyQt4.QtGui import QDialog, QDialogButtonBox from calibre.gui2.dialogs.search_ui import Ui_Dialog from calibre.library.caches import CONTAINS_MATCH, EQUALS_MATCH from calibre.gui2 import gprefs +from calibre.utils.icu import sort_key box_values = {} @@ -18,8 +19,7 @@ class SearchDialog(QDialog, Ui_Dialog): self.setupUi(self) self.mc = '' searchables = sorted(db.field_metadata.searchable_fields(), - lambda x, y: cmp(x if x[0] != '#' else x[1:], - y if y[0] != '#' else y[1:])) + key=lambda x: sort_key(x if x[0] != '#' else x[1:])) self.general_combo.addItems(searchables) self.box_last_values = copy.deepcopy(box_values) diff --git a/src/calibre/gui2/dialogs/tag_categories.py b/src/calibre/gui2/dialogs/tag_categories.py index 7a9660a655..210a2704bf 100644 --- a/src/calibre/gui2/dialogs/tag_categories.py +++ b/src/calibre/gui2/dialogs/tag_categories.py @@ -9,6 +9,7 @@ from PyQt4.QtGui import QDialog, QIcon, QListWidgetItem from calibre.gui2.dialogs.tag_categories_ui import Ui_TagCategories from calibre.gui2.dialogs.confirm_delete import confirm from calibre.constants import islinux +from calibre.utils.icu import sort_key class Item: def __init__(self, name, label, index, icon, exists): @@ -85,7 +86,7 @@ class TagCategories(QDialog, Ui_TagCategories): # remove any references to a category that no longer exists del self.categories[cat][item] - self.all_items_sorted = sorted(self.all_items, cmp=lambda x,y: cmp(x.name.lower(), y.name.lower())) + self.all_items_sorted = sorted(self.all_items, key=lambda x: sort_key(x.name)) self.display_filtered_categories(0) for v in category_names: @@ -135,7 +136,7 @@ class TagCategories(QDialog, Ui_TagCategories): index = self.all_items[node.data(Qt.UserRole).toPyObject()].index if index not in self.applied_items: self.applied_items.append(index) - self.applied_items.sort(cmp=lambda x, y:cmp(self.all_items[x].name.lower(), self.all_items[y].name.lower())) + self.applied_items.sort(key=lambda x:sort_key(self.all_items[x])) self.display_filtered_categories(None) def unapply_tags(self, node=None): @@ -198,5 +199,5 @@ class TagCategories(QDialog, Ui_TagCategories): self.categories[self.current_cat_name] = l def populate_category_list(self): - for n in sorted(self.categories.keys(), cmp=lambda x,y: cmp(x.lower(), y.lower())): + for n in sorted(self.categories.keys(), key=sort_key): self.category_box.addItem(n) diff --git a/src/calibre/gui2/dialogs/tag_editor.py b/src/calibre/gui2/dialogs/tag_editor.py index 34c61914fe..48a07c4b9e 100644 --- a/src/calibre/gui2/dialogs/tag_editor.py +++ b/src/calibre/gui2/dialogs/tag_editor.py @@ -6,12 +6,10 @@ from PyQt4.QtGui import QDialog from calibre.gui2.dialogs.tag_editor_ui import Ui_TagEditor from calibre.gui2 import question_dialog, error_dialog from calibre.constants import islinux +from calibre.utils.icu import sort_key class TagEditor(QDialog, Ui_TagEditor): - def tag_cmp(self, x, y): - return cmp(x.lower(), y.lower()) - def __init__(self, window, db, index=None): QDialog.__init__(self, window) Ui_TagEditor.__init__(self) @@ -25,7 +23,7 @@ class TagEditor(QDialog, Ui_TagEditor): tags = [] if tags: tags = [tag.strip() for tag in tags.split(',') if tag.strip()] - tags.sort(cmp=self.tag_cmp) + tags.sort(key=sort_key) for tag in tags: self.applied_tags.addItem(tag) else: @@ -35,7 +33,7 @@ class TagEditor(QDialog, Ui_TagEditor): all_tags = [tag for tag in self.db.all_tags()] all_tags = list(set(all_tags)) - all_tags.sort(cmp=self.tag_cmp) + all_tags.sort(key=sort_key) for tag in all_tags: if tag not in tags: self.available_tags.addItem(tag) @@ -82,7 +80,7 @@ class TagEditor(QDialog, Ui_TagEditor): self.tags.append(tag) self.available_tags.takeItem(self.available_tags.row(item)) - self.tags.sort(cmp=self.tag_cmp) + self.tags.sort(key=sort_key) self.applied_tags.clear() for tag in self.tags: self.applied_tags.addItem(tag) @@ -96,14 +94,14 @@ class TagEditor(QDialog, Ui_TagEditor): self.tags.remove(tag) self.available_tags.addItem(tag) - self.tags.sort(cmp=self.tag_cmp) + self.tags.sort(key=sort_key) self.applied_tags.clear() for tag in self.tags: self.applied_tags.addItem(tag) items = [unicode(self.available_tags.item(x).text()) for x in range(self.available_tags.count())] - items.sort(cmp=self.tag_cmp) + items.sort(key=sort_key) self.available_tags.clear() for item in items: self.available_tags.addItem(item) @@ -117,7 +115,7 @@ class TagEditor(QDialog, Ui_TagEditor): if tag not in self.tags: self.tags.append(tag) - self.tags.sort(cmp=self.tag_cmp) + self.tags.sort(key=sort_key) self.applied_tags.clear() for tag in self.tags: self.applied_tags.addItem(tag) diff --git a/src/calibre/gui2/dialogs/tag_list_editor.py b/src/calibre/gui2/dialogs/tag_list_editor.py index 7cdc0a089a..a7d6fe03e7 100644 --- a/src/calibre/gui2/dialogs/tag_list_editor.py +++ b/src/calibre/gui2/dialogs/tag_list_editor.py @@ -39,7 +39,7 @@ class ListWidgetItem(QListWidgetItem): class TagListEditor(QDialog, Ui_TagListEditor): - def __init__(self, window, tag_to_match, data, compare): + def __init__(self, window, tag_to_match, data, key): QDialog.__init__(self, window) Ui_TagListEditor.__init__(self) self.setupUi(self) @@ -54,7 +54,7 @@ class TagListEditor(QDialog, Ui_TagListEditor): for k,v in data: self.all_tags[v] = k - for tag in sorted(self.all_tags.keys(), cmp=compare): + for tag in sorted(self.all_tags.keys(), key=key): item = ListWidgetItem(tag) item.setData(Qt.UserRole, self.all_tags[tag]) self.available_tags.addItem(item) diff --git a/src/calibre/gui2/dialogs/user_profiles.py b/src/calibre/gui2/dialogs/user_profiles.py index 6901e13968..71c9ebcd04 100644 --- a/src/calibre/gui2/dialogs/user_profiles.py +++ b/src/calibre/gui2/dialogs/user_profiles.py @@ -13,6 +13,7 @@ from calibre.gui2 import error_dialog, question_dialog, open_url, \ choose_files, ResizableDialog, NONE from calibre.gui2.widgets import PythonHighlighter from calibre.ptempfile import PersistentTemporaryFile +from calibre.utils.icu import sort_key class CustomRecipeModel(QAbstractListModel): @@ -256,7 +257,7 @@ class %(classname)s(%(base_class)s): def add_builtin_recipe(self): from calibre.web.feeds.recipes.collection import \ get_builtin_recipe_by_title, get_builtin_recipe_titles - items = sorted(get_builtin_recipe_titles()) + items = sorted(get_builtin_recipe_titles(), key=sort_key) title, ok = QInputDialog.getItem(self, _('Pick recipe'), _('Pick the recipe to customize'), diff --git a/src/calibre/gui2/library/delegates.py b/src/calibre/gui2/library/delegates.py index 03309d1fba..8b6c2a8ae5 100644 --- a/src/calibre/gui2/library/delegates.py +++ b/src/calibre/gui2/library/delegates.py @@ -20,6 +20,7 @@ from calibre.gui2.widgets import EnLineEdit, TagsLineEdit from calibre.utils.date import now, format_date from calibre.utils.config import tweaks from calibre.utils.formatter import validation_formatter +from calibre.utils.icu import sort_key from calibre.gui2.dialogs.comments_dialog import CommentsDialog class RatingDelegate(QStyledItemDelegate): # {{{ @@ -173,7 +174,8 @@ class TagsDelegate(QStyledItemDelegate): # {{{ editor = TagsLineEdit(parent, self.db.all_tags()) else: editor = TagsLineEdit(parent, - sorted(list(self.db.all_custom(label=self.db.field_metadata.key_to_label(col))))) + sorted(list(self.db.all_custom(label=self.db.field_metadata.key_to_label(col))), + key=sort_key)) return editor else: editor = EnLineEdit(parent) @@ -245,7 +247,8 @@ class CcTextDelegate(QStyledItemDelegate): # {{{ editor.setDecimals(2) else: editor = EnLineEdit(parent) - complete_items = sorted(list(m.db.all_custom(label=m.db.field_metadata.key_to_label(col)))) + complete_items = sorted(list(m.db.all_custom(label=m.db.field_metadata.key_to_label(col))), + key=sort_key) completer = QCompleter(complete_items, self) completer.setCaseSensitivity(Qt.CaseInsensitive) completer.setCompletionMode(QCompleter.PopupCompletion) diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index e09f85dc6b..e854ffc1bc 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -18,6 +18,7 @@ from calibre.ebooks.metadata import fmt_sidx, authors_to_string, string_to_autho from calibre.ptempfile import PersistentTemporaryFile from calibre.utils.config import tweaks, prefs from calibre.utils.date import dt_factory, qt_to_dt, isoformat +from calibre.utils.icu import sort_key from calibre.ebooks.metadata.meta import set_metadata as _set_metadata from calibre.utils.search_query_parser import SearchQueryParser from calibre.library.caches import _match, CONTAINS_MATCH, EQUALS_MATCH, \ @@ -305,9 +306,10 @@ class BooksModel(QAbstractTableModel): # {{{ cdata = self.cover(idx) if cdata: data['cover'] = cdata - tags = self.db.tags(idx) + tags = list(self.db.get_tags(self.db.id(idx))) if tags: - tags = tags.replace(',', ', ') + tags.sort(key=sort_key) + tags = ', '.join(tags) else: tags = _('None') data[_('Tags')] = tags @@ -544,7 +546,7 @@ class BooksModel(QAbstractTableModel): # {{{ def tags(r, idx=-1): tags = self.db.data[r][idx] if tags: - return QVariant(', '.join(sorted(tags.split(',')))) + return QVariant(', '.join(sorted(tags.split(','), key=sort_key))) return None def series_type(r, idx=-1, siix=-1): @@ -595,7 +597,7 @@ class BooksModel(QAbstractTableModel): # {{{ def text_type(r, mult=False, idx=-1): text = self.db.data[r][idx] if text and mult: - return QVariant(', '.join(sorted(text.split('|')))) + return QVariant(', '.join(sorted(text.split('|'),key=sort_key))) return QVariant(text) def number_type(r, idx=-1): @@ -1033,8 +1035,8 @@ class DeviceBooksModel(BooksModel): # {{{ x, y = int(self.db[x].size), int(self.db[y].size) return cmp(x, y) def tagscmp(x, y): - x = ','.join(sorted(getattr(self.db[x], 'device_collections', []))).lower() - y = ','.join(sorted(getattr(self.db[y], 'device_collections', []))).lower() + x = ','.join(sorted(getattr(self.db[x], 'device_collections', []),key=sort_key)) + y = ','.join(sorted(getattr(self.db[y], 'device_collections', []),key=sort_key)) return cmp(x, y) def libcmp(x, y): x, y = self.db[x].in_library, self.db[y].in_library @@ -1211,7 +1213,7 @@ class DeviceBooksModel(BooksModel): # {{{ elif cname == 'collections': tags = self.db[self.map[row]].device_collections if tags: - tags.sort(cmp=lambda x,y: cmp(x.lower(), y.lower())) + tags.sort(key=sort_key) return QVariant(', '.join(tags)) elif DEBUG and cname == 'inlibrary': return QVariant(self.db[self.map[row]].in_library) diff --git a/src/calibre/gui2/preferences/behavior.py b/src/calibre/gui2/preferences/behavior.py index d6d6d7be23..169a2b76fe 100644 --- a/src/calibre/gui2/preferences/behavior.py +++ b/src/calibre/gui2/preferences/behavior.py @@ -19,6 +19,7 @@ from calibre.utils.search_query_parser import saved_searches from calibre.ebooks import BOOK_EXTENSIONS from calibre.ebooks.oeb.iterator import is_supported from calibre.constants import iswindows +from calibre.utils.icu import sort_key class ConfigWidget(ConfigWidgetBase, Ui_Form): @@ -45,8 +46,7 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): choices = [(x.upper(), x) for x in output_formats] r('output_format', prefs, choices=choices) - restrictions = sorted(saved_searches().names(), - cmp=lambda x,y: cmp(x.lower(), y.lower())) + restrictions = sorted(saved_searches().names(), key=sort_key) choices = [('', '')] + [(x, x) for x in restrictions] r('gui_restriction', db.prefs, choices=choices) r('new_book_tags', prefs, setting=CommaSeparatedList) diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py index c85dafc6d8..3d34d6c6e9 100644 --- a/src/calibre/gui2/search_box.py +++ b/src/calibre/gui2/search_box.py @@ -17,6 +17,7 @@ from calibre.gui2.dialogs.confirm_delete import confirm from calibre.gui2.dialogs.saved_search_editor import SavedSearchEditor from calibre.gui2.dialogs.search import SearchDialog from calibre.utils.search_query_parser import saved_searches +from calibre.utils.icu import sort_key class SearchLineEdit(QLineEdit): # {{{ key_pressed = pyqtSignal(object) @@ -417,7 +418,7 @@ class SavedSearchBoxMixin(object): # {{{ b.setStatusTip(b.toolTip()) def saved_searches_changed(self): - p = sorted(saved_searches().names(), cmp=lambda x,y: cmp(x.lower(), y.lower())) + p = sorted(saved_searches().names(), key=sort_key) t = unicode(self.search_restriction.currentText()) # rebuild the restrictions combobox using current saved searches self.search_restriction.clear() diff --git a/src/calibre/gui2/shortcuts.py b/src/calibre/gui2/shortcuts.py index 24395a22b6..bdd699a69d 100644 --- a/src/calibre/gui2/shortcuts.py +++ b/src/calibre/gui2/shortcuts.py @@ -14,6 +14,7 @@ from PyQt4.Qt import QAbstractListModel, Qt, QKeySequence, QListView, \ from calibre.gui2 import NONE, error_dialog from calibre.utils.config import XMLConfig +from calibre.utils.icu import sort_key from calibre.gui2.shortcuts_ui import Ui_Frame DEFAULTS = Qt.UserRole @@ -175,8 +176,7 @@ class Shortcuts(QAbstractListModel): for k, v in shortcuts.items(): self.keys[k] = v[0] self.order = list(shortcuts) - self.order.sort(cmp=lambda x,y : cmp(self.descriptions[x], - self.descriptions[y])) + self.order.sort(key=lambda x : sort_key(self.descriptions[x])) self.sequences = {} for k, v in self.keys.items(): self.sequences[k] = [QKeySequence(x) for x in v] diff --git a/src/calibre/gui2/tag_view.py b/src/calibre/gui2/tag_view.py index 768b699ca9..fdae1bdbc9 100644 --- a/src/calibre/gui2/tag_view.py +++ b/src/calibre/gui2/tag_view.py @@ -18,6 +18,7 @@ from PyQt4.Qt import Qt, QTreeView, QApplication, pyqtSignal, \ from calibre.ebooks.metadata import title_sort from calibre.gui2 import config, NONE from calibre.library.field_metadata import TagsIcons, category_icon_map +from calibre.utils.icu import sort_key from calibre.utils.search_query_parser import saved_searches from calibre.gui2 import error_dialog from calibre.gui2.dialogs.confirm_delete import confirm @@ -225,7 +226,7 @@ class TagsView(QTreeView): # {{{ partial(self.context_menu_handler, action='hide', category=category)) if self.hidden_categories: m = self.context_menu.addMenu(_('Show category')) - for col in sorted(self.hidden_categories, cmp=lambda x,y: cmp(x.lower(), y.lower())): + for col in sorted(self.hidden_categories, key=sort_key): m.addAction(col, partial(self.context_menu_handler, action='show', category=col)) @@ -599,7 +600,8 @@ class TagsModel(QAbstractItemModel): # {{{ # Reconstruct the user categories, putting them into metadata self.db.field_metadata.remove_dynamic_categories() tb_cats = self.db.field_metadata - for user_cat in sorted(self.db.prefs.get('user_categories', {}).keys()): + for user_cat in sorted(self.db.prefs.get('user_categories', {}).keys(), + key=sort_key): cat_name = user_cat+':' # add the ':' to avoid name collision tb_cats.add_user_category(label=cat_name, name=user_cat) if len(saved_searches().names()): @@ -878,13 +880,13 @@ class TagBrowserMixin(object): # {{{ db=self.library_view.model().db if category == 'tags': result = db.get_tags_with_ids() - compare = (lambda x,y:cmp(x.lower(), y.lower())) + key = sort_key elif category == 'series': result = db.get_series_with_ids() - compare = (lambda x,y:cmp(title_sort(x).lower(), title_sort(y).lower())) + key = lambda x:sort_key(title_sort(x)) elif category == 'publisher': result = db.get_publishers_with_ids() - compare = (lambda x,y:cmp(x.lower(), y.lower())) + key = sort_key else: # should be a custom field cc_label = None if category in db.field_metadata: @@ -892,9 +894,9 @@ class TagBrowserMixin(object): # {{{ result = db.get_custom_items_with_ids(label=cc_label) else: result = [] - compare = (lambda x,y:cmp(x.lower(), y.lower())) + key = sort_key - d = TagListEditor(self, tag_to_match=tag, data=result, compare=compare) + d = TagListEditor(self, tag_to_match=tag, data=result, key=key) d.exec_() if d.result() == d.Accepted: to_rename = d.to_rename # dict of new text to old id diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 4e05aa3a95..4efb5e6233 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -14,6 +14,7 @@ from operator import itemgetter from PyQt4.QtGui import QImage + from calibre.ebooks.metadata import title_sort, author_to_author_sort from calibre.ebooks.metadata.opf2 import metadata_to_opf from calibre.library.database import LibraryDatabase @@ -33,6 +34,7 @@ from calibre import isbytestring from calibre.utils.filenames import ascii_filename from calibre.utils.date import utcnow, now as nowf, utcfromtimestamp from calibre.utils.config import prefs, tweaks +from calibre.utils.icu import sort_key from calibre.utils.search_query_parser import saved_searches, set_saved_searches from calibre.ebooks import BOOK_EXTENSIONS, check_ebook_format from calibre.utils.magick.draw import save_cover_data_to @@ -287,7 +289,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): # Assumption is that someone else will fix them if they change. self.field_metadata.remove_dynamic_categories() tb_cats = self.field_metadata - for user_cat in sorted(self.prefs.get('user_categories', {}).keys()): + for user_cat in sorted(self.prefs.get('user_categories', {}).keys(), key=sort_key): cat_name = user_cat+':' # add the ':' to avoid name collision tb_cats.add_user_category(label=cat_name, name=user_cat) if len(saved_searches().names()): @@ -1065,7 +1067,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): if sort == 'popularity': query += ' ORDER BY count DESC, sort ASC' elif sort == 'name': - query += ' ORDER BY sort ASC' + query += ' ORDER BY sort COLLATE icucollate' else: query += ' ORDER BY avg_rating DESC, sort ASC' data = self.conn.get(query) @@ -1137,6 +1139,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): if sort == 'popularity': categories['formats'].sort(key=lambda x: x.count, reverse=True) else: # no ratings exist to sort on + # No need for ICU here. categories['formats'].sort(key = lambda x:x.name) #### Now do the user-defined categories. #### @@ -1151,7 +1154,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): for c in categories.keys(): taglist[c] = dict(map(lambda t:(t.name, t), categories[c])) - for user_cat in sorted(user_categories.keys()): + for user_cat in sorted(user_categories.keys(), key=sort_key): items = [] for (name,label,ign) in user_categories[user_cat]: if label in taglist and name in taglist[label]: @@ -1167,7 +1170,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): sorted(items, key=lambda x: x.count, reverse=True) elif sort == 'name': categories[cat_name] = \ - sorted(items, key=lambda x: x.sort.lower()) + sorted(items, key=lambda x: sort_key(x.sort)) else: categories[cat_name] = \ sorted(items, key=lambda x:x.avg_rating, reverse=True) diff --git a/src/calibre/library/server/browse.py b/src/calibre/library/server/browse.py index b6dbde4c77..0a3a7f6fd2 100644 --- a/src/calibre/library/server/browse.py +++ b/src/calibre/library/server/browse.py @@ -16,6 +16,7 @@ from calibre import isbytestring, force_unicode, fit_image, \ from calibre.utils.ordered_dict import OrderedDict from calibre.utils.filenames import ascii_filename from calibre.utils.config import prefs +from calibre.utils.icu import sort_key from calibre.utils.magick import Image from calibre.library.comments import comments_to_html from calibre.library.server import custom_fields_to_display @@ -273,7 +274,7 @@ class BrowseServer(object): opts = ['<option %svalue="%s">%s</option>' % ( 'selected="selected" ' if k==sort else '', xml(k), xml(n), ) for k, n in - sorted(sort_opts, key=operator.itemgetter(1)) if k and n] + sorted(sort_opts, key=lambda x: sort_key(operator.itemgetter(1)(x))) if k and n] ans = ans.replace('{sort_select_options}', ('\n'+' '*20).join(opts)) lp = self.db.library_path if isbytestring(lp): @@ -337,8 +338,7 @@ class BrowseServer(object): return category_meta[x]['name'].lower() displayed_custom_fields = custom_fields_to_display(self.db) - for category in sorted(categories, - cmp=lambda x,y: cmp(getter(x), getter(y))): + for category in sorted(categories, key=lambda x: sort_key(getter(x))): if len(categories[category]) == 0: continue if category == 'formats': @@ -375,12 +375,7 @@ class BrowseServer(object): def browse_sort_categories(self, items, sort): if sort not in ('rating', 'name', 'popularity'): sort = 'name' - def sorter(x): - ans = getattr(x, 'sort', x.name) - if hasattr(ans, 'upper'): - ans = ans.upper() - return ans - items.sort(key=sorter) + items.sort(key=lambda x: sort_key(getattr(x, 'sort', x.name))) if sort == 'popularity': items.sort(key=operator.attrgetter('count'), reverse=True) elif sort == 'rating': @@ -703,7 +698,7 @@ class BrowseServer(object): args[field] fields.append((m['name'], r)) - fields.sort(key=lambda x: x[0].lower()) + fields.sort(key=lambda x: sort_key(x[0])) fields = [u'<div class="field">{0}</div>'.format(f[1]) for f in fields] fields = u'<div class="fields">%s</div>'%('\n\n'.join(fields)) diff --git a/src/calibre/library/server/mobile.py b/src/calibre/library/server/mobile.py index d38c2f206e..0992e6c30b 100644 --- a/src/calibre/library/server/mobile.py +++ b/src/calibre/library/server/mobile.py @@ -21,6 +21,7 @@ from calibre.constants import __appname__ from calibre import human_readable, isbytestring from calibre.utils.date import utcfromtimestamp from calibre.utils.filenames import ascii_filename +from calibre.utils.icu import sort_key def CLASS(*args, **kwargs): # class is a reserved word in Python kwargs['class'] = ' '.join(args) @@ -211,8 +212,7 @@ class MobileServer(object): CFM = self.db.field_metadata CKEYS = [key for key in sorted(custom_fields_to_display(self.db), - cmp=lambda x,y: cmp(CFM[x]['name'].lower(), - CFM[y]['name'].lower()))] + key=lambda x:sort_key(CFM[x]['name']))] # This method uses its own book dict, not the Metadata dict. The loop # below could be changed to use db.get_metadata instead of reading # info directly from the record made by the view, but it doesn't seem diff --git a/src/calibre/library/server/opds.py b/src/calibre/library/server/opds.py index 4b5db63ac3..af635ebf48 100644 --- a/src/calibre/library/server/opds.py +++ b/src/calibre/library/server/opds.py @@ -20,6 +20,7 @@ from calibre.library.comments import comments_to_html from calibre.library.server import custom_fields_to_display from calibre.library.server.utils import format_tag_string, Offsets from calibre import guess_type +from calibre.utils.icu import sort_key from calibre.utils.ordered_dict import OrderedDict BASE_HREFS = { @@ -279,8 +280,7 @@ class AcquisitionFeed(NavFeed): NavFeed.__init__(self, id_, updated, version, offsets, page_url, up_url) CFM = db.field_metadata CKEYS = [key for key in sorted(custom_fields_to_display(db), - cmp=lambda x,y: cmp(CFM[x]['name'].lower(), - CFM[y]['name'].lower()))] + key=lambda x: sort_key(CFM[x]['name']))] for item in items: self.root.append(ACQUISITION_ENTRY(item, version, db, updated, CFM, CKEYS, prefix)) @@ -492,7 +492,7 @@ class OPDSServer(object): val = 'A' starts.add(val[0].upper()) category_groups = OrderedDict() - for x in sorted(starts, cmp=lambda x,y:cmp(x.lower(), y.lower())): + for x in sorted(starts, key=sort_key): category_groups[x] = len([y for y in items if getattr(y, 'sort', y.name).startswith(x)]) items = [Group(x, y) for x, y in category_groups.items()] @@ -571,8 +571,7 @@ class OPDSServer(object): ] def getter(x): return category_meta[x]['name'].lower() - for category in sorted(categories, - cmp=lambda x,y: cmp(getter(x), getter(y))): + for category in sorted(categories, key=lambda x: sort_key(getter(x))): if len(categories[category]) == 0: continue if category == 'formats': diff --git a/src/calibre/library/server/utils.py b/src/calibre/library/server/utils.py index 1407487db3..e58dd2f19b 100644 --- a/src/calibre/library/server/utils.py +++ b/src/calibre/library/server/utils.py @@ -13,6 +13,7 @@ import cherrypy from calibre import strftime as _strftime, prints, isbytestring from calibre.utils.date import now as nowf from calibre.utils.config import tweaks +from calibre.utils.icu import sort_key class Offsets(object): 'Calculate offsets for a paginated view' @@ -73,7 +74,7 @@ def format_tag_string(tags, sep, ignore_max=False, no_tag_count=False): tlist = [t.strip() for t in tags.split(sep)] else: tlist = [] - tlist.sort(cmp=lambda x,y:cmp(x.lower(), y.lower())) + tlist.sort(key=sort_key) if len(tlist) > MAX: tlist = tlist[:MAX]+['...'] if no_tag_count: diff --git a/src/calibre/library/server/xml.py b/src/calibre/library/server/xml.py index e99fc2839c..efbceb9771 100644 --- a/src/calibre/library/server/xml.py +++ b/src/calibre/library/server/xml.py @@ -17,6 +17,7 @@ from calibre.ebooks.metadata import fmt_sidx from calibre.constants import preferred_encoding from calibre import isbytestring from calibre.utils.filenames import ascii_filename +from calibre.utils.icu import sort_key E = ElementMaker() @@ -101,8 +102,7 @@ class XMLServer(object): CFM = self.db.field_metadata CKEYS = [key for key in sorted(custom_fields_to_display(self.db), - cmp=lambda x,y: cmp(CFM[x]['name'].lower(), - CFM[y]['name'].lower()))] + key=lambda x: sort_key(CFM[x]['name']))] custcols = [] for key in CKEYS: def concat(name, val): diff --git a/src/calibre/library/sqlite.py b/src/calibre/library/sqlite.py index 7a86447090..b4cad8061e 100644 --- a/src/calibre/library/sqlite.py +++ b/src/calibre/library/sqlite.py @@ -115,6 +115,9 @@ def pynocase(one, two, encoding='utf-8'): pass return cmp(one.lower(), two.lower()) +def icu_collator(s1, s2, func=None): + return cmp(func(unicode(s1)), func(unicode(s2))) + def load_c_extensions(conn, debug=DEBUG): try: conn.enable_load_extension(True) @@ -166,6 +169,8 @@ class DBThread(Thread): self.conn.create_function('uuid4', 0, lambda : str(uuid.uuid4())) # Dummy functions for dynamically created filters self.conn.create_function('books_list_filter', 1, lambda x: 1) + from calibre.utils.icu import sort_key + self.conn.create_collation('icucollate', partial(icu_collator, func=sort_key)) def run(self): try: diff --git a/src/calibre/utils/search_query_parser.py b/src/calibre/utils/search_query_parser.py index 85a64956a8..db7c7bde5f 100644 --- a/src/calibre/utils/search_query_parser.py +++ b/src/calibre/utils/search_query_parser.py @@ -22,6 +22,7 @@ from calibre.utils.pyparsing import CaselessKeyword, Group, Forward, \ CharsNotIn, Suppress, OneOrMore, MatchFirst, CaselessLiteral, \ Optional, NoMatch, ParseException, QuotedString from calibre.constants import preferred_encoding +from calibre.utils.icu import sort_key @@ -65,8 +66,7 @@ class SavedSearchQueries(object): self.db.prefs[self.opt_name] = self.queries def names(self): - return sorted(self.queries.keys(), - cmp=lambda x,y: cmp(x.lower(), y.lower())) + return sorted(self.queries.keys(),key=sort_key) ''' Create a global instance of the saved searches. It is global so that the searches From 7f6c1712e14e04999ed4f2a7f9cf009491617d7b Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sat, 4 Dec 2010 13:06:35 +0000 Subject: [PATCH 297/375] Provide a sort_order tweak --- resources/default_tweaks.py | 12 ++++++++++++ src/calibre/utils/icu.py | 6 +++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/resources/default_tweaks.py b/resources/default_tweaks.py index 692349283f..1a371e5610 100644 --- a/resources/default_tweaks.py +++ b/resources/default_tweaks.py @@ -217,3 +217,15 @@ generate_cover_foot_font = None # open_viewer, do_nothing, edit_cell. Default: open_viewer. # Example: doubleclick_on_library_view = 'do_nothing' doubleclick_on_library_view = 'open_viewer' + + +# Language to use when sorting. Setting this tweak will force sorting to use the +# collating order for the specified language. This might be useful if you run +# calibre in English but want sorting to work in the language where you live. +# Set the tweak to the desired ISO 639-1 language code, in lower case. +# You can find the list of supported locales at +# http://publib.boulder.ibm.com/infocenter/iseries/v5r3/topic/nls/rbagsicusortsequencetables.htm +# Default: locale_for_sorting = '' -- use the language calibre displays in +# Example: locale_for_sorting = 'fr' -- sort using French rules. +# Example: locale_for_sorting = 'nb' -- sort using Norwegian rules. +locale_for_sorting = '' diff --git a/src/calibre/utils/icu.py b/src/calibre/utils/icu.py index 7c2fd31f78..6b5fc0733a 100644 --- a/src/calibre/utils/icu.py +++ b/src/calibre/utils/icu.py @@ -8,6 +8,7 @@ __docformat__ = 'restructuredtext en' from functools import partial from calibre.constants import plugins +from calibre.utils.config import tweaks _icu = _collator = None @@ -32,7 +33,10 @@ def load_collator(): if _collator is None: icu = load_icu() if icu is not None: - _collator = icu.Collator(get_lang()) + if tweaks['locale_for_sorting']: + _collator = icu.Collator(tweaks['locale_for_sorting']) + else: + _collator = icu.Collator(get_lang()) return _collator From 9dd662ac0b21654a56e8909e18ee8769e6bdb2b3 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sat, 4 Dec 2010 13:21:18 +0000 Subject: [PATCH 298/375] Fix #7787: saved search box is cleared whenever a saved search is selected. --- src/calibre/gui2/search_box.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py index 3d34d6c6e9..8849e2b2ec 100644 --- a/src/calibre/gui2/search_box.py +++ b/src/calibre/gui2/search_box.py @@ -205,7 +205,7 @@ class SearchBox2(QComboBox): # {{{ self.blockSignals(yes) self.line_edit.blockSignals(yes) - def set_search_string(self, txt, store_in_history=False): + def set_search_string(self, txt, store_in_history=False, emit_changed=True): self.setFocus(Qt.OtherFocusReason) if not txt: self.clear() @@ -213,7 +213,8 @@ class SearchBox2(QComboBox): # {{{ self.normalize_state() self.setEditText(txt) self.line_edit.end(False) - self.changed.emit() + if emit_changed: + self.changed.emit() self._do_search(store_in_history=store_in_history) self.focus_to_library.emit() @@ -293,7 +294,7 @@ class SavedSearchBox(QComboBox): # {{{ self.search_box.clear() self.setEditText(qname) return - self.search_box.set_search_string(u'search:"%s"' % qname) + self.search_box.set_search_string(u'search:"%s"' % qname, emit_changed=False) self.setEditText(qname) self.setToolTip(saved_searches().lookup(qname)) From d9cd3fd0b0b77185c7be38bf300815777e884be3 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sat, 4 Dec 2010 14:10:35 +0000 Subject: [PATCH 299/375] Fix problem with sorting in collections --- src/calibre/devices/usbms/books.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/calibre/devices/usbms/books.py b/src/calibre/devices/usbms/books.py index 4a74f68349..9e19e9c66d 100644 --- a/src/calibre/devices/usbms/books.py +++ b/src/calibre/devices/usbms/books.py @@ -237,7 +237,10 @@ class CollectionsBookList(BookList): return 1 if y is None: return -1 - c = cmp(sort_key(x), sort_key(y)) + if isinstance(x, unicode): + c = cmp(sort_key(x), sort_key(y)) + else: + c = cmp(x, y) if c != 0: return c # same as above -- no sort_key needed here From 0aab245a1df8f6b4c44b5f64df85230f0819fd0b Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Sat, 4 Dec 2010 09:12:38 -0700 Subject: [PATCH 300/375] Fix memory leak in ICU sort_key --- src/calibre/utils/icu.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/calibre/utils/icu.c b/src/calibre/utils/icu.c index 1da14a0252..81f3ef4e9a 100644 --- a/src/calibre/utils/icu.c +++ b/src/calibre/utils/icu.c @@ -105,6 +105,7 @@ icu_Collator_sort_key(icu_Collator *self, PyObject *args, PyObject *kwargs) { if (buf == NULL) return PyErr_NoMemory(); u_strFromUTF8(buf, sz*4 + 1, &key_size, input, sz, &status); + PyMem_Free(input); if (U_SUCCESS(status)) { key_size = ucol_getSortKey(self->collator, buf, -1, NULL, 0); From d4c92f8d335c4fcbb652eb085db23b50c6caa739 Mon Sep 17 00:00:00 2001 From: John Schember <john@nachtimwald.com> Date: Sat, 4 Dec 2010 11:39:05 -0500 Subject: [PATCH 301/375] TXT Output: Fix br conversion to space. --- src/calibre/ebooks/txt/txtml.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/calibre/ebooks/txt/txtml.py b/src/calibre/ebooks/txt/txtml.py index 48c94c2543..a3b4ed7afe 100644 --- a/src/calibre/ebooks/txt/txtml.py +++ b/src/calibre/ebooks/txt/txtml.py @@ -179,8 +179,7 @@ class TXTMLizer(object): text.append(u'\n\n') if tag in SPACE_TAGS: - if not end.endswith('u ') and hasattr(elem, 'text') and elem.text: - text.append(u' ') + text.append(u' ') # Process tags that contain text. if hasattr(elem, 'text') and elem.text: From 97bd4f161cb970b9aacf1e3b2a33721aaa4988a2 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Sat, 4 Dec 2010 09:45:45 -0700 Subject: [PATCH 302/375] Speed up ICU key generation by not preflighting in most cases --- src/calibre/utils/icu.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/calibre/utils/icu.c b/src/calibre/utils/icu.c index 81f3ef4e9a..f981abe62e 100644 --- a/src/calibre/utils/icu.c +++ b/src/calibre/utils/icu.c @@ -108,11 +108,22 @@ icu_Collator_sort_key(icu_Collator *self, PyObject *args, PyObject *kwargs) { PyMem_Free(input); if (U_SUCCESS(status)) { - key_size = ucol_getSortKey(self->collator, buf, -1, NULL, 0); - buf2 = (uint8_t*)calloc(key_size + 1, sizeof(uint8_t)); + buf2 = (uint8_t*)calloc(7*sz+1, sizeof(uint8_t)); if (buf2 == NULL) return PyErr_NoMemory(); - ucol_getSortKey(self->collator, buf, -1, buf2, key_size+1); - ans = PyBytes_FromString((char *)buf2); + + key_size = ucol_getSortKey(self->collator, buf, -1, buf2, 7*sz+1); + + if (key_size == 0) { + ans = PyBytes_FromString(""); + } else { + if (key_size >= 7*sz+1) { + free(buf2); + buf2 = (uint8_t*)calloc(key_size+1, sizeof(uint8_t)); + if (buf2 == NULL) return PyErr_NoMemory(); + ucol_getSortKey(self->collator, buf, -1, buf2, key_size+1); + } + ans = PyBytes_FromString((char *)buf2); + } free(buf2); } else ans = PyBytes_FromString(""); From 0e3a2fc39d82fdb1d44e946f6ac33c3d22a9aa4b Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sat, 4 Dec 2010 16:52:27 +0000 Subject: [PATCH 303/375] Better sorting in collection management --- src/calibre/devices/usbms/books.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/calibre/devices/usbms/books.py b/src/calibre/devices/usbms/books.py index 9e19e9c66d..e5a67463e7 100644 --- a/src/calibre/devices/usbms/books.py +++ b/src/calibre/devices/usbms/books.py @@ -216,14 +216,17 @@ class CollectionsBookList(BookList): elif is_series: if doing_dc: collections[cat_name][lpath] = \ - (book, book.get('series_index', sys.maxint), '') + (book, book.get('series_index', sys.maxint), + book.get('title_sort', 'zzzz')) else: collections[cat_name][lpath] = \ - (book, book.get(attr+'_index', sys.maxint), '') + (book, book.get(attr+'_index', sys.maxint), + book.get('title_sort', 'zzzz')) else: if lpath not in collections[cat_name]: collections[cat_name][lpath] = \ - (book, book.get('title_sort', 'zzzz'), '') + (book, book.get('title_sort', 'zzzz'), + book.get('title_sort', 'zzzz')) # Sort collections result = {} @@ -237,7 +240,7 @@ class CollectionsBookList(BookList): return 1 if y is None: return -1 - if isinstance(x, unicode): + if isinstance(x, (unicode, str)): c = cmp(sort_key(x), sort_key(y)) else: c = cmp(x, y) From 4aab356c6904a270c59c5956ec5e944bc6d65a3e Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sat, 4 Dec 2010 17:21:44 +0000 Subject: [PATCH 304/375] Make sorting columns use a key function instead of cmp --- src/calibre/gui2/custom_column_widgets.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/calibre/gui2/custom_column_widgets.py b/src/calibre/gui2/custom_column_widgets.py index 8c41e3def1..5ab8bb6940 100644 --- a/src/calibre/gui2/custom_column_widgets.py +++ b/src/calibre/gui2/custom_column_widgets.py @@ -366,11 +366,10 @@ widgets = { 'enumeration': Enumeration } -def field_sort(y, z, x=None): - m1, m2 = x[y], x[z] +def field_sort_key(y, x=None): + m1 = x[y] n1 = 'zzzzz' if m1['datatype'] == 'comments' else m1['name'] - n2 = 'zzzzz' if m2['datatype'] == 'comments' else m2['name'] - return cmp(sort_key(n1), sort_key(n2)) + return sort_key(n1) def populate_metadata_page(layout, db, book_id, bulk=False, two_column=False, parent=None): def widget_factory(type, col): @@ -382,7 +381,7 @@ def populate_metadata_page(layout, db, book_id, bulk=False, two_column=False, pa return w x = db.custom_column_num_map cols = list(x) - cols.sort(cmp=partial(field_sort, x=x)) + cols.sort(key=partial(field_sort_key, x=x)) count_non_comment = len([c for c in cols if x[c]['datatype'] != 'comments']) layout.setColumnStretch(1, 10) From a6ad9f2c969c542b1e5b14a0d1fe8a378649045a Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Sat, 4 Dec 2010 10:30:04 -0700 Subject: [PATCH 305/375] Add an ICU implementation of strcmp --- src/calibre/utils/icu.c | 36 ++++++++++++++++++++++++++++++++++++ src/calibre/utils/icu.py | 36 ++++++++++++++++++++++++++++++++++-- 2 files changed, 70 insertions(+), 2 deletions(-) diff --git a/src/calibre/utils/icu.c b/src/calibre/utils/icu.c index f981abe62e..79a888f272 100644 --- a/src/calibre/utils/icu.c +++ b/src/calibre/utils/icu.c @@ -133,11 +133,47 @@ icu_Collator_sort_key(icu_Collator *self, PyObject *args, PyObject *kwargs) { return ans; } +// Collator.strcmp {{{ +static PyObject * +icu_Collator_strcmp(icu_Collator *self, PyObject *args, PyObject *kwargs) { + char *a_, *b_; + size_t asz, bsz; + UChar *a, *b; + UErrorCode status = U_ZERO_ERROR; + UCollationResult res = UCOL_EQUAL; + + if (!PyArg_ParseTuple(args, "eses", "UTF-8", &a_, "UTF-8", &b_)) return NULL; + + asz = strlen(a_); bsz = strlen(b_); + + a = (UChar*)calloc(asz*4 + 1, sizeof(UChar)); + b = (UChar*)calloc(bsz*4 + 1, sizeof(UChar)); + + + if (a == NULL || b == NULL) return PyErr_NoMemory(); + + u_strFromUTF8(a, asz*4 + 1, NULL, a_, asz, &status); + u_strFromUTF8(b, bsz*4 + 1, NULL, b_, bsz, &status); + PyMem_Free(a_); PyMem_Free(b_); + + if (U_SUCCESS(status)) + res = ucol_strcoll(self->collator, a, -1, b, -1); + + free(a); free(b); + + return Py_BuildValue("i", res); +} + + static PyMethodDef icu_Collator_methods[] = { {"sort_key", (PyCFunction)icu_Collator_sort_key, METH_VARARGS, "sort_key(unicode object) -> Return a sort key for the given object as a bytestring. The idea is that these bytestring will sort using the builtin cmp function, just like the original unicode strings would sort in the current locale with ICU." }, + {"strcmp", (PyCFunction)icu_Collator_strcmp, METH_VARARGS, + "strcmp(unicode object, unicode object) -> strcmp(a, b) <=> cmp(sorty_key(a), sort_key(b)), but faster." + }, + {NULL} /* Sentinel */ }; diff --git a/src/calibre/utils/icu.py b/src/calibre/utils/icu.py index 7c2fd31f78..5251380973 100644 --- a/src/calibre/utils/icu.py +++ b/src/calibre/utils/icu.py @@ -46,10 +46,35 @@ def icu_sort_key(collator, obj): return _none2 return collator.sort_key(obj.lower()) +def py_case_sensitive_sort_key(obj): + if not obj: + return _none + return obj + +def icu_case_sensitive_sort_key(collator, obj): + if not obj: + return _none2 + return collator.sort_key(obj) + +def icu_strcmp(collator, a, b): + return collator.strcmp(a.lower(), b.lower()) + +def py_strcmp(a, b): + return cmp(a.lower(), b.lower()) + +def icu_case_sensitive_strcmp(collator, a, b): + return collator.strcmp(a, b) + + load_icu() load_collator() -sort_key = py_sort_key if _icu is None or _collator is None else \ - partial(icu_sort_key, _collator) +_icu_not_ok = _icu is None or _collator is None + +sort_key = py_sort_key if _icu_not_ok else partial(icu_sort_key, _collator) +strcmp = py_strcmp if _icu_not_ok else partial(icu_strcmp, _collator) +case_sensitive_sort_key = py_case_sensitive_sort_key if _icu_not_ok else \ + icu_case_sensitive_sort_key +case_sensitive_strcmp = cmp if _icu_not_ok else icu_case_sensitive_strcmp def test(): # {{{ @@ -137,6 +162,12 @@ pêché''' l = l.decode('utf-8').splitlines() return [x.strip() for x in l if x.strip()] + def test_strcmp(entries): + for x in entries: + for y in entries: + if strcmp(x, y) != cmp(sort_key(x), sort_key(y)): + print 'strcmp failed for %r, %r'%(x, y) + german = create(german) c = _icu.Collator('de') print 'Sorted german:: (%s)'%c.actual_locale @@ -156,5 +187,6 @@ pêché''' if fs != create(french_good): print 'French failed (note that French fails with icu < 4.6 i.e. on windows and OS X)' return + test_strcmp(german + french) # }}} From f424743046ec5905a5e4c561714ac048f344e3cd Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Sat, 4 Dec 2010 11:29:08 -0700 Subject: [PATCH 306/375] News download: Localize the navigation bars in the downloaded news to the language the user has selected for their calibre interface --- src/calibre/web/feeds/templates.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/calibre/web/feeds/templates.py b/src/calibre/web/feeds/templates.py index 6e8168be31..eefd897614 100644 --- a/src/calibre/web/feeds/templates.py +++ b/src/calibre/web/feeds/templates.py @@ -115,14 +115,14 @@ class FeedTemplate(Template): hr.tail = '| ' if f+1 < len(feeds): - link = A('Next section', href='../feed_%d/index.html'%(f+1)) + link = A(_('Next section'), href='../feed_%d/index.html'%(f+1)) link.tail = ' | ' navbar.append(link) - link = A('Main menu', href="../index.html") + link = A(_('Main menu'), href="../index.html") link.tail = ' | ' navbar.append(link) if f > 0: - link = A('Previous section', href='../feed_%d/index.html'%(f-1)) + link = A(_('Previous section'), href='../feed_%d/index.html'%(f-1)) link.tail = ' |' navbar.append(link) if top: @@ -208,17 +208,17 @@ class NavBarTemplate(Template): up = '../..' if art == number_of_articles_in_feed - 1 else '..' href = '%s%s/%s/index.html'%(prefix, up, next) navbar.text = '| ' - navbar.append(A('Next', href=href)) + navbar.append(A(_('Next'), href=href)) href = '%s../index.html#article_%d'%(prefix, art) navbar.iterchildren(reversed=True).next().tail = ' | ' - navbar.append(A('Section Menu', href=href)) + navbar.append(A(_('Section Menu'), href=href)) href = '%s../../index.html#feed_%d'%(prefix, feed) navbar.iterchildren(reversed=True).next().tail = ' | ' - navbar.append(A('Main Menu', href=href)) + navbar.append(A(_('Main Menu'), href=href)) if art > 0 and not bottom: href = '%s../article_%d/index.html'%(prefix, art-1) navbar.iterchildren(reversed=True).next().tail = ' | ' - navbar.append(A('Previous', href=href)) + navbar.append(A(_('Previous'), href=href)) navbar.iterchildren(reversed=True).next().tail = ' | ' if not bottom: navbar.append(HR()) @@ -300,7 +300,7 @@ class TouchscreenFeedTemplate(Template): navbar_tr.append(TD(CLASS('feed_prev'),link)) # Up to Sections - link = A('Sections', href="../index.html") + link = A(_('Sections'), href="../index.html") navbar_tr.append(TD(CLASS('feed_up'),link)) # Next Section @@ -381,16 +381,16 @@ class TouchscreenNavBarTemplate(Template): # | Previous if art > 0: - link = A(CLASS('article_link'),'Previous',href='%s../article_%d/index.html'%(prefix, art-1)) + link = A(CLASS('article_link'),_('Previous'),href='%s../article_%d/index.html'%(prefix, art-1)) navbar_tr.append(TD(CLASS('article_prev'),link)) else: navbar_tr.append(TD(CLASS('article_prev'),'')) # | Articles | Sections | - link = A(CLASS('articles_link'),'Articles', href='%s../index.html#article_%d'%(prefix, art)) + link = A(CLASS('articles_link'),_('Articles'), href='%s../index.html#article_%d'%(prefix, art)) navbar_tr.append(TD(CLASS('article_articles_list'),link)) - link = A(CLASS('sections_link'),'Sections', href='%s../../index.html#feed_%d'%(prefix, feed)) + link = A(CLASS('sections_link'),_('Sections'), href='%s../../index.html#feed_%d'%(prefix, feed)) navbar_tr.append(TD(CLASS('article_sections_list'),link)) # | Next @@ -398,7 +398,7 @@ class TouchscreenNavBarTemplate(Template): else 'article_%d'%(art+1) up = '../..' if art == number_of_articles_in_feed - 1 else '..' - link = A(CLASS('article_link'),'Next', href='%s%s/%s/index.html'%(prefix, up, next)) + link = A(CLASS('article_link'), _('Next'), href='%s%s/%s/index.html'%(prefix, up, next)) navbar_tr.append(TD(CLASS('article_next'),link)) navbar_t.append(navbar_tr) navbar.append(navbar_t) From b3868a5ef425054e400ada6a4de35cdc12cc8983 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Sat, 4 Dec 2010 11:48:38 -0700 Subject: [PATCH 307/375] Add ICU case transform algorithms --- src/calibre/utils/icu.c | 154 ++++++++++++++++++++++++++++++++++++++- src/calibre/utils/icu.py | 26 ++++++- 2 files changed, 176 insertions(+), 4 deletions(-) diff --git a/src/calibre/utils/icu.c b/src/calibre/utils/icu.c index 79a888f272..51d9ac25ba 100644 --- a/src/calibre/utils/icu.c +++ b/src/calibre/utils/icu.c @@ -131,7 +131,7 @@ icu_Collator_sort_key(icu_Collator *self, PyObject *args, PyObject *kwargs) { if (ans == NULL) return PyErr_NoMemory(); return ans; -} +} // }}} // Collator.strcmp {{{ static PyObject * @@ -162,7 +162,8 @@ icu_Collator_strcmp(icu_Collator *self, PyObject *args, PyObject *kwargs) { free(a); free(b); return Py_BuildValue("i", res); -} +} // }}} + static PyMethodDef icu_Collator_methods[] = { @@ -242,7 +243,156 @@ static PyTypeObject icu_CollatorType = { // {{{ // Module initialization {{{ +// upper {{{ +static PyObject * +icu_upper(PyObject *self, PyObject *args) { + char *input, *ans, *buf3 = NULL; + const char *loc; + size_t sz; + UChar *buf, *buf2; + PyObject *ret; + UErrorCode status = U_ZERO_ERROR; + + + if (!PyArg_ParseTuple(args, "ses", &loc, "UTF-8", &input)) return NULL; + + sz = strlen(input); + + buf = (UChar*)calloc(sz*4 + 1, sizeof(UChar)); + buf2 = (UChar*)calloc(sz*8 + 1, sizeof(UChar)); + + + if (buf == NULL || buf2 == NULL) return PyErr_NoMemory(); + + u_strFromUTF8(buf, sz*4, NULL, input, sz, &status); + u_strToUpper(buf2, sz*8, buf, -1, loc, &status); + + ans = input; + sz = u_strlen(buf2); + free(buf); + + if (U_SUCCESS(status) && sz > 0) { + buf3 = (char*)calloc(sz*5+1, sizeof(char)); + if (buf3 == NULL) return PyErr_NoMemory(); + u_strToUTF8(buf3, sz*5, NULL, buf2, -1, &status); + if (U_SUCCESS(status)) ans = buf3; + } + + ret = PyUnicode_DecodeUTF8(ans, strlen(ans), "replace"); + if (ret == NULL) return PyErr_NoMemory(); + + free(buf2); + if (buf3 != NULL) free(buf3); + PyMem_Free(input); + + return ret; +} + +// lower {{{ +static PyObject * +icu_lower(PyObject *self, PyObject *args) { + char *input, *ans, *buf3 = NULL; + const char *loc; + size_t sz; + UChar *buf, *buf2; + PyObject *ret; + UErrorCode status = U_ZERO_ERROR; + + + if (!PyArg_ParseTuple(args, "ses", &loc, "UTF-8", &input)) return NULL; + + sz = strlen(input); + + buf = (UChar*)calloc(sz*4 + 1, sizeof(UChar)); + buf2 = (UChar*)calloc(sz*8 + 1, sizeof(UChar)); + + + if (buf == NULL || buf2 == NULL) return PyErr_NoMemory(); + + u_strFromUTF8(buf, sz*4, NULL, input, sz, &status); + u_strToLower(buf2, sz*8, buf, -1, loc, &status); + + ans = input; + sz = u_strlen(buf2); + free(buf); + + if (U_SUCCESS(status) && sz > 0) { + buf3 = (char*)calloc(sz*5+1, sizeof(char)); + if (buf3 == NULL) return PyErr_NoMemory(); + u_strToUTF8(buf3, sz*5, NULL, buf2, -1, &status); + if (U_SUCCESS(status)) ans = buf3; + } + + ret = PyUnicode_DecodeUTF8(ans, strlen(ans), "replace"); + if (ret == NULL) return PyErr_NoMemory(); + + free(buf2); + if (buf3 != NULL) free(buf3); + PyMem_Free(input); + + return ret; +} + +// title {{{ +static PyObject * +icu_title(PyObject *self, PyObject *args) { + char *input, *ans, *buf3 = NULL; + const char *loc; + size_t sz; + UChar *buf, *buf2; + PyObject *ret; + UErrorCode status = U_ZERO_ERROR; + + + if (!PyArg_ParseTuple(args, "ses", &loc, "UTF-8", &input)) return NULL; + + sz = strlen(input); + + buf = (UChar*)calloc(sz*4 + 1, sizeof(UChar)); + buf2 = (UChar*)calloc(sz*8 + 1, sizeof(UChar)); + + + if (buf == NULL || buf2 == NULL) return PyErr_NoMemory(); + + u_strFromUTF8(buf, sz*4, NULL, input, sz, &status); + u_strToTitle(buf2, sz*8, buf, -1, NULL, loc, &status); + + ans = input; + sz = u_strlen(buf2); + free(buf); + + if (U_SUCCESS(status) && sz > 0) { + buf3 = (char*)calloc(sz*5+1, sizeof(char)); + if (buf3 == NULL) return PyErr_NoMemory(); + u_strToUTF8(buf3, sz*5, NULL, buf2, -1, &status); + if (U_SUCCESS(status)) ans = buf3; + } + + ret = PyUnicode_DecodeUTF8(ans, strlen(ans), "replace"); + if (ret == NULL) return PyErr_NoMemory(); + + free(buf2); + if (buf3 != NULL) free(buf3); + PyMem_Free(input); + + return ret; +} + + + static PyMethodDef icu_methods[] = { + {"upper", icu_upper, METH_VARARGS, + "upper(locale, unicode object) -> upper cased unicode object using locale rules." + }, + + {"lower", icu_lower, METH_VARARGS, + "lower(locale, unicode object) -> lower cased unicode object using locale rules." + }, + + {"title", icu_title, METH_VARARGS, + "title(locale, unicode object) -> Title cased unicode object using locale rules." + }, + {NULL} /* Sentinel */ }; diff --git a/src/calibre/utils/icu.py b/src/calibre/utils/icu.py index 5251380973..398d2fe75c 100644 --- a/src/calibre/utils/icu.py +++ b/src/calibre/utils/icu.py @@ -10,10 +10,18 @@ from functools import partial from calibre.constants import plugins _icu = _collator = None +_locale = None _none = u'' _none2 = b'' +def get_locale(): + global _locale + if _locale is None: + from calibre.utils.localization import get_lang + _locale = get_lang() + return _locale + def load_icu(): global _icu if _icu is None: @@ -28,11 +36,10 @@ def load_icu(): def load_collator(): global _collator - from calibre.utils.localization import get_lang if _collator is None: icu = load_icu() if icu is not None: - _collator = icu.Collator(get_lang()) + _collator = icu.Collator(get_locale()) return _collator @@ -76,6 +83,13 @@ case_sensitive_sort_key = py_case_sensitive_sort_key if _icu_not_ok else \ icu_case_sensitive_sort_key case_sensitive_strcmp = cmp if _icu_not_ok else icu_case_sensitive_strcmp +upper = (lambda s: s.upper()) if _icu_not_ok else \ + partial(_icu.upper, get_locale()) +lower = (lambda s: s.lower()) if _icu_not_ok else \ + partial(_icu.lower, get_locale()) +title_case = (lambda s: s.title()) if _icu_not_ok else \ + partial(_icu.title, get_locale()) + def test(): # {{{ # Data {{{ @@ -188,5 +202,13 @@ pêché''' print 'French failed (note that French fails with icu < 4.6 i.e. on windows and OS X)' return test_strcmp(german + french) + + print '\nTesting case transforms in current locale' + for x in ('a', 'Alice\'s code'): + print 'Upper:', x, '->', 'py:', x.upper().encode('utf-8'), 'icu:', upper(x).encode('utf-8') + print 'Lower:', x, '->', 'py:', x.lower().encode('utf-8'), 'icu:', lower(x).encode('utf-8') + print 'Title:', x, '->', 'py:', x.title().encode('utf-8'), 'icu:', title_case(x).encode('utf-8') + print + # }}} From e021f02e3522958a64d28f67580fa57e07517901 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Sat, 4 Dec 2010 11:49:56 -0700 Subject: [PATCH 308/375] ... --- src/calibre/utils/icu.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/calibre/utils/icu.py b/src/calibre/utils/icu.py index 398d2fe75c..83ada4e23e 100644 --- a/src/calibre/utils/icu.py +++ b/src/calibre/utils/icu.py @@ -77,19 +77,26 @@ load_icu() load_collator() _icu_not_ok = _icu is None or _collator is None + +################# The string functions ######################################## sort_key = py_sort_key if _icu_not_ok else partial(icu_sort_key, _collator) + strcmp = py_strcmp if _icu_not_ok else partial(icu_strcmp, _collator) + case_sensitive_sort_key = py_case_sensitive_sort_key if _icu_not_ok else \ icu_case_sensitive_sort_key + case_sensitive_strcmp = cmp if _icu_not_ok else icu_case_sensitive_strcmp upper = (lambda s: s.upper()) if _icu_not_ok else \ partial(_icu.upper, get_locale()) + lower = (lambda s: s.lower()) if _icu_not_ok else \ partial(_icu.lower, get_locale()) + title_case = (lambda s: s.title()) if _icu_not_ok else \ partial(_icu.title, get_locale()) - +################################################################################ def test(): # {{{ # Data {{{ From 8716c5611fbee4432a71b261b1da809258f05930 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Sat, 4 Dec 2010 11:50:36 -0700 Subject: [PATCH 309/375] ... --- src/calibre/utils/icu.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/calibre/utils/icu.py b/src/calibre/utils/icu.py index 83ada4e23e..fed6e0b89b 100644 --- a/src/calibre/utils/icu.py +++ b/src/calibre/utils/icu.py @@ -5,6 +5,7 @@ __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>' __docformat__ = 'restructuredtext en' +# Setup code {{{ from functools import partial from calibre.constants import plugins @@ -77,8 +78,10 @@ load_icu() load_collator() _icu_not_ok = _icu is None or _collator is None +# }}} ################# The string functions ######################################## + sort_key = py_sort_key if _icu_not_ok else partial(icu_sort_key, _collator) strcmp = py_strcmp if _icu_not_ok else partial(icu_strcmp, _collator) @@ -96,6 +99,7 @@ lower = (lambda s: s.lower()) if _icu_not_ok else \ title_case = (lambda s: s.title()) if _icu_not_ok else \ partial(_icu.title, get_locale()) + ################################################################################ def test(): # {{{ From 2fe5c21da81535f1a20f99f910a25c81ac759543 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sat, 4 Dec 2010 20:45:17 +0000 Subject: [PATCH 310/375] Make sort locale tweak work with new icu.py --- src/calibre/utils/icu.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/calibre/utils/icu.py b/src/calibre/utils/icu.py index eaf236083a..796eac9dbc 100644 --- a/src/calibre/utils/icu.py +++ b/src/calibre/utils/icu.py @@ -9,6 +9,7 @@ __docformat__ = 'restructuredtext en' from functools import partial from calibre.constants import plugins +from calibre.utils.config import tweaks _icu = _collator = None _locale = None From fc39c1ad11979b721830a6845a5f625229fc7f8f Mon Sep 17 00:00:00 2001 From: John Schember <john@nachtimwald.com> Date: Sat, 4 Dec 2010 16:57:13 -0500 Subject: [PATCH 311/375] FB2 Output: Rewrite and restructure. --- src/calibre/ebooks/fb2/fb2ml.py | 226 ++++++++++++++++---------------- 1 file changed, 114 insertions(+), 112 deletions(-) diff --git a/src/calibre/ebooks/fb2/fb2ml.py b/src/calibre/ebooks/fb2/fb2ml.py index 252453d25e..f27729ae8c 100644 --- a/src/calibre/ebooks/fb2/fb2ml.py +++ b/src/calibre/ebooks/fb2/fb2ml.py @@ -26,32 +26,6 @@ from calibre.ebooks.oeb.base import XHTML, XHTML_NS, barename, namespace from calibre.ebooks.oeb.stylizer import Stylizer from calibre.ebooks.oeb.base import OEB_RASTER_IMAGES -TAG_MAP = { - 'b' : 'strong', - 'i' : 'emphasis', - 'p' : 'p', - 'li' : 'p', - 'div': 'p', -} - -TAG_SPACE = [] - -TAG_IMAGES = [ - 'img', -] - -TAG_LINKS = [ -] - -BLOCK = [ - 'p', -] - -STYLES = [ - ('font-weight', {'bold' : 'strong', 'bolder' : 'strong'}), - ('font-style', {'italic' : 'emphasis'}), -] - class FB2MLizer(object): ''' Todo: * Include more FB2 specific tags in the conversion. @@ -63,24 +37,32 @@ class FB2MLizer(object): def __init__(self, log): self.log = log self.image_hrefs = {} + self.reset_state() + + def reset_state(self): # Used to ensure text and tags are always within <p> and </p> self.in_p = False + # Mapping of image names. OEB allows for images to have the same name but be stored + # in different directories. FB2 images are all in a flat layout so we rename all images + # into a sequential numbering system to ensure there are no collisions between image names. + self.image_hrefs = {} def extract_content(self, oeb_book, opts): self.log.info('Converting XHTML to FB2 markup...') self.oeb_book = oeb_book self.opts = opts + return self.fb2mlize_spine() def fb2mlize_spine(self): - self.image_hrefs = {} - self.link_hrefs = {} + self.reset_state() + output = [self.fb2_header()] output.append(self.get_text()) - output.append(self.fb2_body_footer()) output.append(self.fb2mlize_images()) output.append(self.fb2_footer()) output = self.clean_text(u''.join(output)) + if self.opts.pretty_print: return u'<?xml version="1.0" encoding="UTF-8"?>\n%s' % etree.tostring(etree.fromstring(output), encoding=unicode, pretty_print=True) else: @@ -127,24 +109,21 @@ class FB2MLizer(object): '<document-info>' \ '<program-used>%s %s</program-used>' \ '</document-info>' \ - '</description><body>' % tuple(map(prepare_string_for_xml, (author_first, author_middle, author_last, + '</description>' % tuple(map(prepare_string_for_xml, (author_first, author_middle, author_last, self.oeb_book.metadata.title[0].value, __appname__, __version__))) + def fb2_footer(self): + return u'</FictionBook>' + def get_text(self): - text = [] + text = ['<body>'] for item in self.oeb_book.spine: self.log.debug('Converting %s to FictionBook2 XML' % item.href) stylizer = Stylizer(item.data, item.href, self.oeb_book, self.opts, self.opts.output_profile) text.append('<section>') text += self.dump_text(item.data.find(XHTML('body')), stylizer, item) text.append('</section>') - return ''.join(text) - - def fb2_body_footer(self): - return u'</body>' - - def fb2_footer(self): - return u'</FictionBook>' + return ''.join(text) + '</body>' def fb2mlize_images(self): images = [] @@ -178,24 +157,6 @@ class FB2MLizer(object): else: self.in_p = True return ['<p>'], ['p'] - - def insert_empty_line(self, tags): - if self.in_p: - text = [''] - closed_tags = [] - tags.reverse() - for t in tags: - text.append('</%s>' % t) - closed_tags.append(t) - if t == 'p': - break - text.append('<empty-line />') - closed_tags.reverse() - for t in closed_tags: - text.append('<%s>' % t) - return text - else: - return ['<empty-line />'] def close_open_p(self, tags): text = [''] @@ -219,84 +180,125 @@ class FB2MLizer(object): self.in_p = True return text, added_p + + def handle_simple_tag(self, tag, tags): + s_out = [] + s_tags = [] + if tag not in tags: + p_out, p_tags = self.ensure_p() + s_out += p_out + s_tags += p_tags + s_out.append('<%s>' % tag) + s_tags.append(tag) + return s_out, s_tags - def dump_text(self, elem, stylizer, page, tag_stack=[]): - if not isinstance(elem.tag, basestring) \ - or namespace(elem.tag) != XHTML_NS: + def dump_text(self, elem_tree, stylizer, page, tag_stack=[]): + ''' + This function is intended to be used in a recursive manner. dump_text will + run though all elements in the elem_tree and call itself on each element. + + self.image_hrefs will be populated by calling this function. + + @param elem_tree: etree representation of XHTML content to be transformed. + @param stylizer: Used to track the style of elements within the tree. + @param page: OEB page used to determine absolute urls. + @param tag_stack: List of open FB2 tags to take into account. + + @return: List of string representing the XHTML converted to FB2 markup. + ''' + # Ensure what we are converting is not a string and that the fist tag is part of the XHTML namespace. + if not isinstance(elem_tree.tag, basestring) or namespace(elem_tree.tag) != XHTML_NS: return [] - style = stylizer.style(elem) - if style['display'] in ('none', 'oeb-page-head', 'oeb-page-foot') \ - or style['visibility'] == 'hidden': + style = stylizer.style(elem_tree) + if style['display'] in ('none', 'oeb-page-head', 'oeb-page-foot') or style['visibility'] == 'hidden': return [] - fb2_text = [] + # FB2 generated output. + fb2_out = [] + # FB2 tags in the order they are opened. This will be used to close the tags. tags = [] + # First tag in tree + tag = barename(elem_tree.tag) - tag = barename(elem.tag) - - if tag in TAG_IMAGES: - if elem.attrib.get('src', None): - if page.abshref(elem.attrib['src']) not in self.image_hrefs.keys(): - self.image_hrefs[page.abshref(elem.attrib['src'])] = '_%s.jpg' % len(self.image_hrefs.keys()) - p_txt, p_tag = self.ensure_p() - fb2_text += p_txt - tags += p_tag - fb2_text.append('<image xlink:href="#%s" />' % self.image_hrefs[page.abshref(elem.attrib['src'])]) - + # Process the XHTML tag if it needs to be converted to an FB2 tag. if tag == 'h1' and self.opts.h1_to_title or tag == 'h2' and self.opts.h2_to_title or tag == 'h3' and self.opts.h3_to_title: - fb2_text.append('<title>') + fb2_out.append('<title>') tags.append('title') - if tag == 'br': - fb2_text += self.insert_empty_line(tag_stack+tags) - - fb2_tag = TAG_MAP.get(tag, None) - if fb2_tag == 'p': + if tag == 'img': + # TODO: Check that the image is in the manifest and only write the tag if it is. + if elem_tree.attrib.get('src', None): + if page.abshref(elem_tree.attrib['src']) not in self.image_hrefs.keys(): + self.image_hrefs[page.abshref(elem_tree.attrib['src'])] = '_%s.jpg' % len(self.image_hrefs.keys()) + p_txt, p_tag = self.ensure_p() + fb2_out += p_txt + tags += p_tag + fb2_out.append('<image xlink:href="#%s" />' % self.image_hrefs[page.abshref(elem_tree.attrib['src'])]) + elif tag == 'br': + if self.in_p: + closed_tags = [] + open_tags = tag_stack+tags + open_tags.reverse() + for t in open_tags: + fb2_out.append('</%s>' % t) + closed_tags.append(t) + if t == 'p': + break + fb2_out.append('<empty-line />') + closed_tags.reverse() + for t in closed_tags: + fb2_out.append('<%s>' % t) + else: + fb2_out.append('<empty-line />') + elif tag in ('div', 'li', 'p'): p_text, added_p = self.close_open_p(tag_stack+tags) - fb2_text += p_text + fb2_out += p_text if added_p: tags.append('p') - elif fb2_tag and fb2_tag not in tag_stack+tags: - p_text, p_tags = self.ensure_p() - fb2_text += p_text - tags += p_tags - fb2_text.append('<%s>' % fb2_tag) - tags.append(fb2_tag) + elif tag == 'b': + s_out, s_tags = self.handle_simple_tag('strong', tag_stack+tags) + fb2_out += s_out + tags += s_tags + elif tag == 'i': + s_out, s_tags = self.handle_simple_tag('emphasis', tag_stack+tags) + fb2_out += s_out + tags += s_tags - # Processes style information - for s in STYLES: - style_tag = s[1].get(style[s[0]], None) - if style_tag and style_tag not in tag_stack+tags: - p_text, p_tags = self.ensure_p() - fb2_text += p_text - tags += p_tags - fb2_text.append('<%s>' % style_tag) - tags.append(style_tag) - - if tag in TAG_SPACE: - fb2_text.append(' ') - - if hasattr(elem, 'text') and elem.text: + # Processes style information. + if style['font-style'] == 'italic': + s_out, s_tags = self.handle_simple_tag('emphasis', tag_stack+tags) + fb2_out += s_out + tags += s_tags + elif style['font-weight'] in ('bold', 'bolder'): + s_out, s_tags = self.handle_simple_tag('strong', tag_stack+tags) + fb2_out += s_out + tags += s_tags + + # Process element text. + if hasattr(elem_tree, 'text') and elem_tree.text: if not self.in_p: - fb2_text.append('<p>') - fb2_text.append(prepare_string_for_xml(elem.text)) + fb2_out.append('<p>') + fb2_out.append(prepare_string_for_xml(elem_tree.text)) if not self.in_p: - fb2_text.append('</p>') + fb2_out.append('</p>') - for item in elem: - fb2_text += self.dump_text(item, stylizer, page, tag_stack+tags) + # Process sub-elements. + for item in elem_tree: + fb2_out += self.dump_text(item, stylizer, page, tag_stack+tags) + # Close open FB2 tags. tags.reverse() - fb2_text += self.close_tags(tags) + fb2_out += self.close_tags(tags) - if hasattr(elem, 'tail') and elem.tail: + # Process element text that comes after the close of the XHTML tag but before the next XHTML tag. + if hasattr(elem_tree, 'tail') and elem_tree.tail: if not self.in_p: - fb2_text.append('<p>') - fb2_text.append(prepare_string_for_xml(elem.tail)) + fb2_out.append('<p>') + fb2_out.append(prepare_string_for_xml(elem_tree.tail)) if not self.in_p: - fb2_text.append('</p>') + fb2_out.append('</p>') - return fb2_text + return fb2_out def close_tags(self, tags): text = [] From bc669a1f987d80523df4a4ac61b0c35039104ad7 Mon Sep 17 00:00:00 2001 From: John Schember <john@nachtimwald.com> Date: Sat, 4 Dec 2010 19:47:16 -0500 Subject: [PATCH 312/375] FB2 Output: Produce correct metadata header. --- src/calibre/ebooks/fb2/fb2ml.py | 55 +++++++++++++++++++++------------ 1 file changed, 36 insertions(+), 19 deletions(-) diff --git a/src/calibre/ebooks/fb2/fb2ml.py b/src/calibre/ebooks/fb2/fb2ml.py index f27729ae8c..d83dc45a0f 100644 --- a/src/calibre/ebooks/fb2/fb2ml.py +++ b/src/calibre/ebooks/fb2/fb2ml.py @@ -10,6 +10,7 @@ Transform OEB content into FB2 markup import cStringIO from base64 import b64encode +from datetime import datetime import re try: @@ -79,38 +80,54 @@ class FB2MLizer(object): return text def fb2_header(self): - author_first = u'' - author_middle = u'' - author_last = u'' + metadata = {} + metadata['author_first'] = u'' + metadata['author_middle'] = u'' + metadata['author_last'] = u'' + metadata['title'] = self.oeb_book.metadata.title[0].value + metadata['appname'] = __appname__ + metadata['version'] = __version__ + metadata['date'] = '%i.%i.%i' % (datetime.now().day, datetime.now().month, datetime.now().year) + metadata['lang'] = u''.join(self.oeb_book.metadata.lang) if self.oeb_book.metadata.lang else 'en' + author_parts = self.oeb_book.metadata.creator[0].value.split(' ') - if len(author_parts) == 1: - author_last = author_parts[0] + metadata['author_last'] = author_parts[0] elif len(author_parts) == 2: - author_first = author_parts[0] - author_last = author_parts[1] + metadata['author_first'] = author_parts[0] + metadata['author_last'] = author_parts[1] else: - author_first = author_parts[0] - author_middle = ' '.join(author_parts[1:-2]) - author_last = author_parts[-1] + metadata['author_first'] = author_parts[0] + metadata['author_middle'] = ' '.join(author_parts[1:-2]) + metadata['author_last'] = author_parts[-1] + + for key, value in metadata.items(): + metadata[key] = prepare_string_for_xml(value) return u'<FictionBook xmlns="http://www.gribuser.ru/xml/fictionbook/2.0" xmlns:xlink="http://www.w3.org/1999/xlink">' \ '<description>' \ '<title-info>' \ - '<genre></genre>' \ + '<genre>antique</genre>' \ '<author>' \ - '<first-name>%s</first-name>' \ - '<middle-name>%s</middle-name>' \ - '<last-name>%s</last-name>' \ + '<first-name>%(author_first)s</first-name>' \ + '<middle-name>%(author_middle)s</middle-name>' \ + '<last-name>%(author_last)s</last-name>' \ '</author>' \ - '<book-title>%s</book-title>' \ - '<annotation><p/></annotation>' \ + '<book-title>%(title)s</book-title>' \ + '<lang>%(lang)s</lang>' \ '</title-info>' \ '<document-info>' \ - '<program-used>%s %s</program-used>' \ + '<author>' \ + '<first-name></first-name>' \ + '<middle-name></middle-name>' \ + '<last-name></last-name>' \ + '</author>' \ + '<program-used>%(appname)s %(version)s</program-used>' \ + '<date>%(date)s</date>' \ + '<id>1</id>' \ + '<version>1.0</version>' \ '</document-info>' \ - '</description>' % tuple(map(prepare_string_for_xml, (author_first, author_middle, author_last, - self.oeb_book.metadata.title[0].value, __appname__, __version__))) + '</description>' % metadata def fb2_footer(self): return u'</FictionBook>' From 1f7c291aeb3bae171e5bff44d0ea47ba3fdd5524 Mon Sep 17 00:00:00 2001 From: John Schember <john@nachtimwald.com> Date: Sat, 4 Dec 2010 20:37:16 -0500 Subject: [PATCH 313/375] FB2 Output: Use random uuid for book id. --- src/calibre/ebooks/fb2/fb2ml.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/calibre/ebooks/fb2/fb2ml.py b/src/calibre/ebooks/fb2/fb2ml.py index d83dc45a0f..d89570a44e 100644 --- a/src/calibre/ebooks/fb2/fb2ml.py +++ b/src/calibre/ebooks/fb2/fb2ml.py @@ -12,6 +12,7 @@ import cStringIO from base64 import b64encode from datetime import datetime import re +import uuid try: from PIL import Image @@ -88,7 +89,8 @@ class FB2MLizer(object): metadata['appname'] = __appname__ metadata['version'] = __version__ metadata['date'] = '%i.%i.%i' % (datetime.now().day, datetime.now().month, datetime.now().year) - metadata['lang'] = u''.join(self.oeb_book.metadata.lang) if self.oeb_book.metadata.lang else 'en' + metadata['lang'] = u''.join(self.oeb_book.metadata.lang) if self.oeb_book.metadata.lang else 'en' + metadata['id'] = '%s' % uuid.uuid4() author_parts = self.oeb_book.metadata.creator[0].value.split(' ') if len(author_parts) == 1: @@ -124,7 +126,7 @@ class FB2MLizer(object): '</author>' \ '<program-used>%(appname)s %(version)s</program-used>' \ '<date>%(date)s</date>' \ - '<id>1</id>' \ + '<id>%(id)s</id>' \ '<version>1.0</version>' \ '</document-info>' \ '</description>' % metadata From 63727bc608ddc2683ceb4ceca84a0e0776fb0ceb Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Sat, 4 Dec 2010 19:06:47 -0700 Subject: [PATCH 314/375] ... --- src/calibre/ebooks/oeb/base.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/calibre/ebooks/oeb/base.py b/src/calibre/ebooks/oeb/base.py index 2e480a9941..a077fb0225 100644 --- a/src/calibre/ebooks/oeb/base.py +++ b/src/calibre/ebooks/oeb/base.py @@ -775,6 +775,7 @@ class Manifest(object): return u'Item(id=%r, href=%r, media_type=%r)' \ % (self.id, self.href, self.media_type) + # Parsing {{{ def _parse_xml(self, data): data = xml_to_unicode(data, strip_encoding_pats=True, assume_utf8=True, resolve_entities=True)[0] @@ -1035,6 +1036,8 @@ class Manifest(object): data = item.data.cssText return ('utf-8', data) + # }}} + @dynamic_property def data(self): doc = """Provides MIME type sensitive access to the manifest From 0ea35abaf189ded4ba2e39a6201c545c21e8290e Mon Sep 17 00:00:00 2001 From: John Schember <john@nachtimwald.com> Date: Sat, 4 Dec 2010 22:04:37 -0500 Subject: [PATCH 315/375] FB2 Output: Check image is in document and manifest before referencing and writing. --- src/calibre/ebooks/fb2/fb2ml.py | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/calibre/ebooks/fb2/fb2ml.py b/src/calibre/ebooks/fb2/fb2ml.py index d89570a44e..3020c002a5 100644 --- a/src/calibre/ebooks/fb2/fb2ml.py +++ b/src/calibre/ebooks/fb2/fb2ml.py @@ -145,8 +145,14 @@ class FB2MLizer(object): return ''.join(text) + '</body>' def fb2mlize_images(self): + ''' + This function uses the self.image_hrefs dictionary mapping. It is populated by the dump_text function. + ''' images = [] for item in self.oeb_book.manifest: + # Don't write the image if it's not referenced in the document's text. + if item.href not in self.image_hrefs: + continue if item.media_type in OEB_RASTER_IMAGES: try: im = Image.open(cStringIO.StringIO(item.data)).convert('RGB') @@ -164,7 +170,7 @@ class FB2MLizer(object): col = 1 col += 1 data += char - images.append('<binary id="%s" content-type="%s">%s\n</binary>' % (self.image_hrefs.get(item.href, '_0000.JPEG'), item.media_type, data)) + images.append('<binary id="%s" content-type="%s">%s\n</binary>' % (self.image_hrefs[item.href], item.media_type, data)) except Exception as e: self.log.error('Error: Could not include file %s because ' \ '%s.' % (item.href, e)) @@ -245,14 +251,15 @@ class FB2MLizer(object): fb2_out.append('<title>') tags.append('title') if tag == 'img': - # TODO: Check that the image is in the manifest and only write the tag if it is. if elem_tree.attrib.get('src', None): - if page.abshref(elem_tree.attrib['src']) not in self.image_hrefs.keys(): - self.image_hrefs[page.abshref(elem_tree.attrib['src'])] = '_%s.jpg' % len(self.image_hrefs.keys()) - p_txt, p_tag = self.ensure_p() - fb2_out += p_txt - tags += p_tag - fb2_out.append('<image xlink:href="#%s" />' % self.image_hrefs[page.abshref(elem_tree.attrib['src'])]) + # Only write the image tag if it is in the manifest. + if page.abshref(elem_tree.attrib['src']) in self.oeb_book.manifest.hrefs.keys(): + if page.abshref(elem_tree.attrib['src']) not in self.image_hrefs.keys(): + self.image_hrefs[page.abshref(elem_tree.attrib['src'])] = '_%s.jpg' % len(self.image_hrefs.keys()) + p_txt, p_tag = self.ensure_p() + fb2_out += p_txt + tags += p_tag + fb2_out.append('<image xlink:href="#%s" />' % self.image_hrefs[page.abshref(elem_tree.attrib['src'])]) elif tag == 'br': if self.in_p: closed_tags = [] From 596c8b905bd7280093cc84eb57bef674326a63a0 Mon Sep 17 00:00:00 2001 From: John Schember <john@nachtimwald.com> Date: Sat, 4 Dec 2010 22:14:30 -0500 Subject: [PATCH 316/375] FB2 Output: SVG rasterization. --- src/calibre/ebooks/fb2/output.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/calibre/ebooks/fb2/output.py b/src/calibre/ebooks/fb2/output.py index 88508b83e0..33714c6e6e 100644 --- a/src/calibre/ebooks/fb2/output.py +++ b/src/calibre/ebooks/fb2/output.py @@ -29,6 +29,14 @@ class FB2Output(OutputFormatPlugin): def convert(self, oeb_book, output_path, input_plugin, opts, log): from calibre.ebooks.oeb.transforms.jacket import linearize_jacket + from calibre.ebooks.oeb.transforms.rasterize import SVGRasterizer, Unavailable + + try: + rasterizer = SVGRasterizer() + rasterizer(oeb_book, opts) + except Unavailable: + self.log.warn('SVG rasterizer unavailable, SVG will not be converted') + linearize_jacket(oeb_book) fb2mlizer = FB2MLizer(log) From cafe81f2e4528b596517108d501cd7a934864d15 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Sat, 4 Dec 2010 20:20:20 -0700 Subject: [PATCH 317/375] EPUB Output: Mangle filenames to ensure they are unique, to support broken EPUB Readers like Aldiko and Stanza. Currently disabled pending further testing. --- src/calibre/ebooks/epub/output.py | 3 + .../ebooks/oeb/transforms/filenames.py | 130 ++++++++++++++++++ 2 files changed, 133 insertions(+) create mode 100644 src/calibre/ebooks/oeb/transforms/filenames.py diff --git a/src/calibre/ebooks/epub/output.py b/src/calibre/ebooks/epub/output.py index 17f6eb9f46..c5d11edc2b 100644 --- a/src/calibre/ebooks/epub/output.py +++ b/src/calibre/ebooks/epub/output.py @@ -142,6 +142,9 @@ class EPUBOutput(OutputFormatPlugin): def convert(self, oeb, output_path, input_plugin, opts, log): self.log, self.opts, self.oeb = log, opts, oeb + #from calibre.ebooks.oeb.transforms.filenames import UniqueFilenames + #UniqueFilenames()(oeb, opts) + self.workaround_ade_quirks() self.workaround_webkit_quirks() self.upshift_markup() diff --git a/src/calibre/ebooks/oeb/transforms/filenames.py b/src/calibre/ebooks/oeb/transforms/filenames.py new file mode 100644 index 0000000000..2b22474d30 --- /dev/null +++ b/src/calibre/ebooks/oeb/transforms/filenames.py @@ -0,0 +1,130 @@ +#!/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 posixpath +from urlparse import urldefrag + +from lxml import etree +import cssutils + +from calibre.ebooks.oeb.base import rewrite_links, urlnormalize + +class RenameFiles(object): + + ''' + Rename files and adjust all links pointing to them. Note that the spine + and manifest are not touched by this transform. + ''' + + def __init__(self, rename_map): + self.rename_map = rename_map + + def __call__(self, oeb, opts): + self.log = oeb.logger + self.opts = opts + self.oeb = oeb + + for item in oeb.manifest.items: + self.current_item = item + if etree.iselement(item.data): + rewrite_links(self.current_item.data, self.url_replacer) + elif hasattr(item.data, 'cssText'): + cssutils.replaceUrls(item.data, self.url_replacer) + + if self.oeb.guide: + for ref in self.oeb.guide.values(): + href = urlnormalize(ref.href) + href, frag = urldefrag(href) + replacement = self.rename_map.get(href, None) + if replacement is not None: + nhref = replacement + if frag: + nhref += '#' + frag + ref.href = nhref + + if self.oeb.toc: + self.fix_toc_entry(self.oeb.toc) + + + def fix_toc_entry(self, toc): + if toc.href: + href = urlnormalize(toc.href) + href, frag = urldefrag(href) + replacement = self.rename_map.get(href, None) + + if replacement is not None: + nhref = replacement + if frag: + nhref = '#'.join((nhref, frag)) + toc.href = nhref + + for x in toc: + self.fix_toc_entry(x) + + def url_replacer(self, orig_url): + url = urlnormalize(orig_url) + path, frag = urldefrag(url) + href = self.current_item.abshref(path) + replacement = self.rename_map.get(href, None) + if replacement is None: + return orig_url + replacement = self.current_item.relhref(replacement) + if frag: + replacement += '#' + frag + return replacement + +class UniqueFilenames(object): + + 'Ensure that every item in the manifest has a unique filename' + + def __call__(self, oeb, opts): + self.log = oeb.logger + self.opts = opts + self.oeb = oeb + + self.seen_filenames = set([]) + self.rename_map = {} + + for item in list(oeb.manifest.items): + fname = posixpath.basename(item.href) + if fname in self.seen_filenames: + suffix = self.unique_suffix(fname) + data = item.data + base, ext = posixpath.splitext(item.href) + nhref = base + suffix + ext + nhref = oeb.manifest.generate(href=nhref)[1] + nitem = oeb.manifest.add(item.id, nhref, item.media_type, data=data, + fallback=item.fallback) + self.seen_filenames.add(posixpath.basename(nhref)) + self.rename_map[item.href] = nhref + if item.spine_position is not None: + oeb.spine.insert(item.spine_position, nitem, item.linear) + oeb.spine.remove(item) + oeb.manifest.remove(item) + else: + self.seen_filenames.add(fname) + + if self.rename_map: + self.log('Found non-unique filenames, renaming to support broken' + ' EPUB readers like FBReader, Aldiko and Stanza...') + from pprint import pformat + self.log.debug(pformat(self.rename_map)) + + renamer = RenameFiles(self.rename_map) + renamer(oeb, opts) + + + def unique_suffix(self, fname): + base, ext = posixpath.splitext(fname) + c = 0 + while True: + c += 1 + suffix = '_u%d'%c + candidate = base + suffix + ext + if candidate not in self.seen_filenames: + return suffix + From f7d9571c4c51f8640841f3dfd45af7a71d3fff12 Mon Sep 17 00:00:00 2001 From: John Schember <john@nachtimwald.com> Date: Sat, 4 Dec 2010 22:37:34 -0500 Subject: [PATCH 318/375] FB2 Output: Replace PIL with ImageMagick. Don't convert JPG images to JPG because it's unnecessary. --- src/calibre/ebooks/fb2/fb2ml.py | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/src/calibre/ebooks/fb2/fb2ml.py b/src/calibre/ebooks/fb2/fb2ml.py index 3020c002a5..b04cb50d46 100644 --- a/src/calibre/ebooks/fb2/fb2ml.py +++ b/src/calibre/ebooks/fb2/fb2ml.py @@ -8,18 +8,12 @@ __docformat__ = 'restructuredtext en' Transform OEB content into FB2 markup ''' -import cStringIO from base64 import b64encode from datetime import datetime +from mimetypes import types_map import re import uuid -try: - from PIL import Image - Image -except ImportError: - import Image - from lxml import etree from calibre import prepare_string_for_xml @@ -27,6 +21,7 @@ from calibre.constants import __appname__, __version__ from calibre.ebooks.oeb.base import XHTML, XHTML_NS, barename, namespace from calibre.ebooks.oeb.stylizer import Stylizer from calibre.ebooks.oeb.base import OEB_RASTER_IMAGES +from calibre.utils.magick import Image class FB2MLizer(object): ''' @@ -155,11 +150,11 @@ class FB2MLizer(object): continue if item.media_type in OEB_RASTER_IMAGES: try: - im = Image.open(cStringIO.StringIO(item.data)).convert('RGB') - data = cStringIO.StringIO() - im.save(data, 'JPEG') - data = data.getvalue() - + if not item.media_type == types_map['.jpeg'] or not item.media_type == types_map['.jpg']: + im = Image() + im.load(item.data) + im.set_compression_quality(70) + data = im.export('jpg') raw_data = b64encode(data) # Don't put the encoded image on a single line. data = '' From 4d3e99af6733a7ed7bba89297971b8847d5483d9 Mon Sep 17 00:00:00 2001 From: John Schember <john@nachtimwald.com> Date: Sat, 4 Dec 2010 22:59:37 -0500 Subject: [PATCH 319/375] FB2 Output: Fix writing incorrect mimetype. --- src/calibre/ebooks/fb2/fb2ml.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/ebooks/fb2/fb2ml.py b/src/calibre/ebooks/fb2/fb2ml.py index 479cd4d789..0748970c60 100644 --- a/src/calibre/ebooks/fb2/fb2ml.py +++ b/src/calibre/ebooks/fb2/fb2ml.py @@ -165,7 +165,7 @@ class FB2MLizer(object): col = 1 col += 1 data += char - images.append('<binary id="%s" content-type="%s">%s\n</binary>' % (self.image_hrefs[item.href], item.media_type, data)) + images.append('<binary id="%s">%s\n</binary>' % (self.image_hrefs[item.href], data)) except Exception as e: self.log.error('Error: Could not include file %s because ' \ '%s.' % (item.href, e)) From fcd87f216c6172443f3245b1ad117435aca516c9 Mon Sep 17 00:00:00 2001 From: John Schember <john@nachtimwald.com> Date: Sat, 4 Dec 2010 23:02:55 -0500 Subject: [PATCH 320/375] FB2 Output: Add image mimetype back and set to jpg because that is what is written. --- src/calibre/ebooks/fb2/fb2ml.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/ebooks/fb2/fb2ml.py b/src/calibre/ebooks/fb2/fb2ml.py index 0748970c60..46861357e6 100644 --- a/src/calibre/ebooks/fb2/fb2ml.py +++ b/src/calibre/ebooks/fb2/fb2ml.py @@ -165,7 +165,7 @@ class FB2MLizer(object): col = 1 col += 1 data += char - images.append('<binary id="%s">%s\n</binary>' % (self.image_hrefs[item.href], data)) + images.append('<binary id="%s" content-type="image/jpeg">%s\n</binary>' % (self.image_hrefs[item.href], data)) except Exception as e: self.log.error('Error: Could not include file %s because ' \ '%s.' % (item.href, e)) From 9daa9486a2a5d85af1425546a00bc841f64b0115 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sun, 5 Dec 2010 11:37:25 +0000 Subject: [PATCH 321/375] Change instances of title() to use the ICU function. Change a few lower() as well. --- src/calibre/devices/apple/driver.py | 8 +++--- src/calibre/ebooks/markdown/mdx_toc.py | 5 ++-- src/calibre/ebooks/mobi/langcodes.py | 2 +- src/calibre/ebooks/oeb/base.py | 2 +- .../ebooks/oeb/transforms/manglecase.py | 6 ++--- src/calibre/gui2/dialogs/metadata_bulk.py | 4 +-- src/calibre/library/caches.py | 4 +-- src/calibre/library/catalog.py | 6 ++--- src/calibre/startup.py | 4 +++ src/calibre/utils/titlecase.py | 26 ++++++++++++------- 10 files changed, 39 insertions(+), 28 deletions(-) diff --git a/src/calibre/devices/apple/driver.py b/src/calibre/devices/apple/driver.py index d42c51cedd..0f281ecc92 100644 --- a/src/calibre/devices/apple/driver.py +++ b/src/calibre/devices/apple/driver.py @@ -2637,7 +2637,7 @@ class ITUNES(DriverBase): lb_added.composer.set(metadata_x.uuid) lb_added.description.set("%s %s" % (self.description_prefix,strftime('%Y-%m-%d %H:%M:%S'))) lb_added.enabled.set(True) - lb_added.sort_artist.set(metadata_x.author_sort.title()) + lb_added.sort_artist.set(icu_title(metadata_x.author_sort)) lb_added.sort_name.set(metadata.title_sort) @@ -2648,7 +2648,7 @@ class ITUNES(DriverBase): db_added.composer.set(metadata_x.uuid) db_added.description.set("%s %s" % (self.description_prefix,strftime('%Y-%m-%d %H:%M:%S'))) db_added.enabled.set(True) - db_added.sort_artist.set(metadata_x.author_sort.title()) + db_added.sort_artist.set(icu_title(metadata_x.author_sort)) db_added.sort_name.set(metadata.title_sort) if metadata_x.comments: @@ -2729,7 +2729,7 @@ class ITUNES(DriverBase): lb_added.Composer = metadata_x.uuid lb_added.Description = ("%s %s" % (self.description_prefix,strftime('%Y-%m-%d %H:%M:%S'))) lb_added.Enabled = True - lb_added.SortArtist = metadata_x.author_sort.title() + lb_added.SortArtist = icu_title(metadata_x.author_sort) lb_added.SortName = metadata.title_sort if db_added: @@ -2739,7 +2739,7 @@ class ITUNES(DriverBase): db_added.Composer = metadata_x.uuid db_added.Description = ("%s %s" % (self.description_prefix,strftime('%Y-%m-%d %H:%M:%S'))) db_added.Enabled = True - db_added.SortArtist = metadata_x.author_sort.title() + db_added.SortArtist = icu_title(metadata_x.author_sort) db_added.SortName = metadata.title_sort if metadata_x.comments: diff --git a/src/calibre/ebooks/markdown/mdx_toc.py b/src/calibre/ebooks/markdown/mdx_toc.py index 15fd5061a0..322b820a4e 100644 --- a/src/calibre/ebooks/markdown/mdx_toc.py +++ b/src/calibre/ebooks/markdown/mdx_toc.py @@ -18,9 +18,10 @@ def extract_alphanumeric(in_str=None): """ # I'm sure this is really inefficient and # could be done with a lambda/map() - #x.strip().title().replace(' ', "") + #x.strip(). title().replace(' ', "") out_str=[] - for x in in_str.title(): + for x in in_str: + x = icu_title(x) if x.isalnum(): out_str.append(x) return ''.join(out_str) diff --git a/src/calibre/ebooks/mobi/langcodes.py b/src/calibre/ebooks/mobi/langcodes.py index 5d085906df..723b619590 100644 --- a/src/calibre/ebooks/mobi/langcodes.py +++ b/src/calibre/ebooks/mobi/langcodes.py @@ -322,7 +322,7 @@ def iana2mobi(icode): while len(subtags) > 0: subtag = subtags.pop(0) if subtag not in langdict: - subtag = subtag.title() + subtag = icu_title(subtag) if subtag not in langdict: subtag = subtag.upper() if subtag in langdict: diff --git a/src/calibre/ebooks/oeb/base.py b/src/calibre/ebooks/oeb/base.py index a077fb0225..0f364b8030 100644 --- a/src/calibre/ebooks/oeb/base.py +++ b/src/calibre/ebooks/oeb/base.py @@ -607,7 +607,7 @@ class Metadata(object): key = barename(key) attrib[key] = prefixname(value, nsrmap) if namespace(self.term) == DC11_NS: - name = DC(barename(self.term).title()) + name = DC(icu_title(barename(self.term))) elem = element(dcmeta, name, attrib=attrib) elem.text = self.value else: diff --git a/src/calibre/ebooks/oeb/transforms/manglecase.py b/src/calibre/ebooks/oeb/transforms/manglecase.py index 04bf63ac1d..240f7e7726 100644 --- a/src/calibre/ebooks/oeb/transforms/manglecase.py +++ b/src/calibre/ebooks/oeb/transforms/manglecase.py @@ -50,11 +50,11 @@ class CaseMangler(object): def text_transform(self, transform, text): if transform == 'capitalize': - return text.title() + return icu_title(text) elif transform == 'uppercase': - return text.upper() + return icu_upper(text) elif transform == 'lowercase': - return text.lower() + return icu_lower(text) return text def split_text(self, text): diff --git a/src/calibre/gui2/dialogs/metadata_bulk.py b/src/calibre/gui2/dialogs/metadata_bulk.py index 362091eb2d..4a44b0cefa 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.py +++ b/src/calibre/gui2/dialogs/metadata_bulk.py @@ -184,8 +184,8 @@ class MyBlockingBusy(QDialog): class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): s_r_functions = { '' : lambda x: x, - _('Lower Case') : lambda x: x.lower(), - _('Upper Case') : lambda x: x.upper(), + _('Lower Case') : lambda x: icu_lower(x), + _('Upper Case') : lambda x: icu_upper(x), _('Title Case') : lambda x: titlecase(x), } diff --git a/src/calibre/library/caches.py b/src/calibre/library/caches.py index 7c1dea792c..5b6b79e3df 100644 --- a/src/calibre/library/caches.py +++ b/src/calibre/library/caches.py @@ -223,7 +223,7 @@ EQUALS_MATCH = 1 REGEXP_MATCH = 2 def _match(query, value, matchkind): for t in value: - t = t.lower() + t = icu_lower(t) try: ### ignore regexp exceptions, required because search-ahead tries before typing is finished if ((matchkind == EQUALS_MATCH and query == t) or (matchkind == REGEXP_MATCH and re.search(query, t, re.I)) or ### search unanchored @@ -505,7 +505,7 @@ class ResultCache(SearchQueryParser): # {{{ query = query[1:] if matchkind != REGEXP_MATCH: # leave case in regexps because it can be significant e.g. \S \W \D - query = query.lower() + query = icu_lower(query) if not isinstance(query, unicode): query = query.decode('utf-8') diff --git a/src/calibre/library/catalog.py b/src/calibre/library/catalog.py index eed258a6b0..0b317d6a6e 100644 --- a/src/calibre/library/catalog.py +++ b/src/calibre/library/catalog.py @@ -1476,20 +1476,20 @@ class EPUB_MOBI(CatalogPlugin): self.opts.log.warn(" '%s' != '%s'" % (author[1], current_author[1])) # New author, save the previous author/sort/count - unique_authors.append((current_author[0], current_author[1].title(), + unique_authors.append((current_author[0], icu_title(current_author[1]), books_by_current_author)) current_author = author books_by_current_author = 1 elif i==0 and len(authors) == 1: # Allow for single-book lists - unique_authors.append((current_author[0], current_author[1].title(), + unique_authors.append((current_author[0], icu_title(current_author[1]), books_by_current_author)) else: books_by_current_author += 1 else: # Add final author to list or single-author dataset if (current_author == author and len(authors) > 1) or not multiple_authors: - unique_authors.append((current_author[0], current_author[1].title(), + unique_authors.append((current_author[0], icu_title(current_author[1]), books_by_current_author)) if False and self.verbose: diff --git a/src/calibre/startup.py b/src/calibre/startup.py index 9c9c7651b7..41b20f3946 100644 --- a/src/calibre/startup.py +++ b/src/calibre/startup.py @@ -199,6 +199,10 @@ if not _run_once: __builtin__.__dict__['lopen'] = local_open + from calibre.utils.icu import title_case, lower as icu_lower, upper as icu_upper + __builtin__.__dict__['icu_lower'] = icu_lower + __builtin__.__dict__['icu_upper'] = icu_upper + __builtin__.__dict__['icu_title'] = title_case import mimetypes mimetypes.init([P('mime.types')]) diff --git a/src/calibre/utils/titlecase.py b/src/calibre/utils/titlecase.py index 3ead4848fd..cb0d840515 100755 --- a/src/calibre/utils/titlecase.py +++ b/src/calibre/utils/titlecase.py @@ -40,6 +40,12 @@ def titlecase(text): """ + def capitalize(w): + print 'in capitalize' + w = icu_lower(w) + w = w.replace(w[0], icu_upper(w[0])) + return w + all_caps = ALL_CAPS.match(text) words = re.split('\s', text) @@ -50,29 +56,29 @@ def titlecase(text): line.append(word) continue else: - word = word.lower() + word = icu_lower(word) if APOS_SECOND.match(word): - word = word.replace(word[0], word[0].upper()) - word = word.replace(word[2], word[2].upper()) + word = word.replace(word[0], icu_upper(word[0])) + word = word.replace(word[2], icu_upper(word[2])) line.append(word) continue if INLINE_PERIOD.search(word) or UC_ELSEWHERE.match(word): line.append(word) continue if SMALL_WORDS.match(word): - line.append(word.lower()) + line.append(icu_lower(word)) continue match = MAC_MC.match(word) if match: - line.append("%s%s" % (match.group(1).capitalize(), - match.group(2).capitalize())) + line.append("%s%s" % (capitalize(match.group(1)), + capitalize(match.group(2)))) continue hyphenated = [] for item in word.split('-'): - hyphenated.append(CAPFIRST.sub(lambda m: m.group(0).upper(), item)) + hyphenated.append(CAPFIRST.sub(lambda m: icu_upper(m.group(0)), item)) line.append("-".join(hyphenated)) @@ -80,14 +86,14 @@ def titlecase(text): result = SMALL_FIRST.sub(lambda m: '%s%s' % ( m.group(1), - m.group(2).capitalize() + capitalize(m.group(2)) ), result) - result = SMALL_LAST.sub(lambda m: m.group(0).capitalize(), result) + result = SMALL_LAST.sub(lambda m: capitalize(m.group(0)), result) result = SUBPHRASE.sub(lambda m: '%s%s' % ( m.group(1), - m.group(2).capitalize() + capitalize(m.group(2)) ), result) return result From 37e7cb6ec20ec0ecd63061aa8ac735b4df6b8113 Mon Sep 17 00:00:00 2001 From: John Schember <john@nachtimwald.com> Date: Sun, 5 Dec 2010 08:24:30 -0500 Subject: [PATCH 322/375] FB2 Output: Use precomputed uuid when avaliable. --- src/calibre/ebooks/fb2/fb2ml.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/calibre/ebooks/fb2/fb2ml.py b/src/calibre/ebooks/fb2/fb2ml.py index 46861357e6..51bfaa7293 100644 --- a/src/calibre/ebooks/fb2/fb2ml.py +++ b/src/calibre/ebooks/fb2/fb2ml.py @@ -20,7 +20,7 @@ from calibre import prepare_string_for_xml from calibre.constants import __appname__, __version__ from calibre.ebooks.oeb.base import XHTML, XHTML_NS, barename, namespace from calibre.ebooks.oeb.stylizer import Stylizer -from calibre.ebooks.oeb.base import OEB_RASTER_IMAGES +from calibre.ebooks.oeb.base import OEB_RASTER_IMAGES, OPF from calibre.utils.magick import Image class FB2MLizer(object): @@ -85,8 +85,8 @@ class FB2MLizer(object): metadata['version'] = __version__ metadata['date'] = '%i.%i.%i' % (datetime.now().day, datetime.now().month, datetime.now().year) metadata['lang'] = u''.join(self.oeb_book.metadata.lang) if self.oeb_book.metadata.lang else 'en' - metadata['id'] = '%s' % uuid.uuid4() - + metadata['id'] = None + author_parts = self.oeb_book.metadata.creator[0].value.split(' ') if len(author_parts) == 1: metadata['author_last'] = author_parts[0] @@ -98,6 +98,15 @@ class FB2MLizer(object): metadata['author_middle'] = ' '.join(author_parts[1:-2]) metadata['author_last'] = author_parts[-1] + identifiers = self.oeb_book.metadata['identifier'] + for x in identifiers: + if x.get(OPF('scheme'), None).lower() == 'uuid' or unicode(x).startswith('urn:uuid:'): + metadata['id'] = unicode(x).split(':')[-1] + break + if metadata['id'] is None: + self.log.warn('No UUID identifier found') + metadata['id'] = str(uuid.uuid4()) + for key, value in metadata.items(): metadata[key] = prepare_string_for_xml(value) From 37d51495d227b2ce2689477ff45109bbbd12c987 Mon Sep 17 00:00:00 2001 From: Sengian <sengian1@gmail.com> Date: Sun, 5 Dec 2010 15:28:41 +0100 Subject: [PATCH 323/375] Update of nicebooks --- src/calibre/ebooks/metadata/nicebooks.py | 113 ++++++++++------------- 1 file changed, 50 insertions(+), 63 deletions(-) diff --git a/src/calibre/ebooks/metadata/nicebooks.py b/src/calibre/ebooks/metadata/nicebooks.py index 4d19e9611b..01e20261b3 100644 --- a/src/calibre/ebooks/metadata/nicebooks.py +++ b/src/calibre/ebooks/metadata/nicebooks.py @@ -10,7 +10,8 @@ from copy import deepcopy from lxml.html import soupparser -from calibre.utils.date import parse_date, utcnow +from calibre.utils.date import parse_date, utcnow, replace_months +from calibre.utils.cleantext import clean_ascii_char from calibre import browser, preferred_encoding from calibre.ebooks.chardet import xml_to_unicode from calibre.ebooks.metadata import MetaInformation, check_isbn, \ @@ -71,31 +72,16 @@ class NiceBooksCovers(CoverDownload): traceback.format_exc(), self.name)) +class NiceBooksError(Exception): + pass + +class ISBNNotFound(NiceBooksError): + pass + def report(verbose): if verbose: - import traceback traceback.print_exc() -def replace_monthsfr(datefr): - # Replace french months by english equivalent for parse_date - frtoen = { - u'[jJ]anvier': u'jan', - u'[fF].vrier': u'feb', - u'[mM]ars': u'mar', - u'[aA]vril': u'apr', - u'[mM]ai': u'may', - u'[jJ]uin': u'jun', - u'[jJ]uillet': u'jul', - u'[aA]o.t': u'aug', - u'[sS]eptembre': u'sep', - u'[Oo]ctobre': u'oct', - u'[nN]ovembre': u'nov', - u'[dD].cembre': u'dec' } - for k in frtoen.iterkeys(): - tmp = re.sub(k, frtoen[k], datefr) - if tmp <> datefr: break - return tmp - class Query(object): BASE_URL = 'http://fr.nicebooks.com/' @@ -119,7 +105,7 @@ class Query(object): def __call__(self, browser, verbose, timeout = 5.): if verbose: - print 'Query:', self.BASE_URL+self.urldata + print _('Query: %s') % self.BASE_URL+self.urldata try: raw = browser.open_novisit(self.BASE_URL+self.urldata, timeout=timeout).read() @@ -128,7 +114,9 @@ class Query(object): if callable(getattr(e, 'getcode', None)) and \ e.getcode() == 404: return - raise + if isinstance(getattr(e, 'args', [None])[0], socket.timeout): + raise NiceBooksError(_('Nicebooks timed out. Try again later.')) + raise NiceBooksError(_('Nicebooks encountered an error.')) if '<title>404 - ' in raw: return raw = xml_to_unicode(raw, strip_encoding_pats=True, @@ -136,7 +124,11 @@ class Query(object): try: feed = soupparser.fromstring(raw) except: - return + try: + #remove ASCII invalid chars + feed = soupparser.fromstring(clean_ascii_char(raw)) + except: + return None #nb of page to call try: @@ -161,7 +153,11 @@ class Query(object): try: feed = soupparser.fromstring(raw) except: - continue + try: + #remove ASCII invalid chars + feed = soupparser.fromstring(clean_ascii_char(raw)) + except: + continue pages.append(feed) results = [] @@ -180,14 +176,12 @@ class ResultList(list): self.reautclean = re.compile(u'\s*\(.*\)\s*') def get_title(self, entry): - # title = deepcopy(entry.find("div[@id='book-info']")) title = deepcopy(entry) title.remove(title.find("dl[@title='Informations sur le livre']")) title = ' '.join([i.text_content() for i in title.iterchildren()]) return unicode(title.replace('\n', '')) def get_authors(self, entry): - # author = entry.find("div[@id='book-info']/dl[@title='Informations sur le livre']") author = entry.find("dl[@title='Informations sur le livre']") authortext = [] for x in author.getiterator('dt'): @@ -223,7 +217,7 @@ class ResultList(list): d = x.getnext().text_content() try: default = utcnow().replace(day=15) - d = replace_monthsfr(d) + d = replace_months(d, 'fr') d = parse_date(d, assume_utc=True, default=default) mi.pubdate = d except: @@ -234,11 +228,6 @@ class ResultList(list): mi = MetaInformation(title, authors) mi.author_sort = authors_to_sort_string(authors) mi.comments = self.get_description(entry, verbose) - # entry = entry.find("dl[@title='Informations sur le livre']") - # mi.publisher = self.get_publisher(entry) - # mi.pubdate = self.get_date(entry, verbose) - # mi.isbn = self.get_ISBN(entry) - # mi.language = self.get_language(entry) return self.get_book_info(entry, mi, verbose) def get_individual_metadata(self, browser, linkdata, verbose): @@ -249,7 +238,9 @@ class ResultList(list): if callable(getattr(e, 'getcode', None)) and \ e.getcode() == 404: return - raise + if isinstance(getattr(e, 'args', [None])[0], socket.timeout): + raise NiceBooksError(_('Nicebooks timed out. Try again later.')) + raise NiceBooksError(_('Nicebooks encountered an error.')) if '<title>404 - ' in raw: report(verbose) return @@ -258,7 +249,11 @@ class ResultList(list): try: feed = soupparser.fromstring(raw) except: - return + try: + #remove ASCII invalid chars + feed = soupparser.fromstring(clean_ascii_char(raw)) + except: + return None # get results return feed.xpath("//div[@id='container']")[0] @@ -292,13 +287,6 @@ class ResultList(list): continue self.append(self.fill_MI(entry, title, authors, verbose)) - -class NiceBooksError(Exception): - pass - -class ISBNNotFound(NiceBooksError): - pass - class Covers(object): def __init__(self, isbn = None): @@ -329,11 +317,10 @@ class Covers(object): return cover, ext if ext else 'jpg' except Exception, err: if isinstance(getattr(err, 'args', [None])[0], socket.timeout): - err = NiceBooksError(_('Nicebooks timed out. Try again later.')) - raise err + raise NiceBooksError(_('Nicebooks timed out. Try again later.')) if not len(self.urlimg): if not self.isbnf: - raise ISBNNotFound('ISBN: '+self.isbn+_(' not found.')) + raise ISBNNotFound(_('ISBN: %s not found.') % self.isbn) raise NiceBooksError(_('An errror occured with Nicebooks cover fetcher')) @@ -341,10 +328,10 @@ def search(title=None, author=None, publisher=None, isbn=None, max_results=5, verbose=False, keywords=None): br = browser() entries = Query(title=title, author=author, isbn=isbn, publisher=publisher, - keywords=keywords, max_results=max_results)(br, verbose) + keywords=keywords, max_results=max_results)(br, verbose,timeout = 10.) if entries is None or len(entries) == 0: - return + return None #List of entry ans = ResultList() @@ -364,28 +351,28 @@ def cover_from_isbn(isbn, timeout = 5.): def option_parser(): parser = OptionParser(textwrap.dedent(\ - '''\ + _('''\ %prog [options] Fetch book metadata from Nicebooks. You must specify one of title, author, ISBN, publisher or keywords. Will fetch a maximum of 20 matches, so you should make your query as specific as possible. It can also get covers if the option is activated. - ''' + ''') )) - parser.add_option('-t', '--title', help='Book title') - parser.add_option('-a', '--author', help='Book author(s)') - parser.add_option('-p', '--publisher', help='Book publisher') - parser.add_option('-i', '--isbn', help='Book ISBN') - parser.add_option('-k', '--keywords', help='Keywords') + parser.add_option('-t', '--title', help=_('Book title')) + parser.add_option('-a', '--author', help=_('Book author(s)')) + parser.add_option('-p', '--publisher', help=_('Book publisher')) + parser.add_option('-i', '--isbn', help=_('Book ISBN')) + parser.add_option('-k', '--keywords', help=_('Keywords')) parser.add_option('-c', '--covers', default=0, - help='Covers: 1-Check/ 2-Download') + help=_('Covers: 1-Check/ 2-Download')) parser.add_option('-p', '--coverspath', default='', - help='Covers files path') + help=_('Covers files path')) parser.add_option('-m', '--max-results', default=20, - help='Maximum number of results to fetch') + help=_('Maximum number of results to fetch')) parser.add_option('-v', '--verbose', default=0, action='count', - help='Be more verbose about errors') + help=_('Be more verbose about errors')) return parser def main(args=sys.argv): @@ -400,15 +387,15 @@ def main(args=sys.argv): parser.print_help() return 1 if results is None or len(results) == 0: - print 'No result found for this search!' + print _('No result found for this search!') return 0 for result in results: print unicode(result).encode(preferred_encoding, 'replace') covact = int(opts.covers) if covact == 1: - textcover = 'No cover found!' + textcover = _('No cover found!') if check_for_cover(result.isbn): - textcover = 'A cover was found for this book' + textcover = _('A cover was found for this book') print textcover elif covact == 2: cover_data, ext = cover_from_isbn(result.isbn) @@ -417,7 +404,7 @@ def main(args=sys.argv): cpath = os.path.normpath(opts.coverspath + '/' + result.isbn) oname = os.path.abspath(cpath+'.'+ext) open(oname, 'wb').write(cover_data) - print 'Cover saved to file ', oname + print _('Cover saved to file '), oname print if __name__ == '__main__': From b87a738ef25896e13e08c72fafb3e499a4a98759 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sun, 5 Dec 2010 15:42:17 +0000 Subject: [PATCH 324/375] Add some comments to tag_categories.py to explain the structure of the stored user categories --- src/calibre/gui2/dialogs/tag_categories.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/calibre/gui2/dialogs/tag_categories.py b/src/calibre/gui2/dialogs/tag_categories.py index 210a2704bf..60092e4bd2 100644 --- a/src/calibre/gui2/dialogs/tag_categories.py +++ b/src/calibre/gui2/dialogs/tag_categories.py @@ -22,6 +22,15 @@ class Item: return 'name=%s, label=%s, index=%s, exists='%(self.name, self.label, self.index, self.exists) class TagCategories(QDialog, Ui_TagCategories): + ''' + The structure of user_categories stored in preferences is + {cat_name: [ [name, category, v], [], []}, cat_name [ [name, cat, v] ...} + where name is the item name, category is where it came from (series, etc), + and v is a scratch area that this editor uses to keep track of categories. + + If you add a category, it is permissible to set v to zero. If you delete + a category, ensure that both the name and the category match. + ''' category_labels_orig = ['', 'authors', 'series', 'publisher', 'tags'] def __init__(self, window, db, on_category=None): From 741073f1823208b63adf56e88f8b6558a1e49b3f Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sun, 5 Dec 2010 17:12:21 +0000 Subject: [PATCH 325/375] Forgot to change two instances of strcmp to icu_strcmp --- src/calibre/devices/usbms/books.py | 4 ++-- src/calibre/gui2/library/models.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/calibre/devices/usbms/books.py b/src/calibre/devices/usbms/books.py index e5a67463e7..23ce1716af 100644 --- a/src/calibre/devices/usbms/books.py +++ b/src/calibre/devices/usbms/books.py @@ -13,7 +13,7 @@ from calibre.devices.interface import BookList as _BookList from calibre.constants import preferred_encoding from calibre import isbytestring from calibre.utils.config import prefs, tweaks -from calibre.utils.icu import sort_key +from calibre.utils.icu import sort_key, strcmp as icu_strcmp class Book(Metadata): def __init__(self, prefix, lpath, size=None, other=None): @@ -241,7 +241,7 @@ class CollectionsBookList(BookList): if y is None: return -1 if isinstance(x, (unicode, str)): - c = cmp(sort_key(x), sort_key(y)) + c = strcmp(x, y) else: c = cmp(x, y) if c != 0: diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index e854ffc1bc..311cbaf369 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -18,7 +18,7 @@ from calibre.ebooks.metadata import fmt_sidx, authors_to_string, string_to_autho from calibre.ptempfile import PersistentTemporaryFile from calibre.utils.config import tweaks, prefs from calibre.utils.date import dt_factory, qt_to_dt, isoformat -from calibre.utils.icu import sort_key +from calibre.utils.icu import sort_key, strcmp as icu_strcmp from calibre.ebooks.metadata.meta import set_metadata as _set_metadata from calibre.utils.search_query_parser import SearchQueryParser from calibre.library.caches import _match, CONTAINS_MATCH, EQUALS_MATCH, \ @@ -1023,8 +1023,8 @@ class DeviceBooksModel(BooksModel): # {{{ x = '' if y == None: y = '' - x, y = x.strip().lower(), y.strip().lower() - return cmp(x, y) + x, y = icu_lower(x.strip()), icu_lower(y.strip()) + return icu_strcmp(x, y) return _strcmp def datecmp(x, y): x = self.db[x].datetime From e610f16ca073fc0a4960143484c56031e8ac9069 Mon Sep 17 00:00:00 2001 From: Sengian <sengian1@gmail.com> Date: Sun, 5 Dec 2010 20:09:17 +0100 Subject: [PATCH 326/375] Update fictionwise.py (broken) --- src/calibre/ebooks/metadata/fictionwise.py | 146 +++++++++++++-------- 1 file changed, 93 insertions(+), 53 deletions(-) diff --git a/src/calibre/ebooks/metadata/fictionwise.py b/src/calibre/ebooks/metadata/fictionwise.py index 828ea31c3a..e56c697e3c 100644 --- a/src/calibre/ebooks/metadata/fictionwise.py +++ b/src/calibre/ebooks/metadata/fictionwise.py @@ -3,12 +3,11 @@ __license__ = 'GPL 3' __copyright__ = '2010, sengian <sengian1@gmail.com>' __docformat__ = 'restructuredtext en' -import sys, textwrap, re +import sys, textwrap, re, traceback, socket from urllib import urlencode -from lxml import html, etree -from lxml.html import soupparser -from lxml.etree import tostring +from lxml import html +from lxml.html import soupparser, tostring from calibre import browser, preferred_encoding from calibre.ebooks.chardet import xml_to_unicode @@ -18,6 +17,7 @@ from calibre.library.comments import sanitize_comments_html from calibre.ebooks.metadata.fetch import MetadataSource from calibre.utils.config import OptionParser from calibre.utils.date import parse_date, utcnow +from calibre.utils.cleantext import clean_ascii_char class Fictionwise(MetadataSource): # {{{ @@ -37,10 +37,11 @@ class Fictionwise(MetadataSource): # {{{ # }}} +class FictionwiseError(Exception): + pass def report(verbose): if verbose: - import traceback traceback.print_exc() class Query(object): @@ -86,18 +87,20 @@ class Query(object): q = q.encode('utf-8') self.urldata = urlencode(q) - def __call__(self, browser, verbose): + def __call__(self, browser, verbose, timeout = 5.): if verbose: - print 'Query:', self.BASE_URL+self.urldata + print _('Query: %s') % self.BASE_URL+self.urldata try: - raw = browser.open_novisit(self.BASE_URL, self.urldata).read() + raw = browser.open_novisit(self.BASE_URL, self.urldata, timeout=timeout).read() except Exception, e: report(verbose) if callable(getattr(e, 'getcode', None)) and \ e.getcode() == 404: return - raise + if isinstance(getattr(e, 'args', [None])[0], socket.timeout): + raise FictionwiseError(_('Fictionwise timed out. Try again later.')) + raise FictionwiseError(_('Fictionwise encountered an error.')) if '<title>404 - ' in raw: return raw = xml_to_unicode(raw, strip_encoding_pats=True, @@ -105,7 +108,11 @@ class Query(object): try: feed = soupparser.fromstring(raw) except: - return + try: + #remove ASCII invalid chars + feed = soupparser.fromstring(clean_ascii_char(raw)) + except: + return None # get list of results as links results = feed.xpath("//table[3]/tr/td[2]/table/tr/td/p/table[2]/tr[@valign]") @@ -139,12 +146,41 @@ class ResultList(list): self.reisbn = re.compile(r'.*ISBN\s*:\s*', re.I) def strip_tags_etree(self, etreeobj, invalid_tags): - for itag in invalid_tags: - for elt in etreeobj.getiterator(itag): - elt.drop_tag() - return etreeobj + for (itag, rmv) in invalid_tags.iteritems(): + if rmv: + for elts in etreeobj.getiterator(itag): + elts.drop_tree() + else: + for elts in etreeobj.getiterator(itag): + elts.drop_tag() - def clean_entry(self, entry, + def clean_entry(self, entry, invalid_tags = {'script': True}, + invalid_id = (), invalid_class=(), invalid_xpath = ()): + #invalid_tags: remove tag and keep content if False else remove + #remove tags + if invalid_tags: + self.strip_tags_etree(entry, invalid_tags) + #remove xpath + if invalid_xpath: + for eltid in invalid_xpath: + elt = entry.xpath(eltid) + for el in elt: + el.drop_tree() + #remove id + if invalid_id: + for eltid in invalid_id: + elt = entry.get_element_by_id(eltid) + if elt is not None: + elt.drop_tree() + #remove class + if invalid_class: + for eltclass in invalid_class: + elts = entry.find_class(eltclass) + if elts is not None: + for elt in elts: + elt.drop_tree() + + def clean_entry_dffdfbdjbf(self, entry, invalid_tags = ('font', 'strong', 'b', 'ul', 'span', 'a'), remove_tags_trees = ('script',)): for it in entry[0].iterchildren(tag='table'): @@ -170,7 +206,6 @@ class ResultList(list): authortext = entry.find('./br').tail if not self.rechkauth.search(authortext): return [] - #TODO: parse all tag if necessary authortext = self.rechkauth.sub('', authortext) return [a.strip() for a in authortext.split('&')] @@ -185,7 +220,7 @@ class ResultList(list): float(image.get('height', default=0))) \ for image in entrytable.getiterator('img')) #ratings as x/5 - return 1.25*sum(k*v for (k, v) in hval.iteritems())/sum(hval.itervalues()) + return float(1.25*sum(k*v for (k, v) in hval.iteritems())/sum(hval.itervalues())) def get_description(self, entry): description = self.output_entry(entry.find('./p'),htmlrm="") @@ -221,7 +256,6 @@ class ResultList(list): self.resplitbr.split(date)) if not len(date): return None - #TODO: parse all tag if necessary try: d = self.redate.sub('', date[0]) if d: @@ -279,9 +313,14 @@ class ResultList(list): return feed.xpath("//table[3]/tr/td[2]/table[1]/tr/td/font/table/tr/td") def populate(self, entries, browser, verbose=False): - for x in entries: + inv_tags ={'script': True, 'a': False, 'font': False, 'strong': False, 'b': False, + 'ul': False, 'span': False, 'table': True} + inv_xpath =('descendant-or-self::p[1]',) + #single entry + if len(entries) == 1 and not isinstance(entries[0], str): try: - entry = self.get_individual_metadata(browser, x, verbose) + entry = entries.xpath("//table[3]/tr/td[2]/table[1]/tr/td/font/table/tr/td") + self.clean_entry(entry, invalid_tags=inv_tags, invalid_xpath=inv_xpath) entry = self.clean_entry(entry) title = self.get_title(entry) #ratings: get table for rating then drop @@ -292,28 +331,29 @@ class ResultList(list): authors = self.get_authors(entry) except Exception, e: if verbose: - print 'Failed to get all details for an entry' + print _('Failed to get all details for an entry') print e - continue + return self.append(self.fill_MI(entry, title, authors, ratings, verbose)) - - def populate_single(self, feed, verbose=False): - try: - entry = feed.xpath("//table[3]/tr/td[2]/table[1]/tr/td/font/table/tr/td") - entry = self.clean_entry(entry) - title = self.get_title(entry) - #ratings: get table for rating then drop - for elt in entry.getiterator('table'): - ratings = self.get_rating(elt, verbose) - elt.getprevious().drop_tree() - elt.drop_tree() - authors = self.get_authors(entry) - except Exception, e: - if verbose: - print 'Failed to get all details for an entry' - print e - return - self.append(self.fill_MI(entry, title, authors, ratings, verbose)) + else: + #multiple entries + for x in entries: + try: + entry = self.get_individual_metadata(browser, x, verbose) + self.clean_entry(entry, invalid_tags=inv_tags, invalid_xpath=inv_xpath) + title = self.get_title(entry) + #ratings: get table for rating then drop + for elt in entry.getiterator('table'): + ratings = self.get_rating(elt, verbose) + elt.getprevious().drop_tree() + elt.drop_tree() + authors = self.get_authors(entry) + except Exception, e: + if verbose: + print _('Failed to get all details for an entry') + print e + continue + self.append(self.fill_MI(entry, title, authors, ratings, verbose)) def search(title=None, author=None, publisher=None, isbn=None, @@ -321,35 +361,32 @@ def search(title=None, author=None, publisher=None, isbn=None, keywords=None): br = browser() entries = Query(title=title, author=author, publisher=publisher, - keywords=keywords, max_results=max_results)(br, verbose) + keywords=keywords, max_results=max_results)(br, verbose, timeout = 10.) #List of entry ans = ResultList() - if len(entries) > 1: - ans.populate(entries, br, verbose) - else: - ans.populate_single(entries[0], verbose) + ans.populate(entries, br, verbose) return ans def option_parser(): parser = OptionParser(textwrap.dedent(\ - '''\ + _('''\ %prog [options] Fetch book metadata from Fictionwise. You must specify one of title, author, or keywords. No ISBN specification possible. Will fetch a maximum of 20 matches, so you should make your query as specific as possible. - ''' + ''') )) - parser.add_option('-t', '--title', help='Book title') - parser.add_option('-a', '--author', help='Book author(s)') - parser.add_option('-p', '--publisher', help='Book publisher') - parser.add_option('-k', '--keywords', help='Keywords') + parser.add_option('-t', '--title', help=_('Book title')) + parser.add_option('-a', '--author', help=_('Book author(s)')) + parser.add_option('-p', '--publisher', help=_('Book publisher')) + parser.add_option('-k', '--keywords', help=_('Keywords')) parser.add_option('-m', '--max-results', default=20, - help='Maximum number of results to fetch') + help=_('Maximum number of results to fetch')) parser.add_option('-v', '--verbose', default=0, action='count', - help='Be more verbose about errors') + help=_('Be more verbose about errors')) return parser def main(args=sys.argv): @@ -362,6 +399,9 @@ def main(args=sys.argv): report(True) parser.print_help() return 1 + if results is None or len(results) == 0: + print _('No result found for this search!') + return 0 for result in results: print unicode(result).encode(preferred_encoding, 'replace') print From 29f33524ffb3b9af36bc41fd9b14cd9b4e1f4aa0 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Sun, 5 Dec 2010 17:42:49 -0700 Subject: [PATCH 327/375] Fix #7810 (Updated recipe for The New Yorker) --- resources/recipes/new_yorker.recipe | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/resources/recipes/new_yorker.recipe b/resources/recipes/new_yorker.recipe index 1a2091cd52..0c95aa358d 100644 --- a/resources/recipes/new_yorker.recipe +++ b/resources/recipes/new_yorker.recipe @@ -22,8 +22,19 @@ class NewYorker(BasicNewsRecipe): masthead_url = 'http://www.newyorker.com/css/i/hed/logo.gif' extra_css = """ body {font-family: "Times New Roman",Times,serif} - .articleauthor{color: #9F9F9F; font-family: Arial, sans-serif; font-size: small; text-transform: uppercase} - .rubric{color: #CD0021; font-family: Arial, sans-serif; font-size: small; text-transform: uppercase} + .articleauthor{color: #9F9F9F; + font-family: Arial, sans-serif; + font-size: small; + text-transform: uppercase} + .rubric,.dd,h6#credit{color: #CD0021; + font-family: Arial, sans-serif; + font-size: small; + text-transform: uppercase} + .descender:first-letter{display: inline; font-size: xx-large; font-weight: bold} + .dd,h6#credit{color: gray} + .c{display: block} + .caption,h2#articleintro{font-style: italic} + .caption{font-size: small} """ conversion_options = { @@ -39,7 +50,7 @@ class NewYorker(BasicNewsRecipe): ] remove_tags = [ dict(name=['meta','iframe','base','link','embed','object']) - ,dict(attrs={'class':['utils','articleRailLinks','icons'] }) + ,dict(attrs={'class':['utils','socialUtils','articleRailLinks','icons'] }) ,dict(attrs={'id':['show-header','show-footer'] }) ] remove_attributes = ['lang'] @@ -59,3 +70,13 @@ class NewYorker(BasicNewsRecipe): cover_url = 'http://www.newyorker.com' + cover_item['src'].strip() return cover_url + def preprocess_html(self, soup): + for item in soup.findAll(style=True): + del item['style'] + auth = soup.find(attrs={'id':'articleauthor'}) + if auth: + alink = auth.find('a') + if alink and alink.string is not None: + txt = alink.string + alink.replaceWith(txt) + return soup From 57e0e1820a65af5a273bfe5080c8bd6ef17e871d Mon Sep 17 00:00:00 2001 From: Sengian <sengian1@gmail.com> Date: Mon, 6 Dec 2010 01:57:07 +0100 Subject: [PATCH 328/375] Update of fictionwise.py --- src/calibre/ebooks/metadata/fictionwise.py | 73 ++++++++-------------- 1 file changed, 27 insertions(+), 46 deletions(-) diff --git a/src/calibre/ebooks/metadata/fictionwise.py b/src/calibre/ebooks/metadata/fictionwise.py index e56c697e3c..c4a8597dde 100644 --- a/src/calibre/ebooks/metadata/fictionwise.py +++ b/src/calibre/ebooks/metadata/fictionwise.py @@ -53,7 +53,6 @@ class Query(object): assert (max_results < 21) self.max_results = int(max_results) - q = { 'template' : 'searchresults_adv.htm' , 'searchtitle' : '', 'searchauthor' : '', @@ -131,12 +130,11 @@ class ResultList(list): def __init__(self): self.retitle = re.compile(r'\[[^\[\]]+\]') self.rechkauth = re.compile(r'.*book\s*by', re.I) - self.redesc = re.compile(r'book\s*description\s*:\s*(<br[^>]+>)*(?P<desc>.*)' \ - + '<br[^>]+>.{,15}publisher\s*:', re.I) + self.redesc = re.compile(r'book\s*description\s*:\s*(<br[^>]+>)*(?P<desc>.*)<br[^>]*>.{,15}publisher\s*:', re.I) self.repub = re.compile(r'.*publisher\s*:\s*', re.I) self.redate = re.compile(r'.*release\s*date\s*:\s*', re.I) self.retag = re.compile(r'.*book\s*category\s*:\s*', re.I) - self.resplitbr = re.compile(r'<br[^>]+>', re.I) + self.resplitbr = re.compile(r'<br[^>]*>', re.I) self.recomment = re.compile(r'(?s)<!--.*?-->') self.reimg = re.compile(r'<img[^>]*>', re.I) self.resanitize = re.compile(r'\[HTML_REMOVED\]\s*', re.I) @@ -180,21 +178,9 @@ class ResultList(list): for elt in elts: elt.drop_tree() - def clean_entry_dffdfbdjbf(self, entry, - invalid_tags = ('font', 'strong', 'b', 'ul', 'span', 'a'), - remove_tags_trees = ('script',)): - for it in entry[0].iterchildren(tag='table'): - entry[0].remove(it) - entry[0].remove(entry[0].xpath( 'descendant-or-self::p[1]')[0]) - entry = entry[0] - cleantree = self.strip_tags_etree(entry, invalid_tags) - for itag in remove_tags_trees: - for elts in cleantree.getiterator(itag): - elts.drop_tree() - return cleantree - def output_entry(self, entry, prettyout = True, htmlrm="\d+"): out = tostring(entry, pretty_print=prettyout) + #try to work around tostring to remove this encoding for exemle reclean = re.compile('(\n+|\t+|\r+|&#'+htmlrm+';)') return reclean.sub('', out) @@ -223,18 +209,18 @@ class ResultList(list): return float(1.25*sum(k*v for (k, v) in hval.iteritems())/sum(hval.itervalues())) def get_description(self, entry): - description = self.output_entry(entry.find('./p'),htmlrm="") + description = self.output_entry(entry.xpath('./p')[1],htmlrm="") description = self.redesc.search(description) - if not description and not description.group("desc"): + if not description or not description.group("desc"): return None #remove invalid tags description = self.reimg.sub('', description.group("desc")) description = self.recomment.sub('', description) description = self.resanitize.sub('', sanitize_comments_html(description)) - return 'SUMMARY:\n' + re.sub(r'\n\s+</p>','\n</p>', description) + return _('SUMMARY:\n %s') % re.sub(r'\n\s+</p>','\n</p>', description) def get_publisher(self, entry): - publisher = self.output_entry(entry.find('./p')) + publisher = self.output_entry(entry.xpath('./p')[1]) publisher = filter(lambda x: self.repub.search(x) is not None, self.resplitbr.split(publisher)) if not len(publisher): @@ -243,7 +229,7 @@ class ResultList(list): return publisher.split(',')[0].strip() def get_tags(self, entry): - tag = self.output_entry(entry.find('./p')) + tag = self.output_entry(entry.xpath('./p')[1]) tag = filter(lambda x: self.retag.search(x) is not None, self.resplitbr.split(tag)) if not len(tag): @@ -251,7 +237,7 @@ class ResultList(list): return map(lambda x: x.strip(), self.retag.sub('', tag[0]).split('/')) def get_date(self, entry, verbose): - date = self.output_entry(entry.find('./p')) + date = self.output_entry(entry.xpath('./p')[1]) date = filter(lambda x: self.redate.search(x) is not None, self.resplitbr.split(date)) if not len(date): @@ -269,12 +255,11 @@ class ResultList(list): return d def get_ISBN(self, entry): - isbns = self.output_entry(entry.getchildren()[2]) + isbns = self.output_entry(entry.xpath('./p')[2]) isbns = filter(lambda x: self.reisbn.search(x) is not None, self.resplitbrdiv.split(isbns)) if not len(isbns): return None - #TODO: parse all tag if necessary isbns = [self.reisbn.sub('', x) for x in isbns if check_isbn(self.reisbn.sub('', x))] return sorted(isbns, cmp=lambda x,y:cmp(len(x), len(y)))[-1] @@ -287,7 +272,6 @@ class ResultList(list): mi.pubdate = self.get_date(entry, verbose) mi.isbn = self.get_ISBN(entry) mi.author_sort = authors_to_sort_string(authors) - # mi.language = self.get_language(x, verbose) return mi def get_individual_metadata(self, browser, linkdata, verbose): @@ -298,36 +282,35 @@ class ResultList(list): if callable(getattr(e, 'getcode', None)) and \ e.getcode() == 404: return - raise + if isinstance(getattr(e, 'args', [None])[0], socket.timeout): + raise FictionwiseError(_('Fictionwise timed out. Try again later.')) + raise FictionwiseError(_('Fictionwise encountered an error.')) if '<title>404 - ' in raw: report(verbose) return raw = xml_to_unicode(raw, strip_encoding_pats=True, resolve_entities=True)[0] try: - feed = soupparser.fromstring(raw) + return soupparser.fromstring(raw) except: - return - - # get results - return feed.xpath("//table[3]/tr/td[2]/table[1]/tr/td/font/table/tr/td") + try: + #remove ASCII invalid chars + return soupparser.fromstring(clean_ascii_char(raw)) + except: + return None def populate(self, entries, browser, verbose=False): inv_tags ={'script': True, 'a': False, 'font': False, 'strong': False, 'b': False, - 'ul': False, 'span': False, 'table': True} - inv_xpath =('descendant-or-self::p[1]',) + 'ul': False, 'span': False} + inv_xpath =('./table',) #single entry if len(entries) == 1 and not isinstance(entries[0], str): try: entry = entries.xpath("//table[3]/tr/td[2]/table[1]/tr/td/font/table/tr/td") self.clean_entry(entry, invalid_tags=inv_tags, invalid_xpath=inv_xpath) - entry = self.clean_entry(entry) title = self.get_title(entry) - #ratings: get table for rating then drop - for elt in entry.getiterator('table'): - ratings = self.get_rating(elt, verbose) - elt.getprevious().drop_tree() - elt.drop_tree() + #maybe strenghten the search + ratings = self.get_rating(entry.xpath("./p/table")[1], verbose) authors = self.get_authors(entry) except Exception, e: if verbose: @@ -340,13 +323,11 @@ class ResultList(list): for x in entries: try: entry = self.get_individual_metadata(browser, x, verbose) + entry = entry.xpath("//table[3]/tr/td[2]/table[1]/tr/td/font/table/tr/td")[0] self.clean_entry(entry, invalid_tags=inv_tags, invalid_xpath=inv_xpath) title = self.get_title(entry) - #ratings: get table for rating then drop - for elt in entry.getiterator('table'): - ratings = self.get_rating(elt, verbose) - elt.getprevious().drop_tree() - elt.drop_tree() + #maybe strenghten the search + ratings = self.get_rating(entry.xpath("./p/table")[1], verbose) authors = self.get_authors(entry) except Exception, e: if verbose: @@ -361,7 +342,7 @@ def search(title=None, author=None, publisher=None, isbn=None, keywords=None): br = browser() entries = Query(title=title, author=author, publisher=publisher, - keywords=keywords, max_results=max_results)(br, verbose, timeout = 10.) + keywords=keywords, max_results=max_results)(br, verbose, timeout = 15.) #List of entry ans = ResultList() From 7ff5842e713d50772e0e7b7a99138b802f9ac1c9 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Sun, 5 Dec 2010 18:04:26 -0700 Subject: [PATCH 329/375] Fix icu_collate sqlite function --- src/calibre/library/sqlite.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/calibre/library/sqlite.py b/src/calibre/library/sqlite.py index b4cad8061e..ca6b0fc178 100644 --- a/src/calibre/library/sqlite.py +++ b/src/calibre/library/sqlite.py @@ -18,8 +18,9 @@ from functools import partial from calibre.ebooks.metadata import title_sort, author_to_author_sort from calibre.utils.config import tweaks from calibre.utils.date import parse_date, isoformat -from calibre import isbytestring +from calibre import isbytestring, force_unicode from calibre.constants import iswindows, DEBUG +from calibre.utils.icu import strcmp global_lock = RLock() @@ -115,8 +116,8 @@ def pynocase(one, two, encoding='utf-8'): pass return cmp(one.lower(), two.lower()) -def icu_collator(s1, s2, func=None): - return cmp(func(unicode(s1)), func(unicode(s2))) +def icu_collator(s1, s2): + return strcmp(force_unicode(s1, 'utf-8'), force_unicode(s2, 'utf-8')) def load_c_extensions(conn, debug=DEBUG): try: @@ -169,8 +170,7 @@ class DBThread(Thread): self.conn.create_function('uuid4', 0, lambda : str(uuid.uuid4())) # Dummy functions for dynamically created filters self.conn.create_function('books_list_filter', 1, lambda x: 1) - from calibre.utils.icu import sort_key - self.conn.create_collation('icucollate', partial(icu_collator, func=sort_key)) + self.conn.create_collation('icucollate', icu_collator) def run(self): try: From 90fa43bf371bb65361c2d746986743cddb576e68 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Sun, 5 Dec 2010 22:03:42 -0700 Subject: [PATCH 330/375] Fix regression in 0.7.32 that broke opening formats in the ebook viewer from the edit metadata dialog --- src/calibre/gui2/actions/edit_metadata.py | 5 +++++ src/calibre/gui2/actions/view.py | 9 --------- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/calibre/gui2/actions/edit_metadata.py b/src/calibre/gui2/actions/edit_metadata.py index 6e2a4054c8..4a527d94d8 100644 --- a/src/calibre/gui2/actions/edit_metadata.py +++ b/src/calibre/gui2/actions/edit_metadata.py @@ -147,8 +147,13 @@ class EditMetadataAction(InterfaceAction): d = MetadataSingleDialog(self.gui, row_list[current_row], db, prev=prev, next_=next_) + d.view_format.connect(lambda + fmt:self.gui.iactions['View'].view_format(row_list[current_row], + fmt)) if d.exec_() != d.Accepted: + d.view_format.disconnect() break + d.view_format.disconnect() changed.add(d.id) if d.row_delta == 0: break diff --git a/src/calibre/gui2/actions/view.py b/src/calibre/gui2/actions/view.py index 0a26653771..0910745ac9 100644 --- a/src/calibre/gui2/actions/view.py +++ b/src/calibre/gui2/actions/view.py @@ -26,7 +26,6 @@ class ViewAction(InterfaceAction): def genesis(self): self.persistent_files = [] - self.metadata_view_id = None self.qaction.triggered.connect(self.view_book) self.view_menu = QMenu() self.view_menu.addAction(_('View'), partial(self.view_book, False)) @@ -51,14 +50,6 @@ class ViewAction(InterfaceAction): if fmt_path: self._view_file(fmt_path) - def metadata_view_format(self, fmt): - fmt_path = self.gui.library_view.model().db.\ - format_abspath(self.metadata_view_id, - fmt, index_is_id=True) - if fmt_path: - self._view_file(fmt_path) - - def book_downloaded_for_viewing(self, job): if job.failed: self.gui.device_job_exception(job) From a42306248360bcb19c518fd8f8d3ad028e4538fe Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Mon, 6 Dec 2010 06:52:08 +0000 Subject: [PATCH 331/375] 1) Add icu capitalize 2) Fix strcmp to use icu lower 3) Add capitalize to tests 4) change formatter & title_case to use icu capitalize 5) add capitalize as a function to bulk metadata edit 6) get rid of redundant lower()s in models --- src/calibre/gui2/dialogs/metadata_bulk.py | 3 ++- src/calibre/gui2/library/models.py | 3 +-- src/calibre/utils/formatter.py | 3 ++- src/calibre/utils/icu.py | 18 +++++++++++++----- src/calibre/utils/titlecase.py | 7 ++----- 5 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/calibre/gui2/dialogs/metadata_bulk.py b/src/calibre/gui2/dialogs/metadata_bulk.py index 4a44b0cefa..a640c50fb8 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.py +++ b/src/calibre/gui2/dialogs/metadata_bulk.py @@ -17,7 +17,7 @@ from calibre.gui2 import error_dialog from calibre.gui2.progress_indicator import ProgressIndicator from calibre.utils.config import dynamic from calibre.utils.titlecase import titlecase -from calibre.utils.icu import sort_key +from calibre.utils.icu import sort_key, capitalize class MyBlockingBusy(QDialog): @@ -187,6 +187,7 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): _('Lower Case') : lambda x: icu_lower(x), _('Upper Case') : lambda x: icu_upper(x), _('Title Case') : lambda x: titlecase(x), + _('Capitalize') : lambda x: capitalize(x), } s_r_match_modes = [ _('Character match'), diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index 311cbaf369..e82e1dddd4 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -1023,8 +1023,7 @@ class DeviceBooksModel(BooksModel): # {{{ x = '' if y == None: y = '' - x, y = icu_lower(x.strip()), icu_lower(y.strip()) - return icu_strcmp(x, y) + return icu_strcmp(x.strip(), y.strip()) return _strcmp def datecmp(x, y): x = self.db[x].datetime diff --git a/src/calibre/utils/formatter.py b/src/calibre/utils/formatter.py index 15534a9c8a..6c4ddce81f 100644 --- a/src/calibre/utils/formatter.py +++ b/src/calibre/utils/formatter.py @@ -8,6 +8,7 @@ import re, string, traceback from calibre.constants import DEBUG from calibre.utils.titlecase import titlecase +from calibre.utils.icu import capitalize class TemplateFormatter(string.Formatter): ''' @@ -86,7 +87,7 @@ class TemplateFormatter(string.Formatter): 'uppercase' : (0, lambda s,x: x.upper()), 'lowercase' : (0, lambda s,x: x.lower()), 'titlecase' : (0, lambda s,x: titlecase(x)), - 'capitalize' : (0, lambda s,x: x.capitalize()), + 'capitalize' : (0, lambda s,x: capitalize(x)), 'contains' : (3, _contains), 'ifempty' : (1, _ifempty), 'lookup' : (-1, _lookup), diff --git a/src/calibre/utils/icu.py b/src/calibre/utils/icu.py index d7760671c9..6ae7398fb4 100644 --- a/src/calibre/utils/icu.py +++ b/src/calibre/utils/icu.py @@ -69,7 +69,7 @@ def icu_case_sensitive_sort_key(collator, obj): return collator.sort_key(obj) def icu_strcmp(collator, a, b): - return collator.strcmp(a.lower(), b.lower()) + return collator.strcmp(lower(a), lower(b)) def py_strcmp(a, b): return cmp(a.lower(), b.lower()) @@ -104,6 +104,13 @@ lower = (lambda s: s.lower()) if _icu_not_ok else \ title_case = (lambda s: s.title()) if _icu_not_ok else \ partial(_icu.title, get_locale()) +def icu_capitalize(s): + s = lower(s) + return s.replace(s[0], upper(s[0])) + +capitalize = (lambda s: s.capitalize()) if _icu_not_ok else \ + (lambda s: icu_capitalize(s)) + ################################################################################ def test(): # {{{ @@ -215,14 +222,15 @@ pêché''' print '\t', x.encode('utf-8') if fs != create(french_good): print 'French failed (note that French fails with icu < 4.6 i.e. on windows and OS X)' - return + # return test_strcmp(german + french) print '\nTesting case transforms in current locale' for x in ('a', 'Alice\'s code'): - print 'Upper:', x, '->', 'py:', x.upper().encode('utf-8'), 'icu:', upper(x).encode('utf-8') - print 'Lower:', x, '->', 'py:', x.lower().encode('utf-8'), 'icu:', lower(x).encode('utf-8') - print 'Title:', x, '->', 'py:', x.title().encode('utf-8'), 'icu:', title_case(x).encode('utf-8') + print 'Upper: ', x, '->', 'py:', x.upper().encode('utf-8'), 'icu:', upper(x).encode('utf-8') + print 'Lower: ', x, '->', 'py:', x.lower().encode('utf-8'), 'icu:', lower(x).encode('utf-8') + print 'Title: ', x, '->', 'py:', x.title().encode('utf-8'), 'icu:', title_case(x).encode('utf-8') + print 'Capitalize:', x, '->', 'py:', x.capitalize().encode('utf-8'), 'icu:', capitalize(x).encode('utf-8') print # }}} diff --git a/src/calibre/utils/titlecase.py b/src/calibre/utils/titlecase.py index b85670f038..bbc4c26688 100755 --- a/src/calibre/utils/titlecase.py +++ b/src/calibre/utils/titlecase.py @@ -9,6 +9,8 @@ License: http://www.opensource.org/licenses/mit-license.php import re +from calibre.utils.icu import capitalize + __all__ = ['titlecase'] __version__ = '0.5' @@ -40,11 +42,6 @@ def titlecase(text): """ - def capitalize(w): - w = icu_lower(w) - w = w.replace(w[0], icu_upper(w[0])) - return w - all_caps = ALL_CAPS.match(text) words = re.split('\s', text) From e31735960bf42e443c59e1f5fec52d809dadb363 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Mon, 6 Dec 2010 00:33:37 -0700 Subject: [PATCH 332/375] Save to disk: Refactor to not open a database connection in the worker process. Also fix a bug that could lead to save failures not being reported. --- src/calibre/ebooks/metadata/worker.py | 91 ++++++++++++++++----- src/calibre/gui2/add.py | 13 +++ src/calibre/library/save_to_disk.py | 111 +++++++++++++++++--------- 3 files changed, 160 insertions(+), 55 deletions(-) diff --git a/src/calibre/ebooks/metadata/worker.py b/src/calibre/ebooks/metadata/worker.py index 247050856d..7dff988679 100644 --- a/src/calibre/ebooks/metadata/worker.py +++ b/src/calibre/ebooks/metadata/worker.py @@ -8,12 +8,12 @@ __docformat__ = 'restructuredtext en' from threading import Thread from Queue import Empty -import os, time, sys, shutil +import os, time, sys, shutil, json from calibre.utils.ipc.job import ParallelJob from calibre.utils.ipc.server import Server from calibre.ptempfile import PersistentTemporaryDirectory, TemporaryDirectory -from calibre import prints +from calibre import prints, isbytestring from calibre.constants import filesystem_encoding @@ -194,14 +194,44 @@ class SaveWorker(Thread): self.daemon = True self.path, self.opts = path, opts self.ids = ids - self.library_path = db.library_path + self.db = db self.canceled = False self.result_queue = result_queue self.error = None self.spare_server = spare_server self.start() + def collect_data(self, ids): + from calibre.ebooks.metadata.opf2 import metadata_to_opf + data = {} + for i in set(ids): + mi = self.db.get_metadata(i, index_is_id=True, get_cover=True) + opf = metadata_to_opf(mi) + if isbytestring(opf): + opf = opf.decode('utf-8') + cpath = None + if mi.cover: + cpath = mi.cover + if isbytestring(cpath): + cpath = cpath.decode(filesystem_encoding) + formats = {} + fmts = self.db.formats(i, index_is_id=True, verify_formats=False) + if fmts: + fmts = fmts.split(',') + for fmt in fmts: + fpath = self.db.format_abspath(i, fmt, index_is_id=True) + if fpath is not None: + if isbytestring(fpath): + fpath = fpath.decode(filesystem_encoding) + formats[fmt.lower()] = fpath + data[i] = [opf, cpath, formats] + return data + def run(self): + with TemporaryDirectory('save_to_disk_data') as tdir: + self._run(tdir) + + def _run(self, tdir): from calibre.library.save_to_disk import config server = Server() if self.spare_server is None else self.spare_server ids = set(self.ids) @@ -212,12 +242,19 @@ class SaveWorker(Thread): for pref in c.preferences: recs[pref.name] = getattr(self.opts, pref.name) + plugboards = self.db.prefs.get('plugboards', {}) + for i, task in enumerate(tasks): tids = [x[-1] for x in task] + data = self.collect_data(tids) + dpath = os.path.join(tdir, '%d.json'%i) + with open(dpath, 'wb') as f: + f.write(json.dumps(data, ensure_ascii=False).encode('utf-8')) + job = ParallelJob('save_book', 'Save books (%d of %d)'%(i, len(tasks)), lambda x,y:x, - args=[tids, self.library_path, self.path, recs]) + args=[tids, dpath, plugboards, self.path, recs]) jobs.add(job) server.add_job(job) @@ -226,21 +263,19 @@ class SaveWorker(Thread): time.sleep(0.2) running = False for job in jobs: - job.update(consume_notifications=False) - while True: - try: - id, title, ok, tb = job.notifications.get_nowait()[0] - if id in ids: - self.result_queue.put((id, title, ok, tb)) - ids.remove(id) - except Empty: - break + self.get_notifications(job, ids) if not job.is_finished: running = True if not running: break + for job in jobs: + for id_, title, ok, tb in job.result: + if id_ in ids: + self.result_queue.put((id_, title, ok, tb)) + ids.remove(id_) + server.close() time.sleep(1) @@ -257,21 +292,39 @@ class SaveWorker(Thread): except: pass + def get_notifications(self, job, ids): + job.update(consume_notifications=False) + while True: + try: + id, title, ok, tb = job.notifications.get_nowait()[0] + if id in ids: + self.result_queue.put((id, title, ok, tb)) + ids.remove(id) + except Empty: + break -def save_book(task, library_path, path, recs, notification=lambda x,y:x): - from calibre.library.database2 import LibraryDatabase2 - db = LibraryDatabase2(library_path) - from calibre.library.save_to_disk import config, save_to_disk + +def save_book(ids, dpath, plugboards, path, recs, notification=lambda x,y:x): + from calibre.library.save_to_disk import config, save_serialized_to_disk from calibre.customize.ui import apply_null_metadata opts = config().parse() for name in recs: setattr(opts, name, recs[name]) + results = [] def callback(id, title, failed, tb): + results.append((id, title, not failed, tb)) notification((id, title, not failed, tb)) return True - with apply_null_metadata: - save_to_disk(db, task, path, opts, callback) + data_ = json.loads(open(dpath, 'rb').read().decode('utf-8')) + data = {} + for k, v in data_.iteritems(): + data[int(k)] = v + + with apply_null_metadata: + save_serialized_to_disk(ids, data, plugboards, path, opts, callback) + + return results diff --git a/src/calibre/gui2/add.py b/src/calibre/gui2/add.py index 1339070446..d1af2a6f0c 100644 --- a/src/calibre/gui2/add.py +++ b/src/calibre/gui2/add.py @@ -427,11 +427,23 @@ class Saver(QObject): # {{{ if not self.ids or not self.worker.is_alive(): self.timer.stop() self.pd.hide() + while self.ids: + before = len(self.ids) + self.get_result() + if before == len(self.ids): + for i in list(self.ids): + self.failures.add(('id:%d'%i, 'Unknown error')) + self.ids.remove(i) + break if not self.callback_called: self.callback(self.worker.path, self.failures, self.worker.error) self.callback_called = True return + self.get_result() + + + def get_result(self): try: id, title, ok, tb = self.rq.get_nowait() except Empty: @@ -441,6 +453,7 @@ class Saver(QObject): # {{{ if not isinstance(title, unicode): title = str(title).decode(preferred_encoding, 'replace') self.pd.set_msg(_('Saved')+' '+title) + if not ok: self.failures.add((title, tb)) # }}} diff --git a/src/calibre/library/save_to_disk.py b/src/calibre/library/save_to_disk.py index c6cc12a978..af57d563ac 100644 --- a/src/calibre/library/save_to_disk.py +++ b/src/calibre/library/save_to_disk.py @@ -6,7 +6,7 @@ __license__ = 'GPL v3' __copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>' __docformat__ = 'restructuredtext en' -import os, traceback, cStringIO, re +import os, traceback, cStringIO, re, shutil from calibre.constants import DEBUG from calibre.utils.config import Config, StringConfig, tweaks @@ -203,31 +203,49 @@ def get_components(template, mi, id, timefmt='%b %Y', length=250, return shorten_components_to(length, components) -def save_book_to_disk(id, db, root, opts, length): - mi = db.get_metadata(id, index_is_id=True) +def save_book_to_disk(id_, db, root, opts, length): + mi = db.get_metadata(id_, index_is_id=True) + cover = db.cover(id_, index_is_id=True, as_path=True) + plugboards = db.prefs.get('plugboards', {}) - available_formats = db.formats(id, index_is_id=True) + available_formats = db.formats(id_, index_is_id=True) if not available_formats: available_formats = [] else: available_formats = [x.lower().strip() for x in available_formats.split(',')] + formats = {} + fmts = db.formats(id_, index_is_id=True, verify_formats=False) + if fmts: + fmts = fmts.split(',') + for fmt in fmts: + fpath = db.format_abspath(id_, fmt, index_is_id=True) + if fpath is not None: + formats[fmt.lower()] = fpath + + return do_save_book_to_disk(id_, mi, cover, plugboards, + formats, root, opts, length) + + +def do_save_book_to_disk(id_, mi, cover, plugboards, + format_map, root, opts, length): + available_formats = [x.lower().strip() for x in format_map.keys()] if opts.formats == 'all': asked_formats = available_formats else: asked_formats = [x.lower().strip() for x in opts.formats.split(',')] formats = set(available_formats).intersection(set(asked_formats)) if not formats: - return True, id, mi.title + return True, id_, mi.title - components = get_components(opts.template, mi, id, opts.timefmt, length, + components = get_components(opts.template, mi, id_, opts.timefmt, length, ascii_filename if opts.asciiize else sanitize_file_name, to_lowercase=opts.to_lowercase, replace_whitespace=opts.replace_whitespace) base_path = os.path.join(root, *components) base_name = os.path.basename(base_path) dirpath = os.path.dirname(base_path) - # Don't test for existence first are the test could fail but + # Don't test for existence first as the test could fail but # another worker process could create the directory before # the call to makedirs try: @@ -236,29 +254,23 @@ def save_book_to_disk(id, db, root, opts, length): if not os.path.exists(dirpath): raise - cdata = db.cover(id, index_is_id=True) - if opts.save_cover: - if cdata is not None: - with open(base_path+'.jpg', 'wb') as f: - f.write(cdata) - mi.cover = base_name+'.jpg' - else: - mi.cover = None + if opts.save_cover and cover and os.access(cover, os.R_OK): + with open(base_path+'.jpg', 'wb') as f: + with open(cover, 'rb') as s: + shutil.copyfileobj(s, f) + mi.cover = base_name+'.jpg' + else: + mi.cover = None if opts.write_opf: opf = metadata_to_opf(mi) with open(base_path+'.opf', 'wb') as f: f.write(opf) - if cdata is not None: - mi.cover_data = ('jpg', cdata) - mi.cover = None - written = False for fmt in formats: global plugboard_save_to_disk_value, plugboard_any_format_value dev_name = plugboard_save_to_disk_value - plugboards = db.prefs.get('plugboards', {}) cpb = None if fmt in plugboards: cpb = plugboards[fmt] @@ -275,11 +287,12 @@ def save_book_to_disk(id, db, root, opts, length): # Leave this here for a while, in case problems arise. if cpb is not None: prints('Save-to-disk using plugboard:', fmt, cpb) - data = db.format(id, fmt, index_is_id=True) - if data is None: + fp = format_map.get(fmt, None) + if fp is None: continue - else: - written = True + with open(fp, 'rb') as f: + data = f.read() + written = True if opts.update_metadata: stream = cStringIO.StringIO() stream.write(data) @@ -300,9 +313,21 @@ def save_book_to_disk(id, db, root, opts, length): with open(fmt_path, 'wb') as f: f.write(data) - return not written, id, mi.title + return not written, id_, mi.title +def _sanitize_args(root, opts): + if opts is None: + opts = config().parse() + if isinstance(root, unicode): + root = root.encode(filesystem_encoding) + root = os.path.abspath(root) + opts.template = preprocess_template(opts.template) + length = 1000 if supports_long_names(root) else 250 + length -= len(root) + if length < 5: + raise ValueError('%r is too long.'%root) + return root, opts, length def save_to_disk(db, ids, root, opts=None, callback=None): ''' @@ -316,17 +341,7 @@ def save_to_disk(db, ids, root, opts=None, callback=None): :return: A list of failures. Each element of the list is a tuple (id, title, traceback) ''' - if opts is None: - opts = config().parse() - if isinstance(root, unicode): - root = root.encode(filesystem_encoding) - root = os.path.abspath(root) - - opts.template = preprocess_template(opts.template) - length = 1000 if supports_long_names(root) else 250 - length -= len(root) - if length < 5: - raise ValueError('%r is too long.'%root) + root, opts, length = _sanitize_args(root, opts) failures = [] for x in ids: tb = '' @@ -343,4 +358,28 @@ def save_to_disk(db, ids, root, opts=None, callback=None): break return failures +def save_serialized_to_disk(ids, data, plugboards, root, opts, callback): + from calibre.ebooks.metadata.opf2 import OPF + root, opts, length = _sanitize_args(root, opts) + failures = [] + for x in ids: + opf, cover, format_map = data[x] + if isinstance(opf, unicode): + opf = opf.encode('utf-8') + mi = OPF(cStringIO.StringIO(opf)).to_book_metadata() + tb = '' + try: + failed, id, title = do_save_book_to_disk(x, mi, cover, plugboards, + format_map, root, opts, length) + tb = _('Requested formats not available') + except: + failed, id, title = True, x, mi.title + tb = traceback.format_exc() + if failed: + failures.append((id, title, tb)) + if callable(callback): + if not callback(int(id), title, failed, tb): + break + + return failures From f9a861b3c884bcf1a4a940d38acd1efbf2ac6d47 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Mon, 6 Dec 2010 09:09:36 -0700 Subject: [PATCH 333/375] ... --- src/calibre/ebooks/metadata/worker.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/calibre/ebooks/metadata/worker.py b/src/calibre/ebooks/metadata/worker.py index 7dff988679..a7a8177176 100644 --- a/src/calibre/ebooks/metadata/worker.py +++ b/src/calibre/ebooks/metadata/worker.py @@ -271,6 +271,8 @@ class SaveWorker(Thread): break for job in jobs: + if not job.result: + continue for id_, title, ok, tb in job.result: if id_ in ids: self.result_queue.put((id_, title, ok, tb)) From f5b4029751afc18267b20794d14e3aa03c74aa08 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Mon, 6 Dec 2010 09:44:45 -0700 Subject: [PATCH 334/375] ... --- src/calibre/ebooks/metadata/worker.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/calibre/ebooks/metadata/worker.py b/src/calibre/ebooks/metadata/worker.py index a7a8177176..d059d7e34c 100644 --- a/src/calibre/ebooks/metadata/worker.py +++ b/src/calibre/ebooks/metadata/worker.py @@ -215,10 +215,8 @@ class SaveWorker(Thread): if isbytestring(cpath): cpath = cpath.decode(filesystem_encoding) formats = {} - fmts = self.db.formats(i, index_is_id=True, verify_formats=False) - if fmts: - fmts = fmts.split(',') - for fmt in fmts: + if mi.formats: + for fmt in mi.formats: fpath = self.db.format_abspath(i, fmt, index_is_id=True) if fpath is not None: if isbytestring(fpath): From 54c3ecced6c4fc86f656c18c183ad1d1464a4bf2 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Mon, 6 Dec 2010 10:00:25 -0700 Subject: [PATCH 335/375] ... --- src/calibre/gui2/add.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/calibre/gui2/add.py b/src/calibre/gui2/add.py index d1af2a6f0c..5f41f3a8e0 100644 --- a/src/calibre/gui2/add.py +++ b/src/calibre/gui2/add.py @@ -436,6 +436,10 @@ class Saver(QObject): # {{{ self.ids.remove(i) break if not self.callback_called: + try: + self.worker.join(1.5) + except: + pass # The worker was not yet started self.callback(self.worker.path, self.failures, self.worker.error) self.callback_called = True return From 2ee84bad3ad6e646a08a9bbca5712fa45d2b11a9 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Mon, 6 Dec 2010 10:08:18 -0700 Subject: [PATCH 336/375] ... --- src/calibre/utils/icu.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/utils/icu.py b/src/calibre/utils/icu.py index 6ae7398fb4..4b0f6d4821 100644 --- a/src/calibre/utils/icu.py +++ b/src/calibre/utils/icu.py @@ -56,7 +56,7 @@ def py_sort_key(obj): def icu_sort_key(collator, obj): if not obj: return _none2 - return collator.sort_key(obj.lower()) + return collator.sort_key(lower(obj)) def py_case_sensitive_sort_key(obj): if not obj: From 73f54f5e9dc2a6238f52aa352b2e198c5ed68cb4 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Mon, 6 Dec 2010 10:16:46 -0700 Subject: [PATCH 337/375] Fix #7812 (Bookmarks don't work.) --- src/calibre/utils/zipfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/utils/zipfile.py b/src/calibre/utils/zipfile.py index dbcc125274..5c19444bd6 100644 --- a/src/calibre/utils/zipfile.py +++ b/src/calibre/utils/zipfile.py @@ -1227,7 +1227,7 @@ class ZipFile: self.fp.flush() if zinfo.flag_bits & 0x08: # Write CRC and file sizes after the file data - self.fp.write(struct.pack("<lLL", zinfo.CRC, zinfo.compress_size, + self.fp.write(struct.pack("<LLL", zinfo.CRC, zinfo.compress_size, zinfo.file_size)) self.filelist.append(zinfo) self.NameToInfo[zinfo.filename] = zinfo From 10dc583d4bfce7ceea71cb707257484e5981db94 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Mon, 6 Dec 2010 10:18:53 -0700 Subject: [PATCH 338/375] Fix #7815 (Device support for HTC Legend with Wordplayer) --- src/calibre/devices/android/driver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/devices/android/driver.py b/src/calibre/devices/android/driver.py index 0deef5eb92..46fad13a2a 100644 --- a/src/calibre/devices/android/driver.py +++ b/src/calibre/devices/android/driver.py @@ -21,7 +21,7 @@ class ANDROID(USBMS): # HTC 0x0bb4 : { 0x0c02 : [0x100, 0x0227, 0x0226], 0x0c01 : [0x100, 0x0227], 0x0ff9 : [0x0100, 0x0227, 0x0226], 0x0c87: [0x0100, 0x0227, 0x0226], - 0xc92 : [0x100]}, + 0xc92 : [0x100], 0xc97: [0x226]}, # Eken 0x040d : { 0x8510 : [0x0001] }, From c9510ba730224cc41f2acdd1dc343a40770d90c8 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Mon, 6 Dec 2010 10:20:41 -0700 Subject: [PATCH 339/375] Fix #7802 (Driver for Samsumg Epic?) --- src/calibre/devices/android/driver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/devices/android/driver.py b/src/calibre/devices/android/driver.py index 46fad13a2a..9c37b6ff59 100644 --- a/src/calibre/devices/android/driver.py +++ b/src/calibre/devices/android/driver.py @@ -63,7 +63,7 @@ class ANDROID(USBMS): WINDOWS_MAIN_MEM = ['ANDROID_PHONE', 'A855', 'A853', 'INC.NEXUS_ONE', '__UMS_COMPOSITE', '_MB200', 'MASS_STORAGE', '_-_CARD', 'SGH-I897', 'GT-I9000', 'FILE-STOR_GADGET', 'SGH-T959', 'SAMSUNG_ANDROID', - 'SCH-I500_CARD'] + 'SCH-I500_CARD', 'SPH-D700_CARD'] WINDOWS_CARD_A_MEM = ['ANDROID_PHONE', 'GT-I9000_CARD', 'SGH-I897', 'FILE-STOR_GADGET', 'SGH-T959', 'SAMSUNG_ANDROID'] From 51f48f0cb2923b41d6a69c46d803aabbd5b36cfc Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Mon, 6 Dec 2010 11:00:25 -0700 Subject: [PATCH 340/375] ... --- src/calibre/utils/icu.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/calibre/utils/icu.c b/src/calibre/utils/icu.c index 51d9ac25ba..38542a44c6 100644 --- a/src/calibre/utils/icu.c +++ b/src/calibre/utils/icu.c @@ -237,8 +237,6 @@ static PyTypeObject icu_CollatorType = { // {{{ // }} -// }}} - // }}} // Module initialization {{{ From 2ed1365eb16d028e58218635cc838fb3617452ea Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Mon, 6 Dec 2010 12:20:15 -0700 Subject: [PATCH 341/375] Edit metadata dialog: When trying to download metadata, if there are multiple matches indicate which matches have a cover and summary in the list. Also add an option to automatically download the cover of the selected match. --- src/calibre/gui2/__init__.py | 2 + src/calibre/gui2/dialogs/fetch_metadata.py | 22 +- src/calibre/gui2/dialogs/fetch_metadata.ui | 351 ++++++++++---------- src/calibre/gui2/dialogs/metadata_single.py | 11 +- 4 files changed, 206 insertions(+), 180 deletions(-) diff --git a/src/calibre/gui2/__init__.py b/src/calibre/gui2/__init__.py index 57b914877d..57ca2a1880 100644 --- a/src/calibre/gui2/__init__.py +++ b/src/calibre/gui2/__init__.py @@ -123,6 +123,8 @@ def _config(): help=_('Download social metadata (tags/rating/etc.)')) c.add_opt('overwrite_author_title_metadata', default=True, help=_('Overwrite author and title with new metadata')) + c.add_opt('auto_download_cover', default=False, + help=_('Automatically download the cover, if available')) c.add_opt('enforce_cpu_limit', default=True, help=_('Limit max simultaneous jobs to number of CPUs')) c.add_opt('tag_browser_hidden_categories', default=set(), diff --git a/src/calibre/gui2/dialogs/fetch_metadata.py b/src/calibre/gui2/dialogs/fetch_metadata.py index 2c64219464..3da0e67e3d 100644 --- a/src/calibre/gui2/dialogs/fetch_metadata.py +++ b/src/calibre/gui2/dialogs/fetch_metadata.py @@ -9,7 +9,7 @@ from threading import Thread from PyQt4.QtCore import Qt, QObject, SIGNAL, QVariant, pyqtSignal, \ QAbstractTableModel, QCoreApplication, QTimer -from PyQt4.QtGui import QDialog, QItemSelectionModel +from PyQt4.QtGui import QDialog, QItemSelectionModel, QIcon from calibre.gui2.dialogs.fetch_metadata_ui import Ui_FetchMetadata from calibre.gui2 import error_dialog, NONE, info_dialog, config @@ -42,13 +42,14 @@ class Matches(QAbstractTableModel): def __init__(self, matches): self.matches = matches + self.yes_icon = QVariant(QIcon(I('ok.png'))) QAbstractTableModel.__init__(self) def rowCount(self, *args): return len(self.matches) def columnCount(self, *args): - return 6 + return 8 def headerData(self, section, orientation, role): if role != Qt.DisplayRole: @@ -61,6 +62,8 @@ class Matches(QAbstractTableModel): elif section == 3: text = _("Publisher") elif section == 4: text = _("ISBN") elif section == 5: text = _("Published") + elif section == 6: text = _("Has Cover") + elif section == 7: text = _("Has Summary") return QVariant(text) else: @@ -71,8 +74,8 @@ class Matches(QAbstractTableModel): def data(self, index, role): row, col = index.row(), index.column() + book = self.matches[row] if role == Qt.DisplayRole: - book = self.matches[row] res = None if col == 0: res = book.title @@ -90,6 +93,11 @@ class Matches(QAbstractTableModel): if not res: return NONE return QVariant(res) + elif role == Qt.DecorationRole: + if col == 6 and book.has_cover: + return self.yes_icon + if col == 7 and book.comments: + return self.yes_icon return NONE class FetchMetadata(QDialog, Ui_FetchMetadata): @@ -131,7 +139,7 @@ class FetchMetadata(QDialog, Ui_FetchMetadata): self.fetch_metadata() self.opt_get_social_metadata.setChecked(config['get_social_metadata']) self.opt_overwrite_author_title_metadata.setChecked(config['overwrite_author_title_metadata']) - + self.opt_auto_download_cover.setChecked(config['auto_download_cover']) def show_summary(self, current, *args): row = current.row() @@ -213,6 +221,12 @@ class FetchMetadata(QDialog, Ui_FetchMetadata): _hung_fetchers.add(self.fetcher) if hasattr(self, '_hangcheck') and self._hangcheck.isActive(): self._hangcheck.stop() + # Save value of auto_download_cover, since this is the only place it can + # be set. The values of the other options can be set in + # Preferences->Behavior and should not be set here as they affect bulk + # downloading as well. + if self.opt_auto_download_cover.isChecked() != config['auto_download_cover']: + config.set('auto_download_cover', self.opt_auto_download_cover.isChecked()) def __enter__(self, *args): return self diff --git a/src/calibre/gui2/dialogs/fetch_metadata.ui b/src/calibre/gui2/dialogs/fetch_metadata.ui index 03a362096c..b140fa158d 100644 --- a/src/calibre/gui2/dialogs/fetch_metadata.ui +++ b/src/calibre/gui2/dialogs/fetch_metadata.ui @@ -1,172 +1,179 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>FetchMetadata</class> - <widget class="QDialog" name="FetchMetadata"> - <property name="windowModality"> - <enum>Qt::WindowModal</enum> - </property> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>830</width> - <height>642</height> - </rect> - </property> - <property name="windowTitle"> - <string>Fetch metadata</string> - </property> - <property name="windowIcon"> - <iconset resource="../../../../resources/images.qrc"> - <normaloff>:/images/metadata.png</normaloff>:/images/metadata.png</iconset> - </property> - <layout class="QVBoxLayout"> - <item> - <widget class="QLabel" name="tlabel"> - <property name="text"> - <string><p>calibre can find metadata for your books from two locations: <b>Google Books</b> and <b>isbndb.com</b>. <p>To use isbndb.com you must sign up for a <a href="http://www.isbndb.com">free account</a> and enter your access key below.</string> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - <property name="wordWrap"> - <bool>true</bool> - </property> - <property name="openExternalLinks"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <layout class="QHBoxLayout"> - <item> - <widget class="QLabel" name="label_2"> - <property name="text"> - <string>&Access Key:</string> - </property> - <property name="buddy"> - <cstring>key</cstring> - </property> - </widget> - </item> - <item> - <widget class="QLineEdit" name="key"/> - </item> - <item> - <widget class="QPushButton" name="fetch"> - <property name="text"> - <string>Fetch</string> - </property> - </widget> - </item> - </layout> - </item> - <item> - <widget class="QLabel" name="warning"> - <property name="text"> - <string/> - </property> - <property name="wordWrap"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QGroupBox" name="groupBox"> - <property name="title"> - <string>Matches</string> - </property> - <layout class="QVBoxLayout"> - <item> - <widget class="QLabel" name="label_3"> - <property name="text"> - <string>Select the book that most closely matches your copy from the list below</string> - </property> - </widget> - </item> - <item> - <widget class="QTableView" name="matches"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> - <horstretch>0</horstretch> - <verstretch>1</verstretch> - </sizepolicy> - </property> - <property name="alternatingRowColors"> - <bool>true</bool> - </property> - <property name="selectionMode"> - <enum>QAbstractItemView::SingleSelection</enum> - </property> - <property name="selectionBehavior"> - <enum>QAbstractItemView::SelectRows</enum> - </property> - </widget> - </item> - <item> - <widget class="QTextBrowser" name="summary"/> - </item> - </layout> - </widget> - </item> - <item> - <widget class="QCheckBox" name="opt_get_social_metadata"> - <property name="text"> - <string>Download &social metadata (tags/rating/etc.) for the selected book</string> - </property> - </widget> - </item> - <item> - <widget class="QCheckBox" name="opt_overwrite_author_title_metadata"> - <property name="text"> - <string>Overwrite author and title with author and title of selected book</string> - </property> - </widget> - </item> - <item> - <widget class="QDialogButtonBox" name="buttonBox"> - <property name="standardButtons"> - <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> - </property> - </widget> - </item> - </layout> - </widget> - <resources> - <include location="../../../../resources/images.qrc"/> - </resources> - <connections> - <connection> - <sender>buttonBox</sender> - <signal>accepted()</signal> - <receiver>FetchMetadata</receiver> - <slot>accept()</slot> - <hints> - <hint type="sourcelabel"> - <x>460</x> - <y>599</y> - </hint> - <hint type="destinationlabel"> - <x>657</x> - <y>530</y> - </hint> - </hints> - </connection> - <connection> - <sender>buttonBox</sender> - <signal>rejected()</signal> - <receiver>FetchMetadata</receiver> - <slot>reject()</slot> - <hints> - <hint type="sourcelabel"> - <x>417</x> - <y>599</y> - </hint> - <hint type="destinationlabel"> - <x>0</x> - <y>491</y> - </hint> - </hints> - </connection> - </connections> -</ui> +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>FetchMetadata</class> + <widget class="QDialog" name="FetchMetadata"> + <property name="windowModality"> + <enum>Qt::WindowModal</enum> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>890</width> + <height>642</height> + </rect> + </property> + <property name="windowTitle"> + <string>Fetch metadata</string> + </property> + <property name="windowIcon"> + <iconset resource="../../../../resources/images.qrc"> + <normaloff>:/images/metadata.png</normaloff>:/images/metadata.png</iconset> + </property> + <layout class="QVBoxLayout"> + <item> + <widget class="QLabel" name="tlabel"> + <property name="text"> + <string><p>calibre can find metadata for your books from two locations: <b>Google Books</b> and <b>isbndb.com</b>. <p>To use isbndb.com you must sign up for a <a href="http://www.isbndb.com">free account</a> and enter your access key below.</string> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + <property name="wordWrap"> + <bool>true</bool> + </property> + <property name="openExternalLinks"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <layout class="QHBoxLayout"> + <item> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>&Access Key:</string> + </property> + <property name="buddy"> + <cstring>key</cstring> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="key"/> + </item> + <item> + <widget class="QPushButton" name="fetch"> + <property name="text"> + <string>Fetch</string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="QLabel" name="warning"> + <property name="text"> + <string/> + </property> + <property name="wordWrap"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QGroupBox" name="groupBox"> + <property name="title"> + <string>Matches</string> + </property> + <layout class="QVBoxLayout"> + <item> + <widget class="QLabel" name="label_3"> + <property name="text"> + <string>Select the book that most closely matches your copy from the list below</string> + </property> + </widget> + </item> + <item> + <widget class="QTableView" name="matches"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>1</verstretch> + </sizepolicy> + </property> + <property name="alternatingRowColors"> + <bool>true</bool> + </property> + <property name="selectionMode"> + <enum>QAbstractItemView::SingleSelection</enum> + </property> + <property name="selectionBehavior"> + <enum>QAbstractItemView::SelectRows</enum> + </property> + </widget> + </item> + <item> + <widget class="QTextBrowser" name="summary"/> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QCheckBox" name="opt_overwrite_author_title_metadata"> + <property name="text"> + <string>Overwrite author and title with author and title of selected book</string> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="opt_get_social_metadata"> + <property name="text"> + <string>Download &social metadata (tags/rating/etc.) for the selected book</string> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="opt_auto_download_cover"> + <property name="text"> + <string>Automatically download the cover, if available</string> + </property> + </widget> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <resources> + <include location="../../../../resources/images.qrc"/> + </resources> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>FetchMetadata</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>460</x> + <y>599</y> + </hint> + <hint type="destinationlabel"> + <x>657</x> + <y>530</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>FetchMetadata</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>417</x> + <y>599</y> + </hint> + <hint type="destinationlabel"> + <x>0</x> + <y>491</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/src/calibre/gui2/dialogs/metadata_single.py b/src/calibre/gui2/dialogs/metadata_single.py index 8f068075cf..fec58a74f6 100644 --- a/src/calibre/gui2/dialogs/metadata_single.py +++ b/src/calibre/gui2/dialogs/metadata_single.py @@ -760,8 +760,8 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): if book.publisher: self.publisher.setEditText(book.publisher) if book.isbn: self.isbn.setText(book.isbn) if book.pubdate: - d = book.pubdate - self.pubdate.setDate(QDate(d.year, d.month, d.day)) + dt = book.pubdate + self.pubdate.setDate(QDate(dt.year, dt.month, dt.day)) summ = book.comments if summ: prefix = unicode(self.comments.toPlainText()) @@ -777,8 +777,11 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): self.series.setText(book.series) if book.series_index is not None: self.series_index.setValue(book.series_index) - # Needed because of Qt focus bug on OS X - self.fetch_cover_button.setFocus(Qt.OtherFocusReason) + if book.has_cover: + if d.opt_auto_download_cover.isChecked() and book.has_cover: + self.fetch_cover() + else: + self.fetch_cover_button.setFocus(Qt.OtherFocusReason) else: error_dialog(self, _('Cannot fetch metadata'), _('You must specify at least one of ISBN, Title, ' From 78f9920c3a9dd4c9fc7bbb077d0cc86a374e01a2 Mon Sep 17 00:00:00 2001 From: Hiroshi Miura <miurahr@linux.com> Date: Tue, 7 Dec 2010 06:34:52 +0900 Subject: [PATCH 342/375] recipe: add toyokeizai news. --- resources/recipes/toyokeizai.recipe | 61 +++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 resources/recipes/toyokeizai.recipe diff --git a/resources/recipes/toyokeizai.recipe b/resources/recipes/toyokeizai.recipe new file mode 100644 index 0000000000..7145ece707 --- /dev/null +++ b/resources/recipes/toyokeizai.recipe @@ -0,0 +1,61 @@ +__license__ = 'GPL v3' +__copyright__ = '2010, Hiroshi Miura <miurahr@linux.com>' +''' +www.toyokeizai.net +''' + +from calibre.web.feeds.news import BasicNewsRecipe +import re + +class Toyokeizai(BasicNewsRecipe): + title = u'ToyoKeizai' + __author__ = 'Hiroshi Miura' + oldest_article = 1 + max_articles_per_feed = 50 + description = 'Japanese traditional financial and business magazine' + publisher = 'Toyokeizai Shinbun Sha' + category = 'news, japan' + language = 'ja' + encoding = 'euc-jp' + index = 'http://www.toyokeizai.net/news/' + remove_javascript = True + no_stylesheet = True + masthead_title = u'TOYOKEIZAI' + needs_subscription = True + timefmt = '[%y/%m/%d]' + + keep_only_tags = [dict(name='div', attrs={'class':['news']}), + dict(name='div', attrs={'class':["news_con"]}) + ] + remove_tags = [{'class':"mt35 mgz"}] + + def parse_index(self): + feeds = [] + soup = self.index_to_soup(self.index) + topstories = soup.find('ul',attrs={'class':'list6'}) + if topstories: + newsarticles = [] + for itt in topstories.findAll('li'): + itema = itt.find('a',href=True) + itemd = itt.find('span') + newsarticles.append({ + 'title' :itema.string + ,'date' :re.compile(r"\- ").sub(" ",itemd.string) + ,'url' :'http://www.toyokeizai.net' + itema['href'] + # ,'description':itema['title'] + ,'description':'' + }) + feeds.append(('news', newsarticles)) + return feeds + + def get_browser(self): + br = BasicNewsRecipe.get_browser() + if self.username is not None and self.password is not None: + br.open('http://member.toyokeizai.net/norights/form/') + br.select_form(nr=0) + br['kaiin_id'] = self.username + br['password'] = self.password + res = br.submit() + return br + + From 4d7bab28b6879c569d9ffb3e6cbde673dc688738 Mon Sep 17 00:00:00 2001 From: Hiroshi Miura <miurahr@linux.com> Date: Tue, 7 Dec 2010 07:37:08 +0900 Subject: [PATCH 343/375] recipe: toyokeizai: add description about limit --- resources/recipes/toyokeizai.recipe | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/resources/recipes/toyokeizai.recipe b/resources/recipes/toyokeizai.recipe index 7145ece707..3aed2b2202 100644 --- a/resources/recipes/toyokeizai.recipe +++ b/resources/recipes/toyokeizai.recipe @@ -8,13 +8,13 @@ from calibre.web.feeds.news import BasicNewsRecipe import re class Toyokeizai(BasicNewsRecipe): - title = u'ToyoKeizai' + title = u'ToyoKeizai News' __author__ = 'Hiroshi Miura' oldest_article = 1 max_articles_per_feed = 50 - description = 'Japanese traditional financial and business magazine' + description = 'Japanese traditional economy and business magazine, only for advanced subscribers supported' publisher = 'Toyokeizai Shinbun Sha' - category = 'news, japan' + category = 'economy, magazine, japan' language = 'ja' encoding = 'euc-jp' index = 'http://www.toyokeizai.net/news/' @@ -40,7 +40,7 @@ class Toyokeizai(BasicNewsRecipe): itemd = itt.find('span') newsarticles.append({ 'title' :itema.string - ,'date' :re.compile(r"\- ").sub(" ",itemd.string) + ,'date' :re.compile(r"\- ").sub("",itemd.string) ,'url' :'http://www.toyokeizai.net' + itema['href'] # ,'description':itema['title'] ,'description':'' @@ -58,4 +58,9 @@ class Toyokeizai(BasicNewsRecipe): res = br.submit() return br + def is_link_wanted(url,tag): + if re.compile(r'page//[0-9]+//$').search(url): + return True + return False + From 0d52b87a558e2cde56705ef37a8490be33b958c6 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Mon, 6 Dec 2010 17:30:18 -0700 Subject: [PATCH 344/375] Fix #7786 (Feedback when installing new plugins) --- src/calibre/gui2/preferences/plugins.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/calibre/gui2/preferences/plugins.py b/src/calibre/gui2/preferences/plugins.py index 388227e438..d493b615b5 100644 --- a/src/calibre/gui2/preferences/plugins.py +++ b/src/calibre/gui2/preferences/plugins.py @@ -151,6 +151,7 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): self._plugin_model.populate() self._plugin_model.reset() self.changed_signal.emit() + self.plugin_path.setText('') else: error_dialog(self, _('No valid plugin path'), _('%s is not a valid plugin path')%path).exec_() From dbff870b893a19515cbd3ad3f4004e11735e5893 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Mon, 6 Dec 2010 18:30:34 -0700 Subject: [PATCH 345/375] Fix #7716 (Edit meta Information - cover download crash - os x) --- src/calibre/gui2/dialogs/metadata_single.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/calibre/gui2/dialogs/metadata_single.py b/src/calibre/gui2/dialogs/metadata_single.py index fec58a74f6..3205b1d23c 100644 --- a/src/calibre/gui2/dialogs/metadata_single.py +++ b/src/calibre/gui2/dialogs/metadata_single.py @@ -8,8 +8,9 @@ add/remove formats import os, re, time, traceback, textwrap from functools import partial +from threading import Thread -from PyQt4.Qt import SIGNAL, QObject, Qt, QTimer, QThread, QDate, \ +from PyQt4.Qt import SIGNAL, QObject, Qt, QTimer, QDate, \ QPixmap, QListWidgetItem, QDialog, pyqtSignal, QMessageBox, QIcon, \ QPushButton @@ -34,9 +35,12 @@ from calibre.gui2.preferences.social import SocialMetadata from calibre.gui2.custom_column_widgets import populate_metadata_page from calibre import strftime -class CoverFetcher(QThread): # {{{ +class CoverFetcher(Thread): # {{{ def __init__(self, username, password, isbn, timeout, title, author): + Thread.__init__(self) + self.daemon = True + self.username = username.strip() if username else username self.password = password.strip() if password else password self.timeout = timeout @@ -44,8 +48,7 @@ class CoverFetcher(QThread): # {{{ self.title = title self.needs_isbn = False self.author = author - QThread.__init__(self) - self.exception = self.traceback = self.cover_data = None + self.exception = self.traceback = self.cover_data = self.errors = None def run(self): try: @@ -238,20 +241,20 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog): self.timeout, title, author) self.cover_fetcher.start() self._hangcheck = QTimer(self) - self.connect(self._hangcheck, SIGNAL('timeout()'), self.hangcheck) + self._hangcheck.timeout.connect(self.hangcheck, + type=Qt.QueuedConnection) self.cf_start_time = time.time() self.pi.start(_('Downloading cover...')) self._hangcheck.start(100) def hangcheck(self): - if not self.cover_fetcher.isFinished() and \ + if self.cover_fetcher.is_alive() and \ time.time()-self.cf_start_time < self.COVER_FETCH_TIMEOUT: return self._hangcheck.stop() try: - if self.cover_fetcher.isRunning(): - self.cover_fetcher.terminate() + if self.cover_fetcher.is_alive(): error_dialog(self, _('Cannot fetch cover'), _('<b>Could not fetch cover.</b><br/>')+ _('The download timed out.')).exec_() From 1034e9a73d97ddec1582886137a80bb384717e26 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Tue, 7 Dec 2010 10:25:46 +0000 Subject: [PATCH 346/375] Make template formatting support numeric format specifications --- src/calibre/manual/template_lang.rst | 10 +++-- src/calibre/utils/formatter.py | 59 +++++++++++++++++++++------- 2 files changed, 50 insertions(+), 19 deletions(-) diff --git a/src/calibre/manual/template_lang.rst b/src/calibre/manual/template_lang.rst index 1bef32fbd6..b316850798 100644 --- a/src/calibre/manual/template_lang.rst +++ b/src/calibre/manual/template_lang.rst @@ -46,7 +46,6 @@ and if a book does not have a series:: (|app| automatically removes multiple slashes and leading or trailing spaces). - Advanced formatting ---------------------- @@ -80,6 +79,9 @@ For trailing zeros, use:: {series_index:0<3s} - Three digits with trailing zeros +If you use series indices with sub values (e.g., 1.1), you might want to ensure that the decimal points line up. For example, you might want the indices 1 and 2.5 to appear as 01.00 and 02.50 so that they will sort correctly. To do this, use:: + + {series_index:0<5.2f} - Five characters, consisting of two digits with leading zeros, a decimal point, then 2 digits after the decimal point If you want only the first two letters of the data, use:: @@ -115,15 +117,15 @@ The functions available are: * ``lowercase()`` -- return value of the field in lower case. * ``uppercase()`` -- return the value of the field in upper case. * ``titlecase()`` -- return the value of the field in title case. - * ``capitalize()`` -- return the value as capitalized. - * ``ifempty(text)`` -- if the field is not empty, return the value of the field. Otherwise return `text`. - * ``test(text if not empty, text if empty)`` -- return `text if not empty` if the field is not empty, otherwise return `text if empty`. + * ``capitalize()`` -- return the value with the first letter upper case and the rest lower case. * ``contains(pattern, text if match, text if not match`` -- checks if field contains matches for the regular expression `pattern`. Returns `text if match` if matches are found, otherwise it returns `text if no match`. * ``count(separator)`` -- interprets the value as a list of items separated by `separator`, returning the number of items in the list. Most lists use a comma as the separator, but authors uses an ampersand. Examples: `{tags:count(,)}`, `{authors:count(&)}` + * ``ifempty(text)`` -- if the field is not empty, return the value of the field. Otherwise return `text`. * ``lookup(pattern, field, pattern, field, ..., else_field)`` -- like switch, except the arguments are field (metadata) names, not text. The value of the appropriate field will be fetched and used. Note that because composite columns are fields, you can use this function in one composite field to use the value of some other composite field. This is extremely useful when constructing variable save paths (more later). * ``re(pattern, replacement)`` -- return the field after applying the regular expression. All instances of `pattern` are replaced with `replacement`. As in all of |app|, these are python-compatible regular expressions. * ``shorten(left chars, middle text, right chars)`` -- Return a shortened version of the field, consisting of `left chars` characters from the beginning of the field, followed by `middle text`, followed by `right chars` characters from the end of the string. `Left chars` and `right chars` must be integers. For example, assume the title of the book is `Ancient English Laws in the Times of Ivanhoe`, and you want it to fit in a space of at most 15 characters. If you use ``{title:shorten(9,-,5)}``, the result will be `Ancient E-nhoe`. If the field's length is less than ``left chars`` + ``right chars`` + the length of ``middle text``, then the field will be used intact. For example, the title `The Dome` would not be changed. * ``switch(pattern, value, pattern, value, ..., else_value)`` -- for each ``pattern, value`` pair, checks if the field matches the regular expression ``pattern`` and if so, returns that ``value``. If no ``pattern`` matches, then ``else_value`` is returned. You can have as many ``pattern, value`` pairs as you want. + * ``test(text if not empty, text if empty)`` -- return `text if not empty` if the field is not empty, otherwise return `text if empty`. Now, about using functions and formatting in the same field. Suppose you have an integer custom column called ``#myint`` that you want to see with leading zeros, as in ``003``. To do this, you would use a format of ``0>3s``. However, by default, if a number (integer or float) equals zero then the field produces the empty value, so zero values will produce nothing, not ``000``. If you really want to see ``000`` values, then you use both the format string and the ``ifempty`` function to change the empty value back to a zero. The field reference would be:: diff --git a/src/calibre/utils/formatter.py b/src/calibre/utils/formatter.py index 6c4ddce81f..a7fb3682aa 100644 --- a/src/calibre/utils/formatter.py +++ b/src/calibre/utils/formatter.py @@ -15,6 +15,8 @@ class TemplateFormatter(string.Formatter): Provides a format function that substitutes '' for any missing value ''' + _validation_string = 'This Is Some Text THAT SHOULD be LONG Enough.%^&*' + # Dict to do recursion detection. It is up the the individual get_value # method to use it. It is cleared when starting to format a template composite_values = {} @@ -98,19 +100,29 @@ class TemplateFormatter(string.Formatter): 'count' : (1, _count), } - format_string_re = re.compile(r'^(.*)\|(.*)\|(.*)$') - compress_spaces = re.compile(r'\s+') - backslash_comma_to_comma = re.compile(r'\\,') - - arg_parser = re.Scanner([ - (r',', lambda x,t: ''), - (r'.*?((?<!\\),)', lambda x,t: t[:-1]), - (r'.*?\)', lambda x,t: t[:-1]), - ]) - - def get_value(self, key, args, kwargs): - raise Exception('get_value must be implemented in the subclass') - + def _do_format(self, val, fmt): + if not fmt or not val: + return val + if val == self._validation_string: + val = '0' + typ = fmt[-1] + if typ == 's': + pass + elif 'bcdoxXn'.find(typ) >= 0: + try: + val = int(val) + except: + raise ValueError( + _('format: type {0} requires an integer value, got {1}').format(typ, val)) + elif 'eEfFgGn%'.find(typ) >= 0: + try: + val = float(val) + except: + raise ValueError( + _('format: type {0} requires a decimal (float) value, got {1}').format(typ, val)) + else: + raise ValueError(_('format: unknown format type letter {0}').format(typ)) + return unicode(('{0:'+fmt+'}').format(val)) def _explode_format_string(self, fmt): try: @@ -123,6 +135,21 @@ class TemplateFormatter(string.Formatter): traceback.print_exc() return fmt, '', '' + format_string_re = re.compile(r'^(.*)\|(.*)\|(.*)$') + compress_spaces = re.compile(r'\s+') + backslash_comma_to_comma = re.compile(r'\\,') + + arg_parser = re.Scanner([ + (r',', lambda x,t: ''), + (r'.*?((?<!\\),)', lambda x,t: t[:-1]), + (r'.*?\)', lambda x,t: t[:-1]), + ]) + + ################## Override parent classes methods ##################### + + def get_value(self, key, args, kwargs): + raise Exception('get_value must be implemented in the subclass') + def format_field(self, val, fmt): # Handle conditional text fmt, prefix, suffix = self._explode_format_string(fmt) @@ -156,7 +183,7 @@ class TemplateFormatter(string.Formatter): else: val = func[1](self, val, *args).strip() if val: - val = string.Formatter.format_field(self, val, dispfmt) + val = self._do_format(val, dispfmt) if not val: return '' return prefix + val + suffix @@ -165,6 +192,8 @@ class TemplateFormatter(string.Formatter): ans = string.Formatter.vformat(self, fmt, args, kwargs) return self.compress_spaces.sub(' ', ans).strip() + ########## a formatter guaranteed not to throw and exception ############ + def safe_format(self, fmt, kwargs, error_value, book): self.kwargs = kwargs self.book = book @@ -182,7 +211,7 @@ class ValidateFormat(TemplateFormatter): Provides a format function that substitutes '' for any missing value ''' def get_value(self, key, args, kwargs): - return 'this is some text that should be long enough' + return self._validation_string def validate(self, x): return self.vformat(x, [], {}) From 6cfb43a3e8e219a82994d6d1d381cf3d45c5e245 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Tue, 7 Dec 2010 08:37:30 -0700 Subject: [PATCH 347/375] St. Louis Post Dispatch by cisaak --- .../recipes/st_louis_post_dispatch.recipe | 70 +++++++++++++++++++ src/calibre/devices/android/driver.py | 2 +- 2 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 resources/recipes/st_louis_post_dispatch.recipe diff --git a/resources/recipes/st_louis_post_dispatch.recipe b/resources/recipes/st_louis_post_dispatch.recipe new file mode 100644 index 0000000000..3b7701cedc --- /dev/null +++ b/resources/recipes/st_louis_post_dispatch.recipe @@ -0,0 +1,70 @@ +from calibre.web.feeds.news import BasicNewsRecipe + +class AdvancedUserRecipe1282093204(BasicNewsRecipe): + title = u'St Louis Post-Dispatch' + __author__ = 'cisaak' + language = 'en' + + oldest_article = 1 + max_articles_per_feed = 15 + masthead_url = 'http://farm5.static.flickr.com/4118/4929686950_0e22e2c88a.jpg' + + feeds = [ + (u'News-Bill McClellan', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=news%2Flocal%2fcolumns%2Fbill-mclellan&f=rss&t=article'), + (u'News-Columns', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=news%2Flocal%2Fcolumns*&l=50&f=rss&t=article'), + (u'News-Crime & Courtshttp://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=news%2Flocal%2Fcrime-and-courts&l=50&f=rss&t=article'), + (u'News-Deb Peterson', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=news%2Flocal%2fcolumns%2Fdeb-peterson&f=rss&t=article'), + (u'News-Education', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=news%2Flocal%2feducation&f=rss&t=article'), + (u'News-Government & Politics', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=news%2Flocal%2fgovt-and-politics&f=rss&t=article'), + (u'News-Local', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=news%2Flocal&f=rss&t=article'), + (u'News-Metro', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=news%2Flocal%2fmetro&f=rss&t=article'), + (u'News-Metro East', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=news%2Flocal%2fillinois&f=rss&t=article'), + (u'News-Missouri Out State', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=news%2Fstate-and-regional%2FMissouri&l=50&f=rss&t=article'), + (u'Opinion-Colleen Carroll Campbell', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=news%2Fopinion%2fcolumns%2Fcolleen-carroll-campbell&f=rss&t=article'), + (u'Opinion-Editorial', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=news%2Fopinion%2feditorial&f=rss&t=article'), + (u'Opinion-Kevin Horrigan', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=news%2Fopinion%2fcolumns%2Fkevin-horrigan&f=rss&t=article'), + (u'Opinion-Mailbag', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=news%2Fopinion%2fmailbag&f=rss&t=article'), + (u'Business Columns-Savvy Consumer', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=business%2Fcolumns%2Fsavvy-consumer&l=100&f=rss&t=article'), + (u'Business Columns-Lager Heads', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=business%2Fcolumns%2Flager-heads&l=100&f=rss&t=article'), + (u'Business Columns-Job Watch', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=business%2Fcolumns%2Fjob-watch&l=100&f=rss&t=article'), + (u'Business Columns-Steve Geigerich', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=business%2Fcolumns%2Fsteve-giegerich&l=100&f=rss&t=article'), + (u'Business Columns-David Nicklaus', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=business%2Fcolumns%2Fdavid-nicklaus&l=100&f=rss&t=article'), + (u'Business Columns-Jim Gallagher', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=business%2Fcolumns%2Fjim-gallagher&l=100&f=rss&t=article'), + (u'Business Columns-Building Blocks', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=business%2Fcolumns%2Fbuilding-blocks&l=100&f=rss&t=article'), + (u'Business', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=business*l&l=100&f=rss&t=article'), + (u'Business-Technology', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=business%2Ftechnology&l=50&f=rss&t=article'), + (u'Business-National', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=business%2Fnational-and-international&l=50&f=rss&t=article'), + (u'Travel', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=travel*&l=100&f=rss&t=article'), + (u'Sports', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=sports*&f=rss&t=article'), + (u'Sports-Baseball', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=sports%2Fbaseball%2Fprofessional&l=100&f=rss&t=article'), + (u'Sports-Bernie Miklasz', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=sports%2Fcolumns%2Fbernie-miklasz&l=50&f=rss&t=article'), + (u'Sports-Bryan Burwell', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=sports%2Fcolumns%2Fbryan-burwell&l=50&f=rss&t=article'), + (u'Sports-College', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=sports%2Fcollege*&l=100&f=rss&t=article'), + (u'Sports-Dan Caesar', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=sports%2Fcolumns%2Fdan-caesar&l=50&f=rss&t=article'), + (u'Sports-Football', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=sports%2Ffootball%2Fprofessional&l=100&f=rss&t=article'), + (u'Sports-Hockey', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=sports%2Fhockey%2Fprofessional&l=100&f=rss&t=article'), + (u'Sports-Illini', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=sports%2Fcollege%2Fillini&l=100&f=rss&t=article'), + (u'Sports-Jeff Gordon', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=sports%2Fcolumns%2Fjeff-gordon&l=100&f=rss&t=article'), + (u'Life & Style', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=lifestyles&l=100&f=rss&t=article'), + (u'Life & Style-Debra Bass', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=lifestyles%2Ffashion-and-style%2Fdebra-bass&l=100&f=rss&t=article'), + (u'Life & Style-Food and Cooking', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=lifestyles%2Ffood-and-cooking&l=100&f=rss&t=article'), + (u'Life & Style-Health/Medicine/Fitness', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=lifestyles%2Fhealth-med-fit&l=100&f=rss&t=article'), + (u'Life & Style-Joe Holleman', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=lifestyles%2Fcolumns%2Fjoe-holleman&l=100&f=rss&t=article'), + (u'Life & Style-Steals-and-Deals', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=lifestyles%2Fcolumns%2Fsteals-and-deals&l=100&f=rss&t=article'), + (u'Life & Style-Tim Townsend', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=lifestyles%2Ffaith-and-values%2Ftim-townsend&l=100&f=rss&t=article'), + (u'Entertainment', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=entertainment&l=100&f=rss&t=article'), + (u'Entertainment-Arts & Theatre', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=entertainment%2Farts-and-theatre&l=100&f=rss&t=article'), + (u'Entertainment-Books & Literature', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=entertainment%2Fbooks-and-literature&l=100&f=rss&t=article'), + (u'Entertainment-Dining', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=sports%2Fhockey%2Fprofessional&l=100&f=rss&t=article'), + (u'Entertainment-Events Calendar', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=entertainment%2Fevents-calendar&l=100&f=rss&t=article'), + (u'Entertainment-Gail Pennington', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=entertainment%2Ftelevision%2Fgail-pennington&l=100&f=rss&t=article'), + (u'Entertainment-Hip Hops', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=entertainment%2Fdining%2Fbars-and-clubs-other%2Fhip-hops&l=100&f=rss&t=article'), + (u'Entertainment-House-O-Fun', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=entertainment%2Fhouse-o-fun&l=100&f=rss&t=article'), + (u'Entertainment-Kevin C. Johnson', u'http://www2.stltoday.com/search/?q=&d1=&d2=&s=start_time&sd=desc&c=entertainment%2Fmusic%2Fkevin-johnson&l=100&f=rss&t=article') + ] + remove_empty_feeds = True + remove_tags = [dict(name='div', attrs={'id':'blox-logo'}),dict(name='a')] + keep_only_tags = [dict(name='h1'), dict(name='p', attrs={'class':'byline'}), dict(name="div", attrs={'id':'blox-story-text'})] + extra_css = 'p {text-align: left;}' + + diff --git a/src/calibre/devices/android/driver.py b/src/calibre/devices/android/driver.py index 9c37b6ff59..8b30631528 100644 --- a/src/calibre/devices/android/driver.py +++ b/src/calibre/devices/android/driver.py @@ -63,7 +63,7 @@ class ANDROID(USBMS): WINDOWS_MAIN_MEM = ['ANDROID_PHONE', 'A855', 'A853', 'INC.NEXUS_ONE', '__UMS_COMPOSITE', '_MB200', 'MASS_STORAGE', '_-_CARD', 'SGH-I897', 'GT-I9000', 'FILE-STOR_GADGET', 'SGH-T959', 'SAMSUNG_ANDROID', - 'SCH-I500_CARD', 'SPH-D700_CARD'] + 'SCH-I500_CARD', 'SPH-D700_CARD', 'MB810'] WINDOWS_CARD_A_MEM = ['ANDROID_PHONE', 'GT-I9000_CARD', 'SGH-I897', 'FILE-STOR_GADGET', 'SGH-T959', 'SAMSUNG_ANDROID'] From b49f04c413775e8a92efa31cd87bc734b3451ee6 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Tue, 7 Dec 2010 16:02:39 +0000 Subject: [PATCH 348/375] Fix typo in manual --- src/calibre/manual/template_lang.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/manual/template_lang.rst b/src/calibre/manual/template_lang.rst index b316850798..b2d32f0767 100644 --- a/src/calibre/manual/template_lang.rst +++ b/src/calibre/manual/template_lang.rst @@ -81,7 +81,7 @@ For trailing zeros, use:: If you use series indices with sub values (e.g., 1.1), you might want to ensure that the decimal points line up. For example, you might want the indices 1 and 2.5 to appear as 01.00 and 02.50 so that they will sort correctly. To do this, use:: - {series_index:0<5.2f} - Five characters, consisting of two digits with leading zeros, a decimal point, then 2 digits after the decimal point + {series_index:0>5.2f} - Five characters, consisting of two digits with leading zeros, a decimal point, then 2 digits after the decimal point If you want only the first two letters of the data, use:: From d34894243661f3351bbf09745d97561f3e91f392 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Tue, 7 Dec 2010 09:10:01 -0700 Subject: [PATCH 349/375] ... --- src/calibre/ebooks/oeb/reader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/ebooks/oeb/reader.py b/src/calibre/ebooks/oeb/reader.py index 0f61969373..8e11ac6498 100644 --- a/src/calibre/ebooks/oeb/reader.py +++ b/src/calibre/ebooks/oeb/reader.py @@ -544,7 +544,7 @@ class OEBReader(object): data = render_html_svg_workaround(path, self.logger) if not data: data = '' - id, href = self.oeb.manifest.generate('cover', 'cover.jpeg') + id, href = self.oeb.manifest.generate('cover', 'cover.jpg') item = self.oeb.manifest.add(id, href, JPEG_MIME, data=data) return item From 03c6b10d954e94bce466d768ac121a70bf647461 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Tue, 7 Dec 2010 10:06:30 -0700 Subject: [PATCH 350/375] ... --- src/calibre/utils/ipc/server.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/calibre/utils/ipc/server.py b/src/calibre/utils/ipc/server.py index 380e2e074b..4d35113d80 100644 --- a/src/calibre/utils/ipc/server.py +++ b/src/calibre/utils/ipc/server.py @@ -292,12 +292,12 @@ class Server(Thread): except: pass time.sleep(0.2) - for worker in self.workers: + for worker in list(self.workers): try: worker.kill() except: pass - for worker in self.pool: + for worker in list(self.pool): try: worker.kill() except: From 6e43796c9d041552a0b1e2191ab6d3a34876d2d4 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Tue, 7 Dec 2010 10:52:36 -0700 Subject: [PATCH 351/375] Adding books: Run in the main thread to prevent unfortunate interactions with the metadata backup. Also fix regression that broke the Abort button. --- src/calibre/gui2/add.py | 172 +++++++++++++++++++++++----------------- 1 file changed, 98 insertions(+), 74 deletions(-) diff --git a/src/calibre/gui2/add.py b/src/calibre/gui2/add.py index 5f41f3a8e0..5f555ef138 100644 --- a/src/calibre/gui2/add.py +++ b/src/calibre/gui2/add.py @@ -3,41 +3,55 @@ UI for adding books to the database and saving books to disk ''' import os, shutil, time from Queue import Queue, Empty -from threading import Thread +from functools import partial -from PyQt4.Qt import QThread, SIGNAL, QObject, QTimer, Qt, \ - QProgressDialog +from PyQt4.Qt import QThread, QObject, Qt, QProgressDialog, pyqtSignal, QTimer from calibre.gui2.dialogs.progress import ProgressDialog from calibre.gui2 import question_dialog, error_dialog, info_dialog from calibre.ebooks.metadata.opf2 import OPF from calibre.ebooks.metadata import MetaInformation -from calibre.constants import preferred_encoding, filesystem_encoding +from calibre.constants import preferred_encoding, filesystem_encoding, DEBUG from calibre.utils.config import prefs +from calibre import prints + +single_shot = partial(QTimer.singleShot, 75) + +class DuplicatesAdder(QObject): # {{{ + + added = pyqtSignal(object) + adding_done = pyqtSignal() -class DuplicatesAdder(QThread): # {{{ - # Add duplicate books def __init__(self, parent, db, duplicates, db_adder): - QThread.__init__(self, parent) + QObject.__init__(self, parent) self.db, self.db_adder = db, db_adder - self.duplicates = duplicates + self.duplicates = list(duplicates) + self.count = 0 + single_shot(self.add_one) + + def add_one(self): + if not self.duplicates: + self.adding_done.emit() + return + + mi, cover, formats = self.duplicates.pop() + formats = [f for f in formats if not f.lower().endswith('.opf')] + id = self.db.create_book_entry(mi, cover=cover, + add_duplicates=True) + # here we add all the formats for dupe book record created above + self.db_adder.add_formats(id, formats) + self.db_adder.number_of_books_added += 1 + self.count += 1 + self.added.emit(self.count) + single_shot(self.add_one) - def run(self): - count = 1 - for mi, cover, formats in self.duplicates: - formats = [f for f in formats if not f.lower().endswith('.opf')] - id = self.db.create_book_entry(mi, cover=cover, - add_duplicates=True) - # here we add all the formats for dupe book record created above - self.db_adder.add_formats(id, formats) - self.db_adder.number_of_books_added += 1 - self.emit(SIGNAL('added(PyQt_PyObject)'), count) - count += 1 - self.emit(SIGNAL('adding_done()')) # }}} class RecursiveFind(QThread): # {{{ + update = pyqtSignal(object) + found = pyqtSignal(object) + def __init__(self, parent, db, root, single): QThread.__init__(self, parent) self.db = db @@ -50,8 +64,8 @@ class RecursiveFind(QThread): # {{{ for dirpath in os.walk(root): if self.canceled: return - self.emit(SIGNAL('update(PyQt_PyObject)'), - _('Searching in')+' '+dirpath[0]) + self.update.emit( + _('Searching in')+' '+dirpath[0]) self.books += list(self.db.find_books_in_directory(dirpath[0], self.single_book_per_directory)) @@ -71,46 +85,55 @@ class RecursiveFind(QThread): # {{{ msg = unicode(err) except: msg = repr(err) - self.emit(SIGNAL('found(PyQt_PyObject)'), msg) + self.found.emit(msg) return self.books = [formats for formats in self.books if formats] if not self.canceled: - self.emit(SIGNAL('found(PyQt_PyObject)'), self.books) + self.found.emit(self.books) # }}} -class DBAdder(Thread): # {{{ +class DBAdder(QObject): # {{{ + + def __init__(self, parent, db, ids, nmap): + QObject.__init__(self, parent) - def __init__(self, db, ids, nmap): self.db, self.ids, self.nmap = db, dict(**ids), dict(**nmap) - self.end = False self.critical = {} self.number_of_books_added = 0 self.duplicates = [] self.names, self.paths, self.infos = [], [], [] - Thread.__init__(self) - self.daemon = True self.input_queue = Queue() self.output_queue = Queue() self.merged_books = set([]) - def run(self): - while not self.end: - try: - id, opf, cover = self.input_queue.get(True, 0.2) - except Empty: - continue - name = self.nmap.pop(id) - title = None - try: - title = self.add(id, opf, cover, name) - except: - import traceback - self.critical[name] = traceback.format_exc() - title = name - self.output_queue.put(title) + def end(self): + self.input_queue.put((None, None, None)) + + def start(self): + try: + id, opf, cover = self.input_queue.get_nowait() + except Empty: + single_shot(self.start) + return + if id is None and opf is None and cover is None: + return + name = self.nmap.pop(id) + title = None + if DEBUG: + st = time.time() + try: + title = self.add(id, opf, cover, name) + except: + import traceback + self.critical[name] = traceback.format_exc() + title = name + self.output_queue.put(title) + if DEBUG: + prints('Added', title, 'to db in:', time.time() - st, 'seconds') + single_shot(self.start) def process_formats(self, opf, formats): imp = opf[:-4]+'.import' @@ -201,10 +224,10 @@ class Adder(QObject): # {{{ self.pd.setModal(True) self.pd.show() self._parent = parent - self.rfind = self.worker = self.timer = None + self.rfind = self.worker = None self.callback = callback self.callback_called = False - self.connect(self.pd, SIGNAL('canceled()'), self.canceled) + self.pd.canceled_signal.connect(self.canceled) def add_recursive(self, root, single=True): self.path = root @@ -213,10 +236,8 @@ class Adder(QObject): # {{{ self.pd.set_max(0) self.pd.value = 0 self.rfind = RecursiveFind(self, self.db, root, single) - self.connect(self.rfind, SIGNAL('update(PyQt_PyObject)'), - self.pd.set_msg, Qt.QueuedConnection) - self.connect(self.rfind, SIGNAL('found(PyQt_PyObject)'), - self.add, Qt.QueuedConnection) + self.rfind.update.connect(self.pd.set_msg, type=Qt.QueuedConnection) + self.rfind.found.connect(self.add, type=Qt.QueuedConnection) self.rfind.start() def add(self, books): @@ -246,12 +267,12 @@ class Adder(QObject): # {{{ self.pd.set_min(0) self.pd.set_max(len(self.ids)) self.pd.value = 0 - self.db_adder = DBAdder(self.db, self.ids, self.nmap) + self.db_adder = DBAdder(self, self.db, self.ids, self.nmap) self.db_adder.start() self.last_added_at = time.time() self.entry_count = len(self.ids) self.continue_updating = True - QTimer.singleShot(200, self.update) + single_shot(self.update) def canceled(self): self.continue_updating = False @@ -260,14 +281,14 @@ class Adder(QObject): # {{{ if self.worker is not None: self.worker.canceled = True if hasattr(self, 'db_adder'): - self.db_adder.end = True + self.db_adder.end() self.pd.hide() if not self.callback_called: self.callback(self.paths, self.names, self.infos) self.callback_called = True def duplicates_processed(self): - self.db_adder.end = True + self.db_adder.end() if not self.callback_called: self.callback(self.paths, self.names, self.infos) self.callback_called = True @@ -300,7 +321,7 @@ class Adder(QObject): # {{{ if (time.time() - self.last_added_at) > self.ADD_TIMEOUT: self.continue_updating = False self.pd.hide() - self.db_adder.end = True + self.db_adder.end() if not self.callback_called: self.callback([], [], []) self.callback_called = True @@ -311,7 +332,7 @@ class Adder(QObject): # {{{ 'find the problem book.'), show=True) if self.continue_updating: - QTimer.singleShot(200, self.update) + single_shot(self.update) def process_duplicates(self): @@ -332,11 +353,8 @@ class Adder(QObject): # {{{ self.__p_d = pd self.__d_a = DuplicatesAdder(self._parent, self.db, duplicates, self.db_adder) - self.connect(self.__d_a, SIGNAL('added(PyQt_PyObject)'), - pd.setValue) - self.connect(self.__d_a, SIGNAL('adding_done()'), - self.duplicates_processed) - self.__d_a.start() + self.__d_a.added.connect(pd.setValue) + self.__d_a.adding_done.connect(self.duplicates_processed) else: return self.duplicates_processed() @@ -407,14 +425,12 @@ class Saver(QObject): # {{{ self.worker = SaveWorker(self.rq, db, self.ids, path, self.opts, spare_server=self.spare_server) self.pd.canceled_signal.connect(self.canceled) - self.timer = QTimer(self) - self.connect(self.timer, SIGNAL('timeout()'), self.update) - self.timer.start(200) + self.continue_updating = True + single_shot(self.update) def canceled(self): - if self.timer is not None: - self.timer.stop() + self.continue_updating = False if self.worker is not None: self.worker.canceled = True self.pd.hide() @@ -424,27 +440,35 @@ class Saver(QObject): # {{{ def update(self): - if not self.ids or not self.worker.is_alive(): - self.timer.stop() - self.pd.hide() + if not self.continue_updating: + return + if not self.worker.is_alive(): + # Check that all ids were processed while self.ids: + # Get all queued results since worker is dead before = len(self.ids) self.get_result() if before == len(self.ids): + # No results available => worker died unexpectedly for i in list(self.ids): self.failures.add(('id:%d'%i, 'Unknown error')) self.ids.remove(i) - break + + if not self.ids: + self.continue_updating = False + self.pd.hide() if not self.callback_called: try: - self.worker.join(1.5) + # Give the worker time to clean up and set worker.error + self.worker.join(2) except: pass # The worker was not yet started - self.callback(self.worker.path, self.failures, self.worker.error) self.callback_called = True - return + self.callback(self.worker.path, self.failures, self.worker.error) - self.get_result() + if self.continue_updating: + self.get_result() + single_shot(self.update) def get_result(self): From e20d092ba01b38971990f6c9646b1d72458bcad6 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Tue, 7 Dec 2010 11:09:06 -0700 Subject: [PATCH 352/375] Adding books: Dont refresh the Tag Browser while adding multiple books. Should speed up the adding of large numbers of books. --- src/calibre/gui2/actions/add.py | 4 ++++ src/calibre/gui2/tag_view.py | 3 +++ 2 files changed, 7 insertions(+) diff --git a/src/calibre/gui2/actions/add.py b/src/calibre/gui2/actions/add.py index 9b348d8285..014fa573d2 100644 --- a/src/calibre/gui2/actions/add.py +++ b/src/calibre/gui2/actions/add.py @@ -61,6 +61,7 @@ class AddAction(InterfaceAction): self._adder = Adder(self.gui, self.gui.library_view.model().db, self.Dispatcher(self._files_added), spare_server=self.gui.spare_server) + self.gui.tags_view.disable_recounting = True self._adder.add_recursive(root, single) def add_recursive_single(self, *args): @@ -201,9 +202,11 @@ class AddAction(InterfaceAction): self._adder = Adder(self.gui, None if to_device else self.gui.library_view.model().db, self.Dispatcher(self.__adder_func), spare_server=self.gui.spare_server) + self.gui.tags_view.disable_recounting = True self._adder.add(paths) def _files_added(self, paths=[], names=[], infos=[], on_card=None): + self.gui.tags_view.disable_recounting = False if paths: self.gui.upload_books(paths, list(map(ascii_filename, names)), @@ -214,6 +217,7 @@ class AddAction(InterfaceAction): self.gui.library_view.model().books_added(self._adder.number_of_books_added) if hasattr(self.gui, 'db_images'): self.gui.db_images.reset() + self.gui.tags_view.recount() if getattr(self._adder, 'merged_books', False): books = u'\n'.join([x if isinstance(x, unicode) else x.decode(preferred_encoding, 'replace') for x in diff --git a/src/calibre/gui2/tag_view.py b/src/calibre/gui2/tag_view.py index fdae1bdbc9..2ede698c85 100644 --- a/src/calibre/gui2/tag_view.py +++ b/src/calibre/gui2/tag_view.py @@ -73,6 +73,7 @@ class TagsView(QTreeView): # {{{ def __init__(self, parent=None): QTreeView.__init__(self, parent=None) self.tag_match = None + self.disable_recounting = False self.setUniformRowHeights(True) self.setCursor(Qt.PointingHandCursor) self.setIconSize(QSize(30, 30)) @@ -299,6 +300,8 @@ class TagsView(QTreeView): # {{{ return self.isExpanded(idx) def recount(self, *args): + if self.disable_recounting: + return self.refresh_signal_processed = True ci = self.currentIndex() if not ci.isValid(): From 418b036d4fa1456f56f95258c7abebe112d77f47 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Tue, 7 Dec 2010 13:19:48 -0700 Subject: [PATCH 353/375] ... --- src/calibre/web/feeds/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/web/feeds/__init__.py b/src/calibre/web/feeds/__init__.py index 8aef350498..478dd5015b 100644 --- a/src/calibre/web/feeds/__init__.py +++ b/src/calibre/web/feeds/__init__.py @@ -166,7 +166,7 @@ class Feed(object): self.articles.append(article) else: t = strftime(u'%a, %d %b, %Y %H:%M', article.localtime.timetuple()) - self.logger.debug('Skipping article %s (%s) from feed %s as it is too old.'% + self.logger.debug(u'Skipping article %s (%s) from feed %s as it is too old.'% (title, t, self.title)) d = item.get('date', '') article.formatted_date = d From 403fd4d9c5b4b28c313fd269711c291c997f454a Mon Sep 17 00:00:00 2001 From: Hiroshi Miura <miurahr@linux.com> Date: Wed, 8 Dec 2010 07:52:16 +0900 Subject: [PATCH 354/375] recipe: mainichi: fix missing import --- resources/recipes/mainichi_it_news.recipe | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/recipes/mainichi_it_news.recipe b/resources/recipes/mainichi_it_news.recipe index 732e47bf8e..eddab149cd 100644 --- a/resources/recipes/mainichi_it_news.recipe +++ b/resources/recipes/mainichi_it_news.recipe @@ -1,4 +1,5 @@ from calibre.web.feeds.news import BasicNewsRecipe +import re class MainichiDailyITNews(BasicNewsRecipe): title = u'\u6bce\u65e5\u65b0\u805e(IT&\u5bb6\u96fb)' From e50c6d98a4ab0986c3065ef69841506fd81801c2 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Tue, 7 Dec 2010 17:40:54 -0700 Subject: [PATCH 355/375] Speed up deleting of large numbers of books and show progress while doing so --- src/calibre/gui2/actions/delete.py | 63 ++++++++++++++++++++++++++++-- src/calibre/gui2/library/models.py | 13 +++--- src/calibre/library/database2.py | 9 +++-- 3 files changed, 72 insertions(+), 13 deletions(-) diff --git a/src/calibre/gui2/actions/delete.py b/src/calibre/gui2/actions/delete.py index a541590fd1..1cb1828a0f 100644 --- a/src/calibre/gui2/actions/delete.py +++ b/src/calibre/gui2/actions/delete.py @@ -5,13 +5,65 @@ __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>' __docformat__ = 'restructuredtext en' -from PyQt4.Qt import QMenu +from functools import partial + +from PyQt4.Qt import QMenu, QObject, QTimer from calibre.gui2 import error_dialog from calibre.gui2.dialogs.delete_matching_from_device import DeleteMatchingFromDeviceDialog from calibre.gui2.dialogs.confirm_delete import confirm from calibre.gui2.actions import InterfaceAction +single_shot = partial(QTimer.singleShot, 10) + +class MultiDeleter(QObject): + + def __init__(self, gui, rows, callback): + from calibre.gui2.dialogs.progress import ProgressDialog + QObject.__init__(self, gui) + self.model = gui.library_view.model() + self.ids = list(map(self.model.id, rows)) + self.gui = gui + self.failures = [] + self.deleted_ids = [] + self.callback = callback + single_shot(self.delete_one) + self.pd = ProgressDialog(_('Deleting...'), parent=gui, + cancelable=False, min=0, max=len(self.ids)) + self.pd.setModal(True) + self.pd.show() + + def delete_one(self): + if not self.ids: + self.cleanup() + return + id_ = self.ids.pop() + title = 'id%d'%id_ + try: + title = self.model.db.title(id_, index_is_id=True) + self.model.db.delete_book(id_, notify=False, commit=False) + self.deleted_ids.append(id_) + except: + import traceback + self.failures.append((id_, title, traceback.format_exc())) + single_shot(self.delete_one) + self.pd.value += 1 + self.pd.set_msg(_('Deleted') + ' ' + title) + + def cleanup(self): + self.pd.hide() + self.pd = None + self.model.db.commit() + self.model.db.clean() + self.model.books_deleted() + self.gui.tags_view.recount() + self.callback(self.deleted_ids) + if self.failures: + msg = ['==>'+x[1]+'\n'+x[2] for x in self.failures] + error_dialog(self.gui, _('Failed to delete'), + _('Failed to delete some books, click the Show Details button' + ' for details.'), det_msg='\n\n'.join(msg), show=True) + class DeleteAction(InterfaceAction): name = 'Remove Books' @@ -179,8 +231,13 @@ class DeleteAction(InterfaceAction): row = None if ci.isValid(): row = ci.row() - ids_deleted = view.model().delete_books(rows) - self.library_ids_deleted(ids_deleted, row) + if len(rows) < 5: + ids_deleted = view.model().delete_books(rows) + self.library_ids_deleted(ids_deleted, row) + else: + self.__md = MultiDeleter(self.gui, rows, + partial(self.library_ids_deleted, current_row=row)) + else: if not confirm('<p>'+_('The selected books will be ' '<b>permanently deleted</b> ' diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index e82e1dddd4..8478a6d263 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -223,21 +223,22 @@ class BooksModel(QAbstractTableModel): # {{{ def by_author(self): return self.sorted_on[0] == 'authors' + def books_deleted(self): + self.count_changed() + self.clear_caches() + self.reset() + def delete_books(self, indices): ids = map(self.id, indices) for id in ids: self.db.delete_book(id, notify=False) - self.count_changed() - self.clear_caches() - self.reset() + self.books_deleted() return ids def delete_books_by_id(self, ids): for id in ids: self.db.delete_book(id) - self.count_changed() - self.clear_caches() - self.reset() + self.books_deleted() def books_added(self, num): if num > 0: diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 4efb5e6233..1229b60577 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -953,23 +953,24 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): self.notify('metadata', [id]) return True - def delete_book(self, id, notify=True): + def delete_book(self, id, notify=True, commit=True): ''' Removes book from the result cache and the underlying database. + If you set commit to False, you must call clean() manually afterwards ''' try: path = os.path.join(self.library_path, self.path(id, index_is_id=True)) except: path = None - self.data.remove(id) if path and os.path.exists(path): self.rmtree(path) parent = os.path.dirname(path) if len(os.listdir(parent)) == 0: self.rmtree(parent) self.conn.execute('DELETE FROM books WHERE id=?', (id,)) - self.conn.commit() - self.clean() + if commit: + self.conn.commit() + self.clean() self.data.books_deleted([id]) if notify: self.notify('delete', [id]) From 802b5a6a4ce76fd7c551cd42ae8bc9b9da82901a Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Tue, 7 Dec 2010 17:42:59 -0700 Subject: [PATCH 356/375] ... --- src/calibre/gui2/actions/delete.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/gui2/actions/delete.py b/src/calibre/gui2/actions/delete.py index 1cb1828a0f..f6b81831bd 100644 --- a/src/calibre/gui2/actions/delete.py +++ b/src/calibre/gui2/actions/delete.py @@ -59,7 +59,7 @@ class MultiDeleter(QObject): self.gui.tags_view.recount() self.callback(self.deleted_ids) if self.failures: - msg = ['==>'+x[1]+'\n'+x[2] for x in self.failures] + msg = ['==> '+x[1]+'\n'+x[2] for x in self.failures] error_dialog(self.gui, _('Failed to delete'), _('Failed to delete some books, click the Show Details button' ' for details.'), det_msg='\n\n'.join(msg), show=True) From 73c54d9299d3fe2e7dc8e748374ac6186c8a09f3 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Tue, 7 Dec 2010 22:39:32 -0700 Subject: [PATCH 357/375] ... --- src/calibre/gui2/actions/delete.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/calibre/gui2/actions/delete.py b/src/calibre/gui2/actions/delete.py index f6b81831bd..284c470771 100644 --- a/src/calibre/gui2/actions/delete.py +++ b/src/calibre/gui2/actions/delete.py @@ -40,7 +40,9 @@ class MultiDeleter(QObject): id_ = self.ids.pop() title = 'id%d'%id_ try: - title = self.model.db.title(id_, index_is_id=True) + title_ = self.model.db.title(id_, index_is_id=True) + if title_: + title = title self.model.db.delete_book(id_, notify=False, commit=False) self.deleted_ids.append(id_) except: From a22f18256e84a2813aeac0aa472ac4445fb7abab Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Tue, 7 Dec 2010 22:46:32 -0700 Subject: [PATCH 358/375] ... --- src/calibre/gui2/actions/delete.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/calibre/gui2/actions/delete.py b/src/calibre/gui2/actions/delete.py index 284c470771..a0f49a7e9a 100644 --- a/src/calibre/gui2/actions/delete.py +++ b/src/calibre/gui2/actions/delete.py @@ -38,11 +38,11 @@ class MultiDeleter(QObject): self.cleanup() return id_ = self.ids.pop() - title = 'id%d'%id_ + title = 'id:%d'%id_ try: title_ = self.model.db.title(id_, index_is_id=True) if title_: - title = title + title = title_ self.model.db.delete_book(id_, notify=False, commit=False) self.deleted_ids.append(id_) except: From bb91f82caa066d40261e5fa8d1614c72026ad363 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Tue, 7 Dec 2010 22:48:29 -0700 Subject: [PATCH 359/375] ImageMagick C API: Check for destroyed underlying wand objects and add a destroy method --- src/calibre/utils/magick/magick.c | 114 +++++++++++++++++++++++++++++- 1 file changed, 113 insertions(+), 1 deletion(-) diff --git a/src/calibre/utils/magick/magick.c b/src/calibre/utils/magick/magick.c index 9dac37f2ff..2a20257fba 100644 --- a/src/calibre/utils/magick/magick.c +++ b/src/calibre/utils/magick/magick.c @@ -5,6 +5,9 @@ #include "magick_constants.h" +// Ensure that the underlying MagickWand has not been deleted +#define NULL_CHECK(x) if(self->wand == NULL) {PyErr_SetString(PyExc_ValueError, "Underlying ImageMagick Wand has been destroyed"); return x; } + // magick_set_exception {{{ PyObject* magick_set_exception(MagickWand *wand) { ExceptionType ext; @@ -54,6 +57,7 @@ magick_PixelWand_new(PyTypeObject *type, PyObject *args, PyObject *kwds) static PyObject * magick_PixelWand_color_getter(magick_PixelWand *self, void *closure) { const char *fp; + NULL_CHECK(NULL); fp = PixelGetColorAsNormalizedString(self->wand); return Py_BuildValue("s", fp); } @@ -62,6 +66,8 @@ static int magick_PixelWand_color_setter(magick_PixelWand *self, PyObject *val, void *closure) { char *fmt; + NULL_CHECK(-1); + if (val == NULL) { PyErr_SetString(PyExc_TypeError, "Cannot delete PixelWand color"); return -1; @@ -80,8 +86,21 @@ magick_PixelWand_color_setter(magick_PixelWand *self, PyObject *val, void *closu // }}} +// PixelWand.destroy {{{ + +static PyObject * +magick_PixelWand_destroy(magick_PixelWand *self, PyObject *args, PyObject *kwargs) { + NULL_CHECK(NULL) + self->wand = DestroyPixelWand(self->wand); + Py_RETURN_NONE; +} +// }}} + // PixelWand attr list {{{ static PyMethodDef magick_PixelWand_methods[] = { + {"destroy", (PyCFunction)magick_PixelWand_destroy, METH_VARARGS, + "Destroy the underlying ImageMagick Wand. WARNING: After using this method, all methods on this object will raise an exception."}, + {NULL} /* Sentinel */ }; @@ -175,10 +194,21 @@ magick_DrawingWand_new(PyTypeObject *type, PyObject *args, PyObject *kwds) return (PyObject *)self; } +// DrawingWand.destroy {{{ + +static PyObject * +magick_DrawingWand_destroy(magick_DrawingWand *self, PyObject *args, PyObject *kwargs) { + NULL_CHECK(NULL) + self->wand = DestroyDrawingWand(self->wand); + Py_RETURN_NONE; +} +// }}} + // DrawingWand.font {{{ static PyObject * magick_DrawingWand_font_getter(magick_DrawingWand *self, void *closure) { const char *fp; + NULL_CHECK(NULL); fp = DrawGetFont(self->wand); return Py_BuildValue("s", fp); } @@ -186,6 +216,7 @@ magick_DrawingWand_font_getter(magick_DrawingWand *self, void *closure) { static int magick_DrawingWand_font_setter(magick_DrawingWand *self, PyObject *val, void *closure) { char *fmt; + NULL_CHECK(-1); if (val == NULL) { PyErr_SetString(PyExc_TypeError, "Cannot delete DrawingWand font"); @@ -208,11 +239,13 @@ magick_DrawingWand_font_setter(magick_DrawingWand *self, PyObject *val, void *cl // DrawingWand.font_size {{{ static PyObject * magick_DrawingWand_fontsize_getter(magick_DrawingWand *self, void *closure) { + NULL_CHECK(NULL) return Py_BuildValue("d", DrawGetFontSize(self->wand)); } static int magick_DrawingWand_fontsize_setter(magick_DrawingWand *self, PyObject *val, void *closure) { + NULL_CHECK(-1) if (val == NULL) { PyErr_SetString(PyExc_TypeError, "Cannot delete DrawingWand fontsize"); return -1; @@ -233,12 +266,14 @@ magick_DrawingWand_fontsize_setter(magick_DrawingWand *self, PyObject *val, void // DrawingWand.text_antialias {{{ static PyObject * magick_DrawingWand_textantialias_getter(magick_DrawingWand *self, void *closure) { + NULL_CHECK(NULL); if (DrawGetTextAntialias(self->wand)) Py_RETURN_TRUE; Py_RETURN_FALSE; } static int magick_DrawingWand_textantialias_setter(magick_DrawingWand *self, PyObject *val, void *closure) { + NULL_CHECK(-1); if (val == NULL) { PyErr_SetString(PyExc_TypeError, "Cannot delete DrawingWand textantialias"); return -1; @@ -253,6 +288,7 @@ magick_DrawingWand_textantialias_setter(magick_DrawingWand *self, PyObject *val, // DrawingWand.gravity {{{ static PyObject * magick_DrawingWand_gravity_getter(magick_DrawingWand *self, void *closure) { + NULL_CHECK(NULL); return Py_BuildValue("n", DrawGetGravity(self->wand)); } @@ -260,6 +296,8 @@ static int magick_DrawingWand_gravity_setter(magick_DrawingWand *self, PyObject *val, void *closure) { int grav; + NULL_CHECK(-1); + if (val == NULL) { PyErr_SetString(PyExc_TypeError, "Cannot delete DrawingWand gravity"); return -1; @@ -281,6 +319,9 @@ magick_DrawingWand_gravity_setter(magick_DrawingWand *self, PyObject *val, void // DrawingWand attr list {{{ static PyMethodDef magick_DrawingWand_methods[] = { + {"destroy", (PyCFunction)magick_DrawingWand_destroy, METH_VARARGS, + "Destroy the underlying ImageMagick Wand. WARNING: After using this method, all methods on this object will raise an exception."}, + {NULL} /* Sentinel */ }; @@ -402,6 +443,7 @@ magick_Image_load(magick_Image *self, PyObject *args, PyObject *kwargs) { Py_ssize_t dlen; MagickBooleanType res; + NULL_CHECK(NULL) if (!PyArg_ParseTuple(args, "s#", &data, &dlen)) return NULL; res = MagickReadImageBlob(self->wand, data, dlen); @@ -420,7 +462,8 @@ magick_Image_read(magick_Image *self, PyObject *args, PyObject *kwargs) { const char *data; MagickBooleanType res; - if (!PyArg_ParseTuple(args, "s", &data)) return NULL; + NULL_CHECK(NULL) + if (!PyArg_ParseTuple(args, "s", &data)) return NULL; res = MagickReadImage(self->wand, data); @@ -441,6 +484,8 @@ magick_Image_create_canvas(magick_Image *self, PyObject *args, PyObject *kwargs) PixelWand *pw; MagickBooleanType res = MagickFalse; + NULL_CHECK(NULL) + if (!PyArg_ParseTuple(args, "nns", &width, &height, &bgcolor)) return NULL; pw = NewPixelWand(); @@ -464,6 +509,8 @@ magick_Image_font_metrics(magick_Image *self, PyObject *args, PyObject *kwargs) DrawingWand *dw; double *metrics; + NULL_CHECK(NULL) + if (!PyArg_ParseTuple(args, "O!s", &magick_DrawingWandType, &dw_, &text)) return NULL; dw = ((magick_DrawingWand*)dw_)->wand; if (!IsDrawingWand(dw)) { PyErr_SetString(PyExc_TypeError, "Invalid drawing wand"); return NULL; } @@ -490,6 +537,8 @@ magick_Image_annotate(magick_Image *self, PyObject *args, PyObject *kwargs) { PyObject *dw_; DrawingWand *dw; double x, y, angle; + + NULL_CHECK(NULL) if (!PyArg_ParseTuple(args, "O!ddds", &magick_DrawingWandType, &dw_, &x, &y, &angle, &text)) return NULL; dw = ((magick_DrawingWand*)dw_)->wand; @@ -510,6 +559,8 @@ magick_Image_export(magick_Image *self, PyObject *args, PyObject *kwargs) { PyObject *ans; size_t len = 0; + NULL_CHECK(NULL) + if (!PyArg_ParseTuple(args, "s", &fmt)) return NULL; if (!MagickSetFormat(self->wand, fmt)) { @@ -533,6 +584,8 @@ magick_Image_export(magick_Image *self, PyObject *args, PyObject *kwargs) { static PyObject * magick_Image_size_getter(magick_Image *self, void *closure) { size_t width, height; + NULL_CHECK(NULL) + width = MagickGetImageWidth(self->wand); height = MagickGetImageHeight(self->wand); return Py_BuildValue("nn", width, height); @@ -545,6 +598,9 @@ magick_Image_size_setter(magick_Image *self, PyObject *val, void *closure) { double blur; MagickBooleanType res; + NULL_CHECK(-1) + + if (val == NULL) { PyErr_SetString(PyExc_TypeError, "Cannot delete image size"); return -1; @@ -592,6 +648,8 @@ magick_Image_size_setter(magick_Image *self, PyObject *val, void *closure) { static PyObject * magick_Image_format_getter(magick_Image *self, void *closure) { const char *fmt; + NULL_CHECK(NULL) + fmt = MagickGetImageFormat(self->wand); return Py_BuildValue("s", fmt); } @@ -599,6 +657,8 @@ magick_Image_format_getter(magick_Image *self, void *closure) { static int magick_Image_format_setter(magick_Image *self, PyObject *val, void *closure) { char *fmt; + NULL_CHECK(-1) + if (val == NULL) { PyErr_SetString(PyExc_TypeError, "Cannot delete image format"); @@ -628,6 +688,8 @@ magick_Image_distort(magick_Image *self, PyObject *args, PyObject *kwargs) { MagickBooleanType res; double *arguments = NULL; + NULL_CHECK(NULL) + if (!PyArg_ParseTuple(args, "iOO", &method, &argv, &bestfit)) return NULL; if (!PySequence_Check(argv)) { PyErr_SetString(PyExc_TypeError, "arguments must be a sequence"); return NULL; } @@ -658,6 +720,8 @@ static PyObject * magick_Image_trim(magick_Image *self, PyObject *args, PyObject *kwargs) { double fuzz; + NULL_CHECK(NULL) + if (!PyArg_ParseTuple(args, "d", &fuzz)) return NULL; if (!MagickTrimImage(self->wand, fuzz)) return magick_set_exception(self->wand); @@ -672,6 +736,8 @@ static PyObject * magick_Image_thumbnail(magick_Image *self, PyObject *args, PyObject *kwargs) { Py_ssize_t width, height; + NULL_CHECK(NULL) + if (!PyArg_ParseTuple(args, "nn", &width, &height)) return NULL; if (!MagickThumbnailImage(self->wand, width, height)) return magick_set_exception(self->wand); @@ -686,6 +752,8 @@ static PyObject * magick_Image_crop(magick_Image *self, PyObject *args, PyObject *kwargs) { Py_ssize_t width, height, x, y; + NULL_CHECK(NULL) + if (!PyArg_ParseTuple(args, "nnnn", &width, &height, &x, &y)) return NULL; if (!MagickCropImage(self->wand, width, height, x, y)) return magick_set_exception(self->wand); @@ -701,6 +769,8 @@ magick_Image_set_border_color(magick_Image *self, PyObject *args, PyObject *kwar PyObject *obj; magick_PixelWand *pw; + NULL_CHECK(NULL) + if (!PyArg_ParseTuple(args, "O!", &magick_PixelWandType, &obj)) return NULL; pw = (magick_PixelWand*)obj; if (!IsPixelWand(pw->wand)) { PyErr_SetString(PyExc_TypeError, "Invalid PixelWand"); return NULL; } @@ -719,6 +789,8 @@ magick_Image_rotate(magick_Image *self, PyObject *args, PyObject *kwargs) { magick_PixelWand *pw; double degrees; + NULL_CHECK(NULL) + if (!PyArg_ParseTuple(args, "O!d", &magick_PixelWandType, &obj, °rees)) return NULL; pw = (magick_PixelWand*)obj; if (!IsPixelWand(pw->wand)) { PyErr_SetString(PyExc_TypeError, "Invalid PixelWand"); return NULL; } @@ -735,6 +807,8 @@ static PyObject * magick_Image_set_page(magick_Image *self, PyObject *args, PyObject *kwargs) { Py_ssize_t width, height, x, y; + NULL_CHECK(NULL) + if (!PyArg_ParseTuple(args, "nnnn", &width, &height, &x, &y)) return NULL; if (!MagickSetImagePage(self->wand, width, height, x, y)) return magick_set_exception(self->wand); @@ -749,6 +823,8 @@ static PyObject * magick_Image_set_compression_quality(magick_Image *self, PyObject *args, PyObject *kwargs) { Py_ssize_t quality; + NULL_CHECK(NULL) + if (!PyArg_ParseTuple(args, "n", &quality)) return NULL; if (!MagickSetImageCompressionQuality(self->wand, quality)) return magick_set_exception(self->wand); @@ -767,6 +843,8 @@ magick_Image_has_transparent_pixels(magick_Image *self, PyObject *args, PyObject size_t r, c, width, height; double alpha; + NULL_CHECK(NULL) + height = MagickGetImageHeight(self->wand); pi = NewPixelIterator(self->wand); @@ -790,6 +868,8 @@ magick_Image_has_transparent_pixels(magick_Image *self, PyObject *args, PyObject static PyObject * magick_Image_normalize(magick_Image *self, PyObject *args, PyObject *kwargs) { + NULL_CHECK(NULL) + if (!MagickNormalizeImage(self->wand)) return magick_set_exception(self->wand); Py_RETURN_NONE; @@ -804,6 +884,8 @@ magick_Image_add_border(magick_Image *self, PyObject *args, PyObject *kwargs) { PyObject *obj; magick_PixelWand *pw; + NULL_CHECK(NULL) + if (!PyArg_ParseTuple(args, "O!nn", &magick_PixelWandType, &obj, &dx, &dy)) return NULL; pw = (magick_PixelWand*)obj; if (!IsPixelWand(pw->wand)) { PyErr_SetString(PyExc_TypeError, "Invalid PixelWand"); return NULL; } @@ -820,6 +902,8 @@ static PyObject * magick_Image_sharpen(magick_Image *self, PyObject *args, PyObject *kwargs) { double radius, sigma; + NULL_CHECK(NULL) + if (!PyArg_ParseTuple(args, "dd", &radius, &sigma)) return NULL; if (!MagickSharpenImage(self->wand, radius, sigma)) return magick_set_exception(self->wand); @@ -835,6 +919,9 @@ magick_Image_quantize(magick_Image *self, PyObject *args, PyObject *kwargs) { Py_ssize_t number_colors, treedepth; int colorspace; PyObject *dither, *measure_error; + + NULL_CHECK(NULL) + if (!PyArg_ParseTuple(args, "ninOO", &number_colors, &colorspace, &treedepth, &dither, &measure_error)) return NULL; @@ -848,6 +935,8 @@ magick_Image_quantize(magick_Image *self, PyObject *args, PyObject *kwargs) { static PyObject * magick_Image_despeckle(magick_Image *self, PyObject *args, PyObject *kwargs) { + NULL_CHECK(NULL) + if (!MagickDespeckleImage(self->wand)) return magick_set_exception(self->wand); Py_RETURN_NONE; @@ -857,6 +946,8 @@ magick_Image_despeckle(magick_Image *self, PyObject *args, PyObject *kwargs) { // Image.type {{{ static PyObject * magick_Image_type_getter(magick_Image *self, void *closure) { + NULL_CHECK(NULL) + return Py_BuildValue("n", MagickGetImageType(self->wand)); } @@ -864,6 +955,8 @@ static int magick_Image_type_setter(magick_Image *self, PyObject *val, void *closure) { int type; + NULL_CHECK(-1) + if (val == NULL) { PyErr_SetString(PyExc_TypeError, "Cannot delete image type"); return -1; @@ -885,8 +978,21 @@ magick_Image_type_setter(magick_Image *self, PyObject *val, void *closure) { // }}} +// Image.destroy {{{ + +static PyObject * +magick_Image_destroy(magick_Image *self, PyObject *args, PyObject *kwargs) { + NULL_CHECK(NULL) + self->wand = DestroyMagickWand(self->wand); + Py_RETURN_NONE; +} +// }}} + // Image attr list {{{ static PyMethodDef magick_Image_methods[] = { + {"destroy", (PyCFunction)magick_Image_destroy, METH_VARARGS, + "Destroy the underlying ImageMagick Wand. WARNING: After using this method, all methods on this object will raise an exception."}, + {"load", (PyCFunction)magick_Image_load, METH_VARARGS, "Load an image from a byte buffer (string)" }, @@ -1001,6 +1107,7 @@ static PyGetSetDef magick_Image_getsetters[] = { // }}} + static PyTypeObject magick_ImageType = { // {{{ PyObject_HEAD_INIT(NULL) 0, /*ob_size*/ @@ -1053,6 +1160,9 @@ magick_Image_compose(magick_Image *self, PyObject *args, PyObject *kwargs) magick_Image *src; MagickBooleanType res = MagickFalse; + NULL_CHECK(NULL) + + if (!PyArg_ParseTuple(args, "O!nnO", &magick_ImageType, &img, &left, &top, &op_)) return NULL; src = (magick_Image*)img; if (!IsMagickWand(src->wand)) {PyErr_SetString(PyExc_TypeError, "Not a valid ImageMagick wand"); return NULL;} @@ -1078,6 +1188,8 @@ magick_Image_copy(magick_Image *self, PyObject *args, PyObject *kwargs) PyObject *img; magick_Image *src; + NULL_CHECK(NULL) + if (!PyArg_ParseTuple(args, "O!", &magick_ImageType, &img)) return NULL; src = (magick_Image*)img; if (!IsMagickWand(src->wand)) {PyErr_SetString(PyExc_TypeError, "Not a valid ImageMagick wand"); return NULL;} From 548be9fd6b40eecc16de31a3042459f641eaf82a Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Tue, 7 Dec 2010 22:50:55 -0700 Subject: [PATCH 360/375] ... --- src/calibre/utils/magick/magick.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/calibre/utils/magick/magick.c b/src/calibre/utils/magick/magick.c index 2a20257fba..fd9563529a 100644 --- a/src/calibre/utils/magick/magick.c +++ b/src/calibre/utils/magick/magick.c @@ -1265,3 +1265,4 @@ initmagick(void) MagickWandGenesis(); } // }}} + From 4e4c2b7e68d38cdc0c4cbb4303c74d88530cf2b2 Mon Sep 17 00:00:00 2001 From: Hiroshi Miura <miurahr@linux.com> Date: Wed, 8 Dec 2010 23:43:54 +0900 Subject: [PATCH 361/375] recipes: fix errors and styles --- resources/recipes/the_h.recipe | 8 +++++- resources/recipes/toyokeizai.recipe | 38 +++++++++++++++-------------- 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/resources/recipes/the_h.recipe b/resources/recipes/the_h.recipe index dbfad7e32a..28a1571dc5 100644 --- a/resources/recipes/the_h.recipe +++ b/resources/recipes/the_h.recipe @@ -14,7 +14,7 @@ class TheHeiseOnline(BasicNewsRecipe): oldest_article = 3 description = 'In association with Heise Online' publisher = 'Heise Media UK Ltd.' - category = 'news, technology, security' + category = 'news, technology, security, OSS, internet' max_articles_per_feed = 100 language = 'en' encoding = 'utf-8' @@ -27,6 +27,12 @@ class TheHeiseOnline(BasicNewsRecipe): feeds = [ (u'The H News Feed', u'http://www.h-online.com/news/atom.xml') ] + cover_url = 'http://www.h-online.com/icons/logo_theH.gif' + + remove_tags = [ + dict(id="logo"), + dict(id="footer") + ] def print_version(self, url): return url + '?view=print' diff --git a/resources/recipes/toyokeizai.recipe b/resources/recipes/toyokeizai.recipe index 3aed2b2202..395a8bb9b7 100644 --- a/resources/recipes/toyokeizai.recipe +++ b/resources/recipes/toyokeizai.recipe @@ -17,35 +17,44 @@ class Toyokeizai(BasicNewsRecipe): category = 'economy, magazine, japan' language = 'ja' encoding = 'euc-jp' - index = 'http://www.toyokeizai.net/news/' + index = 'http://member.toyokeizai.net/news/' remove_javascript = True - no_stylesheet = True + no_stylesheets = True masthead_title = u'TOYOKEIZAI' needs_subscription = True timefmt = '[%y/%m/%d]' + recursions = 5 + match_regexps =[ r'page/\d+'] - keep_only_tags = [dict(name='div', attrs={'class':['news']}), - dict(name='div', attrs={'class':["news_con"]}) + keep_only_tags = [ + dict(name='div', attrs={'class':['news']}), + dict(name='div', attrs={'class':["news_cont"]}), + dict(name='div', attrs={'class':["news_con"]}), +# dict(name='div', attrs={'class':["norightsMessage"]}) ] - remove_tags = [{'class':"mt35 mgz"}] + remove_tags = [{'class':"mt35 mgz"}, + {'class':"mt20 newzia"}, + {'class':"mt20 fontS"}, + {'class':"bk_btn_m"}, + dict(id='newzia_connect_member') + ] def parse_index(self): feeds = [] soup = self.index_to_soup(self.index) topstories = soup.find('ul',attrs={'class':'list6'}) if topstories: - newsarticles = [] - for itt in topstories.findAll('li'): + newsarticles = [] + for itt in topstories.findAll('li'): itema = itt.find('a',href=True) itemd = itt.find('span') newsarticles.append({ 'title' :itema.string ,'date' :re.compile(r"\- ").sub("",itemd.string) - ,'url' :'http://www.toyokeizai.net' + itema['href'] - # ,'description':itema['title'] - ,'description':'' + ,'url' :'http://member.toyokeizai.net' + itema['href'] + ,'description':itema['title'] }) - feeds.append(('news', newsarticles)) + feeds.append(('news', newsarticles)) return feeds def get_browser(self): @@ -57,10 +66,3 @@ class Toyokeizai(BasicNewsRecipe): br['password'] = self.password res = br.submit() return br - - def is_link_wanted(url,tag): - if re.compile(r'page//[0-9]+//$').search(url): - return True - return False - - From ecbdbbb006c7380b6ece21dbf78bec2050f442f7 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Wed, 8 Dec 2010 09:32:41 -0700 Subject: [PATCH 362/375] Ming Pao updated --- resources/recipes/ming_pao.recipe | 151 ++++++++++++++++++------------ 1 file changed, 89 insertions(+), 62 deletions(-) diff --git a/resources/recipes/ming_pao.recipe b/resources/recipes/ming_pao.recipe index 385dbdbdb7..726181f57b 100644 --- a/resources/recipes/ming_pao.recipe +++ b/resources/recipes/ming_pao.recipe @@ -1,8 +1,9 @@ __license__ = 'GPL v3' __copyright__ = '2010, Eddie Lau' ''' -modified from Singtao Toronto calibre recipe by rty Change Log: +2010/12/07: add entertainment section, use newspaper front page as ebook cover, suppress date display in section list + (to avoid wrong date display in case the user generates the ebook in a time zone different from HKT) 2010/11/22: add English section, remove eco-news section which is not updated daily, correct ordering of articles 2010/11/12: add news image and eco-news section @@ -17,14 +18,15 @@ from calibre.web.feeds.recipes import BasicNewsRecipe from contextlib import nested -from calibre import __appname__, strftime +from calibre import __appname__ from calibre.ebooks.BeautifulSoup import BeautifulSoup from calibre.ebooks.metadata.opf2 import OPFCreator from calibre.ebooks.metadata.toc import TOC from calibre.ebooks.metadata import MetaInformation -from calibre.utils.date import now as nowf class MPHKRecipe(BasicNewsRecipe): + IsKindleUsed = True # to avoid generating periodical in which CJK characters can't be displayed in section/article view + title = 'Ming Pao - Hong Kong' oldest_article = 1 max_articles_per_feed = 100 @@ -39,13 +41,13 @@ class MPHKRecipe(BasicNewsRecipe): encoding = 'Big5-HKSCS' recursions = 0 conversion_options = {'linearize_tables':True} - extra_css = 'img {display: block; margin-left: auto; margin-right: auto; margin-top: 10px; margin-bottom: 10px;}' - #extra_css = 'img {float:right; margin:4px;}' + timefmt = '' + extra_css = 'img {display: block; margin-left: auto; margin-right: auto; margin-top: 10px; margin-bottom: 10px;} font>b {font-size:200%; font-weight:bold;}' masthead_url = 'http://news.mingpao.com/image/portals_top_logo_news.gif' keep_only_tags = [dict(name='h1'), - #dict(name='font', attrs={'style':['font-size:14pt; line-height:160%;']}), # for entertainment page + dict(name='font', attrs={'style':['font-size:14pt; line-height:160%;']}), # for entertainment page title dict(attrs={'class':['photo']}), - dict(attrs={'id':['newscontent']}), + dict(attrs={'id':['newscontent']}), # entertainment page content dict(attrs={'id':['newscontent01','newscontent02']})] remove_tags = [dict(name='style'), dict(attrs={'id':['newscontent135']})] # for the finance page @@ -55,51 +57,68 @@ class MPHKRecipe(BasicNewsRecipe): lambda match: '<h1>'), (re.compile(r'</h5>', re.DOTALL|re.IGNORECASE), lambda match: '</h1>'), + (re.compile(r'<p><a href=.+?</a></p>', re.DOTALL|re.IGNORECASE), # for entertainment page + lambda match: '') ] def image_url_processor(cls, baseurl, url): # trick: break the url at the first occurance of digit, add an additional # '_' at the front # not working, may need to move this to preprocess_html() method - #minIdx = 10000 - #i0 = url.find('0') - #if i0 >= 0 and i0 < minIdx: - # minIdx = i0 - #i1 = url.find('1') - #if i1 >= 0 and i1 < minIdx: - # minIdx = i1 - #i2 = url.find('2') - #if i2 >= 0 and i2 < minIdx: - # minIdx = i2 - #i3 = url.find('3') - #if i3 >= 0 and i0 < minIdx: - # minIdx = i3 - #i4 = url.find('4') - #if i4 >= 0 and i4 < minIdx: - # minIdx = i4 - #i5 = url.find('5') - #if i5 >= 0 and i5 < minIdx: - # minIdx = i5 - #i6 = url.find('6') - #if i6 >= 0 and i6 < minIdx: - # minIdx = i6 - #i7 = url.find('7') - #if i7 >= 0 and i7 < minIdx: - # minIdx = i7 - #i8 = url.find('8') - #if i8 >= 0 and i8 < minIdx: - # minIdx = i8 - #i9 = url.find('9') - #if i9 >= 0 and i9 < minIdx: - # minIdx = i9 - #return url[0:minIdx] + '_' + url[minIdx+1:] +# minIdx = 10000 +# i0 = url.find('0') +# if i0 >= 0 and i0 < minIdx: +# minIdx = i0 +# i1 = url.find('1') +# if i1 >= 0 and i1 < minIdx: +# minIdx = i1 +# i2 = url.find('2') +# if i2 >= 0 and i2 < minIdx: +# minIdx = i2 +# i3 = url.find('3') +# if i3 >= 0 and i0 < minIdx: +# minIdx = i3 +# i4 = url.find('4') +# if i4 >= 0 and i4 < minIdx: +# minIdx = i4 +# i5 = url.find('5') +# if i5 >= 0 and i5 < minIdx: +# minIdx = i5 +# i6 = url.find('6') +# if i6 >= 0 and i6 < minIdx: +# minIdx = i6 +# i7 = url.find('7') +# if i7 >= 0 and i7 < minIdx: +# minIdx = i7 +# i8 = url.find('8') +# if i8 >= 0 and i8 < minIdx: +# minIdx = i8 +# i9 = url.find('9') +# if i9 >= 0 and i9 < minIdx: +# minIdx = i9 return url - def get_fetchdate(self): + def get_dtlocal(self): dt_utc = datetime.datetime.utcnow() # convert UTC to local hk time - at around HKT 6.00am, all news are available dt_local = dt_utc - datetime.timedelta(-2.0/24) - return dt_local.strftime("%Y%m%d") + return dt_local + + def get_fetchdate(self): + return self.get_dtlocal().strftime("%Y%m%d") + + def get_fetchday(self): + # convert UTC to local hk time - at around HKT 6.00am, all news are available + return self.get_dtlocal().strftime("%d") + + def get_cover_url(self): + cover = 'http://news.mingpao.com/' + self.get_fetchdate() + '/' + self.get_fetchdate() + '_' + self.get_fetchday() + 'gacov.jpg' + br = BasicNewsRecipe.get_browser() + try: + br.open(cover) + except: + cover = None + return cover def parse_index(self): feeds = [] @@ -127,9 +146,9 @@ class MPHKRecipe(BasicNewsRecipe): # if eco_articles: # feeds.append((u'\u74b0\u4fdd Eco News', eco_articles)) # special - entertainment - #ent_articles = self.parse_ent_section('http://ol.mingpao.com/cfm/star1.cfm') - #if ent_articles: - # feeds.append(('Entertainment', ent_articles)) + ent_articles = self.parse_ent_section('http://ol.mingpao.com/cfm/star1.cfm') + if ent_articles: + feeds.append((u'\u5f71\u8996 Entertainment', ent_articles)) return feeds def parse_section(self, url): @@ -164,6 +183,7 @@ class MPHKRecipe(BasicNewsRecipe): return current_articles def parse_eco_section(self, url): + dateStr = self.get_fetchdate() soup = self.index_to_soup(url) divs = soup.findAll(attrs={'class': ['bullet']}) current_articles = [] @@ -173,23 +193,25 @@ class MPHKRecipe(BasicNewsRecipe): title = self.tag_to_string(a) url = a.get('href', False) url = 'http://tssl.mingpao.com/htm/marketing/eco/cfm/' +url - if url not in included_urls and url.rfind('Redirect') == -1: + if url not in included_urls and url.rfind('Redirect') == -1 and not url.rfind('.txt') == -1 and not url.rfind(dateStr) == -1: current_articles.append({'title': title, 'url': url, 'description':''}) included_urls.append(url) return current_articles - #def parse_ent_section(self, url): - # dateStr = self.get_fetchdate() - # soup = self.index_to_soup(url) - # a = soup.findAll('a', href=True) - # current_articles = [] - # included_urls = [] - # for i in a: - # title = self.tag_to_string(i) - # url = 'http://ol.mingpao.com/cfm/' + i.get('href', False) - # if url not in included_urls and not url.rfind('.txt') == -1 and not url.rfind(dateStr) == -1 and not title == '': - # current_articles.append({'title': title, 'url': url, 'description': ''}) - # return current_articles + def parse_ent_section(self, url): + soup = self.index_to_soup(url) + a = soup.findAll('a', href=True) + a.reverse() + current_articles = [] + included_urls = [] + for i in a: + title = self.tag_to_string(i) + url = 'http://ol.mingpao.com/cfm/' + i.get('href', False) + if (url not in included_urls) and (not url.rfind('.txt') == -1) and (not url.rfind('star') == -1): + current_articles.append({'title': title, 'url': url, 'description': ''}) + included_urls.append(url) + current_articles.reverse() + return current_articles def preprocess_html(self, soup): for item in soup.findAll(style=True): @@ -201,21 +223,26 @@ class MPHKRecipe(BasicNewsRecipe): return soup def create_opf(self, feeds, dir=None): - #super(MPHKRecipe,self).create_opf(feeds, dir) + if self.IsKindleUsed == False: + super(MPHKRecipe,self).create_opf(feeds, dir) + return if dir is None: dir = self.output_dir title = self.short_title() - if self.output_profile.periodical_date_in_title: - title += strftime(self.timefmt) + title += ' ' + self.get_fetchdate() + #if self.output_profile.periodical_date_in_title: + # title += strftime(self.timefmt) mi = MetaInformation(title, [__appname__]) mi.publisher = __appname__ mi.author_sort = __appname__ mi.publication_type = self.publication_type+':'+self.short_title() - mi.timestamp = nowf() + #mi.timestamp = nowf() + mi.timestamp = self.get_dtlocal() mi.comments = self.description if not isinstance(mi.comments, unicode): mi.comments = mi.comments.decode('utf-8', 'replace') - mi.pubdate = nowf() + #mi.pubdate = nowf() + mi.pubdate = self.get_dtlocal() opf_path = os.path.join(dir, 'index.opf') ncx_path = os.path.join(dir, 'index.ncx') opf = OPFCreator(dir, mi) From 388d448008ddd5c551d21a281e54f8cb24932ad0 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Wed, 8 Dec 2010 09:34:45 -0700 Subject: [PATCH 363/375] Cleanup save_cover_data_to --- src/calibre/utils/magick/draw.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/calibre/utils/magick/draw.py b/src/calibre/utils/magick/draw.py index d3cbd58c7d..c03a8660c8 100644 --- a/src/calibre/utils/magick/draw.py +++ b/src/calibre/utils/magick/draw.py @@ -54,19 +54,23 @@ def save_cover_data_to(data, path, bgcolor='#ffffff', resize_to=None, changed = True if not changed: changed = fmt != orig_fmt + + ret = None if return_data: + ret = data if changed: if hasattr(img, 'set_compression_quality') and fmt == 'jpg': img.set_compression_quality(compression_quality) - return img.export(fmt) - return data - if changed: - if hasattr(img, 'set_compression_quality') and fmt == 'jpg': - img.set_compression_quality(compression_quality) - img.save(path) + ret = img.export(fmt) else: - with lopen(path, 'wb') as f: - f.write(data) + if changed: + if hasattr(img, 'set_compression_quality') and fmt == 'jpg': + img.set_compression_quality(compression_quality) + img.save(path) + else: + with lopen(path, 'wb') as f: + f.write(data) + return ret def thumbnail(data, width=120, height=120, bgcolor='#ffffff', fmt='jpg'): img = Image() From e126ddc5180f07fc30e320cdbddc704a99c028d4 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Wed, 8 Dec 2010 10:09:52 -0700 Subject: [PATCH 364/375] Fix bug in cover cache that could cause it to keep a large number of covers in memory. Showed up when adding large numbers of books to calibre. Fixes #7813 (errors found in terminal after latest stable Calibre closed) --- src/calibre/library/caches.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/calibre/library/caches.py b/src/calibre/library/caches.py index 5b6b79e3df..e19dd8c1ae 100644 --- a/src/calibre/library/caches.py +++ b/src/calibre/library/caches.py @@ -129,6 +129,7 @@ class CoverCache(Thread): # {{{ self.keep_running = True self.cache = {} self.lock = RLock() + self.allowed_ids = frozenset([]) self.null_image = QImage() def stop(self): @@ -175,6 +176,9 @@ class CoverCache(Thread): # {{{ break for id_ in ids: time.sleep(0.050) # Limit 20/second to not overwhelm the GUI + with self.lock: + if id_ not in self.allowed_ids: + continue try: img = self._image_for_id(id_) except: @@ -193,6 +197,7 @@ class CoverCache(Thread): # {{{ def set_cache(self, ids): with self.lock: + self.allowed_ids = frozenset(ids) already_loaded = set([]) for id in self.cache.keys(): if id in ids: From a48395b9dbc3f61db85bfa4b6639f2573152d4e2 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Wed, 8 Dec 2010 11:28:10 -0700 Subject: [PATCH 365/375] Cover cache: more fixes --- src/calibre/library/caches.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/calibre/library/caches.py b/src/calibre/library/caches.py index e19dd8c1ae..a99c9df125 100644 --- a/src/calibre/library/caches.py +++ b/src/calibre/library/caches.py @@ -176,6 +176,8 @@ class CoverCache(Thread): # {{{ break for id_ in ids: time.sleep(0.050) # Limit 20/second to not overwhelm the GUI + if not self.keep_running: + return with self.lock: if id_ not in self.allowed_ids: continue @@ -218,8 +220,9 @@ class CoverCache(Thread): # {{{ def refresh(self, ids): with self.lock: for id_ in ids: - self.cache.pop(id_, None) - self.load_queue.put(id_) + cover = self.cache.pop(id_, None) + if cover is not None: + self.load_queue.put(id_) # }}} ### Global utility function for get_match here and in gui2/library.py From ceca43448356281cb8fbbece9e91d48d62cf98fc Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Thu, 9 Dec 2010 09:04:45 -0700 Subject: [PATCH 366/375] Updated Le Monde --- resources/recipes/le_monde.recipe | 206 ++-- src/calibre/translations/calibre.pot | 1429 +++++++++++++++----------- 2 files changed, 895 insertions(+), 740 deletions(-) diff --git a/resources/recipes/le_monde.recipe b/resources/recipes/le_monde.recipe index 38360ce48e..18be6ca711 100644 --- a/resources/recipes/le_monde.recipe +++ b/resources/recipes/le_monde.recipe @@ -1,106 +1,89 @@ -#!/usr/bin/env python - -__license__ = 'GPL v3' -__copyright__ = '2008, Mathieu Godlewski <mathieu at godlewski.fr>' -''' -lemonde.fr -''' - import re -from calibre.web.feeds.news import BasicNewsRecipe - +from calibre.web.feeds.recipes import BasicNewsRecipe class LeMonde(BasicNewsRecipe): - title = 'LeMonde.fr' - __author__ = 'Mathieu Godlewski and Sujata Raman' - description = 'Global news in french' - oldest_article = 3 - language = 'fr' + title = 'Le Monde' + __author__ = 'veezh' + description = 'Actualités' + oldest_article = 1 + max_articles_per_feed = 100 + no_stylesheets = True + #delay = 1 + use_embedded_content = False + encoding = 'cp1252' + publisher = 'lemonde.fr' + language = 'fr' + conversion_options = { + 'comments' : description + ,'language' : language + ,'publisher' : publisher + ,'linearize_tables': True + } - max_articles_per_feed = 30 - no_stylesheets = True - remove_javascript = True + remove_empty_feeds = True + filterDuplicates = True - # cover_url='http://abonnes.lemonde.fr/titresdumonde/'+date.today().strftime("%y%m%d")+'/1.jpg' + def preprocess_html(self, soup): + for alink in soup.findAll('a'): + if alink.string is not None: + tstr = alink.string + alink.replaceWith(tstr) + return soup - - extra_css = ''' - .dateline{color:#666666;font-family:verdana,sans-serif;font-size:x-small;} - .author{font-family:verdana,sans-serif;font-size:x-small;color:#222222;} - .articleImage{color:#666666;font-family:verdana,sans-serif;font-size:x-small;} - .mainText{font-family:Georgia,serif;color:#222222;} - .LM_articleText{font-family:Arial,Helvetica,sans-serif;} - .LM_titleZone{font-family:Arial,Helvetica,sans-serif;} - .mainContent{font-family:Georgia,serif;} - .LM_content{font-family:Georgia,serif;} - .LM_caption{font-family:Georgia,serif;font-size:-small;} - .LM_imageSource{font-family:Arial,Helvetica,sans-serif;font-size:x-small;color:#666666;} - h1{font-family:Arial,Helvetica,sans-serif;font-size:medium;color:#000000;} - .post{font-family:Arial,Helvetica,sans-serif;} - .mainTitle{font-family:Georgia,serif;} - .content{font-family:Georgia,serif;} - .entry{font-family:Georgia,serif;} - h2{font-family:Arial,Helvetica,sans-serif;font-size:large;} - small{font-family:Arial,Helvetica,sans-serif; color:#ED1B23;} - ''' - - feeds = [ - ('A la Une', 'http://www.lemonde.fr/rss/une.xml'), - ('International', 'http://www.lemonde.fr/rss/sequence/0,2-3210,1-0,0.xml'), - ('Europe', 'http://www.lemonde.fr/rss/sequence/0,2-3214,1-0,0.xml'), - ('Societe', 'http://www.lemonde.fr/rss/sequence/0,2-3224,1-0,0.xml'), - ('Economie', 'http://www.lemonde.fr/rss/sequence/0,2-3234,1-0,0.xml'), - ('Medias', 'http://www.lemonde.fr/rss/sequence/0,2-3236,1-0,0.xml'), - ('Rendez-vous', 'http://www.lemonde.fr/rss/sequence/0,2-3238,1-0,0.xml'), - ('Sports', 'http://www.lemonde.fr/rss/sequence/0,2-3242,1-0,0.xml'), - ('Planete', 'http://www.lemonde.fr/rss/sequence/0,2-3244,1-0,0.xml'), - ('Culture', 'http://www.lemonde.fr/rss/sequence/0,2-3246,1-0,0.xml'), - ('Technologies', 'http://www.lemonde.fr/rss/sequence/0,2-651865,1-0,0.xml'), - ('Cinema', 'http://www.lemonde.fr/rss/sequence/0,2-3476,1-0,0.xml'), - ('Voyages', 'http://www.lemonde.fr/rss/sequence/0,2-3546,1-0,0.xml'), - ('Livres', 'http://www.lemonde.fr/rss/sequence/0,2-3260,1-0,0.xml'), - ('Examens', 'http://www.lemonde.fr/rss/sequence/0,2-3404,1-0,0.xml'), - ('Opinions', 'http://www.lemonde.fr/rss/sequence/0,2-3232,1-0,0.xml') - ] - keep_only_tags = [dict(name='div', attrs={'id':["mainTitle","mainContent","LM_content","content"]}), - dict(name='div', attrs={'class':["post"]}) - ] - - remove_tags = [dict(name='img', attrs={'src':'http://medias.lemonde.fr/mmpub/img/lgo/lemondefr_pet.gif'}), - dict(name='div', attrs={'id':'xiti-logo-noscript'}), - dict(name='br', attrs={}), - dict(name='iframe', attrs={}), - dict(name='table', attrs={'id':["toolBox"]}), - dict(name='table', attrs={'class':["bottomToolBox"]}), - dict(name='div', attrs={'class':["pageNavigation","LM_pagination","fenetreBoxesContainer","breakingNews","LM_toolsBottom","LM_comments","LM_tools","pave_meme_sujet_hidden","boxMemeSujet"]}), - dict(name='div', attrs={'id':["miniUne","LM_sideBar"]}), - ] - - preprocess_regexps = [ (re.compile(i[0], re.IGNORECASE|re.DOTALL), i[1]) for i in - [ - (r'<html.*(<div class="post".*?>.*?</div>.*?<div class="entry">.*?</div>).*You can start editing here.*</html>', lambda match : '<html><body>'+match.group(1)+'</body></html>'), - (r'<p> </p>', lambda match : ''), - (r'<img src="http://medias\.lemonde\.fr/mmpub/img/let/(.)\.gif"[^>]*><div class=ar-txt>', lambda match : '<div class=ar-txt>'+match.group(1).upper()), - (r'<img src="http://medias\.lemonde\.fr/mmpub/img/let/q(.)\.gif"[^>]*><div class=ar-txt>', lambda match : '<div class=ar-txt>"'+match.group(1).upper()), - (r'(<div class=desc><b>.*</b></div>).*</body>', lambda match : match.group(1)), + preprocess_regexps = [ + (re.compile(r' \''), lambda match: ' ‘'), + (re.compile(r'\''), lambda match: '’'), + (re.compile(r'"<'), lambda match: ' »<'), + (re.compile(r'>"'), lambda match: '>« '), + (re.compile(r'’"'), lambda match: '’« '), + (re.compile(r' "'), lambda match: ' « '), + (re.compile(r'" '), lambda match: ' » '), + (re.compile(r'\("'), lambda match: '(« '), + (re.compile(r'"\)'), lambda match: ' »)'), + (re.compile(r'"\.'), lambda match: ' ».'), + (re.compile(r'",'), lambda match: ' »,'), + (re.compile(r'"\?'), lambda match: ' »?'), + (re.compile(r'":'), lambda match: ' »:'), + (re.compile(r'";'), lambda match: ' »;'), + (re.compile(r'"\!'), lambda match: ' »!'), + (re.compile(r' :'), lambda match: ' :'), + (re.compile(r' ;'), lambda match: ' ;'), + (re.compile(r' \?'), lambda match: ' ?'), + (re.compile(r' \!'), lambda match: ' !'), + (re.compile(r'\s»'), lambda match: ' »'), + (re.compile(r'«\s'), lambda match: '« '), + (re.compile(r' %'), lambda match: ' %'), + (re.compile(r'\.jpg » border='), lambda match: '.jpg'), + (re.compile(r'\.png » border='), lambda match: '.png'), ] - ] - article_match_regexps = [ (re.compile(i)) for i in - [ - (r'http://www\.lemonde\.fr/\S+/article/.*'), - (r'http://www\.lemonde\.fr/\S+/portfolio/.*'), - (r'http://www\.lemonde\.fr/\S+/article_interactif/.*'), - (r'http://\S+\.blog\.lemonde\.fr/.*'), - ] - ] + keep_only_tags = [ + dict(name='div', attrs={'class':['contenu']}) + ] - # def print_version(self, url): - # return re.sub('http://www\.lemonde\.fr/.*_([0-9]+)_[0-9]+\.html.*','http://www.lemonde.fr/web/imprimer_element/0,40-0,50-\\1,0.html' ,url) + remove_tags_after = [dict(id='appel_temoignage')] - # Used to filter duplicated articles - articles_list = [] + def get_article_url(self, article): + link = article.get('link') + if 'blog' not in link: + return link + + + + feeds = [ + ('A la une', 'http://www.lemonde.fr/rss/une.xml'), + ('International', 'http://www.lemonde.fr/rss/tag/international.xml'), + ('Europe', 'http://www.lemonde.fr/rss/tag/europe.xml'), + (u'Société', 'http://www.lemonde.fr/rss/tag/societe.xml'), + ('Economie', 'http://www.lemonde.fr/rss/tag/economie.xml'), + (u'Médias', 'http://www.lemonde.fr/rss/tag/actualite-medias.xml'), + (u'Planète', 'http://www.lemonde.fr/rss/tag/planete.xml'), + ('Culture', 'http://www.lemonde.fr/rss/tag/culture.xml'), + ('Technologies', 'http://www.lemonde.fr/rss/tag/technologies.xml'), + ('Livres', 'http://www.lemonde.fr/rss/tag/livres.xml'), + + ] def get_cover_url(self): cover_url = None @@ -111,42 +94,3 @@ class LeMonde(BasicNewsRecipe): cover_url = link_item.img['src'] return cover_url - - def get_article_url(self, article): - url=article.get('link', None) - url=url[0:url.find("#")] - if url in self.articles_list: - self.log_debug(_('Skipping duplicated article: %s')%url) - return False - if self.is_article_wanted(url): - self.articles_list.append(url) - if '/portfolio/' in url or '/video/' in url: - url = None - return url - self.log_debug(_('Skipping filtered article: %s')%url) - url = article.get('guid', None) - - - return False - - - def is_article_wanted(self, url): - if self.article_match_regexps: - for m in self.article_match_regexps: - if m.search(url): - return True - return False - return False - - def preprocess_html(self, soup): - - for item in soup.findAll(style=True): - del item['style'] - - for item in soup.findAll(face=True): - del item['face'] - for tag in soup.findAll(name=['ul','li']): - tag.name = 'div' - - return soup - diff --git a/src/calibre/translations/calibre.pot b/src/calibre/translations/calibre.pot index 0eeae72c07..11eb9cad49 100644 --- a/src/calibre/translations/calibre.pot +++ b/src/calibre/translations/calibre.pot @@ -5,8 +5,8 @@ msgid "" msgstr "" "Project-Id-Version: calibre 0.7.32\n" -"POT-Creation-Date: 2010-12-03 10:53+MST\n" -"PO-Revision-Date: 2010-12-03 10:53+MST\n" +"POT-Creation-Date: 2010-12-09 08:47+MST\n" +"PO-Revision-Date: 2010-12-09 08:47+MST\n" "Last-Translator: Automatically generated\n" "Language-Team: LANGUAGE\n" "MIME-Version: 1.0\n" @@ -77,9 +77,9 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:839 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:913 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:918 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:984 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:914 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:919 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:985 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:143 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:150 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:64 @@ -109,44 +109,44 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/writer.py:98 #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:305 #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:307 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:355 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:362 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:302 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:305 -#: /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/__init__.py:357 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:364 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:308 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:311 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:167 #: /home/kovid/work/calibre/src/calibre/gui2/convert/__init__.py:42 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:114 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:139 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:140 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:142 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:1039 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:1042 #: /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:671 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:163 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:675 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:193 #: /home/kovid/work/calibre/src/calibre/gui2/email.py:235 #: /home/kovid/work/calibre/src/calibre/gui2/email.py:244 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:376 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:395 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:922 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1116 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:379 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:398 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:925 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1118 #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:112 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:190 #: /home/kovid/work/calibre/src/calibre/library/cli.py:215 #: /home/kovid/work/calibre/src/calibre/library/database.py:914 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:373 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:385 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1260 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1361 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2158 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2160 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2291 +#: /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:1264 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1365 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2162 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2164 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2295 #: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:229 -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:139 -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:142 -#: /home/kovid/work/calibre/src/calibre/library/server/xml.py:78 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:140 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:143 +#: /home/kovid/work/calibre/src/calibre/library/server/xml.py:79 #: /home/kovid/work/calibre/src/calibre/utils/localization.py:118 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:46 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:64 @@ -682,9 +682,9 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:888 #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:918 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:264 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:187 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:200 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2022 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:189 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:202 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2026 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:150 msgid "News" msgstr "" @@ -692,8 +692,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2554 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:21 #: /home/kovid/work/calibre/src/calibre/library/catalog.py:560 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1985 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2003 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1989 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2007 msgid "Catalog" msgstr "" @@ -896,7 +896,7 @@ msgid "Adding books to device metadata listing..." msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:445 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:272 msgid "Not Implemented" msgstr "" @@ -1573,46 +1573,24 @@ msgstr "" msgid "When using an SVG cover, this option will cause the cover to scale to cover the available screen area, but still preserve its aspect ratio (ratio of width to height). That means there may be white borders at the sides or top and bottom of the image, but the image will never be distorted. Without this option the image may be slightly distorted, but there will be no borders." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:170 +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:173 #: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:203 msgid "Start" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/fb2ml.py:151 -#: /home/kovid/work/calibre/src/calibre/ebooks/rb/rbml.py:102 -#: /home/kovid/work/calibre/src/calibre/ebooks/txt/txtml.py:78 -msgid "Table of Contents:" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:32 msgid "Do not insert a Table of Contents at the beginning of the book." msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/output.py:21 -#: /home/kovid/work/calibre/src/calibre/ebooks/pdb/output.py:32 -#: /home/kovid/work/calibre/src/calibre/ebooks/pml/output.py:37 -#: /home/kovid/work/calibre/src/calibre/ebooks/rb/output.py:21 -#: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:36 -msgid "Add Table of Contents to beginning of the book." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/output.py:24 -msgid "Try to turn chapters into individual sections. WARNING: This option is experimental. It can cause conversion to fail. It can also produce unexpected output." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/output.py:30 -msgid "Try to turn chapters into individual sections using the internal structure of the ebook. This works well for EPUB books that have been internally split by chapter." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/output.py:35 msgid "Wrap all h1 tags with fb2 title elements." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/output.py:38 +#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/output.py:24 msgid "Wrap all h2 tags with fb2 title elements." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/output.py:41 +#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/output.py:27 msgid "Wrap all h3 tags with fb2 title elements." msgstr "" @@ -1895,6 +1873,38 @@ msgstr "" msgid "Comic" msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/amazonfr.py:26 +msgid "Downloads metadata from amazon.fr" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/amazonfr.py:43 +msgid "Downloads metadata from amazon.com in spanish" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/amazonfr.py:60 +msgid "Downloads metadata from amazon.com in english" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/amazonfr.py:77 +msgid "Downloads metadata from amazon.de" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/amazonfr.py:94 +msgid "Downloads metadata from amazon.com" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/amazonfr.py:474 +msgid "" +" %prog [options]\n" +"\n" +" Fetch book metadata from Amazon. You must specify one of title, author,\n" +" ISBN, publisher or keywords. Will fetch a maximum of 10 matches,\n" +" so you should make your query as specific as possible.\n" +" You can chose the language for metadata retrieval:\n" +" All & english & french & german & spanish\n" +" " +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/archive.py:41 msgid "Extract common e-book formats from archives (zip/rar) files. Also try to autodetect if they are actually cbz/cbr files." msgstr "" @@ -1904,13 +1914,13 @@ msgid "TEMPLATE ERROR" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:533 -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:59 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:60 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:492 msgid "No" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:533 -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:59 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:60 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:492 msgid "Yes" msgstr "" @@ -1920,26 +1930,26 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:106 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:107 #: /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:373 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:927 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:59 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:66 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:376 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:930 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:304 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:570 msgid "Title" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:608 -#: /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:378 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:928 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:381 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:931 msgid "Author(s)" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:609 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:61 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:72 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:62 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:73 msgid "Publisher" msgstr "" @@ -1949,36 +1959,36 @@ msgid "Producer" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:611 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:39 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:210 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:40 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:211 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:189 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:108 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:79 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:325 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1135 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:328 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1137 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:188 msgid "Comments" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:613 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:166 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:29 -#: /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:313 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1131 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:30 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:316 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1133 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:161 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:655 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:650 msgid "Tags" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:615 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:164 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:28 -#: /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:330 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1140 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:29 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:333 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1142 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:109 msgid "Series" msgstr "" @@ -1988,14 +1998,14 @@ msgid "Language" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:618 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1123 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1125 msgid "Timestamp" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:620 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:163 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:63 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:71 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:259 msgid "Published" msgstr "" @@ -2087,7 +2097,7 @@ msgid "No cover found" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/covers.py:28 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:44 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:45 msgid "Cover download" msgstr "" @@ -2175,6 +2185,81 @@ msgstr "" msgid "Downloads series/tags/rating information from librarything.com" msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:25 +msgid "Downloads metadata from Fictionwise" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:90 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:108 +msgid "Query: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:100 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:285 +msgid "Fictionwise timed out. Try again later." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:101 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:286 +msgid "Fictionwise encountered an error." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:219 +msgid "" +"SUMMARY:\n" +" %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:316 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:333 +msgid "Failed to get all details for an entry" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:354 +msgid "" +" %prog [options]\n" +"\n" +" Fetch book metadata from Fictionwise. You must specify one of title, author,\n" +" or keywords. No ISBN specification possible. Will fetch a maximum of 20 matches,\n" +" so you should make your query as specific as possible.\n" +" " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:362 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:363 +msgid "Book title" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:363 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:364 +msgid "Book author(s)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:364 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:365 +msgid "Book publisher" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:365 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:367 +msgid "Keywords" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:367 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:373 +msgid "Maximum number of results to fetch" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:369 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:375 +msgid "Be more verbose about errors" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:383 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:390 +msgid "No result found for this search!" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:107 msgid "" "\n" @@ -2205,7 +2290,6 @@ msgid "The publisher of the book to search for." msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:77 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:336 msgid " not found." msgstr "" @@ -2217,24 +2301,70 @@ msgid "" "Fetch a cover image/social metadata for the book identified by ISBN from LibraryThing.com\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:25 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:26 msgid "Downloads metadata from french Nicebooks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:41 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:42 msgid "Downloads covers from french Nicebooks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:332 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:118 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:242 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:320 msgid "Nicebooks timed out. Try again later." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:337 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:119 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:243 +msgid "Nicebooks encountered an error." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:323 +msgid "ISBN: %s not found." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:324 msgid "An errror occured with Nicebooks cover fetcher" msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:354 +msgid "" +" %prog [options]\n" +"\n" +" Fetch book metadata from Nicebooks. You must specify one of title, author,\n" +" ISBN, publisher or keywords. Will fetch a maximum of 20 matches,\n" +" so you should make your query as specific as possible.\n" +" It can also get covers if the option is activated.\n" +" " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:366 +msgid "Book ISBN" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:369 +msgid "Covers: 1-Check/ 2-Download" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:371 +msgid "Covers files path" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:396 +msgid "No cover found!" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:398 +msgid "A cover was found for this book" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:407 +msgid "Cover saved to file " +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1308 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1401 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 msgid "Cover" msgstr "" @@ -2271,70 +2401,70 @@ msgstr "" msgid "This is an Amazon Topaz book. It cannot be processed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1402 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 msgid "Title Page" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1403 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 #: /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:199 msgid "Table of Contents" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1404 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 msgid "Index" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1405 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 msgid "Glossary" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1406 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 msgid "Acknowledgements" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1407 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 msgid "Bibliography" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1408 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 msgid "Colophon" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1409 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 msgid "Copyright" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1410 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 msgid "Dedication" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1411 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 msgid "Epigraph" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1412 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 msgid "Foreword" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1413 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1416 msgid "List of Illustrations" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1414 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1417 msgid "List of Tables" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1415 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1418 msgid "Notes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1416 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1419 msgid "Preface" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1417 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1420 msgid "Main Text" msgstr "" @@ -2343,7 +2473,7 @@ msgid "%s format books are not supported" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/cover.py:98 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:218 msgid "Book %s of %s" msgstr "" @@ -2356,8 +2486,8 @@ msgid "Unknown publisher" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:165 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:71 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:653 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:72 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:648 msgid "Rating" msgstr "" @@ -2405,6 +2535,13 @@ msgstr "" msgid "Specify the character encoding of the output document. The default is cp1252. Note: This option is not honored by all formats." msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/pdb/output.py:32 +#: /home/kovid/work/calibre/src/calibre/ebooks/pml/output.py:37 +#: /home/kovid/work/calibre/src/calibre/ebooks/rb/output.py:21 +#: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:36 +msgid "Add Table of Contents to beginning of the book." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/input.py:24 msgid "Do not extract images from the document" msgstr "" @@ -2621,6 +2758,11 @@ msgstr "" msgid "Do not reduce the size or bit depth of images. Images have their size and depth reduced by default to accommodate applications that can not convert images on their own such as Dropbook." msgstr "" +#: /home/kovid/work/calibre/src/calibre/ebooks/rb/rbml.py:102 +#: /home/kovid/work/calibre/src/calibre/ebooks/txt/txtml.py:78 +msgid "Table of Contents:" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:256 msgid "" "This RTF file has a feature calibre does not support. Convert it to HTML first and then try it.\n" @@ -2792,39 +2934,44 @@ msgid "Overwrite author and title with new metadata" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:127 -msgid "Limit max simultaneous jobs to number of CPUs" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:101 +msgid "Automatically download the cover, if available" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:129 -msgid "tag browser categories not to display" +msgid "Limit max simultaneous jobs to number of CPUs" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:131 -msgid "The layout of the user interface" +msgid "tag browser categories not to display" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:133 -msgid "Show the average rating per item indication in the tag browser" +msgid "The layout of the user interface" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:135 +msgid "Show the average rating per item indication in the tag browser" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:137 msgid "Disable UI animations" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:183 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:185 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:509 msgid "Copied" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:219 msgid "Copy" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:219 msgid "Copy to Clipboard" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:466 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:468 msgid "Choose Files" msgstr "" @@ -2860,107 +3007,107 @@ msgstr "" msgid "Add from ISBN" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:86 msgid "How many empty books?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:87 msgid "How many empty books should be added?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:153 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:154 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:215 msgid "Uploading books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:170 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:299 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:303 msgid "Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:172 msgid "EPUB Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:173 msgid "LRF Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:174 msgid "HTML Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:175 msgid "LIT Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:176 msgid "MOBI Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:176 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:177 msgid "Topaz books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:177 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:178 msgid "Text books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:178 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:179 msgid "PDF Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:180 msgid "SNB Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:181 msgid "Comics" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:181 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:182 msgid "Archives" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:186 msgid "Supported books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:225 msgid "Merged some books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:226 msgid "Some duplicates were found and merged into the following existing books:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:235 msgid "Failed to read metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:232 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:236 msgid "Failed to read metadata from the following" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:251 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:256 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:275 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:279 msgid "Add to library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:256 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:110 #: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:28 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:94 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:135 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:126 msgid "No book selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:273 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:275 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:279 msgid "No book files found" msgstr "" @@ -2991,10 +3138,10 @@ msgstr "" #: /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:124 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:75 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:122 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:175 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:181 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:218 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:92 msgid "No books selected" msgstr "" @@ -3041,7 +3188,7 @@ msgid "Generating %s catalog..." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:59 -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:230 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:251 msgid "No books found" msgstr "" @@ -3088,8 +3235,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:148 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:51 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:162 -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:112 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:163 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:113 msgid "%d books" msgstr "" @@ -3154,7 +3301,7 @@ msgid "Note that the actual library folder will be renamed." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:278 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:190 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:191 msgid "Already exists" msgstr "" @@ -3285,7 +3432,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:147 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:664 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:699 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:701 #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:190 msgid "Failed" msgstr "" @@ -3294,88 +3441,104 @@ msgstr "" msgid "Copied %d books to %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:18 -msgid "Del" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:18 -msgid "Remove books" -msgstr "" - -#: /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:26 -msgid "Remove files of a specific format from selected books.." -msgstr "" - -#: /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:32 -msgid "Remove covers from selected books" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:35 -msgid "Remove matching books from device" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:31 +msgid "Deleting..." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:53 -msgid "Cannot delete" +msgid "Deleted" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:65 +msgid "Failed to delete" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:66 +msgid "Failed to delete some books, click the Show Details button for details." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:72 +msgid "Del" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:72 +msgid "Remove books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:78 +msgid "Remove selected books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:80 +msgid "Remove files of a specific format from selected books.." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:83 +msgid "Remove all formats from selected books, except..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:86 +msgid "Remove covers from selected books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:89 +msgid "Remove matching books from device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:107 +msgid "Cannot delete" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:120 msgid "Choose formats to be deleted" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:138 msgid "Choose formats <b>not</b> to be deleted" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:104 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:158 msgid "Cannot delete books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:159 msgid "No device is connected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:169 msgid "Main memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:170 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:467 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:476 msgid "Storage Card A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:171 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:469 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:478 msgid "Storage Card B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:176 msgid "No books to delete" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:177 msgid "None of the selected books are on the device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:140 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:200 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:194 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:259 msgid "Deleting books from device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:227 msgid "The selected books will be <b>permanently deleted</b> and the files removed from your calibre library. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:244 msgid "The selected books will be <b>permanently deleted</b> from your device. Are you sure?" msgstr "" @@ -3430,98 +3593,98 @@ msgstr "" msgid "Manage the collections on this device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:23 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:24 msgid "E" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:23 +#: /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 +#: /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:74 +#: /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:94 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:95 msgid "social 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:97 msgid "covers" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:97 #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:224 msgid "metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:98 msgid "Downloading %s for %d book(s)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:121 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:180 msgid "Cannot edit metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:211 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:217 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:220 msgid "Cannot merge books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:221 msgid "At least two books must be selected for merging" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:226 msgid "Book formats and metadata from the selected books will be added to the <b>first selected book</b> (%s). ISBN will <i>not</i> be merged.<br><br> The second and subsequently selected books will not be deleted or changed.<br><br>Please confirm you want to proceed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:232 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:238 msgid "Book formats and metadata from the selected books will be merged into the <b>first selected book</b> (%s). ISBN will <i>not</i> be merged.<br><br>After merger the second and subsequently selected books will be <b>deleted</b>. <br><br>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 <b>deleted</b> from your computer.<br><br> Are you <b>sure</b> you want to proceed?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:245 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:251 msgid "You are about to merge more than 5 books. Are you <b>sure</b> you want to proceed?" msgstr "" @@ -3649,7 +3812,7 @@ msgid "Click the show details button to see which ones." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:16 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:660 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:655 msgid "Show book details" msgstr "" @@ -3728,102 +3891,102 @@ msgid "V" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:24 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:31 msgid "View" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:33 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:32 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:174 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:165 msgid "Cannot view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:96 #: /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:116 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:107 msgid "Format unavailable" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:108 msgid "Not all the selected books were available in the %s format. You should convert them first." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:115 msgid "Multiple Books Selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:116 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 "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:125 msgid "Cannot open folder" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:166 msgid "%s has no available formats." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:68 msgid "Searching in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:198 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:221 msgid "Adding..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:234 msgid "Searching in all sub-directories..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:245 msgid "Path error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:246 msgid "The specified directory could not be processed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:250 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:813 msgid "No books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:315 msgid "Added" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:307 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:328 msgid "Adding failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:308 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:329 msgid "The add books process seems to have hung. Try restarting calibre and adding the books in smaller increments, until you find the problem book." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:323 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:344 msgid "Duplicates found!" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:324 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:345 msgid "Books with the same title as the following already exist in the database. Add them anyway?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:327 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:348 msgid "Adding duplicates..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:390 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:408 msgid "Saving..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:443 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:483 msgid "Saved" msgstr "" @@ -3962,57 +4125,57 @@ msgstr "" msgid "&Multiple books per folder, assumes every ebook file is a different book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:25 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:49 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:58 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:417 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:59 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:418 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:123 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:124 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:125 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:135 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:320 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1121 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:323 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1123 msgid "Path" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:53 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:126 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:127 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:128 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:131 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:319 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:322 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/emailp.py:24 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:118 msgid "Formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:27 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:931 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1124 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:28 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:934 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1126 msgid "Collections" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:51 -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:61 msgid "Click to open" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:52 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:312 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:318 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:324 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1130 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1134 -#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:47 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:53 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:315 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:321 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:327 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1132 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1136 +#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:48 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:78 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:83 #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:293 msgid "None" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:416 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:417 msgid "Double-click to open Book Details window" msgstr "" @@ -4065,7 +4228,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:54 #: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:53 #: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_input_ui.py:33 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:48 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:39 #: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:127 #: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:120 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:171 @@ -4421,31 +4584,15 @@ msgstr "" msgid "FB2 Output" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:49 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_output_ui.py:42 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/pmlz_output_ui.py:37 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/rb_output_ui.py:34 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:61 -msgid "&Inline TOC" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:50 -msgid "Sectionize Chapters (Use with care!)" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:51 -msgid "Sectionize Chapters using file structure" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:52 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:40 msgid "Wrap h1 tags with <title> elements" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:53 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:41 msgid "Wrap h2 tags with <title> elements" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:42 msgid "Wrap h3 tags with <title> elements" msgstr "" @@ -4645,44 +4792,44 @@ msgstr "" msgid "&Monospaced font family:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:44 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:45 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:114 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:200 msgid "Metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:47 msgid "Set the metadata. The output file will contain as much of this metadata as possible." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:168 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:170 msgid "Choose cover for " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:175 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:176 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:177 msgid "Cannot read" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:176 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:174 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:177 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:178 msgid "You do not have permission to read the file: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:184 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:191 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:182 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:192 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:186 msgid "Error reading file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:185 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:183 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:187 msgid "<p>There was an error reading from file: <br /><b>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:192 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:191 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:193 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:195 msgid " is not a valid picture" msgstr "" @@ -4864,6 +5011,13 @@ msgstr "" msgid "&Format:" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_output_ui.py:42 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/pmlz_output_ui.py:37 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/rb_output_ui.py:34 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:61 +msgid "&Inline TOC" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_input.py:12 msgid "PDF Input" msgstr "" @@ -5234,38 +5388,38 @@ msgstr "" msgid "Cover browser could not be loaded" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:59 -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:84 -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:108 -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:145 -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:164 -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:146 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:165 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:271 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:492 -#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:111 -#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:131 -#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:206 -#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:239 -#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:243 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:241 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:245 msgid "Undefined" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:123 msgid "star(s)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:124 msgid "Unrated" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:156 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:157 msgid "Set '%s' to today" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:267 msgid " index:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:332 +#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:333 msgid "The enumeration \"{0}\" contains an invalid value that will be set to the default" msgstr "" @@ -5467,14 +5621,14 @@ msgid "<p>Cannot upload books to device there is no more free space available " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget.py:89 -#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:356 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:359 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:234 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:57 msgid "Invalid template" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget.py:90 -#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:357 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:360 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:235 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:58 msgid "The template %s is invalid:" @@ -5603,7 +5757,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:134 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/bookmarkmanager.py:89 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:248 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:249 msgid "Name" msgstr "" @@ -5729,8 +5883,8 @@ 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:929 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:932 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:33 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:295 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:569 @@ -5739,7 +5893,7 @@ 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:1120 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1122 msgid "Format" msgstr "" @@ -5754,13 +5908,13 @@ msgstr "" #: #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:115 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:684 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:689 msgid "Invalid author name" msgstr "" #: #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:116 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:685 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:690 msgid "Author names cannot contain & characters." msgstr "" @@ -5789,72 +5943,80 @@ msgstr "" msgid "Recalculate all author sort values" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:61 msgid "Author Sort" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:62 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:63 msgid "ISBN" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:162 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:65 +msgid "Has Cover" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:66 +msgid "Has Summary" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:170 msgid "Finding metadata..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:176 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:184 msgid "Could not find metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:177 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:185 msgid "The metadata download seems to have stalled. Try again later." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:194 msgid "Warning" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:195 msgid "Could not fetch metadata from:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:191 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:199 msgid "No metadata found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:192 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:200 msgid "No metadata found, try adjusting the title and author and/or removing the ISBN." msgstr "" -#: /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:93 msgid "Fetch metadata" msgstr "" -#: /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:94 msgid "<p>calibre can find metadata for your books from two locations: <b>Google Books</b> and <b>isbndb.com</b>. <p>To use isbndb.com you must sign up for a <a href=\"http://www.isbndb.com\">free account</a> and enter your access key below." 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:95 msgid "&Access Key:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:96 msgid "Fetch" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:94 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:97 msgid "Matches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:98 msgid "Select the book that most closely matches your copy from the list below" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:96 -msgid "Download &social metadata (tags/rating/etc.) for the selected book" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:99 +msgid "Overwrite author and title with author and title of selected book" msgstr "" -#: /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" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:100 +msgid "Download &social metadata (tags/rating/etc.) for the selected book" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:42 @@ -5877,109 +6039,113 @@ msgstr "" msgid "Stop &all non device jobs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:26 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:27 msgid "Title/Author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:28 msgid "Standard metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:28 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:29 msgid "Custom metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:29 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:30 msgid "Search/Replace" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:33 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:34 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress.py:76 msgid "Working" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:186 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:187 #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:386 msgid "Lower Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:187 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:188 #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:385 msgid "Upper Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:188 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:189 #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:388 msgid "Title Case" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:191 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:190 +msgid "Capitalize" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:193 msgid "Character match" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:192 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:194 msgid "Regular Expression" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:195 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:197 msgid "Replace field" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:196 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:198 msgid "Prepend to field" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:197 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:199 msgid "Append to field" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:210 msgid "Editing meta information for <b>%d books</b>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:239 msgid "Immediately make all changes without closing the dialog. This operation cannot be canceled or undone" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:273 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:275 msgid "Book %d:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:290 msgid "<b>You can destroy your library using this feature.</b> Changes are permanent. There is no undo function. You are strongly encouraged to back up your library before proceeding.<p>Search and replace in text fields using character matching or regular expressions. " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:298 msgid "In character mode, the field is searched for the entered search text. The text is replaced by the specified replacement text everywhere it is found in the specified field. After replacement is finished, the text can be changed to upper-case, lower-case, or title-case. If the case-sensitive check box is checked, the search text must match exactly. If it is unchecked, the search text will match both upper- and lower-case letters" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:307 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:309 msgid "In regular expression mode, the search text is an arbitrary python-compatible regular expression. The replacement text can contain backreferences to parenthesized expressions in the pattern. The search is not anchored, and can match and replace multiple times on the same string. The modification functions (lower-case etc) are applied to the matched text, not to the field as a whole. The destination box specifies the field where the result after matching and replacement is to be assigned. You can replace the text in the field, or prepend or append the matched text. See <a href=\"http://docs.python.org/library/re.html\"> this reference</a> for more information on python's regular expressions, and in particular the 'sub' function." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:452 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:454 msgid "You must specify a destination when source is a composite field" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:544 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:552 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:647 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:546 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:554 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:649 msgid "Search/replace invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:545 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:547 msgid "Authors cannot be set to the empty string. Book title %s not processed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:553 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:555 msgid "Title cannot be set to the empty string. Book title %s not processed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:648 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:650 msgid "Search pattern is invalid: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:685 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:687 msgid "" "Applying changes to %d books.\n" "Phase {0} {1}%%." @@ -6207,162 +6373,166 @@ msgstr "" msgid "&Search and replace" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:97 msgid "Last modified: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:127 msgid "Could not read cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:122 msgid "Could not read cover from %s format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:128 msgid "The cover in the %s format is invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:153 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:157 msgid "Cover size: %dx%d pixels" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:190 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:194 msgid "Not a valid picture" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:212 msgid "Specify title and author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:209 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:213 msgid "You must specify a title and author before generating a cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:242 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:247 msgid "Downloading cover..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:254 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:259 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:265 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:269 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:274 msgid "Cannot fetch cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:255 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:266 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:275 msgid "<b>Could not fetch cover.</b><br/>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:256 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:260 msgid "The download timed out." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:264 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:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:276 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:279 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:283 msgid "Bad cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:280 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:284 msgid "The cover is not a valid picture" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:298 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:302 msgid "Choose formats for " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:329 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:333 msgid "No permission" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:330 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:334 msgid "You do not have permission to read the following files:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:357 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:358 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:361 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:362 msgid "No format selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:369 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:373 msgid "Could not read metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:370 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:374 msgid "Could not read metadata from %s format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:441 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:445 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:444 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:448 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:449 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:453 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:102 +#: /home/kovid/work/calibre/src/calibre/web/feeds/templates.py:221 +#: /home/kovid/work/calibre/src/calibre/web/feeds/templates.py:384 msgid "Previous" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:452 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:460 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:456 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:464 msgid "Save changes and edit the metadata of %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:457 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:102 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:461 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:103 +#: /home/kovid/work/calibre/src/calibre/web/feeds/templates.py:211 +#: /home/kovid/work/calibre/src/calibre/web/feeds/templates.py:401 msgid "Next" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:631 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:636 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:635 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:640 msgid "This ISBN number is valid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:639 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:643 msgid "This ISBN number is invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:711 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:715 msgid "Tags changed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:712 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:716 msgid "You have changed the tags. In order to use the tags editor, you must either discard or apply these changes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:750 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:754 msgid "There were errors" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:751 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:755 msgid "There were errors downloading social metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:782 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:789 msgid "Cannot fetch metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:783 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:790 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:878 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:885 msgid "Permission denied" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:879 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:886 msgid "Could not open %s. Is it being used by another program?" msgstr "" @@ -6499,7 +6669,7 @@ msgstr "" msgid "Aborting..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/saved_search_editor.py:55 msgid "The current saved search will be <b>permanently deleted</b>. Are you sure?" msgstr "" @@ -6600,7 +6770,7 @@ msgid "Cannot download news as no internet connection is active" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:198 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:284 msgid "Recipes" msgstr "" @@ -6815,21 +6985,21 @@ msgstr "" msgid "Choose formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:98 msgid "Authors" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:50 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:129 msgid "Publishers" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:124 msgid " (not on any book)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:176 msgid "The current tag category will be <b>permanently deleted</b>. Are you sure?" msgstr "" @@ -6881,12 +7051,12 @@ msgstr "" msgid "Select the content kind of the new category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor.py:66 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:105 msgid "Are your sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor.py:69 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor.py:67 msgid "The following tags are used by one or more books. Are you certain you want to delete them?" msgstr "" @@ -6931,12 +7101,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:674 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:679 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:675 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:680 msgid "An item cannot be set to nothing. Delete it instead." msgstr "" @@ -7023,82 +7193,82 @@ msgstr "" msgid "<p>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 <b>and the editor windows you used to edit files in the epub</b>.</p><p>Rebuild the ePub, updating your calibre library.</p>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:133 msgid "No recipe selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:138 msgid "The attached file: %s is a recipe to download %s." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:138 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:139 msgid "Recipe for " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:155 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:156 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:167 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:260 msgid "Switch to Advanced mode" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:161 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:162 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:170 msgid "Switch to Basic mode" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:179 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180 msgid "Feed must have a title" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:181 msgid "The feed must have a title" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:185 msgid "Feed must have a URL" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:186 msgid "The feed %s must have a URL" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:191 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:192 msgid "This feed has already been added to the recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:232 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:241 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:291 -msgid "Invalid input" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:233 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:242 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:292 -msgid "<p>Could not create recipe. Error:<br>%s" +msgid "Invalid input" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:246 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:268 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:295 -msgid "Replace recipe?" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:234 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:243 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:293 +msgid "<p>Could not create recipe. Error:<br>%s" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:247 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:269 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:296 +msgid "Replace recipe?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:248 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:297 msgid "A custom recipe named %s already exists. Do you want to replace it?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:263 msgid "Pick recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:263 msgid "Pick the recipe to customize" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:283 msgid "Choose a recipe file" msgstr "" @@ -7431,7 +7601,7 @@ msgid "Eject this device" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:63 -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:209 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:210 msgid "Library" msgstr "" @@ -7448,7 +7618,7 @@ msgid "Show books in the main memory of the device" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:67 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:826 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:828 msgid "Card A" msgstr "" @@ -7457,7 +7627,7 @@ msgid "Show books in storage card A" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:69 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:828 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:830 msgid "Card B" msgstr "" @@ -7509,56 +7679,56 @@ msgstr "" msgid "Delete current saved search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:317 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:320 msgid "N" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:317 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:320 msgid "Y" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:66 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:67 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:241 msgid "On Device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:69 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:286 msgid "Size (MB)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:331 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:334 msgid "Book %s of %s." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:693 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1240 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:450 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:696 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1242 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:454 msgid "The lookup/search name is \"{0}\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:699 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1242 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:702 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1244 msgid "This book's UUID is \"{0}\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:926 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:929 msgid "In Library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:930 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:933 msgid "Size" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1140 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1142 msgid "Book <font face=\"serif\">%s</font> of %s." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1220 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1222 msgid "Marked for deletion" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1223 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1225 msgid "Double click to <b>edit</b> me<br><br>" msgstr "" @@ -7847,7 +8017,7 @@ msgid "Successfully downloaded metadata for %d out of %d books" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:291 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:659 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:654 msgid "Details" msgstr "" @@ -7887,17 +8057,17 @@ msgstr "" msgid "&Swap author firstname and lastname" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:33 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:145 msgid "Normal" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:33 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:146 msgid "High" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior.py:33 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/behavior_ui.py:147 msgid "Low" msgstr "" @@ -8132,7 +8302,7 @@ msgstr "" #: #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:145 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:171 msgid "Create or edit custom columns" msgstr "" @@ -8221,15 +8391,14 @@ msgstr "" #: #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:166 msgid "" -"A comma-separated list of permitted values. You can specify\n" -"empty values by entering only the comma. For example, the list\n" -"',one,two,three' has 4 valid values, one of them empty. The first\n" -"value in the list is the default." +"A comma-separated list of permitted values. The empty value is always\n" +"included, and is the default. For example, the list 'one,two,three' has\n" +"four values, the first of them being the empty value." msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:171 -msgid "The first value entered will be the default value for this enumeration" +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column_ui.py:169 +msgid "The empty string is always the first value" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/device_debug.py:21 @@ -8530,43 +8699,43 @@ msgid "" "Customization: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:155 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:156 msgid "No valid plugin path" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:156 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:157 msgid "%s is not a valid plugin path" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:159 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:160 msgid "Choose plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:172 msgid "Plugin cannot be disabled" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:173 msgid "The plugin: %s cannot be disabled" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:182 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:183 msgid "Plugin not customizable" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:183 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:184 msgid "Plugin: %s does not need customization" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:193 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:194 msgid "Customize" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:237 msgid "Cannot remove builtin plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:238 msgid " cannot be removed. It is a builtin plugin. Try disabling it instead." msgstr "" @@ -8864,26 +9033,26 @@ msgstr "" msgid "&Current tweaks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:92 -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:264 #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:574 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:272 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:273 msgid "Search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:306 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:308 msgid "The selected search will be <b>permanently deleted</b>. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:349 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:351 msgid "Search (For Advanced Search click the button to the left)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:411 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:413 msgid "Saved Searches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:413 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:415 msgid "Choose saved search or enter name for new saved search" msgstr "" @@ -8904,29 +9073,29 @@ msgstr "" msgid "({0} of all)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:59 msgid "Press a key..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:79 +#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:80 msgid "Already assigned" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:82 msgid "already assigned to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:131 +#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:132 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:223 msgid " or " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:134 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:74 msgid "&Default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:135 +#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:136 msgid "Customize shortcuts for" msgstr "" @@ -8964,94 +9133,94 @@ msgstr "" msgid "&Alternate shortcut:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:217 msgid "Rename '%s'" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:221 msgid "Edit sort for '%s'" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:226 msgid "Hide category %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:229 msgid "Show category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:236 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:240 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:242 msgid "Manage %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:243 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:245 msgid "Manage Saved Searches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:250 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:254 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:252 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:256 msgid "Manage User Categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:263 msgid "Show all categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:545 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:549 msgid "Changing the authors for several books can take a while. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:550 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:554 msgid "Changing the metadata for that many books can take a while. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:606 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:294 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:611 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:296 msgid "Searches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:689 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:694 msgid "Duplicate search name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:690 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:695 msgid "The saved search name %s is already used." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:971 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:976 msgid "Sort by name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:971 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:976 msgid "Sort by popularity" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:972 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:977 msgid "Sort by average rating" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:975 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:980 msgid "Set the sort order for entries in the Tag Browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:981 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:986 msgid "Match all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:981 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:986 msgid "Match any" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:986 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:991 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:990 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:995 msgid "Manage &user categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:993 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:998 msgid "Add your own categories to the Tag Browser" msgstr "" @@ -9913,50 +10082,50 @@ msgstr "" msgid "Turn on the &content server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:365 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:373 msgid "today" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:368 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:376 msgid "yesterday" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:371 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:379 msgid "thismonth" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:374 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:375 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:382 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:383 msgid "daysago" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:554 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:564 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:562 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:572 msgid "unchecked" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:554 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:564 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:562 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:572 #: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:184 msgid "no" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:557 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:567 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:565 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:575 msgid "checked" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:557 -#: /home/kovid/work/calibre/src/calibre/library/caches.py:567 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:565 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:575 #: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:184 msgid "yes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:561 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:569 msgid "blank" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/caches.py:561 +#: /home/kovid/work/calibre/src/calibre/library/caches.py:569 msgid "empty" msgstr "" @@ -10621,35 +10790,35 @@ msgstr "" msgid "The label must contain only lower case letters, digits and underscores, and start with a letter" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:57 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:59 msgid "%sAverage rating is %3.1f" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:824 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:826 msgid "Main" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2317 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2321 msgid "<p>Migrating old database to ebook library in %s<br><center>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2346 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2350 msgid "Copying <b>%s</b>" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2363 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2367 msgid "Compacting database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2456 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2460 msgid "Checking SQL integrity..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2495 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2499 msgid "Checking for missing files." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2523 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2527 msgid "Checked id" msgstr "" @@ -10762,7 +10931,8 @@ msgstr "" msgid "Replace whitespace with underscores." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:335 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:350 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:374 msgid "Requested formats not available" msgstr "" @@ -10806,65 +10976,65 @@ msgstr "" msgid "Prefix to prepend to all URLs. Useful for reverseproxying to this server from Apache/nginx/etc." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:59 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:437 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:60 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:432 msgid "Loading, please wait" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:85 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:106 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:86 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:107 msgid "Go to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:101 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:102 msgid "First" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:101 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:102 msgid "Last" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:104 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:105 msgid "Browsing %d books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:121 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:247 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:122 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:248 msgid "Average rating" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:122 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:123 msgid "%s: %.1f stars" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:155 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:156 msgid "%d stars" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:248 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:249 msgid "Popularity" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:267 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:268 msgid "Sort by" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:270 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:271 msgid "library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:271 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:272 msgid "home" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:332 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:548 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:333 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:543 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:569 msgid "Newest" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:333 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:549 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:334 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:544 msgid "All books" msgstr "" @@ -10876,51 +11046,51 @@ msgstr "" msgid "Choose a category to browse by:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:457 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:452 msgid "Browsing by" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:458 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:453 msgid "Up" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:579 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:574 msgid "in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:582 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:577 msgid "Books in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:634 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:629 msgid "Other formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:641 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:636 msgid "Read %s in the %s format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:646 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:641 msgid "Get" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:661 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:656 msgid "Permalink" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:662 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:657 msgid "A permanent link to this book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:673 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:668 msgid "This book has been deleted" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:757 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:752 msgid "in search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:759 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:754 msgid "Matching books" msgstr "" @@ -10953,35 +11123,35 @@ msgstr "" msgid "Auto reload server when source code changes. May not work in all environments." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:112 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:113 msgid "%d book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:131 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:132 msgid "%d items" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:149 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:150 msgid "RATING: %s<br />" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:152 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:153 msgid "TAGS: %s<br />" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:157 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:158 msgid "SERIES: %s [%s]<br />" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:248 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:249 msgid "Books in your library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:254 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:255 msgid "By " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:255 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:256 msgid "Books sorted by " msgstr "" @@ -11062,14 +11232,26 @@ msgstr "" msgid "How and when calibre updates metadata on the device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter.py:33 +#: /home/kovid/work/calibre/src/calibre/utils/formatter.py:36 msgid "lookup requires either 2 or an odd number of arguments" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter.py:56 +#: /home/kovid/work/calibre/src/calibre/utils/formatter.py:59 msgid "switch requires an odd number of arguments" msgstr "" +#: /home/kovid/work/calibre/src/calibre/utils/formatter.py:116 +msgid "format: type {0} requires an integer value, got {1}" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/formatter.py:122 +msgid "format: type {0} requires a decimal (float) value, got {1}" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/formatter.py:124 +msgid "format: unknown format type letter {0}" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:43 msgid "Waiting..." msgstr "" @@ -11374,6 +11556,35 @@ msgstr "" msgid "Custom" msgstr "" +#: /home/kovid/work/calibre/src/calibre/web/feeds/templates.py:118 +msgid "Next section" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/templates.py:121 +msgid "Main menu" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/templates.py:125 +msgid "Previous section" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/templates.py:214 +msgid "Section Menu" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/templates.py:217 +msgid "Main Menu" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/templates.py:303 +#: /home/kovid/work/calibre/src/calibre/web/feeds/templates.py:393 +msgid "Sections" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/templates.py:390 +msgid "Articles" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:476 msgid "" "%prog URL\n" From 26d3a9bb007ee9d56bb4f2b4095e79adf892a55e Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Thu, 9 Dec 2010 20:01:25 -0700 Subject: [PATCH 367/375] News download: When generating periodicals for the SONY use the local timezone in the SONY specific metadata --- src/calibre/ebooks/epub/periodical.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/calibre/ebooks/epub/periodical.py b/src/calibre/ebooks/epub/periodical.py index b46bea3719..0c9b029c51 100644 --- a/src/calibre/ebooks/epub/periodical.py +++ b/src/calibre/ebooks/epub/periodical.py @@ -9,6 +9,7 @@ from uuid import uuid4 from calibre.constants import __appname__, __version__ from calibre import strftime, prepare_string_for_xml as xml +from calibre.utils.date import parse_date SONY_METADATA = u'''\ <?xml version="1.0" encoding="utf-8"?> @@ -87,7 +88,8 @@ def sony_metadata(oeb): pass try: - date = unicode(m.date[0]).split('T')[0] + date = parse_date(unicode(m.date[0]), + as_utc=False).strftime('%Y-%m-%d') except: date = strftime('%Y-%m-%d') try: From c63ffe6ae8217ff8a1c33e1750fe2f3cf17d36f1 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Fri, 10 Dec 2010 09:45:52 +0000 Subject: [PATCH 368/375] Add tweak to control which custom fields are displayed in books info --- resources/default_tweaks.py | 14 ++++++++++---- src/calibre/gui2/book_details.py | 20 +++++++++++++++++++- src/calibre/gui2/library/models.py | 5 +++++ 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/resources/default_tweaks.py b/resources/default_tweaks.py index 1a371e5610..081112444a 100644 --- a/resources/default_tweaks.py +++ b/resources/default_tweaks.py @@ -181,19 +181,25 @@ max_content_server_tags_shown=5 # content_server_will_display is a list of custom fields to be displayed. # content_server_wont_display is a list of custom fields not to be displayed. # wont_display has priority over will_display. -# The special value '*' means all custom fields. +# The special value '*' means all custom fields. The value [] means no entries. # Defaults: # content_server_will_display = ['*'] -# content_server_wont_display = [''] +# content_server_wont_display = [] # Examples: # To display only the custom fields #mytags and #genre: # content_server_will_display = ['#mytags', '#genre'] -# content_server_wont_display = [''] +# content_server_wont_display = [] # To display all fields except #mycomments: # content_server_will_display = ['*'] # content_server_wont_display['#mycomments'] content_server_will_display = ['*'] -content_server_wont_display = [''] +content_server_wont_display = [] + +# Same as above (content server) but for the book details pane. Same syntax. +# As above, this tweak affects only display of custom fields. The standard +# fields are not affected +book_details_will_display = ['*'] +book_details_wont_display = [] # Set the maximum number of sort 'levels' that calibre will use to resort the diff --git a/src/calibre/gui2/book_details.py b/src/calibre/gui2/book_details.py index 5214f1a1d5..8a9d40d73b 100644 --- a/src/calibre/gui2/book_details.py +++ b/src/calibre/gui2/book_details.py @@ -20,6 +20,7 @@ from calibre.constants import preferred_encoding from calibre.library.comments import comments_to_html from calibre.gui2 import config, open_local_file from calibre.utils.icu import sort_key +from calibre.utils.config import tweaks # render_rows(data) {{{ WEIGHTS = collections.defaultdict(lambda : 100) @@ -29,8 +30,25 @@ WEIGHTS[_('Collections')] = 2 WEIGHTS[_('Series')] = 3 WEIGHTS[_('Tags')] = 4 +def keys_to_display(data): + kt = data.get('__cf_kt__', None) + if kt is None: + return data.keys() + cfkeys = frozenset([k for k in kt.values()]) + yes_fields = set(tweaks['book_details_will_display']) + no_fields = set(tweaks['book_details_wont_display']) + if '*' in yes_fields: + yes_fields = cfkeys + if '*' in no_fields: + no_fields = cfkeys + todisplay = frozenset(yes_fields - no_fields) + res = [k for k in data.keys() + if k not in kt or (kt[k] not in cfkeys or kt[k] in todisplay)] + res.remove('__cf_kt__') + return res + def render_rows(data): - keys = data.keys() + keys = keys_to_display(data) # First sort by name. The WEIGHTS sort will preserve this sub-order keys.sort(key=sort_key) keys.sort(key=lambda x: WEIGHTS[x]) diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index e82e1dddd4..2bf521283f 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -337,6 +337,11 @@ class BooksModel(QAbstractTableModel): # {{{ name, val = mi.format_field(key) if val: data[name] = val + cf_kt = {} + for key,mi in self.db.all_metadata().items(): + if mi['is_custom']: + cf_kt[mi['name']] = key + data['__cf_kt__'] = cf_kt return data def set_cache(self, idx): From 617fb186d2b784fd1fd5f0d79fbe136acfb936a8 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Fri, 10 Dec 2010 12:46:12 +0000 Subject: [PATCH 369/375] Implement template program mode. Includes changes to the gui to make it easier to edit larger templates. --- src/calibre/gui2/dialogs/comments_dialog.py | 4 +- src/calibre/gui2/dialogs/comments_dialog.ui | 10 - src/calibre/gui2/library/delegates.py | 15 +- src/calibre/manual/template_lang.rst | 80 +++++- src/calibre/utils/formatter.py | 263 ++++++++++++++++++-- 5 files changed, 331 insertions(+), 41 deletions(-) diff --git a/src/calibre/gui2/dialogs/comments_dialog.py b/src/calibre/gui2/dialogs/comments_dialog.py index bc3ec3e5ad..a7bb885d06 100644 --- a/src/calibre/gui2/dialogs/comments_dialog.py +++ b/src/calibre/gui2/dialogs/comments_dialog.py @@ -3,7 +3,7 @@ __copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' __docformat__ = 'restructuredtext en' __license__ = 'GPL v3' -from PyQt4.Qt import Qt, QDialog +from PyQt4.Qt import Qt, QDialog, QDialogButtonBox from calibre.gui2.dialogs.comments_dialog_ui import Ui_CommentsDialog class CommentsDialog(QDialog, Ui_CommentsDialog): @@ -20,3 +20,5 @@ class CommentsDialog(QDialog, Ui_CommentsDialog): if text is not None: self.textbox.setPlainText(text) self.textbox.setTabChangesFocus(True) + self.buttonBox.button(QDialogButtonBox.Ok).setText('&OK') + self.buttonBox.button(QDialogButtonBox.Cancel).setText('&Cancel') diff --git a/src/calibre/gui2/dialogs/comments_dialog.ui b/src/calibre/gui2/dialogs/comments_dialog.ui index c008ee0573..dccfa48652 100644 --- a/src/calibre/gui2/dialogs/comments_dialog.ui +++ b/src/calibre/gui2/dialogs/comments_dialog.ui @@ -19,15 +19,6 @@ <property name="windowTitle"> <string>Edit Comments</string> </property> - <widget class="QWidget" name="verticalLayoutWidget"> - <property name="geometry"> - <rect> - <x>10</x> - <y>10</y> - <width>311</width> - <height>211</height> - </rect> - </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <widget class="QPlainTextEdit" name="textbox"/> @@ -43,7 +34,6 @@ </widget> </item> </layout> - </widget> </widget> <resources/> <connections> diff --git a/src/calibre/gui2/library/delegates.py b/src/calibre/gui2/library/delegates.py index 8b6c2a8ae5..fe7e7d55ba 100644 --- a/src/calibre/gui2/library/delegates.py +++ b/src/calibre/gui2/library/delegates.py @@ -349,10 +349,19 @@ class CcTemplateDelegate(QStyledItemDelegate): # {{{ QStyledItemDelegate.__init__(self, parent) def createEditor(self, parent, option, index): - return EnLineEdit(parent) + m = index.model() + text = m.custom_columns[m.column_map[index.column()]]['display']['composite_template'] + editor = CommentsDialog(parent, text) + editor.setWindowTitle(_("Edit template")) + editor.textbox.setTabChangesFocus(False) + editor.textbox.setTabStopWidth(20) + d = editor.exec_() + if d: + m.setData(index, QVariant(editor.textbox.toPlainText()), Qt.EditRole) + return None def setModelData(self, editor, model, index): - val = unicode(editor.text()) + val = unicode(editor.textbox.toPlainText()) try: validation_formatter.validate(val) except Exception, err: @@ -364,7 +373,7 @@ class CcTemplateDelegate(QStyledItemDelegate): # {{{ def setEditorData(self, editor, index): m = index.model() val = m.custom_columns[m.column_map[index.column()]]['display']['composite_template'] - editor.setText(val) + editor.textbox.setPlainText(val) # }}} diff --git a/src/calibre/manual/template_lang.rst b/src/calibre/manual/template_lang.rst index b2d32f0767..ed665eee5a 100644 --- a/src/calibre/manual/template_lang.rst +++ b/src/calibre/manual/template_lang.rst @@ -101,8 +101,8 @@ Composite columns can use any template option, including formatting. You cannot change the data contained in a composite column. If you edit a composite column by double-clicking on any item, you will open the template for editing, not the underlying data. Editing the template on the GUI is a quick way of testing and changing composite columns. -Using functions in templates ------------------------------ +Using functions in templates - single-function mode +--------------------------------------------------- Suppose you want to display the value of a field in upper case, when that field is normally in title case. You can do this (and many more things) using the functions available for templates. For example, to display the title in upper case, use ``{title:uppercase()}``. To display it in title case, use ``{title:titlecase()}``. @@ -137,6 +137,82 @@ Note that you can use the prefix and suffix as well. If you want the number to a {#myint:0>3s:ifempty(0)|[|]} +Using functions in templates - program mode +------------------------------------------- + +The template language program mode differs from single-function mode in that it permits you to write template expressions that refer to other metadata fields, modify values, and do arithmetic. It is a reasonably complete programming language. + +Beginning with an example, assume that you want your template to show the series for a book if it has one, otherwise show the value of a custom field #genre. You cannot do this in the basic language because you cannot make reference to another metadata field within a template expression. In program mode, you can. The following expression works:: + + {#series:'ifempty($, field('#genre'))'} + +The example shows several things: + + * program mode is used if the expression begins with ``:'`` and ends with ``'``. Anything else is assumed to be single-function. + * the variable ``$`` stands for the field the expression is operating upon, ``#series`` in this case. + * functions must be given all their arguments. There is no default value. This is true for the standard builtin functions, and is a significant difference from single-function mode. + * white space is ignored and can be used anywhere within the expression. + * constant strings are enclosed in matching quotes, either ``'`` or ``"``. + +The language is similar to ``functional`` languages in that it is built almost entirely from functions. A statement is a function. An expression is a function. Constants and identifiers can be thought of as functions returning the value indicated by the constant or stored in the identifier. + +The syntax of the language is shown by the following grammar:: + + constant ::= " string " | ' string ' | number + identifier ::= sequence of letters or ``_`` characters + function ::= identifier ( statement [ , statement ]* ) + expression ::= identifier | constant | function + statement ::= expression [ ; expression ]* + program ::= statement + +An ``expression`` always has a value, either the value of the constant, the value contained in the identifier, or the value returned by a function. The value of a ``statement`` is the value of the last expression in the sequence of statements. As such, the value of the program (statement):: + + 1; 2; 'foobar'; 3 + +is 3. + +Another example of a complex but rather silly program might help make things clearer:: + + {series_index:' + substr( + strcat($, '->', + cmp(divide($, 2), 1, + assign(c, 1); substr('lt123', c, 0), + 'eq', 'gt')), + 0, 6) + '| prefix | suffix} + +This program does the following: + + * specify that the field being looked at is series_index. This sets the value of the variable ``$``. + * calls the ``substr`` function, which takes 3 parameters ``(str, start, end)``. It returns a string formed by extracting the start through end characters from string, zero-based (the first character is character zero). In this case the string will be computed by the ``strcat`` function, the start is 0, and the end is 6. In this case it will return the first 6 characters of the string returned by ``strcat``, which must be evaluated before substr can return. + * calls the ``strcat`` (string concatenation) function. Strcat accepts 1 or more arguments, and returns a string formed by concatenating all the values. In this case there are three arguments. The first parameter is the value in ``$``, which here is the value of ``series_index``. The second paremeter is the constant string ``'->'``. The third parameter is the value returned by the ``cmp`` function, which must be fully evaluated before ``strcat`` can return. + * The ``cmp`` function takes 5 arguments ``(x, y, lt, eq, gt)``. It compares x and y and returns the third argument ``lt`` if x < y, the fourth argument ``eq`` if x == y, and the fifth argument ``gt`` if x > y. As with all functions, all of the parameters can be statements. In this case the first parameter (the value for ``x``) is the result of dividing the series_index by 2. The second parameter ``y`` is the constant ``1``. The third parameter ``lt`` is a statement (more later). The fourth parameter ``eq`` is the constant string ``'eq'``. The fifth parameter is the constant string ``'gt'``. + * The third parameter (the one for ``lt``) is a statement, or a sequence of expressions. Remember that a statement (a sequence of semicolon-separated expressions) is also an expression, returning the value of the last expression in the list. In this case, the program first assigns the value ``1`` to a local variable ``c``, then returns a substring made by extracting the c'th character to the end. Since c always contains the constant ``1``, the substring will return the second through end'th characters, or ``'t123'``. + * Once the statement providing the value to the third parameter is executed, ``cmp`` can return a value. At that point, ``strcat` can return a value, then ``substr`` can return a value. The program then terminates. + +For various values of series_index, the program returns: + + * series_index == undefined, result = ``prefix ->t123 suffix`` + * series_index == 0.5, result = ``prefix 0.50-> suffix`` + * series_index == 1, result = ``prefix 1->t12 suffix`` + * series_index == 2, result = ``prefix 2->eq suffix`` + * series_index == 3, result = ``prefix 3->gt suffix`` + +All the functions listed under single-function mode can be used in program mode, noting that unlike the functions described below you must supply a first parameter providing the value the function is to act upon. + +The following functions are available in addition to those described in single-function mode. With the exception of the ``id`` parameter of assign, all parameters can be statements (sequences of expressions): + + * ``add(x, y)`` -- returns x + y. Throws an exception if either x or y are not numbers. + * ``assign(id, val)`` -- assigns val to id, then returns val. id must be an identifier, not an expression + * ``cmp(x, y, lt, eq, gt)`` -- compares x and y after converting both to numbers. Returns ``lt`` if x < y. Returns ``eq`` if x == y. Otherwise returns ``gt``. + * ``divide(x, y)`` -- returns x / y. Throws an exception if either x or y are not numbers. + * ``field(name)`` -- returns the metadata field named by ``name``. + * ``multiply`` -- returns x * y. Throws an exception if either x or y are not numbers. + * ``strcat(a, b, ...)`` -- can take any number of arguments. Returns a string formed by concatenating all the arguments. + * ``strcmp(x, y, lt, eq, gt)`` -- does a case-insensitive comparison x and y as strings. Returns ``lt`` if x < y. Returns ``eq`` if x == y. Otherwise returns ``gt``. + * ``substr(str, start, end)`` -- returns the ``start``'th through the ``end``'th characters of ``str``. The first character in ``str`` is the zero'th character. If end is negative, then it indicates that many characters counting from the right. If end is zero, then it indicates the last character. For example, ``substr('12345', 1, 0)`` returns ``'2345'``, and ``substr('12345', 1, -1)`` returns ``'234'``. + * ``subtract`` -- returns x - y. Throws an exception if either x or y are not numbers. Special notes for save/send templates ------------------------------------- diff --git a/src/calibre/utils/formatter.py b/src/calibre/utils/formatter.py index a7fb3682aa..9e095af7b9 100644 --- a/src/calibre/utils/formatter.py +++ b/src/calibre/utils/formatter.py @@ -5,10 +5,183 @@ Created on 23 Sep 2010 ''' import re, string, traceback +from functools import partial from calibre.constants import DEBUG from calibre.utils.titlecase import titlecase -from calibre.utils.icu import capitalize +from calibre.utils.icu import capitalize, strcmp + +class _Parser(object): + LEX_OP = 1 + LEX_ID = 2 + LEX_STR = 3 + LEX_NUM = 4 + LEX_EOF = 5 + + def _strcmp(self, x, y, lt, eq, gt): + v = strcmp(x, y) + if v < 0: + return lt + if v == 0: + return eq + return gt + + def _cmp(self, x, y, lt, eq, gt): + x = float(x if x else 0) + y = float(y if y else 0) + if x < y: + return lt + if x == y: + return eq + return gt + + def _assign(self, target, value): + setattr(self, target, value) + return value + + def _concat(self, *args): + i = 0 + res = '' + for i in range(0, len(args)): + res += args[i] + return res + + def _math(self, x, y, op=None): + ops = { + '+': lambda x, y: x + y, + '-': lambda x, y: x - y, + '*': lambda x, y: x * y, + '/': lambda x, y: x / y, + } + x = float(x if x else 0) + y = float(y if y else 0) + return ops[op](x, y) + + local_functions = { + 'add' : (2, partial(_math, op='+')), + 'assign' : (2, _assign), + 'cmp' : (5, _cmp), + 'divide' : (2, partial(_math, op='/')), + 'field' : (1, lambda s, x: s.parent.get_value(x, [], s.parent.kwargs)), + 'multiply' : (2, partial(_math, op='*')), + 'strcat' : (-1, _concat), + 'strcmp' : (5, _strcmp), + 'substr' : (3, lambda s, x, y, z: x[int(y): len(x) if int(z) == 0 else int(z)]), + 'subtract' : (2, partial(_math, op='-')), + } + + def __init__(self, val, prog, parent): + self.lex_pos = 0 + self.prog = prog[0] + if prog[1] != '': + self.error(_('failed to scan program. Invalid input {0}').format(prog[1])) + self.parent = parent + setattr(self, '$', val) + + def error(self, message): + m = 'Formatter: ' + message + _(' near ') + if self.lex_pos > 0: + m = '{0} {1}'.format(m, self.prog[self.lex_pos-1][1]) + m = '{0} {1}'.format(m, self.prog[self.lex_pos][1]) + if self.lex_pos < len(self.prog): + m = '{0} {1}'.format(m, self.prog[self.lex_pos+1][1]) + raise ValueError(m) + + def token(self): + if self.lex_pos >= len(self.prog): + return None + token = self.prog[self.lex_pos] + self.lex_pos += 1 + return token[1] + + def lookahead(self): + if self.lex_pos >= len(self.prog): + return (self.LEX_EOF, '') + return self.prog[self.lex_pos] + + def consume(self): + self.lex_pos += 1 + + def token_op_is_a(self, val): + token = self.lookahead() + return token[0] == self.LEX_OP and token[1] == val + + def token_is_id(self): + token = self.lookahead() + return token[0] == self.LEX_ID + + def token_is_constant(self): + token = self.lookahead() + return token[0] == self.LEX_STR or token[0] == self.LEX_NUM + + def token_is_eof(self): + token = self.lookahead() + return token[0] == self.LEX_EOF + + def program(self): + val = self.statement() + if not self.token_is_eof(): + self.error(_('syntax error - program ends before EOF')) + return val + + def statement(self): + while True: + val = self.expr() + if self.token_is_eof(): + return val + if not self.token_op_is_a(';'): + return val + self.consume() + + def expr(self): + if self.token_is_id(): + # We have an identifier. Determine if it is a function + id = self.token() + if not self.token_op_is_a('('): + return getattr(self, id, _('unknown id ') + id) + # We have a function. + # Check if it is a known one. We do this here so error reporting is + # better, as it can identify the tokens near the problem. + if id not in self.parent.functions and id not in self.local_functions: + self.error(_('unknown function {0}').format(id)) + # Eat the paren + self.consume() + args = list() + while not self.token_op_is_a(')'): + if id == 'assign' and len(args) == 0: + # Must handle the lvalue semantics of the assign function. + # The first argument is the name of the destination, not + # the value. + if not self.token_is_id(): + self.error('assign requires the first parameter be an id') + args.append(self.token()) + else: + # evaluate the argument (recursive call) + args.append(self.statement()) + if not self.token_op_is_a(','): + break + self.consume() + if self.token() != ')': + self.error(_('missing closing parenthesis')) + + # Evaluate the function + if id in self.local_functions: + f = self.local_functions[id] + if f[0] != -1 and len(args) != f[0]: + self.error('incorrect number of arguments for function {}'.format(id)) + return f[1](self, *args) + else: + f = self.parent.functions[id] + if f[0] != -1 and len(args) != f[0]+1: + self.error('incorrect number of arguments for function {}'.format(id)) + return f[1](self.parent, *args) + # can't get here + elif self.token_is_constant(): + # String or number + return self.token() + else: + self.error(_('expression is not function or constant')) + class TemplateFormatter(string.Formatter): ''' @@ -25,6 +198,7 @@ class TemplateFormatter(string.Formatter): string.Formatter.__init__(self) self.book = None self.kwargs = None + self.program_cache = {} def _lookup(self, val, *args): if len(args) == 2: # here for backwards compatibility @@ -135,7 +309,7 @@ class TemplateFormatter(string.Formatter): traceback.print_exc() return fmt, '', '' - format_string_re = re.compile(r'^(.*)\|(.*)\|(.*)$') + format_string_re = re.compile(r'^(.*)\|([^\|]*)\|(.*)$', re.DOTALL) compress_spaces = re.compile(r'\s+') backslash_comma_to_comma = re.compile(r'\\,') @@ -145,6 +319,29 @@ class TemplateFormatter(string.Formatter): (r'.*?\)', lambda x,t: t[:-1]), ]) + ################## 'Functional' template language ###################### + + lex_scanner = re.Scanner([ + (r'[(),=;]', lambda x,t: (1, t)), + (r'-?[\d\.]+', lambda x,t: (3, t)), + (r'\$', lambda x,t: (2, t)), + (r'\w+', lambda x,t: (2, t)), + (r'".*?((?<!\\)")', lambda x,t: (3, t[1:-1])), + (r'\'.*?((?<!\\)\')', lambda x,t: (3, t[1:-1])), + (r'\s', None) + ]) + + def _eval_program(self, val, prog): + # keep a cache of the lex'ed program under the theory that re-lexing + # is much more expensive than the cache lookup. This is certainly true + # for more than a few tokens, but it isn't clear for simple programs. + lprog = self.program_cache.get(prog, None) + if not lprog: + lprog = self.lex_scanner.scan(prog) + self.program_cache[prog] = lprog + parser = _Parser(val, lprog, self) + return parser.program() + ################## Override parent classes methods ##################### def get_value(self, key, args, kwargs): @@ -155,33 +352,49 @@ class TemplateFormatter(string.Formatter): fmt, prefix, suffix = self._explode_format_string(fmt) # Handle functions - p = fmt.find('(') - dispfmt = fmt - if p >= 0 and fmt[-1] == ')': + # First see if we have a functional-style expression + if fmt.startswith('\''): + p = 0 + else: + p = fmt.find(':\'') + if p >= 0: + p += 1 + if p >= 0 and fmt[-1] == '\'': + val = self._eval_program(val, fmt[p+1:-1]) colon = fmt[0:p].find(':') if colon < 0: dispfmt = '' - colon = 0 else: dispfmt = fmt[0:colon] - colon += 1 - if fmt[colon:p] in self.functions: - field = fmt[colon:p] - func = self.functions[field] - if func[0] == 1: - # only one arg expected. Don't bother to scan. Avoids need - # for escaping characters - args = [fmt[p+1:-1]] + else: + # check for old-style function references + p = fmt.find('(') + dispfmt = fmt + if p >= 0 and fmt[-1] == ')': + colon = fmt[0:p].find(':') + if colon < 0: + dispfmt = '' + colon = 0 else: - args = self.arg_parser.scan(fmt[p+1:])[0] - args = [self.backslash_comma_to_comma.sub(',', a) for a in args] - if (func[0] == 0 and (len(args) != 1 or args[0])) or \ - (func[0] > 0 and func[0] != len(args)): - raise ValueError('Incorrect number of arguments for function '+ fmt[0:p]) - if func[0] == 0: - val = func[1](self, val).strip() - else: - val = func[1](self, val, *args).strip() + dispfmt = fmt[0:colon] + colon += 1 + if fmt[colon:p] in self.functions: + field = fmt[colon:p] + func = self.functions[field] + if func[0] == 1: + # only one arg expected. Don't bother to scan. Avoids need + # for escaping characters + args = [fmt[p+1:-1]] + else: + args = self.arg_parser.scan(fmt[p+1:])[0] + args = [self.backslash_comma_to_comma.sub(',', a) for a in args] + if (func[0] == 0 and (len(args) != 1 or args[0])) or \ + (func[0] > 0 and func[0] != len(args)): + raise ValueError('Incorrect number of arguments for function '+ fmt[0:p]) + if func[0] == 0: + val = func[1](self, val).strip() + else: + val = func[1](self, val, *args).strip() if val: val = self._do_format(val, dispfmt) if not val: @@ -200,10 +413,10 @@ class TemplateFormatter(string.Formatter): self.composite_values = {} try: ans = self.vformat(fmt, [], kwargs).strip() - except: + except Exception, e: if DEBUG: traceback.print_exc() - ans = error_value + ans = error_value + ' ' + e.message return ans class ValidateFormat(TemplateFormatter): From 64d6f328191cba166987b8003aee87c28490da71 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Fri, 10 Dec 2010 14:39:43 +0000 Subject: [PATCH 370/375] Better implementation of tweak controlling book_info --- src/calibre/gui2/book_details.py | 20 +------------------- src/calibre/gui2/library/models.py | 22 +++++++++++++++++----- 2 files changed, 18 insertions(+), 24 deletions(-) diff --git a/src/calibre/gui2/book_details.py b/src/calibre/gui2/book_details.py index 8a9d40d73b..5214f1a1d5 100644 --- a/src/calibre/gui2/book_details.py +++ b/src/calibre/gui2/book_details.py @@ -20,7 +20,6 @@ from calibre.constants import preferred_encoding from calibre.library.comments import comments_to_html from calibre.gui2 import config, open_local_file from calibre.utils.icu import sort_key -from calibre.utils.config import tweaks # render_rows(data) {{{ WEIGHTS = collections.defaultdict(lambda : 100) @@ -30,25 +29,8 @@ WEIGHTS[_('Collections')] = 2 WEIGHTS[_('Series')] = 3 WEIGHTS[_('Tags')] = 4 -def keys_to_display(data): - kt = data.get('__cf_kt__', None) - if kt is None: - return data.keys() - cfkeys = frozenset([k for k in kt.values()]) - yes_fields = set(tweaks['book_details_will_display']) - no_fields = set(tweaks['book_details_wont_display']) - if '*' in yes_fields: - yes_fields = cfkeys - if '*' in no_fields: - no_fields = cfkeys - todisplay = frozenset(yes_fields - no_fields) - res = [k for k in data.keys() - if k not in kt or (kt[k] not in cfkeys or kt[k] in todisplay)] - res.remove('__cf_kt__') - return res - def render_rows(data): - keys = keys_to_display(data) + keys = data.keys() # First sort by name. The WEIGHTS sort will preserve this sub-order keys.sort(key=sort_key) keys.sort(key=lambda x: WEIGHTS[x]) diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index a2e7bdfa33..37d7d56ce1 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -303,6 +303,20 @@ class BooksModel(QAbstractTableModel): # {{{ return self.rowCount(None) def get_book_display_info(self, idx): + def custom_keys_to_display(): + ans = getattr(self, '_custom_fields_in_book_info', None) + if ans is None: + cfkeys = set(self.db.custom_field_keys()) + yes_fields = set(tweaks['book_details_will_display']) + no_fields = set(tweaks['book_details_wont_display']) + if '*' in yes_fields: + yes_fields = cfkeys + if '*' in no_fields: + no_fields = cfkeys + ans = frozenset(yes_fields - no_fields) + setattr(self, '_custom_fields_in_book_info', ans) + return ans + data = {} cdata = self.cover(idx) if cdata: @@ -334,15 +348,13 @@ class BooksModel(QAbstractTableModel): # {{{ _('Book %s of %s.')%\ (sidx, prepare_string_for_xml(series)) mi = self.db.get_metadata(idx) + cf_to_display = custom_keys_to_display() for key in mi.custom_field_keys(): + if key not in cf_to_display: + continue name, val = mi.format_field(key) if val: data[name] = val - cf_kt = {} - for key,mi in self.db.all_metadata().items(): - if mi['is_custom']: - cf_kt[mi['name']] = key - data['__cf_kt__'] = cf_kt return data def set_cache(self, idx): From 488b7b8169de752f2d8bd7a46c70e8c335c0c2ab Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Fri, 10 Dec 2010 10:47:40 -0700 Subject: [PATCH 371/375] Content server: Fix --urll-prefix beig ignored for links at the Top level --- src/calibre/library/server/browse.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/library/server/browse.py b/src/calibre/library/server/browse.py index 0a3a7f6fd2..fa058eb303 100644 --- a/src/calibre/library/server/browse.py +++ b/src/calibre/library/server/browse.py @@ -359,7 +359,7 @@ class BrowseServer(object): icon = 'blank.png' cats.append((meta['name'], category, icon)) - cats = [(u'<li><a title="{2} {0}" href="/browse/category/{1}"> </a>' + cats = [(u'<li><a title="{2} {0}" href="{3}/browse/category/{1}"> </a>' u'<img src="{3}{src}" alt="{0}" />' u'<span class="label">{0}</span>' u'</li>') From 826221c0f520b5fcbd5d931032a3cf5035f12df7 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Fri, 10 Dec 2010 12:27:06 -0700 Subject: [PATCH 372/375] Various fixes to Title Casing. Fixes #7846 (Title Case doesn't quite work) --- src/calibre/utils/icu.py | 15 +++++++++------ src/calibre/utils/titlecase.py | 15 ++++++++++----- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/calibre/utils/icu.py b/src/calibre/utils/icu.py index 4b0f6d4821..22611813f4 100644 --- a/src/calibre/utils/icu.py +++ b/src/calibre/utils/icu.py @@ -77,6 +77,9 @@ def py_strcmp(a, b): def icu_case_sensitive_strcmp(collator, a, b): return collator.strcmp(a, b) +def icu_capitalize(s): + s = lower(s) + return s.replace(s[0], upper(s[0]), 1) load_icu() load_collator() @@ -104,10 +107,6 @@ lower = (lambda s: s.lower()) if _icu_not_ok else \ title_case = (lambda s: s.title()) if _icu_not_ok else \ partial(_icu.title, get_locale()) -def icu_capitalize(s): - s = lower(s) - return s.replace(s[0], upper(s[0])) - capitalize = (lambda s: s.capitalize()) if _icu_not_ok else \ (lambda s: icu_capitalize(s)) @@ -226,12 +225,16 @@ pêché''' test_strcmp(german + french) print '\nTesting case transforms in current locale' - for x in ('a', 'Alice\'s code'): + from calibre.utils.titlecase import titlecase + for x in ('a', 'Alice\'s code', 'macdonald\'s machine', '02 the wars'): print 'Upper: ', x, '->', 'py:', x.upper().encode('utf-8'), 'icu:', upper(x).encode('utf-8') print 'Lower: ', x, '->', 'py:', x.lower().encode('utf-8'), 'icu:', lower(x).encode('utf-8') - print 'Title: ', x, '->', 'py:', x.title().encode('utf-8'), 'icu:', title_case(x).encode('utf-8') + print 'Title: ', x, '->', 'py:', x.title().encode('utf-8'), 'icu:', title_case(x).encode('utf-8'), 'titlecase:', titlecase(x).encode('utf-8') print 'Capitalize:', x, '->', 'py:', x.capitalize().encode('utf-8'), 'icu:', capitalize(x).encode('utf-8') print # }}} +if __name__ == '__main__': + test() + diff --git a/src/calibre/utils/titlecase.py b/src/calibre/utils/titlecase.py index bbc4c26688..bf2f9a78d4 100755 --- a/src/calibre/utils/titlecase.py +++ b/src/calibre/utils/titlecase.py @@ -23,11 +23,12 @@ UC_ELSEWHERE = re.compile(r'[%s]*?[a-zA-Z]+[A-Z]+?' % PUNCT) CAPFIRST = re.compile(r"^[%s]*?([A-Za-z])" % PUNCT) SMALL_FIRST = re.compile(r'^([%s]*)(%s)\b' % (PUNCT, SMALL), re.I) SMALL_LAST = re.compile(r'\b(%s)[%s]?$' % (SMALL, PUNCT), re.I) +SMALL_AFTER_NUM = re.compile(r'(\d+\s+)(a|an|the)\b', re.I) SUBPHRASE = re.compile(r'([:.;?!][ ])(%s)' % SMALL) APOS_SECOND = re.compile(r"^[dol]{1}['‘]{1}[a-z]+$", re.I) ALL_CAPS = re.compile(r'^[A-Z\s%s]+$' % PUNCT) UC_INITIALS = re.compile(r"^(?:[A-Z]{1}\.{1}|[A-Z]{1}\.{1}[A-Z]{1})+$") -MAC_MC = re.compile(r"^([Mm]a?c)(\w+)") +MAC_MC = re.compile(r"^([Mm]a?c)(.+)") def titlecase(text): @@ -44,7 +45,7 @@ def titlecase(text): all_caps = ALL_CAPS.match(text) - words = re.split('\s', text) + words = re.split('\s+', text) line = [] for word in words: if all_caps: @@ -55,8 +56,8 @@ def titlecase(text): word = icu_lower(word) if APOS_SECOND.match(word): - word = word.replace(word[0], icu_upper(word[0])) - word = word.replace(word[2], icu_upper(word[2])) + word = word.replace(word[0], icu_upper(word[0]), 1) + word = word[:2] + icu_upper(word[2]) + word[3:] line.append(word) continue if INLINE_PERIOD.search(word) or UC_ELSEWHERE.match(word): @@ -67,7 +68,7 @@ def titlecase(text): continue match = MAC_MC.match(word) - if match: + if match and not match.group(2).startswith('hin'): line.append("%s%s" % (capitalize(match.group(1)), capitalize(match.group(2)))) continue @@ -85,6 +86,10 @@ def titlecase(text): capitalize(m.group(2)) ), result) + result = SMALL_AFTER_NUM.sub(lambda m: '%s%s' % (m.group(1), + capitalize(m.group(2)) + ), result) + result = SMALL_LAST.sub(lambda m: capitalize(m.group(0)), result) result = SUBPHRASE.sub(lambda m: '%s%s' % ( From 2f26cc8d2b2acd37981627cbe74ff8ae4cc23b3f Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Fri, 10 Dec 2010 12:56:18 -0700 Subject: [PATCH 373/375] Implement #7709 ("Merge only formats - delete others" and Ctl-M keyboard shortcut) --- src/calibre/gui2/actions/edit_metadata.py | 35 +++++++++++++++++----- src/calibre/gui2/dialogs/confirm_delete.py | 1 + 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/src/calibre/gui2/actions/edit_metadata.py b/src/calibre/gui2/actions/edit_metadata.py index 4a527d94d8..60a943ccb9 100644 --- a/src/calibre/gui2/actions/edit_metadata.py +++ b/src/calibre/gui2/actions/edit_metadata.py @@ -54,6 +54,10 @@ class EditMetadataAction(InterfaceAction): mb.addAction(_('Merge into first selected book - keep others'), partial(self.merge_books, safe_merge=True), Qt.AltModifier+Qt.Key_M) + mb.addSeparator() + mb.addAction(_('Merge only formats into first selected book - delete others'), + partial(self.merge_books, merge_only_formats=True), + Qt.AltModifier+Qt.ShiftModifier+Qt.Key_M) self.merge_menu = mb self.action_merge.setMenu(mb) md.addSeparator() @@ -206,7 +210,7 @@ class EditMetadataAction(InterfaceAction): self.gui.library_view.select_rows(ids) # Merge books {{{ - def merge_books(self, safe_merge=False): + def merge_books(self, safe_merge=False, merge_only_formats=False): ''' Merge selected books in library. ''' @@ -220,6 +224,12 @@ class EditMetadataAction(InterfaceAction): return error_dialog(self.gui, _('Cannot merge books'), _('At least two books must be selected for merging'), show=True) + if len(rows) > 5: + if not confirm('<p>'+_('You are about to merge more than 5 books. ' + 'Are you <b>sure</b> you want to proceed?') + +'</p>', 'merge_too_many_books', self.gui): + return + dest_id, src_books, src_ids = self.books_to_merge(rows) title = self.gui.library_view.model().db.title(dest_id, index_is_id=True) if safe_merge: @@ -234,6 +244,22 @@ class EditMetadataAction(InterfaceAction): return self.add_formats(dest_id, src_books) self.merge_metadata(dest_id, src_ids) + elif merge_only_formats: + if not confirm('<p>'+_( + 'Book formats from the selected books will be merged ' + 'into the <b>first selected book</b> (%s). ' + 'Metadata in the first selected book will not be changed.' + 'Author, Title, ISBN and all other metadata will <i>not</i> be merged.<br><br>' + 'After merger the second and subsequently ' + 'selected books, with any metadata they have will be <b>deleted</b>. <br><br>' + '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 <b>deleted</b> from your calibre library.<br><br> ' + 'Are you <b>sure</b> you want to proceed?')%title + +'</p>', 'merge_only_formats', self.gui): + return + self.add_formats(dest_id, src_books) + self.delete_books_after_merge(src_ids) else: if not confirm('<p>'+_( 'Book formats and metadata from the selected books will be merged ' @@ -243,15 +269,10 @@ class EditMetadataAction(InterfaceAction): 'subsequently selected books will be <b>deleted</b>. <br><br>' '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 <b>deleted</b> from your computer.<br><br> ' + 'will be permanently <b>deleted</b> from your calibre library.<br><br> ' 'Are you <b>sure</b> you want to proceed?')%title +'</p>', 'merge_books', self.gui): return - if len(rows)>5: - if not confirm('<p>'+_('You are about to merge more than 5 books. ' - 'Are you <b>sure</b> you want to proceed?') - +'</p>', 'merge_too_many_books', self.gui): - return self.add_formats(dest_id, src_books) self.merge_metadata(dest_id, src_ids) self.delete_books_after_merge(src_ids) diff --git a/src/calibre/gui2/dialogs/confirm_delete.py b/src/calibre/gui2/dialogs/confirm_delete.py index 4e0a259824..ff7f0a285a 100644 --- a/src/calibre/gui2/dialogs/confirm_delete.py +++ b/src/calibre/gui2/dialogs/confirm_delete.py @@ -31,4 +31,5 @@ def confirm(msg, name, parent=None, pixmap='dialog_warning.png'): d = Dialog(msg, name, parent) d.label.setPixmap(QPixmap(I(pixmap))) d.setWindowIcon(QIcon(I(pixmap))) + d.resize(d.sizeHint()) return d.exec_() == d.Accepted From 43a80c117d588e8a4fe6710379f52a8bf6309aa2 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Fri, 10 Dec 2010 14:10:11 -0700 Subject: [PATCH 374/375] version 0.7.33 --- Changelog.yaml | 72 ++++++++++++++++++++++++++++++++++++++++ src/calibre/constants.py | 2 +- 2 files changed, 73 insertions(+), 1 deletion(-) diff --git a/Changelog.yaml b/Changelog.yaml index 068afbb42d..3bc266c18e 100644 --- a/Changelog.yaml +++ b/Changelog.yaml @@ -4,6 +4,78 @@ # for important features/bug fixes. # Also, each release can have new and improved recipes. +- version: 0.7.33 + date: 2010-12-10 + + new features: + - title: "Language sensitive sorting" + type: major + description: > + "calibre now sorts using language specific rules. The language used is the language of the calibre interface, which can be changed via Preferences->Look & Feel. There is also + a tweak that allows you to use a different language from the one used for the calibre interface." + + - title: "Add an action to merge only formats and leave metadata alone (Shift+Alt+M)" + tickets: [7709] + + - title: "Add a tweak to control which custom columns are displayed in the Book details panel." + + - title: "Implement a more sophisticated 'functional programming' template language. See the User Manual for details." + + - title: "Speed up deleting of large numbers of books and show progress while doing so" + + - title: "Adding books: Dont refresh the Tag Browser while adding multiple books. Should speed up the adding of large numbers of books." + + - title: "Edit metadata dialog: When trying to download metadata, if there are multiple matches indicate which matches have a cover and summary in the list. Also add an option to automatically download the cover of the selected match." + + - title: "Drivers for the HTC Legend and Samsung Epic" + + - title: "FB2 Output: Convert SVG images in the input document to raster images" + + - title: "News download: Localize the navigation bars in the downloaded news to the language the user has selected for their calibre interface" + + bug fixes: + - title: "Various fixes to the Title Case function" + tickets: [7846] + + - title: "Content server: Fix --url-prefix being ignored for links at the Top level" + + - title: "News download: When generating periodicals for the SONY use the local timezone in the SONY specific metadata" + + - title: "Fix bug in cover cache that could cause it to keep a large number of covers in memory. Showed up when adding large numbers of books to calibre." + tickets: [7813] + + - title: "Adding books: Run in the main thread to prevent unfortunate interactions with the metadata backup. Also fix regression that broke the Abort button." + + - title: "Fix a crash on OS X if OK is clicked inthe edit metadata button while downloading a cover" + tickets: [7716] + + - title: "E-book viewer: Fix a regression that prevented booksmarks from working with some EPUB files" + tickets: [7812] + + - title: "Save to disk: Refactor to not open a database connection in the worker process. Also fix a bug that could lead to save failures not being reported." + + - title: "Fix regression in 0.7.32 that broke opening formats in the ebook viewer from the edit metadata dialog" + + - title: "FB2 Output: Generate output 100% compliant with the FB2 spec" + + - title: "Fix Saved search dropdown box looses selected search" + tickets: [7787] + + - title: "TXT Output: Fix an issue where the br to space conversion was not being handled properly." + + improved recipes: + - Le Monde + - Ming Pao + - New Yorker + + new recipes: + - title: "ToyoKeizai News and Nikkei Social News" + author: "Hiroshi Miura" + + - title: "St. Louis Post Dispatch" + author: "cisaak" + + - version: 0.7.32 date: 2010-12-03 diff --git a/src/calibre/constants.py b/src/calibre/constants.py index f9c177e7a8..9cc67b39e4 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.32' +__version__ = '0.7.33' __author__ = "Kovid Goyal <kovid@kovidgoyal.net>" import re From 5296694fd7638135aa8aae5467f1ae57b0136822 Mon Sep 17 00:00:00 2001 From: Kovid Goyal <kovid@kovidgoyal.net> Date: Fri, 10 Dec 2010 14:25:10 -0700 Subject: [PATCH 375/375] Heise Open and Technology Review by Anton Gillert --- Changelog.yaml | 5 +- resources/recipes/heise_open.recipe | 38 +++++ resources/recipes/tr.recipe | 37 +++++ src/calibre/translations/calibre.pot | 209 ++++++++++++++++----------- 4 files changed, 206 insertions(+), 83 deletions(-) create mode 100644 resources/recipes/heise_open.recipe create mode 100644 resources/recipes/tr.recipe diff --git a/Changelog.yaml b/Changelog.yaml index 3bc266c18e..12f1b570bc 100644 --- a/Changelog.yaml +++ b/Changelog.yaml @@ -12,7 +12,7 @@ type: major description: > "calibre now sorts using language specific rules. The language used is the language of the calibre interface, which can be changed via Preferences->Look & Feel. There is also - a tweak that allows you to use a different language from the one used for the calibre interface." + a tweak that allows you to use a different language from the one used for the calibre interface. Powered by the ICU library." - title: "Add an action to merge only formats and leave metadata alone (Shift+Alt+M)" tickets: [7709] @@ -75,6 +75,9 @@ - title: "St. Louis Post Dispatch" author: "cisaak" + - title: "Heise Open and Technology Review" + author: "Anton Gillert" + - version: 0.7.32 date: 2010-12-03 diff --git a/resources/recipes/heise_open.recipe b/resources/recipes/heise_open.recipe new file mode 100644 index 0000000000..dd1374aa6b --- /dev/null +++ b/resources/recipes/heise_open.recipe @@ -0,0 +1,38 @@ +__license__ = 'GPL v3' +__copyright__ = '2010, Anton Gillert <atx at binaryninja.de>' + +''' +Fetch Heise Open. +''' +from calibre.web.feeds.news import BasicNewsRecipe + + +class HeiseOpenDe(BasicNewsRecipe): + + title = 'Heise Open' + description = 'Opensource news from Germany' + __author__ = 'Anton Gillert' + use_embedded_content = False + language = 'de' + timefmt = ' [%d %b %Y]' + max_articles_per_feed = 40 + no_stylesheets = True + + feeds = [ ('Heise Open', 'http://www.heise.de/open/news/news-atom.xml') ] + + def print_version(self, url): + return url + '?view=print' + + remove_tags = [dict(id='navi_top'), + dict(id='navi_bottom'), + dict(name='div', attrs={'class':'navi_top_logo'}), + dict(name='img', attrs={'src':'/open/icons/open_logo_2009_weiss.gif'}), + dict(name='h5', attrs={'style':'margin: 0.5em 0;'}), + dict(name='p', attrs={'class':'news_datum'}), + dict(name='p', attrs={'class':'size80'})] + remove_tags_after = [dict(name='p', attrs={'class':'size80'})] + + def get_cover_url(self): + return 'http://www.heise.de/open/icons/open_logo_2009_weiss.gif' + + diff --git a/resources/recipes/tr.recipe b/resources/recipes/tr.recipe new file mode 100644 index 0000000000..d58c9d2281 --- /dev/null +++ b/resources/recipes/tr.recipe @@ -0,0 +1,37 @@ +__license__ = 'GPL v3' +__copyright__ = '2010, Anton Gillert <atx at binaryninja.de>' + +''' +Fetch Technology Review. +''' +from time import strftime +from calibre.web.feeds.news import BasicNewsRecipe + + +class TechnologyReviewDe(BasicNewsRecipe): + + title = 'Technology Review' + description = 'Technology news from Germany' + __author__ = 'Anton Gillert' + use_embedded_content = False + language = 'de' + timefmt = ' [%d %b %Y]' + max_articles_per_feed = 40 + no_stylesheets = True + + feeds = [ ('Technology Review', 'http://www.heise.de/tr/news-atom.xml') ] + + def print_version(self, url): + return url + '?view=print' + + remove_tags = [dict(id='navi_top'), + dict(id='navi_bottom'), + dict(name='div', attrs={'class':'navi_top_logo'}), + dict(name='img', attrs={'src':'/tr/icons/tr_logo2006.gif'}), + dict(name='p', attrs={'class':'size80'})] + remove_tags_after = [dict(name='p', attrs={'class':'size80'})] + + def get_cover_url(self): + return 'http://www.heise-medien.de/presseinfo/bilder/tr/' + strftime("%y/tr%m%Y.jpg") + + diff --git a/src/calibre/translations/calibre.pot b/src/calibre/translations/calibre.pot index 11eb9cad49..af4cd72ee0 100644 --- a/src/calibre/translations/calibre.pot +++ b/src/calibre/translations/calibre.pot @@ -4,9 +4,9 @@ # msgid "" msgstr "" -"Project-Id-Version: calibre 0.7.32\n" -"POT-Creation-Date: 2010-12-09 08:47+MST\n" -"PO-Revision-Date: 2010-12-09 08:47+MST\n" +"Project-Id-Version: calibre 0.7.33\n" +"POT-Creation-Date: 2010-12-10 14:10+MST\n" +"PO-Revision-Date: 2010-12-10 14:10+MST\n" "Last-Translator: Automatically generated\n" "Language-Team: LANGUAGE\n" "MIME-Version: 1.0\n" @@ -35,7 +35,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:100 #: /home/kovid/work/calibre/src/calibre/ebooks/chm/metadata.py:56 #: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:407 -#: /home/kovid/work/calibre/src/calibre/ebooks/epub/periodical.py:124 +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/periodical.py:126 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:93 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:95 #: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:338 @@ -111,8 +111,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:307 #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:357 #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:364 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:308 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:311 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:329 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:332 #: /home/kovid/work/calibre/src/calibre/gui2/add.py:160 #: /home/kovid/work/calibre/src/calibre/gui2/add.py:167 #: /home/kovid/work/calibre/src/calibre/gui2/convert/__init__.py:42 @@ -128,10 +128,10 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:193 #: /home/kovid/work/calibre/src/calibre/gui2/email.py:235 #: /home/kovid/work/calibre/src/calibre/gui2/email.py:244 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:379 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:398 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:925 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1118 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:396 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:415 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:942 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1135 #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:112 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:190 #: /home/kovid/work/calibre/src/calibre/library/cli.py:215 @@ -1932,8 +1932,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:59 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:66 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:376 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:930 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:393 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:947 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:304 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:570 msgid "Title" @@ -1942,8 +1942,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:608 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:60 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:68 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:381 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:931 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:398 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:948 msgid "Author(s)" msgstr "" @@ -1964,8 +1964,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:189 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:108 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:79 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:328 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1137 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:342 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1154 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:188 msgid "Comments" msgstr "" @@ -1975,8 +1975,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:30 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:74 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:316 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1133 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:330 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1150 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:161 #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:650 msgid "Tags" @@ -1987,8 +1987,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:29 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:75 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:333 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1142 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:347 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1159 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:109 msgid "Series" msgstr "" @@ -1998,7 +1998,7 @@ msgid "Language" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:618 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1125 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1142 msgid "Timestamp" msgstr "" @@ -3138,10 +3138,10 @@ msgstr "" #: /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:124 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:123 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:181 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:185 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:222 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:92 msgid "No books selected" msgstr "" @@ -3641,51 +3641,59 @@ msgstr "" msgid "Merge into first selected book - keep others" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:58 +msgid "Merge only formats into first selected book - delete others" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:79 msgid "Cannot download metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:99 msgid "social metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:101 msgid "covers" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:101 #: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:224 msgid "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:102 msgid "Downloading %s for %d book(s)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:122 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:184 msgid "Cannot edit metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:217 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:220 +#: /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 "Cannot merge books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:225 msgid "At least two books must be selected for merging" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:226 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:228 +msgid "You are about to merge more than 5 books. Are you <b>sure</b> you want to proceed?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:236 msgid "Book formats and metadata from the selected books will be added to the <b>first selected book</b> (%s). ISBN will <i>not</i> be merged.<br><br> The second and subsequently selected books will not be deleted or changed.<br><br>Please confirm you want to proceed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:238 -msgid "Book formats and metadata from the selected books will be merged into the <b>first selected book</b> (%s). ISBN will <i>not</i> be merged.<br><br>After merger the second and subsequently selected books will be <b>deleted</b>. <br><br>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 <b>deleted</b> from your computer.<br><br> Are you <b>sure</b> you want to proceed?" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:248 +msgid "Book formats from the selected books will be merged into the <b>first selected book</b> (%s). Metadata in the first selected book will not be changed.Author, Title, ISBN and all other metadata will <i>not</i> be merged.<br><br>After merger the second and subsequently selected books, with any metadata they have will be <b>deleted</b>. <br><br>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 <b>deleted</b> from your calibre library.<br><br> Are you <b>sure</b> you want to proceed?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:251 -msgid "You are about to merge more than 5 books. Are you <b>sure</b> you want to proceed?" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:264 +msgid "Book formats and metadata from the selected books will be merged into the <b>first selected book</b> (%s). ISBN will <i>not</i> be merged.<br><br>After merger the second and subsequently selected books will be <b>deleted</b>. <br><br>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 <b>deleted</b> from your calibre library.<br><br> Are you <b>sure</b> you want to proceed?" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/fetch_news.py:17 @@ -4134,8 +4142,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:125 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:135 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:323 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1123 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:337 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1140 msgid "Path" msgstr "" @@ -4145,15 +4153,15 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:127 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:128 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:131 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:322 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:336 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/emailp.py:24 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:118 msgid "Formats" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:28 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:934 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1126 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:951 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1143 msgid "Collections" msgstr "" @@ -4163,11 +4171,11 @@ msgid "Click to open" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:53 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:315 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:321 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:327 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1132 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1136 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:329 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:335 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1149 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1153 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:48 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:78 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:83 @@ -5621,14 +5629,14 @@ msgid "<p>Cannot upload books to device there is no more free space available " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget.py:89 -#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:359 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:368 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:234 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:57 msgid "Invalid template" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget.py:90 -#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:360 +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:369 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:235 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:58 msgid "The template %s is invalid:" @@ -5859,7 +5867,17 @@ msgstr "" msgid "&Profile:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comments_dialog_ui.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comments_dialog.py:23 +msgid "&OK" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comments_dialog.py:24 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:225 +msgid "&Cancel" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comments_dialog_ui.py:43 msgid "Edit Comments" msgstr "" @@ -5884,7 +5902,7 @@ 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:70 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:932 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:949 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:33 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:295 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:569 @@ -5893,7 +5911,7 @@ 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:1122 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1139 msgid "Format" msgstr "" @@ -7184,11 +7202,6 @@ msgstr "" msgid "Discard changes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:60 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:225 -msgid "&Cancel" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:61 msgid "<p>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 <b>and the editor windows you used to edit files in the epub</b>.</p><p>Rebuild the ePub, updating your calibre library.</p>" msgstr "" @@ -7687,6 +7700,10 @@ msgstr "" msgid "Y" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:355 +msgid "Edit template" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:67 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:241 msgid "On Device" @@ -7697,38 +7714,38 @@ msgstr "" msgid "Size (MB)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:334 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:348 msgid "Book %s of %s." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:696 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1242 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:713 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1259 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:454 msgid "The lookup/search name is \"{0}\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:702 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1244 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:719 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1261 msgid "This book's UUID is \"{0}\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:929 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:946 msgid "In Library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:933 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:950 msgid "Size" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1142 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1159 msgid "Book <font face=\"serif\">%s</font> of %s." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1222 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1239 msgid "Marked for deletion" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1225 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1242 msgid "Double click to <b>edit</b> me<br><br>" msgstr "" @@ -11232,23 +11249,51 @@ msgstr "" msgid "How and when calibre updates metadata on the device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter.py:36 -msgid "lookup requires either 2 or an odd number of arguments" +#: /home/kovid/work/calibre/src/calibre/utils/formatter.py:77 +msgid "failed to scan program. Invalid input {0}" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/formatter.py:59 -msgid "switch requires an odd number of arguments" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/utils/formatter.py:116 -msgid "format: type {0} requires an integer value, got {1}" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/utils/formatter.py:122 -msgid "format: type {0} requires a decimal (float) value, got {1}" +#: /home/kovid/work/calibre/src/calibre/utils/formatter.py:82 +msgid " near " msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/formatter.py:124 +msgid "syntax error - program ends before EOF" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/formatter.py:141 +msgid "unknown id " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/formatter.py:146 +msgid "unknown function {0}" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/formatter.py:165 +msgid "missing closing parenthesis" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/formatter.py:183 +msgid "expression is not function or constant" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/formatter.py:210 +msgid "lookup requires either 2 or an odd number of arguments" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/formatter.py:233 +msgid "switch requires an odd number of arguments" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/formatter.py:290 +msgid "format: type {0} requires an integer value, got {1}" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/formatter.py:296 +msgid "format: type {0} requires a decimal (float) value, got {1}" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/utils/formatter.py:298 msgid "format: unknown format type letter {0}" msgstr ""