Sync to trunk.

This commit is contained in:
John Schember 2010-01-28 06:15:37 -05:00
commit 8d34fe7167
64 changed files with 12607 additions and 8520 deletions

View File

@ -4,6 +4,70 @@
# for important features/bug fixes. # for important features/bug fixes.
# Also, each release can have new and improved recipes. # Also, each release can have new and improved recipes.
- version: 0.6.36
date: 2010-01-25
new features:
- title: Catalog generation in MOBI format
- title: "Driver for Inves Book 600"
- title: "Show notifications on OS X even when systray icon is disabled. "
bug fixes:
- title: Fix memory leak in catalog generation
- title: Fix regression that broke PML output
- title: Fix bug in MOBI Input
tickets: [4643]
- title: "Replace commas with semi-colons in download tags"
tickets: [4650]
- title: Fix catalog output format dropdown empty in linux
tickets: [4656]
- title: "Fix display of non-English characters in OS X notifications"
tickets: [4654]
- title: Add .cbc to list of book formats
tickets: [4662]
- title: "Content server: Mobile page breaks if library contains empty books. Now fixed."
- title: "Support old 212 byte header PDB files"
tickets: [4646]
- title: "Fix regression that caused wrong error message to be displayed when device is out of space"
new recipes:
- title: Harvard Business Review Blogs
author: Brian_G
- title: Neowin
author: Darko Miletic
- title: Greensboro News and Record
author: Walt Anthony
- title: Hot Air
author: Walt Anthony
- title: ionline
author: Darko Miletic
- title: The National Review Online
author: Walt Anthony
improved recipes:
- Ars Technica
- Sports Illustrated
- Common Dreams
- Wired Magazine
- version: 0.6.35 - version: 0.6.35
date: 2010-01-22 date: 2010-01-22

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 788 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 835 B

View File

@ -60,7 +60,7 @@ class ArsTechnica2(BasicNewsRecipe):
nurl = 'http://arstechnica.com' + atag['href'] nurl = 'http://arstechnica.com' + atag['href']
rawc = self.index_to_soup(nurl,True) rawc = self.index_to_soup(nurl,True)
soup2 = BeautifulSoup(rawc, fromEncoding=self.encoding) soup2 = BeautifulSoup(rawc, fromEncoding=self.encoding)
readmoretag = soup2.find('div', attrs={'class':'read-more-link'}) readmoretag = soup2.find('div', attrs={'class':'read-more-link'})
if readmoretag: if readmoretag:
readmoretag.extract() readmoretag.extract()
@ -90,7 +90,3 @@ class ArsTechnica2(BasicNewsRecipe):
return soup return soup
def get_article_url(self, article):
return article.get('feedburner_origlink', None).rpartition('?')[0]

View File

@ -10,26 +10,44 @@ doscovermagazine.com
from calibre.web.feeds.news import BasicNewsRecipe from calibre.web.feeds.news import BasicNewsRecipe
class DiscoverMagazine(BasicNewsRecipe): class DiscoverMagazine(BasicNewsRecipe):
title = u'Discover Magazine' title = u'Discover Magazine'
description = u'Science, Technology and the Future' description = u'Science, Technology and the Future'
__author__ = 'Mike Diaz' __author__ = 'Mike Diaz'
oldest_article = 33
language = 'en' language = 'en'
max_articles_per_feed = 20 oldest_article = 33
max_articles_per_feed = 20
no_stylesheets = True
remove_javascript = True
use_embedded_content = False
encoding = 'utf-8'
extra_css = '.headline {font-size: x-large;} \n .fact {padding-top: 10pt}'
remove_tags_before = dict(id='articlePage')
keep_only_tags = [dict(name='div', attrs={'id':'articlePage'})]
remove_tags = [dict(attrs={'id':['buttons', 'tool-box', 'teaser', 'already-subscriber', 'teaser-suite', 'related-articles', 'relatedItem', 'box-popular', 'box-blogs', 'box-news', 'footer']}),
dict(attrs={'class':'popularNewsBox'}),
dict(name=['img', 'style', 'head'])]
remove_tags_after = dict(id='articlePage')
feeds = [ feeds = [
(u'Technology', u'http://discovermagazine.com/topics/technology/rss.xml'), (u'Technology', u'http://discovermagazine.com/topics/technology/rss.xml'),
(u'Health - Medicine', u'http://discovermagazine.com/topics/health-medicine/rss.xml'), (u'Health - Medicine', u'http://discovermagazine.com/topics/health-medicine/rss.xml'),
(u'Mind Brain', u'http://discovermagazine.com/topics/mind-brain/rss.xml'), (u'Mind Brain', u'http://discovermagazine.com/topics/mind-brain/rss.xml'),
(u'Space', u'http://discovermagazine.com/topics/space/rss.xml'), (u'Space', u'http://discovermagazine.com/topics/space/rss.xml'),
(u'Human Origins', u'http://discovermagazine.com/topics/human-origins/rss.xml'), (u'Human Origins', u'http://discovermagazine.com/topics/human-origins/rss.xml'),
(u'Living World', u'http://discovermagazine.com/topics/living-world/rss.xml'), (u'Living World', u'http://discovermagazine.com/topics/living-world/rss.xml'),
(u'Environment', u'http://discovermagazine.com/topics/environment/rss.xml'), (u'Environment', u'http://discovermagazine.com/topics/environment/rss.xml'),
(u'Physics & Math', u'http://discovermagazine.com/topics/physics-math/rss.xml'), (u'Physics & Math', u'http://discovermagazine.com/topics/physics-math/rss.xml'),
(u'Vital Signs', u'http://discovermagazine.com/columns/vital-signs/rss.xml'), (u'Vital Signs', u'http://discovermagazine.com/columns/vital-signs/rss.xml'),
(u"20 Things you didn't know about...", u'http://discovermagazine.com/columns/20-things-you-didnt-know/rss.xml'), (u"20 Things you didn't know about...", u'http://discovermagazine.com/columns/20-things-you-didnt-know/rss.xml'),
(u'Fuzzy Math', u'http://discovermagazine.com/columns/fuzzy-math/rss.xml'), (u'Fuzzy Math', u'http://discovermagazine.com/columns/fuzzy-math/rss.xml'),
(u'The Brain', u'http://discovermagazine.com/columns/the-brain/rss.xml'), (u'The Brain', u'http://discovermagazine.com/columns/the-brain/rss.xml'),
(u'Stupid Science Word of the Month', u'http://discovermagazine.com/columns/stupid-science-word-of-the-month/rss.xml'), (u'Stupid Science Word of the Month', u'http://discovermagazine.com/columns/stupid-science-word-of-the-month/rss.xml'),
(u'Science Not Fiction', u'http://blogs.discovermagazine.com/sciencenotfiction/wp-rss.php') (u'Science Not Fiction', u'http://blogs.discovermagazine.com/sciencenotfiction/wp-rss.php')
] ]

View File

@ -0,0 +1,197 @@
from calibre.web.feeds.news import BasicNewsRecipe
import re
# Needed for BLOGs
from calibre.web.feeds import Feed
class HBR(BasicNewsRecipe):
title = 'Harvard Business Review Blogs'
description = 'To subscribe go to http://hbr.harvardbusiness.org'
needs_subscription = True
__author__ = 'Kovid Goyal and Sujata Raman, enhanced by BrianG'
language = 'en'
no_stylesheets = True
LOGIN_URL = 'http://hbr.org/login?request_url=/'
INDEX = 'http://hbr.org/current'
#
# Blog Stuff
#
INCLUDE_BLOGS = True
INCLUDE_ARTICLES = False
# option-specific settings.
if INCLUDE_BLOGS == True:
remove_tags_after = dict(id='articleBody')
remove_tags_before = dict(id='pageFeature')
feeds = [('Blog','http://feeds.harvardbusiness.org/harvardbusiness')]
oldest_article = 30
max_articles_per_feed = 100
else:
timefmt = ' [%B %Y]'
keep_only_tags = [ dict(name='div', id='pageContainer')
]
remove_tags = [dict(id=['mastheadContainer', 'magazineHeadline',
'articleToolbarTopRD', 'pageRightSubColumn', 'pageRightColumn',
'todayOnHBRListWidget', 'mostWidget', 'keepUpWithHBR',
'articleToolbarTop','articleToolbarBottom', 'articleToolbarRD',
'mailingListTout', 'partnerCenter', 'pageFooter']),
dict(name='iframe')]
extra_css = '''
a {font-family:Georgia,"Times New Roman",Times,serif; font-style:italic; color:#000000; }
.article{font-family:Georgia,"Times New Roman",Times,serif; font-size: xx-small;}
h2{font-family:Georgia,"Times New Roman",Times,serif; font-weight:bold; font-size:large; }
h4{font-family:Georgia,"Times New Roman",Times,serif; font-weight:bold; font-size:small; }
#articleBody{font-family:Georgia,"Times New Roman",Times,serif; font-style:italic; color:#000000;font-size:x-small;}
#summaryText{font-family:Georgia,"Times New Roman",Times,serif; font-weight:bold; font-size:x-small;}
'''
#-------------------------------------------------------------------------------------------------
def get_browser(self):
br = BasicNewsRecipe.get_browser(self)
br.open(self.LOGIN_URL)
br.select_form(name='signInForm')
br['signInForm:username'] = self.username
br['signInForm:password'] = self.password
raw = br.submit().read()
if 'My Account' not in raw:
raise Exception('Failed to login, are you sure your username and password are correct?')
self.logout_url = None
link = br.find_link(text='Sign out')
if link:
self.logout_url = link.absolute_url
return br
#-------------------------------------------------------------------------------------------------
def cleanup(self):
if self.logout_url is not None:
self.browser.open(self.logout_url)
#-------------------------------------------------------------------------------------------------
def map_url(self, url):
if url.endswith('/ar/1'):
return url[:-1]+'pr'
#-------------------------------------------------------------------------------------------------
def hbr_get_toc(self):
soup = self.index_to_soup(self.INDEX)
url = soup.find('a', text=lambda t:'Full Table of Contents' in t).parent.get('href')
return self.index_to_soup('http://hbr.org'+url)
#-------------------------------------------------------------------------------------------------
def hbr_parse_section(self, container, feeds):
current_section = None
current_articles = []
for x in container.findAll(name=['li', 'h3', 'h4']):
if x.name in ['h3', 'h4'] and not x.findAll(True):
if current_section and current_articles:
feeds.append((current_section, current_articles))
current_section = self.tag_to_string(x)
current_articles = []
self.log('\tFound section:', current_section)
if x.name == 'li':
a = x.find('a', href=True)
if a is not None:
title = self.tag_to_string(a)
url = a.get('href')
if '/ar/' not in url:
continue
if url.startswith('/'):
url = 'http://hbr.org'+url
url = self.map_url(url)
p = x.find('p')
desc = ''
if p is not None:
desc = self.tag_to_string(p)
if not title or not url:
continue
self.log('\t\tFound article:', title)
self.log('\t\t\t', url)
self.log('\t\t\t', desc)
current_articles.append({'title':title, 'url':url,
'description':desc, 'date':''})
if current_section and current_articles:
feeds.append((current_section, current_articles))
#-------------------------------------------------------------------------------------------------
def hbr_parse_toc(self, soup):
feeds = []
features = soup.find(id='issueFeaturesContent')
self.hbr_parse_section(features, feeds)
departments = soup.find(id='issueDepartments')
self.hbr_parse_section(departments, feeds)
return feeds
#-------------------------------------------------------------------------------------------------
def feed_to_index_append(self, feedObject, masterFeed):
# Loop thru the feed object and build the correct type of article list
for feed in feedObject:
# build the correct structure from the feed object
newArticles = []
for article in feed.articles:
newArt = {
'title' : article.title,
'url' : article.url,
'date' : article.date,
'description' : article.text_summary
}
newArticles.append(newArt)
# Append the earliest/latest dates of the feed to the feed title
startDate, endDate = self.get_feed_dates(feed, '%d-%b')
newFeedTitle = feed.title + ' (' + startDate + ' thru ' + endDate + ')'
# append the newly-built list object to the index object passed in
# as masterFeed.
masterFeed.append( (newFeedTitle,newArticles) )
#-------------------------------------------------------------------------------------------------
def get_feed_dates(self, feedObject, dateMask):
startDate = feedObject.articles[len(feedObject.articles)-1].localtime.strftime(dateMask)
endDate = feedObject.articles[0].localtime.strftime(dateMask)
return startDate, endDate
#-------------------------------------------------------------------------------------------------
def hbr_parse_blogs(self, feeds):
# Do the "official" parse_feeds first
rssFeeds = Feed()
# Use the PARSE_FEEDS method to get a Feeds object of the articles
rssFeeds = BasicNewsRecipe.parse_feeds(self)
# Create a new feed of the right configuration and append to existing afeeds
self.feed_to_index_append(rssFeeds[:], feeds)
#-------------------------------------------------------------------------------------------------
def parse_index(self):
if self.INCLUDE_ARTICLES == True:
soup = self.hbr_get_toc()
feeds = self.hbr_parse_toc(soup)
else:
feeds = []
# blog stuff
if self.INCLUDE_BLOGS == True:
self.hbr_parse_blogs(feeds)
return feeds
#-------------------------------------------------------------------------------------------------
def get_cover_url(self):
cover_url = None
index = 'http://hbr.org/current'
soup = self.index_to_soup(index)
link_item = soup.find('img', alt=re.compile("Current Issue"), src=True)
if link_item:
cover_url = 'http://hbr.org' + link_item['src']
return cover_url

View File

@ -1,4 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import time
from calibre.web.feeds.recipes import BasicNewsRecipe from calibre.web.feeds.recipes import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import BeautifulSoup from calibre.ebooks.BeautifulSoup import BeautifulSoup
@ -8,6 +11,7 @@ class JASN(BasicNewsRecipe):
__author__ = 'Krittika Goyal' __author__ = 'Krittika Goyal'
oldest_article = 31 #days oldest_article = 31 #days
max_articles_per_feed = 25 max_articles_per_feed = 25
delay = 5
needs_subscription = True needs_subscription = True
INDEX = 'http://jasn.asnjournals.org/current.shtml' INDEX = 'http://jasn.asnjournals.org/current.shtml'
@ -15,13 +19,13 @@ class JASN(BasicNewsRecipe):
remove_tags_before = dict(name='h2') remove_tags_before = dict(name='h2')
#remove_tags_after = dict(name='th', attrs={'align':'left'}) #remove_tags_after = dict(name='th', attrs={'align':'left'})
remove_tags = [ remove_tags = [
dict(name='iframe'), dict(name='iframe'),
#dict(name='div', attrs={'class':'related-articles'}), #dict(name='div', attrs={'class':'related-articles'}),
dict(name='td', attrs={'id':['jasnFooter']}), dict(name='td', attrs={'id':['jasnFooter']}),
dict(name='table', attrs={'id':"jasnNavBar"}), dict(name='table', attrs={'id':"jasnNavBar"}),
dict(name='table', attrs={'class':'content_box_outer_table'}), dict(name='table', attrs={'class':'content_box_outer_table'}),
dict(name='th', attrs={'align':'left'}) dict(name='th', attrs={'align':'left'})
] ]
@ -45,10 +49,52 @@ class JASN(BasicNewsRecipe):
raise ValueError('Failed to log in, is your account expired?') raise ValueError('Failed to log in, is your account expired?')
return br return br
feeds = [ #feeds = [
('JASN', #('JASN',
'http://jasn.asnjournals.org/rss/current.xml'), #'http://jasn.asnjournals.org/rss/current.xml'),
] #]
#TO GET ARTICLE TOC
def jasn_get_index(self):
return self.index_to_soup('http://jasn.asnjournals.org/current.shtml')
# To parse artice toc
def parse_index(self):
parse_soup = self.jasn_get_index()
div = parse_soup.find(id='tocBody')
current_section = None
current_articles = []
feeds = []
for x in div.findAll(True):
if x.name == 'h2':
# Section heading found
if current_articles and current_section:
feeds.append((current_section, current_articles))
current_section = self.tag_to_string(x)
current_articles = []
self.log('\tFound section:', current_section)
if current_section is not None and x.name == 'strong':
title = self.tag_to_string(x)
a = x.parent.parent.find('a', href=lambda x: x and '/full/' in x)
if a is None:
continue
url = a.get('href', False)
if not url or not title:
continue
if url.startswith('/'):
url = 'http://jasn.asnjournals.org'+url
self.log('\t\tFound article:', title)
self.log('\t\t\t', url)
current_articles.append({'title': title, 'url':url,
'description':'', 'date':''})
if current_articles and current_section:
feeds.append((current_section, current_articles))
return feeds
@ -59,10 +105,18 @@ class JASN(BasicNewsRecipe):
if not url: if not url:
continue continue
if url.startswith('/'): if url.startswith('/'):
url = 'http://jasn.asnjournals.org/'+url url = 'http://jasn.asnjournals.org'+url
isoup = self.index_to_soup(url) img = isoup = None
img = isoup.find('img', src=lambda x: x and try:
x.startswith('/content/')) isoup = self.index_to_soup(url)
except:
time.sleep(5)
try:
isoup = self.index_to_soup(url)
except:
continue
img = isoup.find('img', src=lambda x: x and x.startswith('/content/'))
if img is not None: if img is not None:
img.extract() img.extract()
table = a.findParent('table') table = a.findParent('table')
@ -71,3 +125,4 @@ class JASN(BasicNewsRecipe):

View File

@ -0,0 +1,239 @@
#!/usr/bin/env python
__license__ = 'GPL v3'
'''
macleans.ca
'''
from calibre.web.feeds.recipes import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag
from datetime import timedelta, date
class Macleans(BasicNewsRecipe):
title = u'Macleans Magazine'
__author__ = 'Nick Redding'
language = 'en_CA'
description = ('Macleans Magazine')
no_stylesheets = True
timefmt = ' [%b %d]'
# customization notes: delete sections you are not interested in
# set oldest_article to the maximum number of days back from today to include articles
sectionlist = [
['http://www2.macleans.ca/','Front Page'],
['http://www2.macleans.ca/category/canada/','Canada'],
['http://www2.macleans.ca/category/world-from-the-magazine/','World'],
['http://www2.macleans.ca/category/business','Business'],
['http://www2.macleans.ca/category/arts-culture/','Culture'],
['http://www2.macleans.ca/category/opinion','Opinion'],
['http://www2.macleans.ca/category/health-from-the-magazine/','Health'],
['http://www2.macleans.ca/category/environment-from-the-magazine/','Environment'],
['http://www2.macleans.ca/category/education/','On Campus'],
['http://www2.macleans.ca/category/travel-from-the-magazine/','Travel']
]
oldest_article = 7
# formatting for print version of articles
extra_css = '''h2{font-family:Times,serif; font-size:large;}
small {font-family:Times,serif; font-size:xx-small; list-style-type: none;}
'''
# tag handling for print version of articles
keep_only_tags = [dict(id='tw-print')]
remove_tags = [dict({'class':'postmetadata'})]
def preprocess_html(self,soup):
for img_tag in soup.findAll('img'):
parent_tag = img_tag.parent
if parent_tag.name == 'a':
new_tag = Tag(soup,'p')
new_tag.insert(0,img_tag)
parent_tag.replaceWith(new_tag)
elif parent_tag.name == 'p':
if not self.tag_to_string(parent_tag) == '':
new_div = Tag(soup,'div')
new_tag = Tag(soup,'p')
new_tag.insert(0,img_tag)
parent_tag.replaceWith(new_div)
new_div.insert(0,new_tag)
new_div.insert(1,parent_tag)
return soup
def parse_index(self):
articles = {}
key = None
ans = []
def parse_index_page(page_url,page_title):
def decode_date(datestr):
dmysplit = datestr.strip().lower().split(',')
mdsplit = dmysplit[1].split()
m = ['january','february','march','april','may','june','july','august','september','october','november','december'].index(mdsplit[0])+1
d = int(mdsplit[1])
y = int(dmysplit[2].split()[0])
return date(y,m,d)
def article_title(tag):
atag = tag.find('a',href=True)
if not atag:
return ''
return self.tag_to_string(atag)
def article_url(tag):
atag = tag.find('a',href=True)
if not atag:
return ''
return atag['href']+'print/'
def article_description(tag):
for p_tag in tag.findAll('p'):
d = self.tag_to_string(p_tag,False)
if not d == '':
return d
return ''
def compound_h4_h3_title(tag):
if tag.h4:
if tag.h3:
return self.tag_to_string(tag.h4,False)+u'\u2014'+self.tag_to_string(tag.h3,False)
else:
return self.tag_to_string(tag.h4,False)
elif tag.h3:
return self.tag_to_string(tag.h3,False)
else:
return ''
def compound_h2_h4_title(tag):
if tag.h2:
if tag.h4:
return self.tag_to_string(tag.h2,False)+u'\u2014'+self.tag_to_string(tag.h4,False)
else:
return self.tag_to_string(tag.h2,False)
elif tag.h4:
return self.tag_to_string(tag.h4,False)
else:
return ''
def handle_article(header_tag, outer_tag):
if header_tag:
url = article_url(header_tag)
title = article_title(header_tag)
author_date_tag = outer_tag.h4
if author_date_tag:
author_date = self.tag_to_string(author_date_tag,False).split(' - ')
author = author_date[0].strip()
article_date = decode_date(author_date[1])
earliest_date = date.today() - timedelta(days=self.oldest_article)
if article_date < earliest_date:
self.log("Skipping article dated %s" % author_date[1])
else:
excerpt_div = outer_tag.find('div','excerpt')
if excerpt_div:
description = article_description(excerpt_div)
else:
description = ''
if not articles.has_key(page_title):
articles[page_title] = []
articles[page_title].append(dict(title=title,url=url,date=author_date[1],description=description,author=author,content=''))
def handle_category_article(cat, header_tag, outer_tag):
url = article_url(header_tag)
title = article_title(header_tag)
if not title == '':
title = cat+u'\u2014'+title
a_tag = outer_tag.find('span','authorLink')
if a_tag:
author = self.tag_to_string(a_tag,False)
a_tag.parent.extract()
else:
author = ''
description = article_description(outer_tag)
if not articles.has_key(page_title):
articles[page_title] = []
articles[page_title].append(dict(title=title,url=url,date='',description=description,author=author,content=''))
soup = self.index_to_soup(page_url)
if page_title == 'Front Page':
# special processing for the front page
top_stories = soup.find('div',{ "id" : "macleansFeatured" })
if top_stories:
for div_slide in top_stories.findAll('div','slide'):
url = article_url(div_slide)
div_title = div_slide.find('div','header')
if div_title:
title = self.tag_to_string(div_title,False)
else:
title = ''
description = article_description(div_slide)
if not articles.has_key(page_title):
articles[page_title] = []
articles[page_title].append(dict(title=title,url=url,date='',description=description,author='',content=''))
from_macleans = soup.find('div',{ "id" : "fromMacleans" })
if from_macleans:
for li_tag in from_macleans.findAll('li','fromMacleansArticle'):
title = compound_h4_h3_title(li_tag)
url = article_url(li_tag)
description = article_description(li_tag)
if not articles.has_key(page_title):
articles[page_title] = []
articles[page_title].append(dict(title=title,url=url,date='',description=description,author='',content=''))
blog_central = soup.find('div',{ "id" : "bloglist" })
if blog_central:
for li_tag in blog_central.findAll('li'):
title = compound_h2_h4_title(li_tag)
if li_tag.h4:
url = article_url(li_tag.h4)
if not articles.has_key(page_title):
articles[page_title] = []
articles[page_title].append(dict(title=title,url=url,date='',description='',author='',content=''))
# need_to_know = soup.find('div',{ "id" : "needToKnow" })
# if need_to_know:
# for div_tag in need_to_know('div',attrs={'class' : re.compile("^needToKnowArticle")}):
# title = compound_h4_h3_title(div_tag)
# url = article_url(div_tag)
# description = article_description(div_tag)
# if not articles.has_key(page_title):
# articles[page_title] = []
# articles[page_title].append(dict(title=title,url=url,date='',description=description,author='',content=''))
for news_category in soup.findAll('div','newsCategory'):
news_cat = self.tag_to_string(news_category.h4,False)
handle_category_article(news_cat, news_category.find('h2'), news_category.find('div'))
for news_item in news_category.findAll('li'):
handle_category_article(news_cat,news_item.h3,news_item)
return
# find the div containing the highlight article
div_post = soup.find('div','post')
if div_post:
h1_tag = div_post.h1
handle_article(h1_tag,div_post)
# find the divs containing the rest of the articles
div_other = div_post.find('div', { "id" : "categoryOtherPosts" })
if div_other:
for div_entry in div_other.findAll('div','entry'):
h2_tag = div_entry.h2
handle_article(h2_tag,div_entry)
for page_name,page_title in self.sectionlist:
parse_index_page(page_name,page_title)
ans.append(page_title)
ans = [(key, articles[key]) for key in ans if articles.has_key(key)]
return ans

View File

@ -0,0 +1,24 @@
from calibre.web.feeds.news import BasicNewsRecipe
class Metro_Montreal(BasicNewsRecipe):
title = u'M\xe9tro Montr\xe9al'
__author__ = 'Jerry Clapperton'
description = 'Le quotidien le plus branché sur le monde'
language = 'fr'
oldest_article = 7
max_articles_per_feed = 20
use_embedded_content = False
remove_javascript = True
no_stylesheets = True
encoding = 'utf-8'
extra_css = '.headline {font-size: x-large;} \n .fact {padding-top: 10pt}'
remove_tags = [dict(attrs={'id':'buttons'}), dict(name=['img', 'style'])]
feeds = [(u"L'info", u'http://journalmetro.com/linfo/rss'), (u'Monde', u'http://journalmetro.com/monde/rss'), (u'Culture', u'http://journalmetro.com/culture/rss'), (u'Sports', u'http://journalmetro.com/sports/rss'), (u'Paroles', u'http://journalmetro.com/paroles/rss')]
def print_version(self, url):
return url.replace('article', 'ArticlePrint') + '?language=fr'

View File

@ -0,0 +1,67 @@
__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
www.nursingtimes.net
'''
import urllib
from calibre.web.feeds.recipes import BasicNewsRecipe
class NursingTimes(BasicNewsRecipe):
title = 'Nursing Times'
__author__ = 'Darko Miletic'
description = 'Nursing practice, NHS and health care news'
oldest_article = 8
max_articles_per_feed = 100
no_stylesheets = True
use_embedded_content = False
encoding = 'utf-8'
publisher = 'emap'
category = 'news, health, nursing, UK'
language = 'en-UK'
needs_subscription = True
LOGIN = 'http://www.nursingtimes.net/sign-in'
conversion_options = {
'comments' : description
,'tags' : category
,'language' : language
,'publisher' : publisher
}
def get_browser(self):
br = BasicNewsRecipe.get_browser()
br.open(self.LOGIN)
if self.username is not None and self.password is not None:
data = urllib.urlencode({ 'campaigncode' :'0'
,'referrer' :''
,'security_text':''
,'SIemail' :self.username
,'passWord' :self.password
,'LoginButton.x':'27'
,'LoginButton.y':'13'
})
br.open(self.LOGIN,data)
return br
keep_only_tags = [dict(name='div', attrs={'class':'storytext'})]
remove_tags = [
dict(name=['object','link','script','iframe'])
,dict(name='div',attrs={'id':'comments_form'})
]
remove_tags_after = dict(name='div',attrs={'id':'comments_form'})
feeds = [
(u'Breaking News', u'http://www.nursingtimes.net/XmlServers/navsectionRSS.aspx?navsectioncode=1')
,(u'Practice', u'http://www.nursingtimes.net/XmlServers/navsectionRSS.aspx?navsectioncode=512')
,(u'Behind the headlines', u'http://www.nursingtimes.net/XmlServers/navsectionRSS.aspx?navsectioncode=468')
,(u'Analysis', u'http://www.nursingtimes.net/XmlServers/navsectionRSS.aspx?navsectioncode=62')
,(u'Acute care news', u'http://www.nursingtimes.net/XmlServers/navsectionRSS.aspx?navsectioncode=5')
,(u'Primary vare news', u'http://www.nursingtimes.net/XmlServers/navsectionRSS.aspx?navsectioncode=231')
,(u'Mental Health news', u'http://www.nursingtimes.net/XmlServers/navsectionRSS.aspx?navsectioncode=27')
,(u'Management news', u'http://www.nursingtimes.net/XmlServers/navsectionRSS.aspx?navsectioncode=32')
,(u"Older people's nursing news", u'http://www.nursingtimes.net/XmlServers/navsectionRSS.aspx?navsectioncode=181')
,(u'Respiratory news', u'http://www.nursingtimes.net/XmlServers/navsectionRSS.aspx?navsectioncode=177')
,(u'Wound care news', u'http://www.nursingtimes.net/XmlServers/navsectionRSS.aspx?navsectioncode=182')
]

View File

@ -10,11 +10,18 @@ from calibre import strftime
from calibre.web.feeds.recipes import BasicNewsRecipe from calibre.web.feeds.recipes import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import BeautifulSoup from calibre.ebooks.BeautifulSoup import BeautifulSoup
def decode(self, src):
enc = 'utf-8'
if 'iso-8859-1' in src:
enc = 'cp1252'
return src.decode(enc, 'ignore')
class NYTimes(BasicNewsRecipe): class NYTimes(BasicNewsRecipe):
title = 'The New York Times (subscription)' title = 'The New York Times (subscription)'
__author__ = 'Kovid Goyal' __author__ = 'Kovid Goyal'
language = 'en' language = 'en'
requires_version = (0, 6, 36)
description = 'Daily news from the New York Times (subscription version)' description = 'Daily news from the New York Times (subscription version)'
timefmt = ' [%a, %b %d, %Y]' timefmt = ' [%a, %b %d, %Y]'
@ -27,7 +34,7 @@ class NYTimes(BasicNewsRecipe):
'side_tool', 'side_index', 'side_tool', 'side_index',
'relatedArticles', 'relatedTopics', 'adxSponLink']), 'relatedArticles', 'relatedTopics', 'adxSponLink']),
dict(name=['script', 'noscript', 'style'])] dict(name=['script', 'noscript', 'style'])]
#encoding = 'cp1252' encoding = decode
no_stylesheets = True no_stylesheets = True
extra_css = 'h1 {font: sans-serif large;}\n.byline {font:monospace;}' extra_css = 'h1 {font: sans-serif large;}\n.byline {font:monospace;}'
@ -48,9 +55,7 @@ class NYTimes(BasicNewsRecipe):
return 'NY Times' return 'NY Times'
def parse_index(self): def parse_index(self):
self.encoding = 'cp1252'
soup = self.index_to_soup('http://www.nytimes.com/pages/todayspaper/index.html') soup = self.index_to_soup('http://www.nytimes.com/pages/todayspaper/index.html')
self.encoding = None
def feed_title(div): def feed_title(div):
return ''.join(div.findAll(text=True, recursive=False)).strip() return ''.join(div.findAll(text=True, recursive=False)).strip()

View File

@ -1,31 +1,40 @@
from calibre.web.feeds.news import BasicNewsRecipe from calibre.web.feeds.news import BasicNewsRecipe
class NewsandObserver(BasicNewsRecipe): class NewsandObserver(BasicNewsRecipe):
title = u'News and Observer' title = u'Raleigh News & Observer'
description = 'News from Raleigh, North Carolina' description = 'News from Raleigh, North Carolina'
language = 'en' language = 'en'
__author__ = 'Krittika Goyal' __author__ = 'Krittika Goyal updated by Walt Anthony'
oldest_article = 5 #days oldest_article = 3 #days
max_articles_per_feed = 25 max_articles_per_feed = 25
summary_length = 150
no_stylesheets = True
remove_javascript = True
remove_stylesheets = True
remove_tags_before = dict(name='h1', attrs={'id':'story_headline'}) remove_tags_before = dict(name='h1', attrs={'id':'story_headline'})
remove_tags_after = dict(name='div', attrs={'id':'story_text_remaining'}) remove_tags_after = dict(name='div', attrs={'id':'story_text_remaining'})
remove_tags = [ remove_tags = [
dict(name='iframe'), dict(name='iframe'),
dict(name='div', attrs={'id':['right-rail', 'story_tools']}), dict(name='div', attrs={'id':['right-rail', 'story_tools', 'toolbox', 'toolbar', 'tool', 'shirttail', 'comment_widget', 'story_keywords', 'txtResizeTool']}),
dict(name='div', attrs={'class':['Buy-It-Now', 'story_link_share']}),
dict(name='ul', attrs={'class':'bold_tabs_nav'}), dict(name='ul', attrs={'class':'bold_tabs_nav'}),
] ]
feeds = [ feeds = [
('Cover', 'http://www.newsobserver.com/100/index.rss'), ('Cover', 'http://www.newsobserver.com/100/index.rss'),
('News', 'http://www.newsobserver.com/102/index.rss'), ('News', 'http://www.newsobserver.com/102/index.rss'),
('Politics', 'http://www.newsobserver.com/105/index.rss'), ('Politics', 'http://www.newsobserver.com/105/index.rss'),
('Business', 'http://www.newsobserver.com/104/index.rss'), ('Business', 'http://www.newsobserver.com/104/index.rss'),
('Sports', 'http://www.newsobserver.com/103/index.rss'), ('Sports', 'http://www.newsobserver.com/103/index.rss'),
('College Sports', 'http://www.newsobserver.com/119/index.rss'), ('College Sports', 'http://www.newsobserver.com/119/index.rss'),
('Lifestyles', 'http://www.newsobserver.com/106/index.rss'), ('Lifestyles', 'http://www.newsobserver.com/106/index.rss'),
('Editorials', 'http://www.newsobserver.com/158/index.rss')] ('Editorials', 'http://www.newsobserver.com/158/index.rss')
]

View File

@ -1,10 +1,12 @@
__license__ = 'GPL v3' __license__ = 'GPL v3'
__copyright__ = '2008-2009, Darko Miletic <darko.miletic at gmail.com>' __copyright__ = '2008-2010, Darko Miletic <darko.miletic at gmail.com>'
''' '''
pagina12.com.ar pagina12.com.ar
''' '''
import time
from calibre import strftime
from calibre.web.feeds.news import BasicNewsRecipe from calibre.web.feeds.news import BasicNewsRecipe
class Pagina12(BasicNewsRecipe): class Pagina12(BasicNewsRecipe):
@ -19,6 +21,8 @@ class Pagina12(BasicNewsRecipe):
encoding = 'cp1252' encoding = 'cp1252'
use_embedded_content = False use_embedded_content = False
language = 'es' language = 'es'
remove_empty_feeds = True
extra_css = ' body{font-family: sans-serif} '
conversion_options = { conversion_options = {
'comment' : description 'comment' : description
@ -47,3 +51,8 @@ class Pagina12(BasicNewsRecipe):
def print_version(self, url): def print_version(self, url):
return url.replace('http://www.pagina12.com.ar/','http://www.pagina12.com.ar/imprimir/') return url.replace('http://www.pagina12.com.ar/','http://www.pagina12.com.ar/imprimir/')
def get_cover_url(self):
imgnames = ['tapan.jpg','tapagn.jpg','tapan_gr.jpg','tapagn.jpg','tapagn.jpg','tapan.jpg','tapagn.jpg']
weekday = time.localtime().tm_wday
return strftime('http://www.pagina12.com.ar/fotos/%Y%m%d/diario/') + imgnames[weekday]

View File

@ -1,6 +1,5 @@
from calibre.web.feeds.recipes import BasicNewsRecipe from calibre.web.feeds.recipes import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import BeautifulSoup from calibre.ebooks.BeautifulSoup import BeautifulSoup
#from random import randint
from urllib import quote from urllib import quote
class SportsIllustratedRecipe(BasicNewsRecipe) : class SportsIllustratedRecipe(BasicNewsRecipe) :
@ -9,12 +8,11 @@ class SportsIllustratedRecipe(BasicNewsRecipe) :
__license__ = 'GPL v3' __license__ = 'GPL v3'
language = 'en' language = 'en'
description = 'Sports Illustrated' description = 'Sports Illustrated'
version = 1 version = 3
title = u'Sports Illustrated' title = u'Sports Illustrated'
no_stylesheets = True no_stylesheets = True
remove_javascript = True remove_javascript = True
#template_css = ''
use_embedded_content = False use_embedded_content = False
INDEX = 'http://sportsillustrated.cnn.com/' INDEX = 'http://sportsillustrated.cnn.com/'
@ -22,13 +20,39 @@ class SportsIllustratedRecipe(BasicNewsRecipe) :
def parse_index(self): def parse_index(self):
answer = [] answer = []
soup = self.index_to_soup(self.INDEX) soup = self.index_to_soup(self.INDEX)
# Find the link to the current issue on the front page. # Find the link to the current issue on the front page. SI Cover
cover = soup.find('img', attrs = {'alt' : 'Read All Articles', 'style' : 'vertical-align:bottom;'}) cover = soup.find('img', attrs = {'alt' : 'Read All Articles', 'style' : 'vertical-align:bottom;'})
if cover: if cover:
currentIssue = cover.parent['href'] currentIssue = cover.parent['href']
if currentIssue: if currentIssue:
# Open the index of current issue # Open the index of current issue
index = self.index_to_soup(currentIssue) index = self.index_to_soup(currentIssue)
self.log('\tLooking for current issue in: ' + currentIssue)
# Now let us see if they updated their frontpage
nav = index.find('div', attrs = {'class': 'siv_trav_top'})
if nav:
img = nav.find('img', attrs = {'src': 'http://i.cdn.turner.com/sivault/.element/img/1.0/btn_next_v2.jpg'})
if img:
parent = img.parent
if parent.name == 'a':
# They didn't update their frontpage; Load the next issue from here
href = self.INDEX + parent['href']
index = self.index_to_soup(href)
self.log('\tLooking for current issue in: ' + href)
if index.find('div', 'siv_noArticleMessage'):
nav = index.find('div', attrs = {'class': 'siv_trav_top'})
if nav:
# Their frontpage points to an issue without any articles; Use the previous issue
img = nav.find('img', attrs = {'src': 'http://i.cdn.turner.com/sivault/.element/img/1.0/btn_previous_v2.jpg'})
if img:
parent = img.parent
if parent.name == 'a':
href = self.INDEX + parent['href']
index = self.index_to_soup(href)
self.log('\tLooking for current issue in: ' + href)
# Find all articles. # Find all articles.
list = index.find('div', attrs = {'class' : 'siv_artList'}) list = index.find('div', attrs = {'class' : 'siv_artList'})
@ -69,31 +93,26 @@ class SportsIllustratedRecipe(BasicNewsRecipe) :
def preprocess_html(self, soup): def preprocess_html(self, soup):
header = soup.find('div', attrs = {'class' : 'siv_artheader'}) header = soup.find('div', attrs = {'class' : 'siv_artheader'})
if header: homeMadeSoup = BeautifulSoup('<html><head></head><body></body></html>')
# It's an article, prepare a container for the content body = homeMadeSoup.body
homeMadeSoup = BeautifulSoup('<html><head></head><body></body></html>')
body = homeMadeSoup.find('body')
# Find the date, title and byline # Find the date, title and byline
temp = header.find('td', attrs = {'class' : 'title'}) temp = header.find('td', attrs = {'class' : 'title'})
if temp : if temp :
date = temp.find('div', attrs = {'class' : 'date'}) date = temp.find('div', attrs = {'class' : 'date'})
if date: if date:
body.append(date) body.append(date)
if temp.h1: if temp.h1:
body.append(temp.h1) body.append(temp.h1)
if temp.h2 : if temp.h2 :
body.append(temp.h2) body.append(temp.h2)
byline = temp.find('div', attrs = {'class' : 'byline'}) byline = temp.find('div', attrs = {'class' : 'byline'})
if byline: if byline:
body.append(byline) body.append(byline)
# Find the content # Find the content
for para in soup.findAll('div', attrs = {'class' : 'siv_artpara'}) : for para in soup.findAll('div', attrs = {'class' : 'siv_artpara'}) :
body.append(para) body.append(para)
return homeMadeSoup return homeMadeSoup
else :
# It's a TOC, just return the whole lot
return soup

View File

@ -0,0 +1,22 @@
from calibre.web.feeds.news import BasicNewsRecipe
class The_Gazette(BasicNewsRecipe):
cover_url = 'file:///D:/Documents/Pictures/Covers/The_Gazette.jpg'
title = u'The Gazette'
__author__ = 'Jerry Clapperton'
description = 'Montreal news in English'
language = 'en_CA'
oldest_article = 7
max_articles_per_feed = 20
use_embedded_content = False
remove_javascript = True
no_stylesheets = True
encoding = 'utf-8'
keep_only_tags = [dict(name='div', attrs={'id':['storyheader','page1']})]
extra_css = '.headline {font-size: x-large;} \n .fact {padding-top: 10pt}'
feeds = [(u'News', u'http://feeds.canada.com/canwest/F297'), (u'Opinion', u'http://feeds.canada.com/canwest/F7383'), (u'Arts', u'http://feeds.canada.com/canwest/F7366'), (u'Life', u'http://rss.canada.com/get/?F6934'), (u'Business', u'http://feeds.canada.com/canwest/F6939'), (u'Travel', u'http://rss.canada.com/get/?F6938'), (u'Health', u'http://feeds.canada.com/canwest/F7397'), (u'Technology', u'http://feeds.canada.com/canwest/F7411')]

View File

@ -112,6 +112,9 @@ class LinuxFreeze(Command):
includes += ['calibre.gui2.convert.'+x.split('/')[-1].rpartition('.')[0] for x in \ includes += ['calibre.gui2.convert.'+x.split('/')[-1].rpartition('.')[0] for x in \
glob.glob('src/calibre/gui2/convert/*.py')] glob.glob('src/calibre/gui2/convert/*.py')]
includes += ['calibre.gui2.catalog.'+x.split('/')[-1].rpartition('.')[0] for x in \
glob.glob('src/calibre/gui2/catalog/*.py')]
LOADER = '/tmp/loader.py' LOADER = '/tmp/loader.py'
open(LOADER, 'wb').write('# This script is never actually used.\nimport sys') open(LOADER, 'wb').write('# This script is never actually used.\nimport sys')

View File

@ -117,9 +117,12 @@ def prints(*args, **kwargs):
try: try:
arg = arg.encode(enc) arg = arg.encode(enc)
except UnicodeEncodeError: except UnicodeEncodeError:
if not safe_encode: try:
raise arg = arg.encode('utf-8')
arg = repr(arg) except:
if not safe_encode:
raise
arg = repr(arg)
if not isinstance(arg, str): if not isinstance(arg, str):
try: try:
arg = str(arg) arg = str(arg)

View File

@ -2,7 +2,7 @@ __license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' __copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
__docformat__ = 'restructuredtext en' __docformat__ = 'restructuredtext en'
__appname__ = 'calibre' __appname__ = 'calibre'
__version__ = '0.6.35' __version__ = '0.6.36'
__author__ = "Kovid Goyal <kovid@kovidgoyal.net>" __author__ = "Kovid Goyal <kovid@kovidgoyal.net>"
import re import re

View File

@ -404,7 +404,7 @@ from calibre.devices.hanlin.driver import HANLINV3, HANLINV5, BOOX
from calibre.devices.blackberry.driver import BLACKBERRY from calibre.devices.blackberry.driver import BLACKBERRY
from calibre.devices.cybook.driver import CYBOOK from calibre.devices.cybook.driver import CYBOOK
from calibre.devices.eb600.driver import EB600, COOL_ER, SHINEBOOK, \ from calibre.devices.eb600.driver import EB600, COOL_ER, SHINEBOOK, \
POCKETBOOK360, GER2, ITALICA, ECLICTO, DBOOK POCKETBOOK360, GER2, ITALICA, ECLICTO, DBOOK, INVESBOOK
from calibre.devices.iliad.driver import ILIAD from calibre.devices.iliad.driver import ILIAD
from calibre.devices.irexdr.driver import IREXDR1000 from calibre.devices.irexdr.driver import IREXDR1000
from calibre.devices.jetbook.driver import JETBOOK from calibre.devices.jetbook.driver import JETBOOK
@ -485,6 +485,7 @@ plugins += [
ITALICA, ITALICA,
ECLICTO, ECLICTO,
DBOOK, DBOOK,
INVESBOOK,
BOOX, BOOX,
EB600, EB600,
README, README,

View File

@ -9,23 +9,22 @@ from calibre.devices.usbms.driver import USBMS
class BLACKBERRY(USBMS): class BLACKBERRY(USBMS):
name = 'Blackberry Device Interface' name = 'Blackberry Device Interface'
gui_name = 'Blackberry'
description = _('Communicate with the Blackberry smart phone.') description = _('Communicate with the Blackberry smart phone.')
author = _('Kovid Goyal') author = _('Kovid Goyal')
supported_platforms = ['windows', 'linux'] supported_platforms = ['windows', 'linux', 'osx']
# Ordered list of supported formats # Ordered list of supported formats
FORMATS = ['mobi', 'prc'] FORMATS = ['mobi', 'prc']
VENDOR_ID = [0x0fca] VENDOR_ID = [0x0fca]
PRODUCT_ID = [0x8004, 0x0004] PRODUCT_ID = [0x8004, 0x0004]
BCD = [0x0200, 0x0107, 0x0201] BCD = [0x0200, 0x0107, 0x0210, 0x0201]
VENDOR_NAME = 'RIM' VENDOR_NAME = 'RIM'
WINDOWS_MAIN_MEM = 'BLACKBERRY_SD' WINDOWS_MAIN_MEM = 'BLACKBERRY_SD'
#OSX_MAIN_MEM = 'Kindle Internal Storage Media'
MAIN_MEMORY_VOLUME_LABEL = 'Blackberry SD Card' MAIN_MEMORY_VOLUME_LABEL = 'Blackberry SD Card'
EBOOK_DIR_MAIN = 'ebooks' EBOOK_DIR_MAIN = 'eBooks'
SUPPORTS_SUB_DIRS = True SUPPORTS_SUB_DIRS = True

View File

@ -154,7 +154,7 @@ class ECLICTO(EB600):
name = 'eClicto Device Interface' name = 'eClicto Device Interface'
gui_name = 'eClicto' gui_name = 'eClicto'
FORMATS = ['epub', 'pdf', 'txt'] FORMATS = ['epub', 'pdf', 'htm', 'html', 'txt']
VENDOR_NAME = 'ECLICTO' VENDOR_NAME = 'ECLICTO'
WINDOWS_MAIN_MEM = 'EBOOK' WINDOWS_MAIN_MEM = 'EBOOK'
@ -173,3 +173,14 @@ class DBOOK(EB600):
VENDOR_NAME = 'INFINITY' VENDOR_NAME = 'INFINITY'
WINDOWS_MAIN_MEM = 'AIRIS_DBOOK' WINDOWS_MAIN_MEM = 'AIRIS_DBOOK'
WINDOWS_CARD_A_MEM = 'AIRIS_DBOOK' WINDOWS_CARD_A_MEM = 'AIRIS_DBOOK'
class INVESBOOK(EB600):
name = 'Inves Book Device Interface'
gui_name = 'Inves Book 600'
FORMATS = ['epub', 'mobi', 'prc', 'fb2', 'html', 'pdf', 'rtf', 'txt']
VENDOR_NAME = 'INVES_E6'
WINDOWS_MAIN_MEM = '00INVES_E600'
WINDOWS_CARD_A_MEM = '00INVES_E600'

View File

@ -23,7 +23,7 @@ class N516(USBMS):
VENDOR_ID = [0x0525] VENDOR_ID = [0x0525]
PRODUCT_ID = [0xa4a5] PRODUCT_ID = [0xa4a5]
BCD = [0x323] BCD = [0x323, 0x326]
VENDOR_NAME = 'INGENIC' VENDOR_NAME = 'INGENIC'
WINDOWS_MAIN_MEM = '_FILE-STOR_GADGE' WINDOWS_MAIN_MEM = '_FILE-STOR_GADGE'

View File

@ -71,7 +71,7 @@ int do_mount(const char *dev, const char *mp) {
#ifdef __NetBSD__ #ifdef __NetBSD__
execlp("mount_msdos", "mount_msdos", "-u", uids, "-g", gids, "-o", options, dev, mp, NULL); execlp("mount_msdos", "mount_msdos", "-u", uids, "-g", gids, "-o", options, dev, mp, NULL);
#else #else
execlp("mount", "mount", "-t", "vfat", "-o", options, dev, mp, NULL); execlp("mount", "mount", "-t", "auto", "-o", options, dev, mp, NULL);
#endif #endif
errsv = errno; errsv = errno;
fprintf(stderr, "Failed to mount with error: %s\n", strerror(errsv)); fprintf(stderr, "Failed to mount with error: %s\n", strerror(errsv));

View File

@ -808,6 +808,8 @@ class Device(DeviceConfig, DevicePlugin):
ext = os.path.splitext(fname)[1] ext = os.path.splitext(fname)[1]
from calibre.library.save_to_disk import get_components from calibre.library.save_to_disk import get_components
if not isinstance(template, unicode):
template = template.decode('utf-8')
extra_components = get_components(template, mdata, fname) extra_components = get_components(template, mdata, fname)
if not extra_components: if not extra_components:
extra_components.append(sanitize(self.filename_callback(fname, extra_components.append(sanitize(self.filename_callback(fname,

View File

@ -24,7 +24,7 @@ class DRMError(ValueError):
BOOK_EXTENSIONS = ['lrf', 'rar', 'zip', 'rtf', 'lit', 'txt', 'htm', 'xhtm', BOOK_EXTENSIONS = ['lrf', 'rar', 'zip', 'rtf', 'lit', 'txt', 'htm', 'xhtm',
'html', 'xhtml', 'pdf', 'pdb', 'prc', 'mobi', 'azw', 'doc', 'html', 'xhtml', 'pdf', 'pdb', 'prc', 'mobi', 'azw', 'doc',
'epub', 'fb2', 'djvu', 'lrx', 'cbr', 'cbz', 'oebzip', 'epub', 'fb2', 'djvu', 'lrx', 'cbr', 'cbz', 'cbc', 'oebzip',
'rb', 'imp', 'odt', 'chm', 'tpz', 'azw1', 'pml'] 'rb', 'imp', 'odt', 'chm', 'tpz', 'azw1', 'pml']
class HTMLRenderer(object): class HTMLRenderer(object):

View File

@ -340,6 +340,9 @@ class ComicInput(InputFormatPlugin):
%stream.name) %stream.name)
for line in open('comics.txt', for line in open('comics.txt',
'rb').read().decode('utf-8').splitlines(): 'rb').read().decode('utf-8').splitlines():
line = line.strip()
if not line:
continue
fname, title = line.partition(':')[0], line.partition(':')[-1] fname, title = line.partition(':')[0], line.partition(':')[-1]
fname = os.path.join(tdir, *fname.split('/')) fname = os.path.join(tdir, *fname.split('/'))
if not title: if not title:

View File

@ -63,6 +63,7 @@ def get_social_metadata(title, authors, publisher, isbn):
mi.tags = [] mi.tags = []
for x in tags: for x in tags:
mi.tags.extend([y.strip() for y in x.split('/')]) mi.tags.extend([y.strip() for y in x.split('/')])
mi.tags = [x.replace(',', ';') for x in mi.tags]
comments = root.find('.//%s/%s'%(AWS('EditorialReview'), comments = root.find('.//%s/%s'%(AWS('EditorialReview'),
AWS('Content'))) AWS('Content')))
if comments is not None: if comments is not None:

View File

@ -143,7 +143,7 @@ class ResultList(list):
except: except:
report(verbose) report(verbose)
tags = [] tags = []
return tags return [x.replace(',', ';') for x in tags]
def get_publisher(self, entry, verbose): def get_publisher(self, entry, verbose):
try: try:

View File

@ -17,6 +17,8 @@ from calibre.ebooks.mobi import MobiError
from calibre.ebooks.mobi.writer import rescale_image, MAX_THUMB_DIMEN from calibre.ebooks.mobi.writer import rescale_image, MAX_THUMB_DIMEN
from calibre.ebooks.mobi.langcodes import iana2mobi from calibre.ebooks.mobi.langcodes import iana2mobi
import struct
class StreamSlicer(object): class StreamSlicer(object):
def __init__(self, stream, start=0, stop=None): def __init__(self, stream, start=0, stop=None):
@ -72,25 +74,54 @@ class StreamSlicer(object):
return stream.write(value) return stream.write(value)
raise TypeError("stream indices must be integers") raise TypeError("stream indices must be integers")
def update(self, data_blocks):
# Rewrite the stream
stream = self._stream
base = self.start
stream.seek(base)
self._stream.truncate(base)
for block in data_blocks:
stream.write(block)
def truncate(self, value):
self._stream.truncate(value)
class MetadataUpdater(object): class MetadataUpdater(object):
def __init__(self, stream): def __init__(self, stream):
self.stream = stream self.stream = stream
data = self.data = StreamSlicer(stream) data = self.data = StreamSlicer(stream)
type = self.type = data[60:68] self.type = data[60:68]
if self.type != "BOOKMOBI":
return
self.nrecs, = unpack('>H', data[76:78]) self.nrecs, = unpack('>H', data[76:78])
record0 = self.record0 = self.record(0) record0 = self.record0 = self.record(0)
self.encryption_type, = unpack('>H', record0[12:14]) self.encryption_type, = unpack('>H', record0[12:14])
codepage, = unpack('>I', record0[28:32]) codepage, = unpack('>I', record0[28:32])
self.codec = 'utf-8' if codepage == 65001 else 'cp1252' self.codec = 'utf-8' if codepage == 65001 else 'cp1252'
image_base, = unpack('>I', record0[108:112]) image_base, = unpack('>I', record0[108:112])
flags, = unpack('>I', record0[128:132]) flags, = self.flags, = unpack('>I', record0[128:132])
have_exth = self.have_exth = (flags & 0x40) != 0 have_exth = self.have_exth = (flags & 0x40) != 0
self.cover_record = self.thumbnail_record = None self.cover_record = self.thumbnail_record = None
self.timestamp = None self.timestamp = None
self.pdbrecords = self.get_pdbrecords()
if not have_exth: if not have_exth:
return self.create_exth()
# Fetch timestamp, cover_record, thumbnail_record
self.fetchEXTHFields()
def fetchEXTHFields(self):
stream = self.stream
record0 = self.record0
# 20:24 = mobiHeaderLength, 16=PDBHeader size
exth_off = unpack('>I', record0[20:24])[0] + 16 + record0.start exth_off = unpack('>I', record0[20:24])[0] + 16 + record0.start
image_base, = unpack('>I', record0[108:112])
# Fetch EXTH block
exth = self.exth = StreamSlicer(stream, exth_off, record0.stop) exth = self.exth = StreamSlicer(stream, exth_off, record0.stop)
nitems, = unpack('>I', exth[8:12]) nitems, = unpack('>I', exth[8:12])
pos = 12 pos = 12
@ -109,6 +140,130 @@ class MetadataUpdater(object):
rindex, = self.thumbnail_rindex, = unpack('>I', content) rindex, = self.thumbnail_rindex, = unpack('>I', content)
self.thumbnail_record = self.record(rindex + image_base) self.thumbnail_record = self.record(rindex + image_base)
def patch(self, off, new_record0):
# Save the current size of each record
record_sizes = [len(new_record0)]
for i in range(1,self.nrecs-1):
record_sizes.append(self.pdbrecords[i+1][0]-self.pdbrecords[i][0])
# And the last one
record_sizes.append(self.data.stop - self.pdbrecords[self.nrecs-1][0])
# pdbrecord[0] is the offset of record0. It will not change
# record1 offset will be offset of record0 + len(new_record0)
updated_pdbrecords = [self.pdbrecords[0][0]]
record0_offset = self.pdbrecords[0][0]
updated_offset = record0_offset + len(new_record0)
for i in range(1,self.nrecs-1):
updated_pdbrecords.append(updated_offset)
updated_offset += record_sizes[i]
# Update the last pdbrecord
updated_pdbrecords.append(updated_offset)
# Read in current records 1 to last
data_blocks = [new_record0]
for i in range(1,self.nrecs):
data_blocks.append(self.data[self.pdbrecords[i][0]:self.pdbrecords[i][0] + record_sizes[i]])
# Rewrite the stream
self.record0.update(data_blocks)
# Rewrite the pdbrecords
self.update_pdbrecords(updated_pdbrecords)
# Truncate if necessary
if (updated_pdbrecords[-1] + record_sizes[-1]) < self.data.stop:
self.data.truncate(updated_pdbrecords[-1] + record_sizes[-1])
else:
self.data.stop = updated_pdbrecords[-1] + record_sizes[-1]
def patchSection(self, section, new):
off = self.pdbrecords[section][0]
self.patch(off, new)
def create_exth(self, exth=None):
# Add an EXTH block to record 0, rewrite the stream
# self.hexdump(self.record0)
# Fetch the title
title_offset, = struct.unpack('>L', self.record0[0x54:0x58])
title_length, = struct.unpack('>L', self.record0[0x58:0x5c])
title_in_file, = struct.unpack('%ds' % (title_length), self.record0[title_offset:title_offset + title_length])
# Adjust length to accommodate PrimaryINDX if necessary
mobi_header_length, = unpack('>L', self.record0[0x14:0x18])
if mobi_header_length == 0xe4:
# Patch mobi_header_length to 0xE8
self.record0[0x17] = "\xe8"
self.record0[0xf4:0xf8] = pack('>L', 0xFFFFFFFF)
mobi_header_length = 0xe8
# Set EXTH flag (0x40)
self.record0[0x80:0x84] = pack('>L', self.flags|0x40)
if not exth:
# Construct an empty EXTH block
pad = '\0' * 4
exth = ['EXTH', pack('>II', 12, 0), pad]
exth = ''.join(exth)
# Update title_offset
self.record0[0x54:0x58] = pack('>L', 0x10 + mobi_header_length + len(exth))
# Create an updated Record0
new_record0 = StringIO()
new_record0.write(self.record0[:0x10 + mobi_header_length])
new_record0.write(exth)
new_record0.write(title_in_file)
# Pad to a 4-byte boundary
trail = len(new_record0.getvalue()) % 4
pad = '\0' * (4 - trail) # Always pad w/ at least 1 byte
new_record0.write(pad)
#self.hexdump(new_record0.getvalue())
# Rebuild the stream, update the pdbrecords pointers
self.patchSection(0,new_record0.getvalue())
# Update record0
self.record0 = self.record(0)
def hexdump(self, src, length=16):
# Diagnostic
FILTER=''.join([(len(repr(chr(x)))==3) and chr(x) or '.' for x in range(256)])
N=0; result=''
while src:
s,src = src[:length],src[length:]
hexa = ' '.join(["%02X"%ord(x) for x in s])
s = s.translate(FILTER)
result += "%04X %-*s %s\n" % (N, length*3, hexa, s)
N+=length
print result
def get_pdbrecords(self):
pdbrecords = []
for i in xrange(self.nrecs):
offset, a1,a2,a3,a4 = struct.unpack('>LBBBB', self.data[78+i*8:78+i*8+8])
flags, val = a1, a2<<16|a3<<8|a4
pdbrecords.append( [offset, flags, val] )
return pdbrecords
def update_pdbrecords(self, updated_pdbrecords):
for (i, pdbrecord) in enumerate(updated_pdbrecords):
self.data[78+i*8:78+i*8 + 4] = pack('>L',pdbrecord)
# Refresh local copy
self.pdbrecords = self.get_pdbrecords()
def dump_pdbrecords(self):
# Diagnostic
print "MetadataUpdater.dump_pdbrecords()"
print "%10s %10s %10s" % ("offset","flags","val")
for i in xrange(len(self.pdbrecords)):
pdbrecord = self.pdbrecords[i]
print "%10X %10X %10X" % (pdbrecord[0], pdbrecord[1], pdbrecord[2])
def record(self, n): def record(self, n):
if n >= self.nrecs: if n >= self.nrecs:
raise ValueError('non-existent record %r' % n) raise ValueError('non-existent record %r' % n)
@ -120,6 +275,10 @@ class MetadataUpdater(object):
return StreamSlicer(self.stream, start, stop) return StreamSlicer(self.stream, start, stop)
def update(self, mi): def update(self, mi):
if self.type != "BOOKMOBI":
raise MobiError("Setting metadata only supported for MOBI files of type 'BOOK'.\n"
"\tThis is a '%s' file of type '%s'" % (self.type[0:4], self.type[4:8]))
recs = [] recs = []
try: try:
from calibre.ebooks.conversion.config import load_defaults from calibre.ebooks.conversion.config import load_defaults
@ -142,7 +301,6 @@ class MetadataUpdater(object):
if mi.tags: if mi.tags:
subjects = '; '.join(mi.tags) subjects = '; '.join(mi.tags)
recs.append((105, subjects.encode(self.codec, 'replace'))) recs.append((105, subjects.encode(self.codec, 'replace')))
if mi.pubdate: if mi.pubdate:
recs.append((106, str(mi.pubdate).encode(self.codec, 'replace'))) recs.append((106, str(mi.pubdate).encode(self.codec, 'replace')))
elif mi.timestamp: elif mi.timestamp:
@ -151,15 +309,16 @@ class MetadataUpdater(object):
recs.append((106, self.timestamp)) recs.append((106, self.timestamp))
else: else:
recs.append((106, str(datetime.now()).encode(self.codec, 'replace'))) recs.append((106, str(datetime.now()).encode(self.codec, 'replace')))
if self.cover_record is not None: if self.cover_record is not None:
recs.append((201, pack('>I', self.cover_rindex))) recs.append((201, pack('>I', self.cover_rindex)))
recs.append((203, pack('>I', 0))) recs.append((203, pack('>I', 0)))
if self.thumbnail_record is not None: if self.thumbnail_record is not None:
recs.append((202, pack('>I', self.thumbnail_rindex))) recs.append((202, pack('>I', self.thumbnail_rindex)))
exth = StringIO()
if getattr(self, 'encryption_type', -1) != 0: if getattr(self, 'encryption_type', -1) != 0:
raise MobiError('Setting metadata in DRMed MOBI files is not supported.') raise MobiError('Setting metadata in DRMed MOBI files is not supported.')
exth = StringIO()
for code, data in recs: for code, data in recs:
exth.write(pack('>II', code, len(data) + 8)) exth.write(pack('>II', code, len(data) + 8))
exth.write(data) exth.write(data)
@ -168,17 +327,16 @@ class MetadataUpdater(object):
pad = '\0' * (4 - trail) # Always pad w/ at least 1 byte pad = '\0' * (4 - trail) # Always pad w/ at least 1 byte
exth = ['EXTH', pack('>II', len(exth) + 12, len(recs)), exth, pad] exth = ['EXTH', pack('>II', len(exth) + 12, len(recs)), exth, pad]
exth = ''.join(exth) exth = ''.join(exth)
title = (mi.title or _('Unknown')).encode(self.codec, 'replace')
if getattr(self, 'exth', None) is None: if getattr(self, 'exth', None) is None:
raise MobiError('No existing EXTH record. Cannot update metadata.') raise MobiError('No existing EXTH record. Cannot update metadata.')
title_off = (self.exth.start - self.record0.start) + len(exth)
title_len = len(title)
trail = len(self.exth) - len(exth) - len(title)
if trail < 0:
raise MobiError("Insufficient space to update metadata")
self.exth[:] = ''.join([exth, title, '\0' * trail])
self.record0[84:92] = pack('>II', title_off, title_len)
self.record0[92:96] = iana2mobi(mi.language) self.record0[92:96] = iana2mobi(mi.language)
self.create_exth(exth)
# Fetch updated timestamp, cover_record, thumbnail_record
self.fetchEXTHFields()
if mi.cover_data[1] or mi.cover: if mi.cover_data[1] or mi.cover:
try: try:
data = mi.cover_data[1] if mi.cover_data[1] else open(mi.cover, 'rb').read() data = mi.cover_data[1] if mi.cover_data[1] else open(mi.cover, 'rb').read()

View File

@ -164,6 +164,8 @@ class MobiMLizer(object):
parent = bstate.nested[-1] if bstate.nested else bstate.body parent = bstate.nested[-1] if bstate.nested else bstate.body
indent = istate.indent indent = istate.indent
left = istate.left left = istate.left
if isinstance(indent, basestring):
indent = 0
if indent < 0 and abs(indent) < left: if indent < 0 and abs(indent) < left:
left += indent left += indent
indent = 0 indent = 0

View File

@ -760,6 +760,8 @@ class Manifest(object):
def _parse_xml(self, data): def _parse_xml(self, data):
data = xml_to_unicode(data, strip_encoding_pats=True)[0] data = xml_to_unicode(data, strip_encoding_pats=True)[0]
if not data:
return None
parser = etree.XMLParser(recover=True) parser = etree.XMLParser(recover=True)
try: try:
return etree.fromstring(data, parser=parser) return etree.fromstring(data, parser=parser)

View File

@ -40,6 +40,8 @@ class Image(Element):
map(float, map(img.get, ('top', 'left', 'rwidth', 'rheight', 'iwidth', map(float, map(img.get, ('top', 'left', 'rwidth', 'rheight', 'iwidth',
'iheight'))) 'iheight')))
self.src = img.get('src') self.src = img.get('src')
self.bottom = self.top + self.height
self.right = self.left + self.width
class Text(Element): class Text(Element):
@ -151,16 +153,17 @@ class Column(object):
def collect_stats(self): def collect_stats(self):
if len(self.elements) > 1: if len(self.elements) > 1:
gaps = [self.elements[i+1].top - self.elements[i].bottom for i in gaps = [self.elements[i+1].top - self.elements[i].bottom for i in
range(len(0, len(self.elements)-1))] range(0, len(self.elements)-1)]
self.average_line_separation = sum(gaps)/len(gaps) self.average_line_separation = sum(gaps)/len(gaps)
for i, elem in enumerate(self.elements): for i, elem in enumerate(self.elements):
left_margin = elem.left - self.left left_margin = elem.left - self.left
elem.indent_fraction = left_margin/self.width elem.indent_fraction = left_margin/self.width
elem.width_fraction = elem.width/self.width elem.width_fraction = elem.width/self.width
if i == 0: if i == 0:
elem.top_gap = None elem.top_gap_ratio = None
else: else:
elem.top_gap = self.elements[i-1].bottom - elem.top elem.top_gap_ratio = (self.elements[i-1].bottom -
elem.top)/self.average_line_separation
def previous_element(self, idx): def previous_element(self, idx):
if idx == 0: if idx == 0:
@ -168,7 +171,16 @@ class Column(object):
return self.elements[idx-1] return self.elements[idx-1]
class Box(list):
def __init__(self, type='p'):
self.type = type
class ImageBox(Box):
def __init__(self, img):
Box.__init__(self, type='img')
self.img = img
class Region(object): class Region(object):
@ -203,7 +215,7 @@ class Region(object):
@property @property
def is_empty(self): def is_empty(self):
return len(self.elements) == 0 return len(self.columns) == 0
def collect_stats(self): def collect_stats(self):
for column in self.columns: for column in self.columns:
@ -220,6 +232,32 @@ class Region(object):
for x in self.columns: for x in self.columns:
self.elements.extend(x) self.elements.extend(x)
self.boxes = [Box()]
for i, elem in enumerate(self.elements):
if isinstance(elem, Image):
self.boxes.append(ImageBox(elem))
img = Interval(elem.left, elem.right)
for j in range(i+1, len(self.elements)):
t = self.elements[j]
if not isinstance(t, Text):
break
ti = Interval(t.left, t.right)
if not ti.centered_in(img):
break
self.boxes[-1].append(t)
self.boxes.append(Box())
else:
is_indented = False
if i+1 < len(self.elements):
indent_diff = elem.indent_fraction - \
self.elements[i+1].indent_fraction
if indent_diff > 0.05:
is_indented = True
if elem.top_gap_ratio > 1.2 or is_indented:
self.boxes.append(Box())
self.boxes[-1].append(elem)
class Page(object): class Page(object):
@ -311,10 +349,10 @@ class Page(object):
columns = self.sort_into_columns(x, elems) columns = self.sort_into_columns(x, elems)
processed.update(elems) processed.update(elems)
if not current_region.contains(columns): if not current_region.contains(columns):
self.regions.append(self.current_region) self.regions.append(current_region)
current_region = Region() current_region = Region()
current_region.add(columns) current_region.add(columns)
if not self.current_region.is_empty(): if not current_region.is_empty:
self.regions.append(current_region) self.regions.append(current_region)
def sort_into_columns(self, elem, neighbors): def sort_into_columns(self, elem, neighbors):

View File

@ -14,12 +14,13 @@ from PyQt4.Qt import QWidget
class PluginWidget(QWidget,Ui_Form): class PluginWidget(QWidget,Ui_Form):
TITLE = _('E-book Options') TITLE = _('E-book options')
HELP = _('Options specific to')+' EPUB/MOBI '+_('output') HELP = _('Options specific to')+' EPUB/MOBI '+_('output')
OPTION_FIELDS = [('exclude_genre','\[[\w ]*\]'), OPTION_FIELDS = [('exclude_genre','\[[\w ]*\]'),
('exclude_tags','~,'+_('Catalog')), ('exclude_tags','~,'+_('Catalog')),
('read_tag','+'), ('note_tag','*'),
('note_tag','*')] ('numbers_as_text', False),
('read_tag','+')]
# Output synced to the connected device? # Output synced to the connected device?
sync_enabled = True sync_enabled = True
@ -33,21 +34,30 @@ class PluginWidget(QWidget,Ui_Form):
def initialize(self, name): def initialize(self, name):
self.name = name self.name = name
# Restore options from last use here # Update dialog fields from stored options
for opt in self.OPTION_FIELDS: for opt in self.OPTION_FIELDS:
opt_value = gprefs.get(self.name + '_' + opt[0], opt[1]) opt_value = gprefs.get(self.name + '_' + opt[0], opt[1])
getattr(self, opt[0]).setText(opt_value) if opt[0] == 'numbers_as_text':
getattr(self, opt[0]).setChecked(opt_value)
else:
getattr(self, opt[0]).setText(opt_value)
def options(self): def options(self):
# Save/return the current options # Save/return the current options
# exclude_genre stores literally
# numbers_as_text stores as True/False
# others store as lists
opts_dict = {} opts_dict = {}
for opt in self.OPTION_FIELDS: for opt in self.OPTION_FIELDS:
opt_value = unicode(getattr(self, opt[0]).text()) if opt[0] == 'numbers_as_text':
opt_value = getattr(self,opt[0]).isChecked()
else:
opt_value = unicode(getattr(self, opt[0]).text())
gprefs.set(self.name + '_' + opt[0], opt_value) gprefs.set(self.name + '_' + opt[0], opt_value)
if opt[0] != 'exclude_genre': if opt[0] == 'exclude_genre' or 'numbers_as_text':
opts_dict[opt[0]] = opt_value
else:
opt_value = opt_value.split(',') opt_value = opt_value.split(',')
opts_dict[opt[0]] = opt_value
opts_dict['output_profile'] = [load_defaults('page_setup')['output_profile']] opts_dict['output_profile'] = [load_defaults('page_setup')['output_profile']]

View File

@ -69,6 +69,13 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="1">
<widget class="QLineEdit" name="exclude_genre">
<property name="toolTip">
<string extracomment="Tooltip comment here"/>
</property>
</widget>
</item>
<item row="4" column="0"> <item row="4" column="0">
<spacer name="verticalSpacer"> <spacer name="verticalSpacer">
<property name="orientation"> <property name="orientation">
@ -82,10 +89,10 @@
</property> </property>
</spacer> </spacer>
</item> </item>
<item row="0" column="1"> <item row="5" column="0">
<widget class="QLineEdit" name="exclude_genre"> <widget class="QCheckBox" name="numbers_as_text">
<property name="toolTip"> <property name="text">
<string extracomment="Tooltip comment here"/> <string>Sort numbers as text</string>
</property> </property>
</widget> </widget>
</item> </item>

View File

@ -7,7 +7,7 @@ __copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
__docformat__ = 'restructuredtext en' __docformat__ = 'restructuredtext en'
from calibre.constants import islinux from calibre.constants import islinux, isosx
class Notifier(object): class Notifier(object):
@ -85,8 +85,52 @@ class QtNotifier(Notifier):
def __call__(self, body, summary=None, replaces_id=None, timeout=0): def __call__(self, body, summary=None, replaces_id=None, timeout=0):
timeout, body, summary = self.get_msg_parms(timeout, body, summary) timeout, body, summary = self.get_msg_parms(timeout, body, summary)
if self.systray is not None: if self.systray is not None:
self.systray.showMessage(summary, body, self.systray.Information, try:
timeout) hide = False
try:
if not isinstance(body, unicode):
body = body.decode('utf-8')
if isosx and not self.systray.isVisible():
self.systray.show()
hide = True
self.systray.showMessage(summary, body, self.systray.Information,
timeout)
finally:
if hide:
self.systray.hide()
except:
pass
class GrowlNotifier(Notifier):
notification_type = 'All notifications'
def __init__(self):
try:
import Growl
self.icon = Growl.Image.imageFromPath(I('notify.png'))
self.growl = Growl.GrowlNotifier(applicationName='calibre',
applicationIcon=self.icon, notifications=[self.notification_type])
self.growl.register()
self.ok = True
except:
self.ok = False
def encode(self, msg):
if isinstance(msg, unicode):
msg = msg.encode('utf-8')
return msg
def __call__(self, body, summary=None, replaces_id=None, timeout=0):
timeout, body, summary = self.get_msg_parms(timeout, body, summary)
if self.ok:
try:
self.growl.notify(self.notification_type, self.encode(summary),
self.encode(body))
except:
import traceback
traceback.print_exc()
def get_notifier(systray=None): def get_notifier(systray=None):
ans = None ans = None
@ -96,6 +140,10 @@ def get_notifier(systray=None):
ans = FDONotifier() ans = FDONotifier()
if not ans.ok: if not ans.ok:
ans = None ans = None
#if isosx:
# ans = GrowlNotifier()
# if not ans.ok:
# ans = None
if ans is None: if ans is None:
ans = QtNotifier(systray) ans = QtNotifier(systray)
if not ans.ok: if not ans.ok:

File diff suppressed because it is too large Load Diff

View File

@ -670,8 +670,6 @@ def command_catalog(args, dbpath):
print print
print >>sys.stderr, _('Error: You must specify a catalog output file') print >>sys.stderr, _('Error: You must specify a catalog output file')
return 1 return 1
if opts.verbose:
log("library.cli:command_catalog dispatching to plugin %s" % plugin.name)
if opts.ids: if opts.ids:
opts.ids = [int(id) for id in opts.ids.split(',')] opts.ids = [int(id) for id in opts.ids.split(',')]

View File

@ -1415,9 +1415,10 @@ class LibraryDatabase2(LibraryDatabase):
if matches: if matches:
tag_matches = self.data.get_matches('tags', _('Catalog')) tag_matches = self.data.get_matches('tags', _('Catalog'))
matches = matches.intersection(tag_matches) matches = matches.intersection(tag_matches)
db_id = None db_id, existing = None, False
if matches: if matches:
db_id = list(matches)[0] db_id = list(matches)[0]
existing = True
if db_id is None: if db_id is None:
obj = self.conn.execute('INSERT INTO books(title, author_sort) VALUES (?, ?)', obj = self.conn.execute('INSERT INTO books(title, author_sort) VALUES (?, ?)',
(title, 'calibre')) (title, 'calibre'))
@ -1433,6 +1434,10 @@ class LibraryDatabase2(LibraryDatabase):
if not hasattr(path, 'read'): if not hasattr(path, 'read'):
stream.close() stream.close()
self.conn.commit() self.conn.commit()
if existing:
t = datetime.utcnow()
self.set_timestamp(db_id, t, notify=False)
self.set_pubdate(db_id, t, notify=False)
self.data.refresh_ids(self, [db_id]) # Needed to update format list and size self.data.refresh_ids(self, [db_id]) # Needed to update format list and size
return db_id return db_id

View File

@ -714,6 +714,10 @@ class LibraryServer(object):
book, books = MarkupTemplate(self.MOBILE_BOOK), [] book, books = MarkupTemplate(self.MOBILE_BOOK), []
for record in items[(start-1):(start-1)+num]: for record in items[(start-1):(start-1)+num]:
if record[13] is None:
record[13] = ''
if record[6] is None:
record[6] = 0
aus = record[2] if record[2] else __builtin__._('Unknown') aus = record[2] if record[2] else __builtin__._('Unknown')
authors = '|'.join([i.replace('|', ',') for i in aus.split(',')]) authors = '|'.join([i.replace('|', ',') for i in aus.split(',')])
record[10] = fmt_sidx(float(record[10])) record[10] = fmt_sidx(float(record[10]))

File diff suppressed because it is too large Load Diff

View File

@ -4,9 +4,9 @@
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: calibre 0.6.35\n" "Project-Id-Version: calibre 0.6.36\n"
"POT-Creation-Date: 2010-01-22 16:20+MST\n" "POT-Creation-Date: 2010-01-25 10:46+MST\n"
"PO-Revision-Date: 2010-01-22 16:20+MST\n" "PO-Revision-Date: 2010-01-25 10:46+MST\n"
"Last-Translator: Automatically generated\n" "Last-Translator: Automatically generated\n"
"Language-Team: LANGUAGE\n" "Language-Team: LANGUAGE\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -28,7 +28,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/devices/prs505/books.py:58 #: /home/kovid/work/calibre/src/calibre/devices/prs505/books.py:58
#: /home/kovid/work/calibre/src/calibre/devices/prs505/books.py:199 #: /home/kovid/work/calibre/src/calibre/devices/prs505/books.py:199
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:205 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:205
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:414 #: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:417
#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:67 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:67
#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:69 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:69
#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:319 #: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:319
@ -125,12 +125,12 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/database2.py:715 #: /home/kovid/work/calibre/src/calibre/library/database2.py:715
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1143 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1143
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1180 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1180
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1547 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1552
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1549 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1554
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1665 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1670
#: /home/kovid/work/calibre/src/calibre/library/server.py:645 #: /home/kovid/work/calibre/src/calibre/library/server.py:645
#: /home/kovid/work/calibre/src/calibre/library/server.py:717 #: /home/kovid/work/calibre/src/calibre/library/server.py:721
#: /home/kovid/work/calibre/src/calibre/library/server.py:764 #: /home/kovid/work/calibre/src/calibre/library/server.py:768
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:111 #: /home/kovid/work/calibre/src/calibre/utils/localization.py:111
#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:45 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:45
#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:63 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:63
@ -396,11 +396,11 @@ msgstr ""
msgid "Communicate with the Binatone Readme eBook reader." msgid "Communicate with the Binatone Readme eBook reader."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/devices/blackberry/driver.py:12 #: /home/kovid/work/calibre/src/calibre/devices/blackberry/driver.py:13
msgid "Communicate with the Blackberry smart phone." msgid "Communicate with the Blackberry smart phone."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/devices/blackberry/driver.py:13 #: /home/kovid/work/calibre/src/calibre/devices/blackberry/driver.py:14
#: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:18 #: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:18
#: /home/kovid/work/calibre/src/calibre/devices/prs500/driver.py:90 #: /home/kovid/work/calibre/src/calibre/devices/prs500/driver.py:90
msgid "Kovid Goyal" msgid "Kovid Goyal"
@ -589,7 +589,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:132 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:132
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1068 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1068
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1072 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1072
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1447 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1452
msgid "News" msgid "News"
msgstr "" msgstr ""
@ -704,8 +704,8 @@ msgstr ""
msgid "Apply no processing to the image" msgid "Apply no processing to the image"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:438 #: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:441
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:449 #: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:452
msgid "Page" msgid "Page"
msgstr "" msgstr ""
@ -1389,7 +1389,7 @@ msgstr ""
msgid "Rights" msgid "Rights"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/amazon.py:77 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/amazon.py:78
msgid "EDITORIAL REVIEW" msgid "EDITORIAL REVIEW"
msgstr "" msgstr ""
@ -2201,7 +2201,14 @@ msgid "Fields to include in output:"
msgstr "" 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:17
msgid "E-book Options" 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:256
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1416
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1430
msgid "Catalog"
msgstr "" msgstr ""
#: #:
@ -3115,7 +3122,7 @@ msgid "<p>For example, to match all h2 tags that have class=\"chapter\", set tag
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:38 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:38
#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:130 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:132
msgid "No details available." msgid "No details available."
msgstr "" msgstr ""
@ -6584,12 +6591,19 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/catalog.py:244 #: /home/kovid/work/calibre/src/calibre/library/catalog.py:244
msgid "" 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 conversion process a bug is occurring.\n"
"Default: '%default'None\n"
"Applies to: ePub, MOBI output formats"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/catalog.py:253
msgid ""
"Regex describing tags to exclude as genres.\n" "Regex describing tags to exclude as genres.\n"
"Default: '%default' excludes bracketed tags, e.g. '[<tag>]'\n" "Default: '%default' excludes bracketed tags, e.g. '[<tag>]'\n"
"Applies to: ePub, MOBI output formats" "Applies to: ePub, MOBI output formats"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/catalog.py:249 #: /home/kovid/work/calibre/src/calibre/library/catalog.py:258
msgid "" msgid ""
"Comma-separated list of tag words indicating book should be excluded from output. Case-insensitive.\n" "Comma-separated list of tag words indicating book should be excluded from output. Case-insensitive.\n"
"--exclude-tags=skip will match 'skip this book' and 'Skip will like this'.\n" "--exclude-tags=skip will match 'skip this book' and 'Skip will like this'.\n"
@ -6597,21 +6611,21 @@ msgid ""
"Applies to: ePub, MOBI output formats" "Applies to: ePub, MOBI output formats"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/catalog.py:256 #: /home/kovid/work/calibre/src/calibre/library/catalog.py:265
msgid "" msgid ""
"Tag indicating book has been read.\n" "Tag indicating book has been read.\n"
"Default: '%default'\n" "Default: '%default'\n"
"Applies to: ePub, MOBI output formats" "Applies to: ePub, MOBI output formats"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/catalog.py:261 #: /home/kovid/work/calibre/src/calibre/library/catalog.py:270
msgid "" msgid ""
"Tag prefix for user notes, e.g. '*Jeff might enjoy reading this'.\n" "Tag prefix for user notes, e.g. '*Jeff might enjoy reading this'.\n"
"Default: '%default'\n" "Default: '%default'\n"
"Applies to: ePub, MOBI output formats" "Applies to: ePub, MOBI output formats"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/catalog.py:267 #: /home/kovid/work/calibre/src/calibre/library/catalog.py:276
msgid "" msgid ""
"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" "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" "Default: '%default'\n"
@ -6826,7 +6840,7 @@ msgid ""
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:658 #: /home/kovid/work/calibre/src/calibre/library/cli.py:658
#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:482 #: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:484
msgid "Show detailed output information. Useful for debugging" msgid "Show detailed output information. Useful for debugging"
msgstr "" msgstr ""
@ -6846,32 +6860,27 @@ msgid ""
"For help on an individual command: %%prog command --help\n" "For help on an individual command: %%prog command --help\n"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1416 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1696
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1429
msgid "Catalog"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1691
msgid "<p>Migrating old database to ebook library in %s<br><center>" msgid "<p>Migrating old database to ebook library in %s<br><center>"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1720 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1725
msgid "Copying <b>%s</b>" msgid "Copying <b>%s</b>"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1737 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1742
msgid "Compacting database" msgid "Compacting database"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1830 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1835
msgid "Checking SQL integrity..." msgid "Checking SQL integrity..."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1867 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1872
msgid "Checking for missing files." msgid "Checking for missing files."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1889 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1894
msgid "Checked id" msgid "Checked id"
msgstr "" msgstr ""
@ -6967,7 +6976,7 @@ msgstr ""
msgid "Replace whitespace with underscores." msgid "Replace whitespace with underscores."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:255 #: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:256
msgid "Requested formats not available" msgid "Requested formats not available"
msgstr "" msgstr ""
@ -6975,14 +6984,14 @@ msgstr ""
msgid "Password to access your calibre library. Username is " msgid "Password to access your calibre library. Username is "
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server.py:856 #: /home/kovid/work/calibre/src/calibre/library/server.py:860
msgid "" msgid ""
"[options]\n" "[options]\n"
"\n" "\n"
"Start the calibre content server." "Start the calibre content server."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server.py:858 #: /home/kovid/work/calibre/src/calibre/library/server.py:862
msgid "Path to the library folder to serve with the content server" msgid "Path to the library folder to serve with the content server"
msgstr "" msgstr ""
@ -7055,7 +7064,7 @@ msgstr ""
msgid "Finished" msgid "Finished"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:70 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:72
msgid "Working..." msgid "Working..."
msgstr "" msgstr ""
@ -7185,75 +7194,75 @@ msgstr ""
msgid "Unknown News Source" msgid "Unknown News Source"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:528 #: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:533
msgid "The \"%s\" recipe needs a username and password." msgid "The \"%s\" recipe needs a username and password."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:614 #: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:619
msgid "Download finished" msgid "Download finished"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:616 #: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:621
msgid "Failed to download the following articles:" msgid "Failed to download the following articles:"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:622 #: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:627
msgid "Failed to download parts of the following articles:" msgid "Failed to download parts of the following articles:"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:624 #: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:629
msgid " from " msgid " from "
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:626 #: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:631
msgid "\tFailed links:" msgid "\tFailed links:"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:707 #: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:712
msgid "Could not fetch article. Run with -vv to see the reason" msgid "Could not fetch article. Run with -vv to see the reason"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:728 #: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:733
msgid "Fetching feeds..." msgid "Fetching feeds..."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:733 #: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:738
msgid "Got feeds from index page" msgid "Got feeds from index page"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:739 #: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:744
msgid "Trying to download cover..." msgid "Trying to download cover..."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:797 #: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:802
msgid "Starting download [%d thread(s)]..." msgid "Starting download [%d thread(s)]..."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:813 #: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:818
msgid "Feeds downloaded to %s" msgid "Feeds downloaded to %s"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:823 #: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:828
msgid "Could not download cover: %s" msgid "Could not download cover: %s"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:835 #: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:840
msgid "Downloading cover from %s" msgid "Downloading cover from %s"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:978 #: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:983
msgid "Untitled Article" msgid "Untitled Article"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1049 #: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1054
msgid "Article downloaded: %s" msgid "Article downloaded: %s"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1060 #: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1065
msgid "Article download failed: %s" msgid "Article download failed: %s"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1077 #: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1082
msgid "Fetching feed" msgid "Fetching feed"
msgstr "" msgstr ""
@ -7272,46 +7281,46 @@ msgstr ""
msgid "Custom" msgid "Custom"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:459 #: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:461
msgid "" msgid ""
"%prog URL\n" "%prog URL\n"
"\n" "\n"
"Where URL is for example http://google.com" "Where URL is for example http://google.com"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:462 #: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:464
msgid "Base directory into which URL is saved. Default is %default" msgid "Base directory into which URL is saved. Default is %default"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:465 #: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:467
msgid "Timeout in seconds to wait for a response from the server. Default: %default s" msgid "Timeout in seconds to wait for a response from the server. Default: %default s"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:468 #: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:470
msgid "Maximum number of levels to recurse i.e. depth of links to follow. Default %default" msgid "Maximum number of levels to recurse i.e. depth of links to follow. Default %default"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:471 #: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:473
msgid "The maximum number of files to download. This only applies to files from <a href> tags. Default is %default" msgid "The maximum number of files to download. This only applies to files from <a href> tags. Default is %default"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:473 #: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:475
msgid "Minimum interval in seconds between consecutive fetches. Default is %default s" msgid "Minimum interval in seconds between consecutive fetches. Default is %default s"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:475 #: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:477
msgid "The character encoding for the websites you are trying to download. The default is to try and guess the encoding." msgid "The character encoding for the websites you are trying to download. The default is to try and guess the encoding."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:477 #: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:479
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." 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 "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:479 #: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:481
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 a link, it will be ignored.By default, no links are ignored. If both --filter-regexp and --match-regexp are specified, then --filter-regexp is applied first." 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 a link, it will be ignored.By default, no links are ignored. If both --filter-regexp and --match-regexp are specified, then --filter-regexp is applied first."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:481 #: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:483
msgid "Do not download CSS stylesheets." msgid "Do not download CSS stylesheets."
msgstr "" msgstr ""

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -6,14 +6,14 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: calibre 0.4.22\n" "Project-Id-Version: calibre 0.4.22\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-01-22 03:18+0000\n" "POT-Creation-Date: 2010-01-25 00:45+0000\n"
"PO-Revision-Date: 2010-01-21 01:41+0000\n" "PO-Revision-Date: 2010-01-25 02:45+0000\n"
"Last-Translator: Vincent C. <Unknown>\n" "Last-Translator: Kovid Goyal <Unknown>\n"
"Language-Team: fr\n" "Language-Team: fr\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2010-01-22 04:33+0000\n" "X-Launchpad-Export-Date: 2010-01-25 04:46+0000\n"
"X-Generator: Launchpad (build Unknown)\n" "X-Generator: Launchpad (build Unknown)\n"
"Generated-By: pygettext.py 1.5\n" "Generated-By: pygettext.py 1.5\n"
@ -30,7 +30,7 @@ msgstr "Ne fait strictement rien"
#: /home/kovid/work/calibre/src/calibre/devices/prs505/books.py:58 #: /home/kovid/work/calibre/src/calibre/devices/prs505/books.py:58
#: /home/kovid/work/calibre/src/calibre/devices/prs505/books.py:199 #: /home/kovid/work/calibre/src/calibre/devices/prs505/books.py:199
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:205 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:205
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:414 #: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:417
#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:67 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:67
#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:69 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:69
#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:319 #: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:319
@ -127,12 +127,12 @@ msgstr "Ne fait strictement rien"
#: /home/kovid/work/calibre/src/calibre/library/database2.py:715 #: /home/kovid/work/calibre/src/calibre/library/database2.py:715
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1143 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1143
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1180 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1180
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1547 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1552
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1549 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1554
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1665 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1670
#: /home/kovid/work/calibre/src/calibre/library/server.py:645 #: /home/kovid/work/calibre/src/calibre/library/server.py:645
#: /home/kovid/work/calibre/src/calibre/library/server.py:717 #: /home/kovid/work/calibre/src/calibre/library/server.py:721
#: /home/kovid/work/calibre/src/calibre/library/server.py:764 #: /home/kovid/work/calibre/src/calibre/library/server.py:768
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:111 #: /home/kovid/work/calibre/src/calibre/utils/localization.py:111
#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:45 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:45
#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:63 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:63
@ -234,11 +234,11 @@ msgstr "Définir les métadonnées des fichiers %s"
msgid "Set metadata from %s files" msgid "Set metadata from %s files"
msgstr "Indiquer les métadonnées pour les fichiers %s" msgstr "Indiquer les métadonnées pour les fichiers %s"
#: /home/kovid/work/calibre/src/calibre/customize/conversion.py:99 #: /home/kovid/work/calibre/src/calibre/customize/conversion.py:102
msgid "Conversion Input" msgid "Conversion Input"
msgstr "Conversion (entrée)" msgstr "Conversion (entrée)"
#: /home/kovid/work/calibre/src/calibre/customize/conversion.py:122 #: /home/kovid/work/calibre/src/calibre/customize/conversion.py:125
msgid "" msgid ""
"Specify the character encoding of the input document. If set this option " "Specify the character encoding of the input document. If set this option "
"will override any encoding declared by the document itself. Particularly " "will override any encoding declared by the document itself. Particularly "
@ -250,11 +250,11 @@ msgstr ""
"document. Particulièrement utile pour les documents ne déclarant pas " "document. Particulièrement utile pour les documents ne déclarant pas "
"d'encodage ou ayant des déclarations d'encodage incorrectes." "d'encodage ou ayant des déclarations d'encodage incorrectes."
#: /home/kovid/work/calibre/src/calibre/customize/conversion.py:225 #: /home/kovid/work/calibre/src/calibre/customize/conversion.py:228
msgid "Conversion Output" msgid "Conversion Output"
msgstr "Conversion (sortie)" msgstr "Conversion (sortie)"
#: /home/kovid/work/calibre/src/calibre/customize/conversion.py:239 #: /home/kovid/work/calibre/src/calibre/customize/conversion.py:242
msgid "" msgid ""
"If specified, the output plugin will try to create output that is as human " "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." "readable as possible. May not have any effect for some output plugins."
@ -457,11 +457,11 @@ msgstr ""
msgid "Communicate with the Binatone Readme eBook reader." msgid "Communicate with the Binatone Readme eBook reader."
msgstr "Communiquer avec le lecteur eBook Binatone Readme" msgstr "Communiquer avec le lecteur eBook Binatone Readme"
#: /home/kovid/work/calibre/src/calibre/devices/blackberry/driver.py:12 #: /home/kovid/work/calibre/src/calibre/devices/blackberry/driver.py:13
msgid "Communicate with the Blackberry smart phone." msgid "Communicate with the Blackberry smart phone."
msgstr "Communique avec le smartphone Blackberry." msgstr "Communique avec le smartphone Blackberry."
#: /home/kovid/work/calibre/src/calibre/devices/blackberry/driver.py:13 #: /home/kovid/work/calibre/src/calibre/devices/blackberry/driver.py:14
#: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:18 #: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:18
#: /home/kovid/work/calibre/src/calibre/devices/prs500/driver.py:90 #: /home/kovid/work/calibre/src/calibre/devices/prs500/driver.py:90
msgid "Kovid Goyal" msgid "Kovid Goyal"
@ -660,7 +660,7 @@ msgstr "Espace insuffisant sur la carte mémoire"
#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:132 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:132
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1068 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1068
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1072 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1072
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1447 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1452
msgid "News" msgid "News"
msgstr "Informations" msgstr "Informations"
@ -818,8 +818,8 @@ msgstr ""
msgid "Apply no processing to the image" msgid "Apply no processing to the image"
msgstr "N'applique aucun traitement sur l'image" msgstr "N'applique aucun traitement sur l'image"
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:438 #: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:441
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:449 #: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:452
msgid "Page" msgid "Page"
msgstr "Page" msgstr "Page"
@ -2818,9 +2818,10 @@ msgstr "Sauvegardé"
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml.py:16 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml.py:16
msgid "CSV/XML Options" msgid "CSV/XML Options"
msgstr "" msgstr "Options CSV/XML"
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml.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/convert/comic_input.py:16 #: /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/epub_output.py:16
#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_input.py:13 #: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_input.py:13
@ -2838,6 +2839,7 @@ msgid "Options specific to"
msgstr "Options spécifiques à" msgstr "Options spécifiques à"
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml.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/convert/epub_output.py:16 #: /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/fb2_output.py:15
#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output.py:20 #: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output.py:20
@ -2849,7 +2851,8 @@ msgstr "Options spécifiques à"
msgid "output" msgid "output"
msgstr "sortie" msgstr "sortie"
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml_ui.py:34 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml_ui.py:36
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:51
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_tab_template_ui.py:27 #: /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:84 #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:84
#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:49 #: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:49
@ -2880,8 +2883,35 @@ msgstr "sortie"
msgid "Form" msgid "Form"
msgstr "Formulaire" msgstr "Formulaire"
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml_ui.py:35 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml_ui.py:37
msgid "Fields to include in output:" msgid "Fields to include in output:"
msgstr "Champs à inclure en sortie:"
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:17
msgid "E-book Options"
msgstr "Options E-book"
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:20
#: /home/kovid/work/calibre/src/calibre/library/catalog.py:259
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1416
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1430
msgid "Catalog"
msgstr "Catalogue"
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:52
msgid "Tags to exclude as genres (regex):"
msgstr "Etiquettes pour exclure les genres (regex):"
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:53
msgid "'Don't include this book' tag:"
msgstr "Etiquette 'Ne pas inclure ce livre':"
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:54
msgid "'Mark this book as read' tag:"
msgstr "Etiquette 'Marquer ce livre comme lu':"
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:55
msgid "Additional note tag prefix:"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_tab_template_ui.py:28 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_tab_template_ui.py:28
@ -3547,7 +3577,7 @@ msgid "RB Output"
msgstr "Sortie RB" msgstr "Sortie RB"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:77 #: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:77
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1633 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1637
msgid "Choose the format to view" msgid "Choose the format to view"
msgstr "Choisir le format à afficher" msgstr "Choisir le format à afficher"
@ -3855,7 +3885,7 @@ msgid ""
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:38 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:38
#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:130 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:132
msgid "No details available." msgid "No details available."
msgstr "Pas de détail disponible." msgstr "Pas de détail disponible."
@ -4111,7 +4141,7 @@ msgstr "&Précédent"
msgid "&Next" msgid "&Next"
msgstr "Suiva&nt" msgstr "Suiva&nt"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog.py:38 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog.py:37
msgid "My Books" msgid "My Books"
msgstr "Mes Livres" msgstr "Mes Livres"
@ -4251,7 +4281,7 @@ msgstr "Nouvelle adresse email"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:477 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:477
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:821 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:821
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:158 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:158
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1242 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1246
#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:53 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:53
msgid "Error" msgid "Error"
msgstr "Erreur" msgstr "Erreur"
@ -6443,7 +6473,7 @@ msgid "Save to disk in a single directory"
msgstr "Sauvegarder sur le disque dans un seul répertoire" msgstr "Sauvegarder sur le disque dans un seul répertoire"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:306 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:306
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1741 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1745
msgid "Save only %s format to disk" msgid "Save only %s format to disk"
msgstr "Sauvegarder seulement le format %s vers le disque" msgstr "Sauvegarder seulement le format %s vers le disque"
@ -6478,7 +6508,7 @@ msgstr "Convertir par lot"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:360 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:360
msgid "Create catalog of books in your calibre library" msgid "Create catalog of books in your calibre library"
msgstr "" msgstr "Créer le catalogue des livres dans votre librairie calibre"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:376 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:376
msgid "Run welcome wizard" msgid "Run welcome wizard"
@ -6499,13 +6529,13 @@ msgid "Calibre Library"
msgstr "Librairie calibre" msgstr "Librairie calibre"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:485 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:485
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1897 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1901
msgid "Choose a location for your ebook library." msgid "Choose a location for your ebook library."
msgstr "Choisir un emplacement pour votre librairie d'ebook" msgstr "Choisir un emplacement pour votre librairie d'ebook"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:523 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:523
msgid "Calibre Quick Start Guide" msgid "Calibre Quick Start Guide"
msgstr "" msgstr "Guide De Démarrage Rapide Calibre"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:703 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:703
msgid "Browse by covers" msgid "Browse by covers"
@ -6622,8 +6652,8 @@ msgid "Cannot delete"
msgstr "Impossible de supprimer" msgstr "Impossible de supprimer"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1075 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1075
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1627 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1631
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1646 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1650
msgid "No book selected" msgid "No book selected"
msgstr "Aucun livre sélectionné" msgstr "Aucun livre sélectionné"
@ -6631,11 +6661,11 @@ msgstr "Aucun livre sélectionné"
msgid "Choose formats to be deleted" msgid "Choose formats to be deleted"
msgstr "Choisir les formats à supprimer" msgstr "Choisir les formats à supprimer"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1101 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1103
msgid "Choose formats <b>not</b> to be deleted" msgid "Choose formats <b>not</b> to be deleted"
msgstr "Choisir les formats à <b>ne pas</b> supprimer" msgstr "Choisir les formats à <b>ne pas</b> supprimer"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1137 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1141
msgid "" msgid ""
"The selected books will be <b>permanently deleted</b> and the files removed " "The selected books will be <b>permanently deleted</b> and the files removed "
"from your computer. Are you sure?" "from your computer. Are you sure?"
@ -6643,123 +6673,131 @@ msgstr ""
"Les livres sélectionnés vont être <b>supprimés définitivement</b> et les " "Les livres sélectionnés vont être <b>supprimés définitivement</b> et les "
"fichiers seront supprimés de votre ordinateur. Etes-vous sûr ?" "fichiers seront supprimés de votre ordinateur. Etes-vous sûr ?"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1164 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1168
msgid "Deleting books from device." msgid "Deleting books from device."
msgstr "Suppression des livres dans l'appareil" msgstr "Suppression des livres dans l'appareil"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1195 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1199
msgid "Cannot download metadata" msgid "Cannot download metadata"
msgstr "Impossible de télécharger les métadonnées" msgstr "Impossible de télécharger les métadonnées"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1196 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1200
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1253 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1257
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1286 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1290
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1311 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1315
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1370 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1374
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1483 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1487
msgid "No books selected" msgid "No books selected"
msgstr "Aucun livre sélectionné" msgstr "Aucun livre sélectionné"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1211 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1215
msgid "social metadata" msgid "social metadata"
msgstr "Métadonnées sociales" msgstr "Métadonnées sociales"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1213 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1217
msgid "covers" msgid "covers"
msgstr "couvertures" msgstr "couvertures"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1213 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1217
msgid "metadata" msgid "metadata"
msgstr "métadonnées" msgstr "métadonnées"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1215 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1219
msgid "Downloading %s for %d book(s)" msgid "Downloading %s for %d book(s)"
msgstr "Télécharge les livres %s sur %d" msgstr "Télécharge les livres %s sur %d"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1237 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1241
msgid "Failed to download some metadata" msgid "Failed to download some metadata"
msgstr "Le téléchargement d'une partie des métadonnées a échoué" msgstr "Le téléchargement d'une partie des métadonnées a échoué"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1238 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1242
msgid "Failed to download metadata for the following:" msgid "Failed to download metadata for the following:"
msgstr "Le téléchargement des métadonnées a échoué pour :" msgstr "Le téléchargement des métadonnées a échoué pour :"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1241 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1245
msgid "Failed to download metadata:" msgid "Failed to download metadata:"
msgstr "Le téléchargement des métadonnées a échoué:" msgstr "Le téléchargement des métadonnées a échoué:"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1252 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1256
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1285 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1289
msgid "Cannot edit metadata" msgid "Cannot edit metadata"
msgstr "Impossible d'éditer les métadonnées" msgstr "Impossible d'éditer les métadonnées"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1310 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1314
msgid "Cannot save to disk" msgid "Cannot save to disk"
msgstr "Impossible de sauvegarder sur le disque" msgstr "Impossible de sauvegarder sur le disque"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1313 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1317
msgid "Choose destination directory" msgid "Choose destination directory"
msgstr "Choisir le répertoire de destination" msgstr "Choisir le répertoire de destination"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1340 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1344
msgid "Error while saving" msgid "Error while saving"
msgstr "Erreur pendant la sauvegarde" msgstr "Erreur pendant la sauvegarde"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1341 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1345
msgid "There was an error while saving." msgid "There was an error while saving."
msgstr "Il y a eu une erreur lors de la sauvegarde." msgstr "Il y a eu une erreur lors de la sauvegarde."
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1348 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1352
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1349 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1353
msgid "Could not save some books" msgid "Could not save some books"
msgstr "Impossible de sauvegarder certains livres" msgstr "Impossible de sauvegarder certains livres"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1350 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1354
msgid "Click the show details button to see which ones." msgid "Click the show details button to see which ones."
msgstr "Cliquer le bouton afficher les détails pour voir lesquels." msgstr "Cliquer le bouton afficher les détails pour voir lesquels."
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1371 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1375
msgid "No books selected to generate catalog for" msgid "No books selected to generate catalog for"
msgstr "Aucun livre sélectionné pour générer le catalogue pour" msgstr "Aucun livre sélectionné pour générer le catalogue pour"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1388 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1392
msgid "Generating %s catalog..." msgid "Generating %s catalog..."
msgstr "Génère le catalogue %s..." msgstr "Génère le catalogue %s..."
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1399 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1403
msgid "Catalog generated." msgid "Catalog generated."
msgstr "Catalogue généré." msgstr "Catalogue généré."
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1417 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1406
msgid "Export Catalog Directory"
msgstr "Répertoire d'export du catalogue"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1407
msgid "Select destination for %s.%s"
msgstr "Sélectionner la destination pour %s.%s"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1421
msgid "Fetching news from " msgid "Fetching news from "
msgstr "Récupération des News de " msgstr "Récupération des News de "
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1431 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1435
msgid " fetched." msgid " fetched."
msgstr " récupéré." msgstr " récupéré."
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1482 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1486
msgid "Cannot convert" msgid "Cannot convert"
msgstr "Conversion impossible" msgstr "Conversion impossible"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1511 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1515
msgid "Starting conversion of %d book(s)" msgid "Starting conversion of %d book(s)"
msgstr "Démarrer la conversion de %d livre(s)" msgstr "Démarrer la conversion de %d livre(s)"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1627 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1631
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1683 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1687
msgid "Cannot view" msgid "Cannot view"
msgstr "Impossible de visualiser" msgstr "Impossible de visualiser"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1645 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1649
msgid "Cannot open folder" msgid "Cannot open folder"
msgstr "Impossible d'ouvrir le répertoire" msgstr "Impossible d'ouvrir le répertoire"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1667 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1671
msgid "Multiple Books Selected" msgid "Multiple Books Selected"
msgstr "Plusieurs livres sélectionnés" msgstr "Plusieurs livres sélectionnés"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1668 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1672
msgid "" msgid ""
"You are attempting to open %d books. Opening too many books at once can be " "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 " "slow and have a negative effect on the responsiveness of your computer. Once "
@ -6771,32 +6809,32 @@ msgstr ""
"réponses de l'ordinateur. Une fois démarré le processus ne peut pas être " "réponses de l'ordinateur. Une fois démarré le processus ne peut pas être "
"arrêté avant la fin. Voulez-vous continuer ?" "arrêté avant la fin. Voulez-vous continuer ?"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1684 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1688
msgid "%s has no available formats." msgid "%s has no available formats."
msgstr "%s n'a pas de format disponible." msgstr "%s n'a pas de format disponible."
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1725 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1729
msgid "Cannot configure" msgid "Cannot configure"
msgstr "Configuration impossible" msgstr "Configuration impossible"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1726 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1730
msgid "Cannot configure while there are running jobs." msgid "Cannot configure while there are running jobs."
msgstr "Impossible de configurer pendant que des travaux sont en cours." msgstr "Impossible de configurer pendant que des travaux sont en cours."
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1769 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1773
msgid "No detailed info available" msgid "No detailed info available"
msgstr "Pas d'information détaillée disponible" msgstr "Pas d'information détaillée disponible"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1770 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1774
msgid "No detailed information is available for books on the device." msgid "No detailed information is available for books on the device."
msgstr "" msgstr ""
"Pas d'information détaillée disponible pour les livres dans l'appareil." "Pas d'information détaillée disponible pour les livres dans l'appareil."
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1825 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1829
msgid "Error talking to device" msgid "Error talking to device"
msgstr "Erreur pendant la communication avec le lecteur électronique" msgstr "Erreur pendant la communication avec le lecteur électronique"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1826 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1830
msgid "" msgid ""
"There was a temporary error talking to the device. Please unplug and " "There was a temporary error talking to the device. Please unplug and "
"reconnect the device and or reboot." "reconnect the device and or reboot."
@ -6805,12 +6843,12 @@ msgstr ""
"lecteur électronique. Veuillez déconnecter et reconnecter le lecteur " "lecteur électronique. Veuillez déconnecter et reconnecter le lecteur "
"électronique et redémarrer." "électronique et redémarrer."
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1849 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1853
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1877 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1881
msgid "Conversion Error" msgid "Conversion Error"
msgstr "Erreur lors de la conversion" msgstr "Erreur lors de la conversion"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1850 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1854
msgid "" msgid ""
"<p>Could not convert: %s<p>It is a <a href=\"%s\">DRM</a>ed book. You must " "<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." "first remove the DRM using third party tools."
@ -6819,23 +6857,23 @@ msgstr ""
"href=\"%s\">DRM</a>. Vous devez d'abord enlever les DRM avec des outils " "href=\"%s\">DRM</a>. Vous devez d'abord enlever les DRM avec des outils "
"tiers." "tiers."
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1863 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1867
msgid "Recipe Disabled" msgid "Recipe Disabled"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1878 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1882
msgid "<b>Failed</b>" msgid "<b>Failed</b>"
msgstr "<b>Échoué</b>" msgstr "<b>Échoué</b>"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1906 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1910
msgid "Invalid library location" msgid "Invalid library location"
msgstr "Emplacement de la librairie invalide" msgstr "Emplacement de la librairie invalide"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1907 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1911
msgid "Could not access %s. Using %s as the library." msgid "Could not access %s. Using %s as the library."
msgstr "Impossible d'accéder à %s. Utilise %s comme librairie." msgstr "Impossible d'accéder à %s. Utilise %s comme librairie."
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1957 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1961
msgid "" msgid ""
"is the result of the efforts of many volunteers from all over the world. If " "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." "you find it useful, please consider donating to support its development."
@ -6844,11 +6882,11 @@ msgstr ""
"Si vous le trouvez utile, pensez à donner afin de supporter son " "Si vous le trouvez utile, pensez à donner afin de supporter son "
"développement." "développement."
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1982 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1986
msgid "There are active jobs. Are you sure you want to quit?" msgid "There are active jobs. Are you sure you want to quit?"
msgstr "Il y a des travaux actifs. Voulez-vous vraiment finir ?" msgstr "Il y a des travaux actifs. Voulez-vous vraiment finir ?"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1985 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1989
msgid "" msgid ""
" is communicating with the device!<br>\n" " is communicating with the device!<br>\n"
" Quitting may cause corruption on the device.<br>\n" " Quitting may cause corruption on the device.<br>\n"
@ -6859,11 +6897,11 @@ msgstr ""
"l'appareil.<br>\n" "l'appareil.<br>\n"
" Êtes-vous sûr de vouloir quitter ?" " Êtes-vous sûr de vouloir quitter ?"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1989 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1993
msgid "WARNING: Active jobs" msgid "WARNING: Active jobs"
msgstr "ATTENTION: Travaux actifs" msgstr "ATTENTION: Travaux actifs"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2041 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2045
msgid "" msgid ""
"will keep running in the system tray. To close it, choose <b>Quit</b> in the " "will keep running in the system tray. To close it, choose <b>Quit</b> in the "
"context menu of the system tray." "context menu of the system tray."
@ -6871,7 +6909,7 @@ msgstr ""
"continuera à tourner dans la zone de notification. Pour le fermer, choisir " "continuera à tourner dans la zone de notification. Pour le fermer, choisir "
"<b>Quitter</b> dans le menu contextuel de la zone de notification." "<b>Quitter</b> dans le menu contextuel de la zone de notification."
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2060 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2064
msgid "" msgid ""
"<span style=\"color:red; font-weight:bold\">Latest version: <a " "<span style=\"color:red; font-weight:bold\">Latest version: <a "
"href=\"%s\">%s</a></span>" "href=\"%s\">%s</a></span>"
@ -6879,11 +6917,11 @@ msgstr ""
"<span style=\"color:red; font-weight:bold\">Dernière version: <a " "<span style=\"color:red; font-weight:bold\">Dernière version: <a "
"href=\"%s\">%s</a></span>" "href=\"%s\">%s</a></span>"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2068 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2072
msgid "Update available" msgid "Update available"
msgstr "Mise à jour disponible" msgstr "Mise à jour disponible"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2069 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2073
msgid "" msgid ""
"%s has been updated to version %s. See the <a href=\"http://calibre-" "%s has been updated to version %s. See the <a href=\"http://calibre-"
"ebook.com/whats-new\">new features</a>. Visit the download page?" "ebook.com/whats-new\">new features</a>. Visit the download page?"
@ -7108,7 +7146,7 @@ msgstr "La taille de police monospace en px"
msgid "The standard font type" msgid "The standard font type"
msgstr "Le type de police standard" msgstr "Le type de police standard"
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:407 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:408
msgid "&Lookup in dictionary" msgid "&Lookup in dictionary"
msgstr "Rechercher dans le dictionnaire" msgstr "Rechercher dans le dictionnaire"
@ -7758,7 +7796,7 @@ msgstr ""
"Le nombre maximum de correspondances retournées par une requête OPDS. Ceci " "Le nombre maximum de correspondances retournées par une requête OPDS. Ceci "
"affecte l'intégration dans Stanza, Wordplayer,etc..." "affecte l'intégration dans Stanza, Wordplayer,etc..."
#: /home/kovid/work/calibre/src/calibre/library/catalog.py:28 #: /home/kovid/work/calibre/src/calibre/library/catalog.py:34
msgid "" msgid ""
"The fields to output when cataloging books in the database. Should be a " "The fields to output when cataloging books in the database. Should be a "
"comma-separated list of fields.\n" "comma-separated list of fields.\n"
@ -7767,7 +7805,7 @@ msgid ""
"Applies to: CSV, XML output formats" "Applies to: CSV, XML output formats"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/catalog.py:37 #: /home/kovid/work/calibre/src/calibre/library/catalog.py:43
msgid "" msgid ""
"Output field to sort on.\n" "Output field to sort on.\n"
"Available fields: author_sort, id, rating, size, timestamp, title.\n" "Available fields: author_sort, id, rating, size, timestamp, title.\n"
@ -7775,6 +7813,62 @@ msgid ""
"Applies to: CSV, XML output formats" "Applies to: CSV, XML output formats"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/catalog.py:241
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:247
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 "
"conversion process a bug is occurring.\n"
"Default: '%default'None\n"
"Applies to: ePub, MOBI output formats"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/catalog.py:256
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:261
msgid ""
"Comma-separated list of tag words indicating book should be excluded from "
"output. Case-insensitive.\n"
"--exclude-tags=skip will match 'skip this book' and 'Skip will like this'.\n"
"Default: '%default'\n"
"Applies to: ePub, MOBI output formats"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/catalog.py:268
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:273
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:279
msgid ""
"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"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:121 #: /home/kovid/work/calibre/src/calibre/library/cli.py:121
msgid "" msgid ""
"Path to the calibre library. Default is to use the path stored in the " "Path to the calibre library. Default is to use the path stored in the "
@ -8126,32 +8220,27 @@ msgstr ""
"\n" "\n"
"Pour une aide sur commande précise: %%prog commande --help\n" "Pour une aide sur commande précise: %%prog commande --help\n"
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1416 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1696
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1429
msgid "Catalog"
msgstr "Catalogue"
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1691
msgid "<p>Migrating old database to ebook library in %s<br><center>" msgid "<p>Migrating old database to ebook library in %s<br><center>"
msgstr "<p>Migre l'ancienne base vers la librairie dans %s<br><center>" msgstr "<p>Migre l'ancienne base vers la librairie dans %s<br><center>"
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1720 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1725
msgid "Copying <b>%s</b>" msgid "Copying <b>%s</b>"
msgstr "Copie <b>%s</b>" msgstr "Copie <b>%s</b>"
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1737 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1742
msgid "Compacting database" msgid "Compacting database"
msgstr "Compacte la base" msgstr "Compacte la base"
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1830 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1835
msgid "Checking SQL integrity..." msgid "Checking SQL integrity..."
msgstr "Vérifie l'intégrité SQL..." msgstr "Vérifie l'intégrité SQL..."
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1867 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1872
msgid "Checking for missing files." msgid "Checking for missing files."
msgstr "Vérifie si des fichiers sont manquants." msgstr "Vérifie si des fichiers sont manquants."
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1889 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1894
msgid "Checked id" msgid "Checked id"
msgstr "Id vérifié" msgstr "Id vérifié"
@ -8299,7 +8388,7 @@ msgstr "Convertir les chemins en minuscule."
msgid "Replace whitespace with underscores." msgid "Replace whitespace with underscores."
msgstr "Remplacer les espaces par des underscores." msgstr "Remplacer les espaces par des underscores."
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:255 #: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:256
msgid "Requested formats not available" msgid "Requested formats not available"
msgstr "Formats demandés non disponible" msgstr "Formats demandés non disponible"
@ -8308,7 +8397,7 @@ msgid "Password to access your calibre library. Username is "
msgstr "" msgstr ""
"Mot de passe pour accéder à la librairie calibre. Le nom d'utilisateur est " "Mot de passe pour accéder à la librairie calibre. Le nom d'utilisateur est "
#: /home/kovid/work/calibre/src/calibre/library/server.py:856 #: /home/kovid/work/calibre/src/calibre/library/server.py:860
msgid "" msgid ""
"[options]\n" "[options]\n"
"\n" "\n"
@ -8318,7 +8407,7 @@ msgstr ""
"\n" "\n"
"Démarre le serveur de contenu calibre" "Démarre le serveur de contenu calibre"
#: /home/kovid/work/calibre/src/calibre/library/server.py:858 #: /home/kovid/work/calibre/src/calibre/library/server.py:862
msgid "Path to the library folder to serve with the content server" msgid "Path to the library folder to serve with the content server"
msgstr "" msgstr ""
@ -8396,7 +8485,7 @@ msgstr "Arrêté"
msgid "Finished" msgid "Finished"
msgstr "Terminé" msgstr "Terminé"
#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:70 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:72
msgid "Working..." msgid "Working..."
msgstr "Traitement en cours..." msgstr "Traitement en cours..."

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -7,14 +7,14 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: calibre\n" "Project-Id-Version: calibre\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2010-01-22 03:18+0000\n" "POT-Creation-Date: 2010-01-25 00:45+0000\n"
"PO-Revision-Date: 2010-01-21 23:19+0000\n" "PO-Revision-Date: 2010-01-25 02:46+0000\n"
"Last-Translator: Marty <Unknown>\n" "Last-Translator: Kovid Goyal <Unknown>\n"
"Language-Team: Polish <pl@li.org>\n" "Language-Team: Polish <pl@li.org>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2010-01-22 04:33+0000\n" "X-Launchpad-Export-Date: 2010-01-25 04:47+0000\n"
"X-Generator: Launchpad (build Unknown)\n" "X-Generator: Launchpad (build Unknown)\n"
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43 #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43
@ -30,7 +30,7 @@ msgstr "Ta opcja nic nie zmienia"
#: /home/kovid/work/calibre/src/calibre/devices/prs505/books.py:58 #: /home/kovid/work/calibre/src/calibre/devices/prs505/books.py:58
#: /home/kovid/work/calibre/src/calibre/devices/prs505/books.py:199 #: /home/kovid/work/calibre/src/calibre/devices/prs505/books.py:199
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:205 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:205
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:414 #: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:417
#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:67 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:67
#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:69 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:69
#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:319 #: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:319
@ -127,12 +127,12 @@ msgstr "Ta opcja nic nie zmienia"
#: /home/kovid/work/calibre/src/calibre/library/database2.py:715 #: /home/kovid/work/calibre/src/calibre/library/database2.py:715
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1143 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1143
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1180 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1180
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1547 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1552
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1549 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1554
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1665 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1670
#: /home/kovid/work/calibre/src/calibre/library/server.py:645 #: /home/kovid/work/calibre/src/calibre/library/server.py:645
#: /home/kovid/work/calibre/src/calibre/library/server.py:717 #: /home/kovid/work/calibre/src/calibre/library/server.py:721
#: /home/kovid/work/calibre/src/calibre/library/server.py:764 #: /home/kovid/work/calibre/src/calibre/library/server.py:768
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:111 #: /home/kovid/work/calibre/src/calibre/utils/localization.py:111
#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:45 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:45
#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:63 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:63
@ -234,11 +234,11 @@ msgstr "Ustaw metadane w %s plikach"
msgid "Set metadata from %s files" msgid "Set metadata from %s files"
msgstr "Pobierz metadane z %s plików" msgstr "Pobierz metadane z %s plików"
#: /home/kovid/work/calibre/src/calibre/customize/conversion.py:99 #: /home/kovid/work/calibre/src/calibre/customize/conversion.py:102
msgid "Conversion Input" msgid "Conversion Input"
msgstr "Źródłowy format do konwersji" msgstr "Źródłowy format do konwersji"
#: /home/kovid/work/calibre/src/calibre/customize/conversion.py:122 #: /home/kovid/work/calibre/src/calibre/customize/conversion.py:125
msgid "" msgid ""
"Specify the character encoding of the input document. If set this option " "Specify the character encoding of the input document. If set this option "
"will override any encoding declared by the document itself. Particularly " "will override any encoding declared by the document itself. Particularly "
@ -246,11 +246,11 @@ msgid ""
"encoding declarations." "encoding declarations."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/conversion.py:225 #: /home/kovid/work/calibre/src/calibre/customize/conversion.py:228
msgid "Conversion Output" msgid "Conversion Output"
msgstr "Docelowy format po konwersji" msgstr "Docelowy format po konwersji"
#: /home/kovid/work/calibre/src/calibre/customize/conversion.py:239 #: /home/kovid/work/calibre/src/calibre/customize/conversion.py:242
msgid "" msgid ""
"If specified, the output plugin will try to create output that is as human " "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." "readable as possible. May not have any effect for some output plugins."
@ -451,11 +451,11 @@ msgstr ""
msgid "Communicate with the Binatone Readme eBook reader." msgid "Communicate with the Binatone Readme eBook reader."
msgstr "Komunikować się z Binatone Readme czytnik e-booków" msgstr "Komunikować się z Binatone Readme czytnik e-booków"
#: /home/kovid/work/calibre/src/calibre/devices/blackberry/driver.py:12 #: /home/kovid/work/calibre/src/calibre/devices/blackberry/driver.py:13
msgid "Communicate with the Blackberry smart phone." msgid "Communicate with the Blackberry smart phone."
msgstr "Komunikować się z telefonu Blackberry." msgstr "Komunikować się z telefonu Blackberry."
#: /home/kovid/work/calibre/src/calibre/devices/blackberry/driver.py:13 #: /home/kovid/work/calibre/src/calibre/devices/blackberry/driver.py:14
#: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:18 #: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:18
#: /home/kovid/work/calibre/src/calibre/devices/prs500/driver.py:90 #: /home/kovid/work/calibre/src/calibre/devices/prs500/driver.py:90
msgid "Kovid Goyal" msgid "Kovid Goyal"
@ -650,7 +650,7 @@ msgstr "Na karcie pamięci jest niewystarczająca ilość wolnego miejsca"
#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:132 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:132
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1068 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1068
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1072 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1072
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1447 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1452
msgid "News" msgid "News"
msgstr "Aktualności" msgstr "Aktualności"
@ -802,8 +802,8 @@ msgstr ""
msgid "Apply no processing to the image" msgid "Apply no processing to the image"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:438 #: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:441
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:449 #: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:452
msgid "Page" msgid "Page"
msgstr "Strona" msgstr "Strona"
@ -2506,6 +2506,7 @@ msgid "CSV/XML Options"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml.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/convert/comic_input.py:16 #: /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/epub_output.py:16
#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_input.py:13 #: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_input.py:13
@ -2523,6 +2524,7 @@ msgid "Options specific to"
msgstr "Opcje specyficzne dla" msgstr "Opcje specyficzne dla"
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml.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/convert/epub_output.py:16 #: /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/fb2_output.py:15
#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output.py:20 #: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output.py:20
@ -2534,7 +2536,8 @@ msgstr "Opcje specyficzne dla"
msgid "output" msgid "output"
msgstr "wyjście" msgstr "wyjście"
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml_ui.py:34 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml_ui.py:36
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:51
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_tab_template_ui.py:27 #: /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:84 #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:84
#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:49 #: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:49
@ -2565,10 +2568,37 @@ msgstr "wyjście"
msgid "Form" msgid "Form"
msgstr "Formularz" msgstr "Formularz"
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml_ui.py:35 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml_ui.py:37
msgid "Fields to include in output:" msgid "Fields to include in output:"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:17
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:259
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1416
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1430
msgid "Catalog"
msgstr "Katalog"
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:52
msgid "Tags to exclude as genres (regex):"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:53
msgid "'Don't include this book' tag:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:54
msgid "'Mark this book as read' tag:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:55
msgid "Additional note tag prefix:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_tab_template_ui.py:28 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_tab_template_ui.py:28
msgid "Tab template for catalog.ui" msgid "Tab template for catalog.ui"
msgstr "" msgstr ""
@ -3198,7 +3228,7 @@ msgid "RB Output"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:77 #: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:77
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1633 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1637
msgid "Choose the format to view" msgid "Choose the format to view"
msgstr "Wybierz format do wyświetlenia" msgstr "Wybierz format do wyświetlenia"
@ -3495,7 +3525,7 @@ msgid ""
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:38 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:38
#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:130 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:132
msgid "No details available." msgid "No details available."
msgstr "Brak szczegółów." msgstr "Brak szczegółów."
@ -3740,7 +3770,7 @@ msgstr "&Poprzedni"
msgid "&Next" msgid "&Next"
msgstr "&Następny" msgstr "&Następny"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog.py:38 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog.py:37
msgid "My Books" msgid "My Books"
msgstr "" msgstr ""
@ -3873,7 +3903,7 @@ msgstr "nowy adres email"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:477 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:477
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:821 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:821
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:158 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:158
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1242 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1246
#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:53 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:53
msgid "Error" msgid "Error"
msgstr "Błąd" msgstr "Błąd"
@ -5954,7 +5984,7 @@ msgid "Save to disk in a single directory"
msgstr "Zapisz na dysku w pojedyńczym folderze" msgstr "Zapisz na dysku w pojedyńczym folderze"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:306 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:306
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1741 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1745
msgid "Save only %s format to disk" msgid "Save only %s format to disk"
msgstr "Zapisz na dysku jedynie pliki w formacie %s" msgstr "Zapisz na dysku jedynie pliki w formacie %s"
@ -6009,7 +6039,7 @@ msgid "Calibre Library"
msgstr "Biblioteka calibre" msgstr "Biblioteka calibre"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:485 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:485
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1897 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1901
msgid "Choose a location for your ebook library." msgid "Choose a location for your ebook library."
msgstr "Wybierz lokalizację dla twojej biblioteki książek." msgstr "Wybierz lokalizację dla twojej biblioteki książek."
@ -6119,8 +6149,8 @@ msgid "Cannot delete"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1075 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1075
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1627 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1631
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1646 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1650
msgid "No book selected" msgid "No book selected"
msgstr "Nie wybrano ksiązki" msgstr "Nie wybrano ksiązki"
@ -6128,11 +6158,11 @@ msgstr "Nie wybrano ksiązki"
msgid "Choose formats to be deleted" msgid "Choose formats to be deleted"
msgstr "Wybierz formaty do usunięcia" msgstr "Wybierz formaty do usunięcia"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1101 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1103
msgid "Choose formats <b>not</b> to be deleted" msgid "Choose formats <b>not</b> to be deleted"
msgstr "Wybierz formaty, które <b>nie</b> zostaną usunięte" msgstr "Wybierz formaty, które <b>nie</b> zostaną usunięte"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1137 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1141
msgid "" msgid ""
"The selected books will be <b>permanently deleted</b> and the files removed " "The selected books will be <b>permanently deleted</b> and the files removed "
"from your computer. Are you sure?" "from your computer. Are you sure?"
@ -6140,123 +6170,131 @@ msgstr ""
"Wybrane książki będą <b>permanentnie usunięte</b> i ich pliki zostaną " "Wybrane książki będą <b>permanentnie usunięte</b> i ich pliki zostaną "
"usunięte z twojego komputera. Jesteś pewny?" "usunięte z twojego komputera. Jesteś pewny?"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1164 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1168
msgid "Deleting books from device." msgid "Deleting books from device."
msgstr "Usuwanie książek z urządzenia." msgstr "Usuwanie książek z urządzenia."
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1195 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1199
msgid "Cannot download metadata" msgid "Cannot download metadata"
msgstr "Nie można obrac metadanych" msgstr "Nie można obrac metadanych"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1196 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1200
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1253 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1257
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1286 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1290
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1311 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1315
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1370 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1374
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1483 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1487
msgid "No books selected" msgid "No books selected"
msgstr "Nie wybrano ksiązek" msgstr "Nie wybrano ksiązek"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1211 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1215
msgid "social metadata" msgid "social metadata"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1213 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1217
msgid "covers" msgid "covers"
msgstr "okładki" msgstr "okładki"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1213 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1217
msgid "metadata" msgid "metadata"
msgstr "metadane" msgstr "metadane"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1215 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1219
msgid "Downloading %s for %d book(s)" msgid "Downloading %s for %d book(s)"
msgstr "Pobieram %s dla %d książki(ek)" msgstr "Pobieram %s dla %d książki(ek)"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1237 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1241
msgid "Failed to download some metadata" msgid "Failed to download some metadata"
msgstr "Nie udało się pobrac niektórych metadanych" msgstr "Nie udało się pobrac niektórych metadanych"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1238 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1242
msgid "Failed to download metadata for the following:" msgid "Failed to download metadata for the following:"
msgstr "Nie udało się pobrać metadanych dla następujących e-ksiązek:" msgstr "Nie udało się pobrać metadanych dla następujących e-ksiązek:"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1241 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1245
msgid "Failed to download metadata:" msgid "Failed to download metadata:"
msgstr "Nie udało się pobrać metadanych:" msgstr "Nie udało się pobrać metadanych:"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1252 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1256
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1285 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1289
msgid "Cannot edit metadata" msgid "Cannot edit metadata"
msgstr "Nie można edytować metadanych" msgstr "Nie można edytować metadanych"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1310 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1314
msgid "Cannot save to disk" msgid "Cannot save to disk"
msgstr "Nie można zapisać na dysku" msgstr "Nie można zapisać na dysku"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1313 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1317
msgid "Choose destination directory" msgid "Choose destination directory"
msgstr "Wyberz folder docelowy" msgstr "Wyberz folder docelowy"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1340 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1344
msgid "Error while saving" msgid "Error while saving"
msgstr "Błąd podczas zapisywania" msgstr "Błąd podczas zapisywania"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1341 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1345
msgid "There was an error while saving." msgid "There was an error while saving."
msgstr "Wysapił błąd podczas zapisywania." msgstr "Wysapił błąd podczas zapisywania."
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1348 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1352
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1349 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1353
msgid "Could not save some books" msgid "Could not save some books"
msgstr "Nie można była zapisać niektórych książek" msgstr "Nie można była zapisać niektórych książek"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1350 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1354
msgid "Click the show details button to see which ones." msgid "Click the show details button to see which ones."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1371 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1375
msgid "No books selected to generate catalog for" msgid "No books selected to generate catalog for"
msgstr "Brak książek do wygenerowania katalogu" msgstr "Brak książek do wygenerowania katalogu"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1388 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1392
msgid "Generating %s catalog..." msgid "Generating %s catalog..."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1399 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1403
msgid "Catalog generated." msgid "Catalog generated."
msgstr "Katalog wygenerowany" msgstr "Katalog wygenerowany"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1417 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1406
msgid "Export Catalog Directory"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1407
msgid "Select destination for %s.%s"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1421
msgid "Fetching news from " msgid "Fetching news from "
msgstr "Pobieranie aktualności z " msgstr "Pobieranie aktualności z "
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1431 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1435
msgid " fetched." msgid " fetched."
msgstr " - pobrano." msgstr " - pobrano."
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1482 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1486
msgid "Cannot convert" msgid "Cannot convert"
msgstr "Nie można przekonwertować" msgstr "Nie można przekonwertować"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1511 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1515
msgid "Starting conversion of %d book(s)" msgid "Starting conversion of %d book(s)"
msgstr "Rozpoczynam konwersję %d książki(ek)" msgstr "Rozpoczynam konwersję %d książki(ek)"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1627 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1631
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1683 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1687
msgid "Cannot view" msgid "Cannot view"
msgstr "Nie można wyświetlić" msgstr "Nie można wyświetlić"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1645 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1649
msgid "Cannot open folder" msgid "Cannot open folder"
msgstr "Nie można otworzyć folderu" msgstr "Nie można otworzyć folderu"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1667 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1671
msgid "Multiple Books Selected" msgid "Multiple Books Selected"
msgstr "Wybrano wiele książek" msgstr "Wybrano wiele książek"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1668 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1672
msgid "" msgid ""
"You are attempting to open %d books. Opening too many books at once can be " "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 " "slow and have a negative effect on the responsiveness of your computer. Once "
@ -6264,31 +6302,31 @@ msgid ""
"continue?" "continue?"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1684 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1688
msgid "%s has no available formats." msgid "%s has no available formats."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1725 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1729
msgid "Cannot configure" msgid "Cannot configure"
msgstr "Nie można skonfigurować" msgstr "Nie można skonfigurować"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1726 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1730
msgid "Cannot configure while there are running jobs." msgid "Cannot configure while there are running jobs."
msgstr "Nie można skonfigurować, gdy są aktywne jakieś zadania." msgstr "Nie można skonfigurować, gdy są aktywne jakieś zadania."
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1769 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1773
msgid "No detailed info available" msgid "No detailed info available"
msgstr "Brak szczegółowych informacji" msgstr "Brak szczegółowych informacji"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1770 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1774
msgid "No detailed information is available for books on the device." msgid "No detailed information is available for books on the device."
msgstr "Brak szczegółowych informacji dla książek na urządzeniu." msgstr "Brak szczegółowych informacji dla książek na urządzeniu."
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1825 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1829
msgid "Error talking to device" msgid "Error talking to device"
msgstr "Błąd komunikacji z urządzeniem" msgstr "Błąd komunikacji z urządzeniem"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1826 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1830
msgid "" msgid ""
"There was a temporary error talking to the device. Please unplug and " "There was a temporary error talking to the device. Please unplug and "
"reconnect the device and or reboot." "reconnect the device and or reboot."
@ -6296,12 +6334,12 @@ msgstr ""
"Wystąpił chwilowy błąd komunikacji z urządzeniem. Odłącz i podłącz je " "Wystąpił chwilowy błąd komunikacji z urządzeniem. Odłącz i podłącz je "
"ponownie lub uruchom komputer ponownie." "ponownie lub uruchom komputer ponownie."
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1849 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1853
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1877 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1881
msgid "Conversion Error" msgid "Conversion Error"
msgstr "Błąd podczas konwersji" msgstr "Błąd podczas konwersji"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1850 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1854
msgid "" msgid ""
"<p>Could not convert: %s<p>It is a <a href=\"%s\">DRM</a>ed book. You must " "<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." "first remove the DRM using third party tools."
@ -6309,61 +6347,61 @@ msgstr ""
"<p>Nie można skonwertować: %s<p>Książka posiada <a href=\"%s\">DRM</a>. " "<p>Nie można skonwertować: %s<p>Książka posiada <a href=\"%s\">DRM</a>. "
"Musisz najpierw usunąć DRM korzystając z innych programów." "Musisz najpierw usunąć DRM korzystając z innych programów."
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1863 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1867
msgid "Recipe Disabled" msgid "Recipe Disabled"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1878 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1882
msgid "<b>Failed</b>" msgid "<b>Failed</b>"
msgstr "<b>Nie powiodło się</b>" msgstr "<b>Nie powiodło się</b>"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1906 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1910
msgid "Invalid library location" msgid "Invalid library location"
msgstr "Niewłaściwa lokalizacja biblioteki" msgstr "Niewłaściwa lokalizacja biblioteki"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1907 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1911
msgid "Could not access %s. Using %s as the library." msgid "Could not access %s. Using %s as the library."
msgstr "Nie można uzyskać dostępu %s. Używam %s jako biblioteki." msgstr "Nie można uzyskać dostępu %s. Używam %s jako biblioteki."
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1957 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1961
msgid "" msgid ""
"is the result of the efforts of many volunteers from all over the world. If " "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." "you find it useful, please consider donating to support its development."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1982 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1986
msgid "There are active jobs. Are you sure you want to quit?" msgid "There are active jobs. Are you sure you want to quit?"
msgstr "" msgstr ""
"Niektóre zadania są aktywne. Jesteś pewnien, że chcesz zamknąć program?" "Niektóre zadania są aktywne. Jesteś pewnien, że chcesz zamknąć program?"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1985 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1989
msgid "" msgid ""
" is communicating with the device!<br>\n" " is communicating with the device!<br>\n"
" Quitting may cause corruption on the device.<br>\n" " Quitting may cause corruption on the device.<br>\n"
" Are you sure you want to quit?" " Are you sure you want to quit?"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1989 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1993
msgid "WARNING: Active jobs" msgid "WARNING: Active jobs"
msgstr "OSTRZEŻENIE: Aktywne zadania" msgstr "OSTRZEŻENIE: Aktywne zadania"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2041 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2045
msgid "" msgid ""
"will keep running in the system tray. To close it, choose <b>Quit</b> in the " "will keep running in the system tray. To close it, choose <b>Quit</b> in the "
"context menu of the system tray." "context menu of the system tray."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2060 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2064
msgid "" msgid ""
"<span style=\"color:red; font-weight:bold\">Latest version: <a " "<span style=\"color:red; font-weight:bold\">Latest version: <a "
"href=\"%s\">%s</a></span>" "href=\"%s\">%s</a></span>"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2068 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2072
msgid "Update available" msgid "Update available"
msgstr "Uaktualnienia dostępne" msgstr "Uaktualnienia dostępne"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2069 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2073
msgid "" msgid ""
"%s has been updated to version %s. See the <a href=\"http://calibre-" "%s has been updated to version %s. See the <a href=\"http://calibre-"
"ebook.com/whats-new\">new features</a>. Visit the download page?" "ebook.com/whats-new\">new features</a>. Visit the download page?"
@ -6583,7 +6621,7 @@ msgstr ""
msgid "The standard font type" msgid "The standard font type"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:407 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:408
msgid "&Lookup in dictionary" msgid "&Lookup in dictionary"
msgstr "Sprawdź w słowniku" msgstr "Sprawdź w słowniku"
@ -7184,7 +7222,7 @@ msgid ""
"WordPlayer, etc. integration." "WordPlayer, etc. integration."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/catalog.py:28 #: /home/kovid/work/calibre/src/calibre/library/catalog.py:34
msgid "" msgid ""
"The fields to output when cataloging books in the database. Should be a " "The fields to output when cataloging books in the database. Should be a "
"comma-separated list of fields.\n" "comma-separated list of fields.\n"
@ -7193,7 +7231,7 @@ msgid ""
"Applies to: CSV, XML output formats" "Applies to: CSV, XML output formats"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/catalog.py:37 #: /home/kovid/work/calibre/src/calibre/library/catalog.py:43
msgid "" msgid ""
"Output field to sort on.\n" "Output field to sort on.\n"
"Available fields: author_sort, id, rating, size, timestamp, title.\n" "Available fields: author_sort, id, rating, size, timestamp, title.\n"
@ -7201,6 +7239,62 @@ msgid ""
"Applies to: CSV, XML output formats" "Applies to: CSV, XML output formats"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/catalog.py:241
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:247
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 "
"conversion process a bug is occurring.\n"
"Default: '%default'None\n"
"Applies to: ePub, MOBI output formats"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/catalog.py:256
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:261
msgid ""
"Comma-separated list of tag words indicating book should be excluded from "
"output. Case-insensitive.\n"
"--exclude-tags=skip will match 'skip this book' and 'Skip will like this'.\n"
"Default: '%default'\n"
"Applies to: ePub, MOBI output formats"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/catalog.py:268
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:273
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:279
msgid ""
"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"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:121 #: /home/kovid/work/calibre/src/calibre/library/cli.py:121
msgid "" msgid ""
"Path to the calibre library. Default is to use the path stored in the " "Path to the calibre library. Default is to use the path stored in the "
@ -7465,32 +7559,27 @@ msgid ""
"For help on an individual command: %%prog command --help\n" "For help on an individual command: %%prog command --help\n"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1416 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1696
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1429
msgid "Catalog"
msgstr "Katalog"
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1691
msgid "<p>Migrating old database to ebook library in %s<br><center>" msgid "<p>Migrating old database to ebook library in %s<br><center>"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1720 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1725
msgid "Copying <b>%s</b>" msgid "Copying <b>%s</b>"
msgstr "Kopiowanie <b>%s</b>" msgstr "Kopiowanie <b>%s</b>"
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1737 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1742
msgid "Compacting database" msgid "Compacting database"
msgstr "Kompaktowanie bazy danych" msgstr "Kompaktowanie bazy danych"
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1830 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1835
msgid "Checking SQL integrity..." msgid "Checking SQL integrity..."
msgstr "Sprawdzam integralność SQL..." msgstr "Sprawdzam integralność SQL..."
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1867 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1872
msgid "Checking for missing files." msgid "Checking for missing files."
msgstr "Sprawdzam czy brakuje jakichś plików." msgstr "Sprawdzam czy brakuje jakichś plików."
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1889 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1894
msgid "Checked id" msgid "Checked id"
msgstr "" msgstr ""
@ -7622,7 +7711,7 @@ msgstr "Przekształć scieżki na małe znaki."
msgid "Replace whitespace with underscores." msgid "Replace whitespace with underscores."
msgstr "Zastąp spacje podkreśleniami." msgstr "Zastąp spacje podkreśleniami."
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:255 #: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:256
msgid "Requested formats not available" msgid "Requested formats not available"
msgstr "Żądane formaty nie dostępne" msgstr "Żądane formaty nie dostępne"
@ -7630,7 +7719,7 @@ msgstr "Żądane formaty nie dostępne"
msgid "Password to access your calibre library. Username is " msgid "Password to access your calibre library. Username is "
msgstr "Hasło do biblioteki calibre. Nazwa użytkownika to " msgstr "Hasło do biblioteki calibre. Nazwa użytkownika to "
#: /home/kovid/work/calibre/src/calibre/library/server.py:856 #: /home/kovid/work/calibre/src/calibre/library/server.py:860
msgid "" msgid ""
"[options]\n" "[options]\n"
"\n" "\n"
@ -7640,7 +7729,7 @@ msgstr ""
"\n" "\n"
"Włącz serwer zawartości calibre." "Włącz serwer zawartości calibre."
#: /home/kovid/work/calibre/src/calibre/library/server.py:858 #: /home/kovid/work/calibre/src/calibre/library/server.py:862
msgid "Path to the library folder to serve with the content server" msgid "Path to the library folder to serve with the content server"
msgstr "" msgstr ""
@ -7714,7 +7803,7 @@ msgstr "Zatrzymano"
msgid "Finished" msgid "Finished"
msgstr "Zakończone" msgstr "Zakończone"
#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:70 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:72
msgid "Working..." msgid "Working..."
msgstr "Pracuję.." msgstr "Pracuję.."

File diff suppressed because it is too large Load Diff

View File

@ -6,14 +6,14 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: calibre 0.4.55\n" "Project-Id-Version: calibre 0.4.55\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-01-22 03:18+0000\n" "POT-Creation-Date: 2010-01-25 00:45+0000\n"
"PO-Revision-Date: 2010-01-21 14:27+0000\n" "PO-Revision-Date: 2010-01-25 02:30+0000\n"
"Last-Translator: DisSkorpion <Unknown>\n" "Last-Translator: Kovid Goyal <Unknown>\n"
"Language-Team: American English <kde-i18n-doc@lists.kde.org>\n" "Language-Team: American English <kde-i18n-doc@lists.kde.org>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2010-01-22 04:33+0000\n" "X-Launchpad-Export-Date: 2010-01-25 04:47+0000\n"
"X-Generator: Launchpad (build Unknown)\n" "X-Generator: Launchpad (build Unknown)\n"
"X-Poedit-Country: RUSSIAN FEDERATION\n" "X-Poedit-Country: RUSSIAN FEDERATION\n"
"X-Poedit-Language: Russian\n" "X-Poedit-Language: Russian\n"
@ -34,7 +34,7 @@ msgstr "Ничего не делает"
#: /home/kovid/work/calibre/src/calibre/devices/prs505/books.py:58 #: /home/kovid/work/calibre/src/calibre/devices/prs505/books.py:58
#: /home/kovid/work/calibre/src/calibre/devices/prs505/books.py:199 #: /home/kovid/work/calibre/src/calibre/devices/prs505/books.py:199
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:205 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:205
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:414 #: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:417
#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:67 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:67
#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:69 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:69
#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:319 #: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:319
@ -131,12 +131,12 @@ msgstr "Ничего не делает"
#: /home/kovid/work/calibre/src/calibre/library/database2.py:715 #: /home/kovid/work/calibre/src/calibre/library/database2.py:715
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1143 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1143
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1180 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1180
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1547 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1552
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1549 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1554
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1665 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1670
#: /home/kovid/work/calibre/src/calibre/library/server.py:645 #: /home/kovid/work/calibre/src/calibre/library/server.py:645
#: /home/kovid/work/calibre/src/calibre/library/server.py:717 #: /home/kovid/work/calibre/src/calibre/library/server.py:721
#: /home/kovid/work/calibre/src/calibre/library/server.py:764 #: /home/kovid/work/calibre/src/calibre/library/server.py:768
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:111 #: /home/kovid/work/calibre/src/calibre/utils/localization.py:111
#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:45 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:45
#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:63 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:63
@ -238,11 +238,11 @@ msgstr "Внести метаданные в файлы %s"
msgid "Set metadata from %s files" msgid "Set metadata from %s files"
msgstr "Внести метаданные из файлов %s" msgstr "Внести метаданные из файлов %s"
#: /home/kovid/work/calibre/src/calibre/customize/conversion.py:99 #: /home/kovid/work/calibre/src/calibre/customize/conversion.py:102
msgid "Conversion Input" msgid "Conversion Input"
msgstr "Вход конвертера" msgstr "Вход конвертера"
#: /home/kovid/work/calibre/src/calibre/customize/conversion.py:122 #: /home/kovid/work/calibre/src/calibre/customize/conversion.py:125
msgid "" msgid ""
"Specify the character encoding of the input document. If set this option " "Specify the character encoding of the input document. If set this option "
"will override any encoding declared by the document itself. Particularly " "will override any encoding declared by the document itself. Particularly "
@ -254,11 +254,11 @@ msgstr ""
"Данная опция может быть полезна для документа, не имеющего информации о " "Данная опция может быть полезна для документа, не имеющего информации о "
"кодировке, или для документа, в котором указаны неверные параметры кодировки." "кодировке, или для документа, в котором указаны неверные параметры кодировки."
#: /home/kovid/work/calibre/src/calibre/customize/conversion.py:225 #: /home/kovid/work/calibre/src/calibre/customize/conversion.py:228
msgid "Conversion Output" msgid "Conversion Output"
msgstr "Выход конвертера" msgstr "Выход конвертера"
#: /home/kovid/work/calibre/src/calibre/customize/conversion.py:239 #: /home/kovid/work/calibre/src/calibre/customize/conversion.py:242
msgid "" msgid ""
"If specified, the output plugin will try to create output that is as human " "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." "readable as possible. May not have any effect for some output plugins."
@ -458,11 +458,11 @@ msgstr ""
msgid "Communicate with the Binatone Readme eBook reader." msgid "Communicate with the Binatone Readme eBook reader."
msgstr "Соединяться с Binatone Readme eBook." msgstr "Соединяться с Binatone Readme eBook."
#: /home/kovid/work/calibre/src/calibre/devices/blackberry/driver.py:12 #: /home/kovid/work/calibre/src/calibre/devices/blackberry/driver.py:13
msgid "Communicate with the Blackberry smart phone." msgid "Communicate with the Blackberry smart phone."
msgstr "Соединяться со смартфонами Blackberry." msgstr "Соединяться со смартфонами Blackberry."
#: /home/kovid/work/calibre/src/calibre/devices/blackberry/driver.py:13 #: /home/kovid/work/calibre/src/calibre/devices/blackberry/driver.py:14
#: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:18 #: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:18
#: /home/kovid/work/calibre/src/calibre/devices/prs500/driver.py:90 #: /home/kovid/work/calibre/src/calibre/devices/prs500/driver.py:90
msgid "Kovid Goyal" msgid "Kovid Goyal"
@ -657,7 +657,7 @@ msgstr "Не хватает свободного места на карте па
#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:132 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:132
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1068 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1068
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1072 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1072
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1447 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1452
msgid "News" msgid "News"
msgstr "Новости" msgstr "Новости"
@ -810,8 +810,8 @@ msgstr ""
msgid "Apply no processing to the image" msgid "Apply no processing to the image"
msgstr "Не обрабатывать изображения" msgstr "Не обрабатывать изображения"
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:438 #: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:441
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:449 #: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:452
msgid "Page" msgid "Page"
msgstr "Страница" msgstr "Страница"
@ -2648,6 +2648,7 @@ msgid "CSV/XML Options"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml.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/convert/comic_input.py:16 #: /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/epub_output.py:16
#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_input.py:13 #: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_input.py:13
@ -2665,6 +2666,7 @@ msgid "Options specific to"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml.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/convert/epub_output.py:16 #: /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/fb2_output.py:15
#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output.py:20 #: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output.py:20
@ -2676,7 +2678,8 @@ msgstr ""
msgid "output" msgid "output"
msgstr "вывод" msgstr "вывод"
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml_ui.py:34 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml_ui.py:36
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:51
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_tab_template_ui.py:27 #: /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:84 #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:84
#: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:49 #: /home/kovid/work/calibre/src/calibre/gui2/convert/debug_ui.py:49
@ -2707,10 +2710,37 @@ msgstr "вывод"
msgid "Form" msgid "Form"
msgstr "Форма" msgstr "Форма"
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml_ui.py:35 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml_ui.py:37
msgid "Fields to include in output:" msgid "Fields to include in output:"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:17
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:259
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1416
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1430
msgid "Catalog"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:52
msgid "Tags to exclude as genres (regex):"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:53
msgid "'Don't include this book' tag:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:54
msgid "'Mark this book as read' tag:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi_ui.py:55
msgid "Additional note tag prefix:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_tab_template_ui.py:28 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_tab_template_ui.py:28
msgid "Tab template for catalog.ui" msgid "Tab template for catalog.ui"
msgstr "" msgstr ""
@ -3343,7 +3373,7 @@ msgid "RB Output"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:77 #: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:77
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1633 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1637
msgid "Choose the format to view" msgid "Choose the format to view"
msgstr "Выберете для просмотра формат" msgstr "Выберете для просмотра формат"
@ -3636,7 +3666,7 @@ msgid ""
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:38 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:38
#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:130 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:132
msgid "No details available." msgid "No details available."
msgstr "" msgstr ""
@ -3881,7 +3911,7 @@ msgstr "&Предыдущий"
msgid "&Next" msgid "&Next"
msgstr "&Следующий" msgstr "&Следующий"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog.py:38 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog.py:37
msgid "My Books" msgid "My Books"
msgstr "" msgstr ""
@ -4017,7 +4047,7 @@ msgstr "новый email адрес"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:477 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:477
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:821 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:821
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:158 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:158
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1242 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1246
#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:53 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:53
msgid "Error" msgid "Error"
msgstr "Ошибка" msgstr "Ошибка"
@ -6113,7 +6143,7 @@ msgid "Save to disk in a single directory"
msgstr "Сохранить на диск в одну директорию" msgstr "Сохранить на диск в одну директорию"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:306 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:306
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1741 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1745
msgid "Save only %s format to disk" msgid "Save only %s format to disk"
msgstr "Сохранять на диск только формат %s" msgstr "Сохранять на диск только формат %s"
@ -6168,7 +6198,7 @@ msgid "Calibre Library"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:485 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:485
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1897 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1901
msgid "Choose a location for your ebook library." msgid "Choose a location for your ebook library."
msgstr "Выбрите расположение Вашей библиотеки электронных книг." msgstr "Выбрите расположение Вашей библиотеки электронных книг."
@ -6292,8 +6322,8 @@ msgid "Cannot delete"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1075 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1075
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1627 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1631
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1646 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1650
msgid "No book selected" msgid "No book selected"
msgstr "Нет выбранных книг" msgstr "Нет выбранных книг"
@ -6301,11 +6331,11 @@ msgstr "Нет выбранных книг"
msgid "Choose formats to be deleted" msgid "Choose formats to be deleted"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1101 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1103
msgid "Choose formats <b>not</b> to be deleted" msgid "Choose formats <b>not</b> to be deleted"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1137 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1141
msgid "" msgid ""
"The selected books will be <b>permanently deleted</b> and the files removed " "The selected books will be <b>permanently deleted</b> and the files removed "
"from your computer. Are you sure?" "from your computer. Are you sure?"
@ -6313,123 +6343,131 @@ msgstr ""
"Выбранные книги будут <b>навсегда удалены</b> вместе с файлами с Вашего " "Выбранные книги будут <b>навсегда удалены</b> вместе с файлами с Вашего "
"компьютера. Вы уверены?" "компьютера. Вы уверены?"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1164 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1168
msgid "Deleting books from device." msgid "Deleting books from device."
msgstr "Удаляются книги из устройства." msgstr "Удаляются книги из устройства."
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1195 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1199
msgid "Cannot download metadata" msgid "Cannot download metadata"
msgstr "Не удалось загрузить метаданные" msgstr "Не удалось загрузить метаданные"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1196 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1200
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1253 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1257
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1286 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1290
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1311 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1315
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1370 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1374
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1483 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1487
msgid "No books selected" msgid "No books selected"
msgstr "Нет Выбранных книг" msgstr "Нет Выбранных книг"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1211 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1215
msgid "social metadata" msgid "social metadata"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1213 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1217
msgid "covers" msgid "covers"
msgstr "обложек" msgstr "обложек"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1213 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1217
msgid "metadata" msgid "metadata"
msgstr "метаданных" msgstr "метаданных"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1215 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1219
msgid "Downloading %s for %d book(s)" msgid "Downloading %s for %d book(s)"
msgstr "Загрузка %s для %d книг(и)" msgstr "Загрузка %s для %d книг(и)"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1237 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1241
msgid "Failed to download some metadata" msgid "Failed to download some metadata"
msgstr "Не удалось загрузить некоторые метаданные" msgstr "Не удалось загрузить некоторые метаданные"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1238 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1242
msgid "Failed to download metadata for the following:" msgid "Failed to download metadata for the following:"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1241 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1245
msgid "Failed to download metadata:" msgid "Failed to download metadata:"
msgstr "Не удалось загрузить метаданные:" msgstr "Не удалось загрузить метаданные:"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1252 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1256
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1285 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1289
msgid "Cannot edit metadata" msgid "Cannot edit metadata"
msgstr "Невозможно редактировать метаданные" msgstr "Невозможно редактировать метаданные"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1310 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1314
msgid "Cannot save to disk" msgid "Cannot save to disk"
msgstr "Невозможно сохранить на диск" msgstr "Невозможно сохранить на диск"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1313 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1317
msgid "Choose destination directory" msgid "Choose destination directory"
msgstr "Выберете директорию получателя" msgstr "Выберете директорию получателя"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1340 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1344
msgid "Error while saving" msgid "Error while saving"
msgstr "Ошибка при сохранении" msgstr "Ошибка при сохранении"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1341 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1345
msgid "There was an error while saving." msgid "There was an error while saving."
msgstr "Произошла ошибка при сохранении." msgstr "Произошла ошибка при сохранении."
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1348 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1352
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1349 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1353
msgid "Could not save some books" msgid "Could not save some books"
msgstr "Не удалось сохранить некоторые книги" msgstr "Не удалось сохранить некоторые книги"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1350 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1354
msgid "Click the show details button to see which ones." msgid "Click the show details button to see which ones."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1371 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1375
msgid "No books selected to generate catalog for" msgid "No books selected to generate catalog for"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1388 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1392
msgid "Generating %s catalog..." msgid "Generating %s catalog..."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1399 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1403
msgid "Catalog generated." msgid "Catalog generated."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1417 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1406
msgid "Export Catalog Directory"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1407
msgid "Select destination for %s.%s"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1421
msgid "Fetching news from " msgid "Fetching news from "
msgstr "Вызвать новость из " msgstr "Вызвать новость из "
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1431 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1435
msgid " fetched." msgid " fetched."
msgstr " загружено." msgstr " загружено."
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1482 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1486
msgid "Cannot convert" msgid "Cannot convert"
msgstr "Не преобразуется" msgstr "Не преобразуется"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1511 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1515
msgid "Starting conversion of %d book(s)" msgid "Starting conversion of %d book(s)"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1627 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1631
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1683 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1687
msgid "Cannot view" msgid "Cannot view"
msgstr "Невозможно просмотреть" msgstr "Невозможно просмотреть"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1645 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1649
msgid "Cannot open folder" msgid "Cannot open folder"
msgstr "Не могу открыть папку" msgstr "Не могу открыть папку"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1667 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1671
msgid "Multiple Books Selected" msgid "Multiple Books Selected"
msgstr "Выбраны несколько книг" msgstr "Выбраны несколько книг"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1668 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1672
msgid "" msgid ""
"You are attempting to open %d books. Opening too many books at once can be " "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 " "slow and have a negative effect on the responsiveness of your computer. Once "
@ -6437,31 +6475,31 @@ msgid ""
"continue?" "continue?"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1684 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1688
msgid "%s has no available formats." msgid "%s has no available formats."
msgstr "%s неизвестный формат." msgstr "%s неизвестный формат."
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1725 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1729
msgid "Cannot configure" msgid "Cannot configure"
msgstr "Невозможно настроить" msgstr "Невозможно настроить"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1726 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1730
msgid "Cannot configure while there are running jobs." msgid "Cannot configure while there are running jobs."
msgstr "Пока запущено задание, не могу настроить" msgstr "Пока запущено задание, не могу настроить"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1769 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1773
msgid "No detailed info available" msgid "No detailed info available"
msgstr "Нет доступной подробной информации" msgstr "Нет доступной подробной информации"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1770 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1774
msgid "No detailed information is available for books on the device." msgid "No detailed information is available for books on the device."
msgstr "Не доступна подробная информация книг на устройстве" msgstr "Не доступна подробная информация книг на устройстве"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1825 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1829
msgid "Error talking to device" msgid "Error talking to device"
msgstr "Ошибка согласования устройства" msgstr "Ошибка согласования устройства"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1826 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1830
msgid "" msgid ""
"There was a temporary error talking to the device. Please unplug and " "There was a temporary error talking to the device. Please unplug and "
"reconnect the device and or reboot." "reconnect the device and or reboot."
@ -6469,34 +6507,34 @@ msgstr ""
"Была временная ошибка общения с устройством. Пожалуста, переподключите " "Была временная ошибка общения с устройством. Пожалуста, переподключите "
"устройство или перегрузите его." "устройство или перегрузите его."
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1849 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1853
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1877 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1881
msgid "Conversion Error" msgid "Conversion Error"
msgstr "Ошибка преобразования" msgstr "Ошибка преобразования"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1850 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1854
msgid "" msgid ""
"<p>Could not convert: %s<p>It is a <a href=\"%s\">DRM</a>ed book. You must " "<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." "first remove the DRM using third party tools."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1863 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1867
msgid "Recipe Disabled" msgid "Recipe Disabled"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1878 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1882
msgid "<b>Failed</b>" msgid "<b>Failed</b>"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1906 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1910
msgid "Invalid library location" msgid "Invalid library location"
msgstr "Неверное расположение библиотеки" msgstr "Неверное расположение библиотеки"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1907 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1911
msgid "Could not access %s. Using %s as the library." msgid "Could not access %s. Using %s as the library."
msgstr "Нет доступа к %s. Использование %s в качестве библиотеки." msgstr "Нет доступа к %s. Использование %s в качестве библиотеки."
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1957 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1961
msgid "" msgid ""
"is the result of the efforts of many volunteers from all over the world. If " "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." "you find it useful, please consider donating to support its development."
@ -6504,22 +6542,22 @@ msgstr ""
"является результато труда многих добровольцев по всему миру. Если Вы сочли " "является результато труда многих добровольцев по всему миру. Если Вы сочли "
"его полезным, будьте добры пожертвовать на его развитие." "его полезным, будьте добры пожертвовать на его развитие."
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1982 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1986
msgid "There are active jobs. Are you sure you want to quit?" msgid "There are active jobs. Are you sure you want to quit?"
msgstr "Имеется активное задание. Вы все равно хотите выйти?" msgstr "Имеется активное задание. Вы все равно хотите выйти?"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1985 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1989
msgid "" msgid ""
" is communicating with the device!<br>\n" " is communicating with the device!<br>\n"
" Quitting may cause corruption on the device.<br>\n" " Quitting may cause corruption on the device.<br>\n"
" Are you sure you want to quit?" " Are you sure you want to quit?"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1989 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1993
msgid "WARNING: Active jobs" msgid "WARNING: Active jobs"
msgstr "ПРЕДУПРЕЖДЕНИЕ: Активные задания" msgstr "ПРЕДУПРЕЖДЕНИЕ: Активные задания"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2041 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2045
msgid "" msgid ""
"will keep running in the system tray. To close it, choose <b>Quit</b> in the " "will keep running in the system tray. To close it, choose <b>Quit</b> in the "
"context menu of the system tray." "context menu of the system tray."
@ -6527,7 +6565,7 @@ msgstr ""
"продолжит работать в трее. Для завершения работы выберите<b>Quit</b> в " "продолжит работать в трее. Для завершения работы выберите<b>Quit</b> в "
"контекстном меню трея." "контекстном меню трея."
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2060 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2064
msgid "" msgid ""
"<span style=\"color:red; font-weight:bold\">Latest version: <a " "<span style=\"color:red; font-weight:bold\">Latest version: <a "
"href=\"%s\">%s</a></span>" "href=\"%s\">%s</a></span>"
@ -6535,11 +6573,11 @@ msgstr ""
"<span style=\"color:red; font-weight:bold\">Последняя версия: <a " "<span style=\"color:red; font-weight:bold\">Последняя версия: <a "
"href=\"%s\">%s</a></span>" "href=\"%s\">%s</a></span>"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2068 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2072
msgid "Update available" msgid "Update available"
msgstr "Доступно обновление" msgstr "Доступно обновление"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2069 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2073
msgid "" msgid ""
"%s has been updated to version %s. See the <a href=\"http://calibre-" "%s has been updated to version %s. See the <a href=\"http://calibre-"
"ebook.com/whats-new\">new features</a>. Visit the download page?" "ebook.com/whats-new\">new features</a>. Visit the download page?"
@ -6760,7 +6798,7 @@ msgstr "Размер Моноширного шрифта в px"
msgid "The standard font type" msgid "The standard font type"
msgstr "Стандартный шрифт" msgstr "Стандартный шрифт"
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:407 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:408
msgid "&Lookup in dictionary" msgid "&Lookup in dictionary"
msgstr "" msgstr ""
@ -7356,7 +7394,7 @@ msgid ""
"WordPlayer, etc. integration." "WordPlayer, etc. integration."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/catalog.py:28 #: /home/kovid/work/calibre/src/calibre/library/catalog.py:34
msgid "" msgid ""
"The fields to output when cataloging books in the database. Should be a " "The fields to output when cataloging books in the database. Should be a "
"comma-separated list of fields.\n" "comma-separated list of fields.\n"
@ -7365,7 +7403,7 @@ msgid ""
"Applies to: CSV, XML output formats" "Applies to: CSV, XML output formats"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/catalog.py:37 #: /home/kovid/work/calibre/src/calibre/library/catalog.py:43
msgid "" msgid ""
"Output field to sort on.\n" "Output field to sort on.\n"
"Available fields: author_sort, id, rating, size, timestamp, title.\n" "Available fields: author_sort, id, rating, size, timestamp, title.\n"
@ -7373,6 +7411,62 @@ msgid ""
"Applies to: CSV, XML output formats" "Applies to: CSV, XML output formats"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/catalog.py:241
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:247
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 "
"conversion process a bug is occurring.\n"
"Default: '%default'None\n"
"Applies to: ePub, MOBI output formats"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/catalog.py:256
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:261
msgid ""
"Comma-separated list of tag words indicating book should be excluded from "
"output. Case-insensitive.\n"
"--exclude-tags=skip will match 'skip this book' and 'Skip will like this'.\n"
"Default: '%default'\n"
"Applies to: ePub, MOBI output formats"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/catalog.py:268
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:273
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:279
msgid ""
"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"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/cli.py:121 #: /home/kovid/work/calibre/src/calibre/library/cli.py:121
msgid "" msgid ""
"Path to the calibre library. Default is to use the path stored in the " "Path to the calibre library. Default is to use the path stored in the "
@ -7704,32 +7798,27 @@ msgstr ""
"\n" "\n"
"Для справки: %%prog команда --help\n" "Для справки: %%prog команда --help\n"
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1416 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1696
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1429
msgid "Catalog"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1691
msgid "<p>Migrating old database to ebook library in %s<br><center>" msgid "<p>Migrating old database to ebook library in %s<br><center>"
msgstr "<p>Миграция старой базы данных в %s<br><center>" msgstr "<p>Миграция старой базы данных в %s<br><center>"
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1720 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1725
msgid "Copying <b>%s</b>" msgid "Copying <b>%s</b>"
msgstr "Копирование <b>%s</b>" msgstr "Копирование <b>%s</b>"
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1737 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1742
msgid "Compacting database" msgid "Compacting database"
msgstr "Сжатие базы данных" msgstr "Сжатие базы данных"
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1830 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1835
msgid "Checking SQL integrity..." msgid "Checking SQL integrity..."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1867 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1872
msgid "Checking for missing files." msgid "Checking for missing files."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/database2.py:1889 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1894
msgid "Checked id" msgid "Checked id"
msgstr "" msgstr ""
@ -7849,7 +7938,7 @@ msgstr ""
msgid "Replace whitespace with underscores." msgid "Replace whitespace with underscores."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:255 #: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:256
msgid "Requested formats not available" msgid "Requested formats not available"
msgstr "" msgstr ""
@ -7857,7 +7946,7 @@ msgstr ""
msgid "Password to access your calibre library. Username is " msgid "Password to access your calibre library. Username is "
msgstr "Пароль для доступа в библиотеку. Имя пользователя " msgstr "Пароль для доступа в библиотеку. Имя пользователя "
#: /home/kovid/work/calibre/src/calibre/library/server.py:856 #: /home/kovid/work/calibre/src/calibre/library/server.py:860
msgid "" msgid ""
"[options]\n" "[options]\n"
"\n" "\n"
@ -7867,7 +7956,7 @@ msgstr ""
"\n" "\n"
"Запуск calibre content server." "Запуск calibre content server."
#: /home/kovid/work/calibre/src/calibre/library/server.py:858 #: /home/kovid/work/calibre/src/calibre/library/server.py:862
msgid "Path to the library folder to serve with the content server" msgid "Path to the library folder to serve with the content server"
msgstr "" msgstr ""
@ -7941,7 +8030,7 @@ msgstr ""
msgid "Finished" msgid "Finished"
msgstr "Закончил" msgstr "Закончил"
#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:70 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:72
msgid "Working..." msgid "Working..."
msgstr "" msgstr ""

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -52,8 +52,10 @@ class BaseJob(object):
else: else:
self._status_text = _('Error') if self.failed else _('Finished') self._status_text = _('Error') if self.failed else _('Finished')
if DEBUG: if DEBUG:
prints('Job:', self.id, self.description, 'finished') prints('Job:', self.id, self.description, 'finished',
prints('\t'.join(self.details.splitlines(True))) safe_encode=True)
prints('\t'.join(self.details.splitlines(True)),
safe_encode=True)
if not self._done_called: if not self._done_called:
self._done_called = True self._done_called = True
try: try:

View File

@ -66,7 +66,7 @@ class RecipeInput(InputFormatPlugin):
if recipe.requires_version > numeric_version: if recipe.requires_version > numeric_version:
log.warn( log.warn(
'Downloaded recipe needs calibre version at least: %s' % \ 'Downloaded recipe needs calibre version at least: %s' % \
recipe.requires_version) ('.'.join(recipe.requires_version)))
builtin = True builtin = True
except: except:
log.exception('Failed to compile downloaded recipe. Falling ' log.exception('Failed to compile downloaded recipe. Falling '

View File

@ -111,7 +111,9 @@ class BasicNewsRecipe(Recipe):
#: Specify an override encoding for sites that have an incorrect #: Specify an override encoding for sites that have an incorrect
#: charset specification. The most common being specifying ``latin1`` and #: charset specification. The most common being specifying ``latin1`` and
#: using ``cp1252``. If None, try to detect the encoding. #: using ``cp1252``. If None, try to detect the encoding. If it is a
#: callable, the callable is called with two arguments: The recipe object
#: and the source to be decoded. It must return the decoded source.
encoding = None encoding = None
#: Normally we try to guess if a feed has full articles embedded in it #: Normally we try to guess if a feed has full articles embedded in it
@ -421,7 +423,10 @@ class BasicNewsRecipe(Recipe):
if raw: if raw:
return _raw return _raw
if not isinstance(_raw, unicode) and self.encoding: if not isinstance(_raw, unicode) and self.encoding:
_raw = _raw.decode(self.encoding, 'replace') if callable(self.encoding):
_raw = self.encoding(_raw)
else:
_raw = _raw.decode(self.encoding, 'replace')
massage = list(BeautifulSoup.MARKUP_MASSAGE) massage = list(BeautifulSoup.MARKUP_MASSAGE)
massage.append((re.compile(r'&(\S+?);'), lambda match: entity_to_unicode(match, encoding=self.encoding))) massage.append((re.compile(r'&(\S+?);'), lambda match: entity_to_unicode(match, encoding=self.encoding)))
return BeautifulSoup(_raw, markupMassage=massage) return BeautifulSoup(_raw, markupMassage=massage)

View File

@ -403,7 +403,9 @@ class RecursiveFetcher(object):
if len(dsrc) == 0 or \ if len(dsrc) == 0 or \
len(re.compile('<!--.*?-->', re.DOTALL).sub('', dsrc).strip()) == 0: len(re.compile('<!--.*?-->', re.DOTALL).sub('', dsrc).strip()) == 0:
raise ValueError('No content at URL %s'%iurl) raise ValueError('No content at URL %s'%iurl)
if self.encoding is not None: if callable(self.encoding):
dsrc = self.encoding(dsrc)
elif self.encoding is not None:
dsrc = dsrc.decode(self.encoding, 'replace') dsrc = dsrc.decode(self.encoding, 'replace')
else: else:
dsrc = xml_to_unicode(dsrc, self.verbose)[0] dsrc = xml_to_unicode(dsrc, self.verbose)[0]