Sync to trunk.

This commit is contained in:
John Schember 2010-04-03 09:00:55 -04:00
commit eb2b11e9dc
108 changed files with 34806 additions and 10699 deletions

View File

@ -4,6 +4,106 @@
# for important features/bug fixes.
# Also, each release can have new and improved recipes.
- version: 0.6.46
date: 2010-03-31
new features:
- title: "EPUB Output: Use SVG for covers, to ensure cover image is correctly resized to fit available screen space"
- title: "Support for the Motorola Cliq and Milestone"
- title: "Fetch My Clippings from the Kindle"
- title: "Comic Input: Add option to disable conversion to grayscale (black and white)"
- title: "MOBI Output: Mark single section news downloads as newspapers so that they are automatically archived by the Kindle"
- title: "MOBI Output: Add option to control setting of document type to Personal Document"
- title: "SONY driver: Tags within [] do not translate into a category when sending books to device"
- title: "ebook-device: Add a test_file command"
- title: "Location support for PDF when fetching annotations from a Kindle"
bug fixes:
- title: "CHM Input: Various fixes"
tickets: [5132, 5141]
- title: "Linux installer: Add mimetypes to .desktop files"
tickets: [5156]
- title: "Fix function naming in bash completion script"
tickets: [5146]
- title: "Fix the author of the metadata download plugins goes wrong after downloaded metadata for a book"
tickets: [5129]
- title: "Popup an error message if a news download is aborted because of no active internet connection"
- title: "Add test button to regex builder to improve performance"
- title: "Fix loading of custom device interface plugins"
- title: "Fix extra spaces in MOBI author field with multiple authors"
tickets: [2279, 4652, 5162]
- title: "Fix Kindle Topaz files with edited metadata won't index"
tickets: [5154]
- title: "PDB output: Fix problem with links continuing through story"
tickets: [5149]
- title: "Don't choke if the user provides an invalid remove header/footer regexp"
new recipes:
- title: MiDDay
author: calibre Periodicals
- title: Business Line
author: Dhiru
- title: New York Post
author: Darko Miletic
- title: Tulsa World
author: Darko Miletic
- title: Oil Price
author: Darko Miletic
- title: nrc.nl
author: Darko Miletic
- title: "Peter Schiff's Economic Commentary"
author: Darko Miletic
- title: IEEE Spectrum
author: Franco Venturi
- title: Washington Post
author: Kos Semonski
- title: The Sun
author: Chaz Ralph
- title: Fronda
author: Tomasz Dugosz
- title: Runa
author: Mori
- title: Times of India
author: Krittika Goyal
improved recipes:
- Various Serian and Polish newspapers
- New York Times Top Stories
- USA Today
- Daily Telegraph
- New York Times
- SFBG
- version: 0.6.45
date: 2010-03-11

Binary file not shown.

After

Width:  |  Height:  |  Size: 400 B

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 134 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 151 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 134 KiB

View File

@ -21,6 +21,7 @@ class Ser24Sata(BasicNewsRecipe):
encoding = 'utf-8'
use_embedded_content = False
language = 'sr'
publication_type = 'newspaper'
extra_css = '@font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)} body{font-family: serif1, serif} .article_description{font-family: serif1, serif}'
conversion_options = {

View File

@ -10,7 +10,7 @@ from calibre.web.feeds.news import BasicNewsRecipe
class B92(BasicNewsRecipe):
title = 'B92'
__author__ = 'Darko Miletic'
description = 'Dnevne vesti iz Srbije i sveta'
description = 'B92 info, najnovije vesti iz Srbije, regiona i sveta'
publisher = 'B92'
category = 'news, politics, Serbia'
oldest_article = 2
@ -19,6 +19,7 @@ class B92(BasicNewsRecipe):
use_embedded_content = False
encoding = 'cp1250'
language = 'sr'
publication_type = 'newsportal'
extra_css = ' @font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)} body{font-family: serif1, serif} .article_description{font-family: serif1, serif} '
conversion_options = {

View File

@ -18,6 +18,7 @@ class Danas(BasicNewsRecipe):
no_stylesheets = False
use_embedded_content = True
language = 'sr'
publication_type = 'newsportal'
extra_css = '@font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)} @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)} body{font-family: serif1, serif} .article_description{font-family: sans1, sans-serif} img{margin-bottom: 0.8em} '
conversion_options = {

View File

@ -20,7 +20,8 @@ class Blic(BasicNewsRecipe):
use_embedded_content = False
masthead_url = 'http://www.blic.rs/resources/images/header/header_back.png'
language = 'sr'
extra_css = '@font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)} @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)} body{font-family: Georgia, serif1, serif} .article_description{font-family: Arial, sans1, sans-serif} .img_full{float: none} img{margin-bottom: 0.8em} '
publication_type = 'newspaper'
extra_css = '@font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)} @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)} body{font-family: Georgia, serif1, serif} .article_description{font-family: Arial, sans1, sans-serif} .img_full{float: none} img{margin-bottom: 0.8em} '
conversion_options = {
'comment' : description
@ -41,4 +42,6 @@ class Blic(BasicNewsRecipe):
return url + '/print'
def preprocess_html(self, soup):
for item in soup.findAll(style=True):
del item['style']
return self.adeify_images(soup)

View File

@ -15,6 +15,7 @@ class Chetnixploitation(BasicNewsRecipe):
oldest_article = 7
max_articles_per_feed = 100
language = 'sr'
publication_type = 'blog'
encoding = 'utf-8'
no_stylesheets = True
use_embedded_content = True
@ -32,5 +33,3 @@ class Chetnixploitation(BasicNewsRecipe):
def preprocess_html(self, soup):
return self.adeify_images(soup)

View File

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
__license__ = 'GPL v3'
__copyright__ = '2008-2010, Darko Miletic <darko.miletic at gmail.com>'
'''
@ -20,7 +21,9 @@ class Danas(BasicNewsRecipe):
encoding = 'utf-8'
masthead_url = 'http://www.danas.rs/images/basic/danas.gif'
language = 'sr'
extra_css = '@font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)} @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)} .article_description,body,.lokacija{font-family: Tahoma,Arial,Helvetica,sans1,sans-serif} .nadNaslov,h1,.preamble{font-family: Georgia,"Times New Roman",Times,serif1,serif} .antrfileText{border-left: 2px solid #999999; margin-left: 0.8em; padding-left: 1.2em; margin-bottom: 0; margin-top: 0} h2,.datum,.lokacija,.autor{font-size: small} .antrfileNaslov{border-left: 2px solid #999999; margin-left: 0.8em; padding-left: 1.2em; font-weight:bold; margin-bottom: 0; margin-top: 0} img{margin-bottom: 0.8em} '
publication_type = 'newspaper'
remove_empty_feeds = True
extra_css = '@font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)} @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)} .article_description,body,.lokacija{font-family: Tahoma,Arial,Helvetica,sans1,sans-serif} .nadNaslov,h1,.preamble{font-family: Georgia,"Times New Roman",Times,serif1,serif} .antrfileText{border-left: 2px solid #999999; margin-left: 0.8em; padding-left: 1.2em; margin-bottom: 0; margin-top: 0} h2,.datum,.lokacija,.autor{font-size: small} .antrfileNaslov{border-left: 2px solid #999999; margin-left: 0.8em; padding-left: 1.2em; font-weight:bold; margin-bottom: 0; margin-top: 0} img{margin-bottom: 0.8em} '
conversion_options = {
'comment' : description
@ -38,10 +41,10 @@ class Danas(BasicNewsRecipe):
,dict(name=['object','link','iframe'])
]
feeds = [
feeds = [
(u'Politika' , u'http://www.danas.rs/rss/rss.asp?column_id=27')
,(u'Hronika' , u'http://www.danas.rs/rss/rss.asp?column_id=2' )
,(u'Drustvo' , u'http://www.danas.rs/rss/rss.asp?column_id=24')
,(u'Dru\xc5\xa1tvo', u'http://www.danas.rs/rss/rss.asp?column_id=24')
,(u'Dijalog' , u'http://www.danas.rs/rss/rss.asp?column_id=1' )
,(u'Ekonomija', u'http://www.danas.rs/rss/rss.asp?column_id=6' )
,(u'Svet' , u'http://www.danas.rs/rss/rss.asp?column_id=25')
@ -51,13 +54,14 @@ class Danas(BasicNewsRecipe):
,(u'Scena' , u'http://www.danas.rs/rss/rss.asp?column_id=42')
,(u'Feljton' , u'http://www.danas.rs/rss/rss.asp?column_id=19')
,(u'Periskop' , u'http://www.danas.rs/rss/rss.asp?column_id=4' )
,(u'Famozno' , u'http://www.danas.rs/rss/rss.asp?column_id=47')
]
def preprocess_html(self, soup):
for item in soup.findAll(style=True):
del item['style']
return soup
return self.adeify_images(soup)
def print_version(self, url):
return url + '&action=print'

View File

@ -25,7 +25,12 @@ class DNAIndia(BasicNewsRecipe):
('After Hours', 'http://www.dnaindia.com/syndication/rss,catid-7.xml'),
('Digital Life', 'http://www.dnaindia.com/syndication/rss,catid-1089741.xml'),
]
remove_tags = [{'id':'footer'}, {'class':['bottom', 'categoryHead']}]
remove_tags = [{'id':['footer', 'lhs-col']}, {'class':['bottom', 'categoryHead',
'article_tools']}]
keep_only_tags = dict(id='middle-col')
remove_tags_after=[dict(attrs={'id':'story'})]
remove_attributes=['style']
no_stylesheets = True
def print_version(self, url):
match = re.search(r'newsid=(\d+)', url)

View File

@ -20,6 +20,7 @@ class E_novine(BasicNewsRecipe):
encoding = 'utf-8'
use_embedded_content = False
language = 'sr'
publication_type = 'newsportal'
masthead_url = 'http://www.e-novine.com/themes/e_novine/img/logo.gif'
extra_css = ' @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)} .article_description,body{font-family: Arial,Helvetica,sans1,sans-serif} img{float: none; margin-bottom: 0.8em} '

View File

@ -22,6 +22,7 @@ class GlasSrpske(BasicNewsRecipe):
use_embedded_content = False
masthead_url = 'http://www.glassrpske.com/var/slike/glassrpske-logo.png'
language = 'sr'
publication_type = 'newspaper'
INDEX = 'http://www.glassrpske.com'
extra_css = '@font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)} body{font-family: serif1, serif} .article_description{font-family: serif1, serif} img{margin-bottom: 0.8em} '

View File

@ -18,6 +18,7 @@ class GlasJavnosti(BasicNewsRecipe):
no_stylesheets = False
use_embedded_content = False
language = 'sr'
publication_type = 'newspaper'
extra_css = '@font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)} @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)} body{font-family: serif1, serif} .article_description{font-family: sans1, sans-serif} img{margin-bottom: 0.8em} '
conversion_options = {

View File

@ -1,7 +1,5 @@
#!/usr/bin/env python
__license__ = 'GPL v3'
__copyright__ = '2008-2009, Darko Miletic <darko.miletic at gmail.com>'
__copyright__ = '2008-2010, Darko Miletic <darko.miletic at gmail.com>'
'''
harpers.org - paid subscription/ printed issue articles
This recipe only get's article's published in text format
@ -10,39 +8,40 @@ images and pdf's are ignored
from calibre import strftime
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag
class Harpers_full(BasicNewsRecipe):
title = u"Harper's Magazine - articles from printed edition"
__author__ = u'Darko Miletic'
description = u"Harper's Magazine: Founded June 1850."
title = "Harper's Magazine - articles from printed edition"
__author__ = 'Darko Miletic'
description = "Harper's Magazine: Founded June 1850."
publisher = "Harpers's"
category = 'news, politics, USA'
oldest_article = 30
max_articles_per_feed = 100
no_stylesheets = True
use_embedded_content = False
delay = 1
language = 'en'
delay = 1
language = 'en'
needs_subscription = True
masthead_url = 'http://www.harpers.org/media/image/Harpers_305x100.gif'
publication_type = 'magazine'
INDEX = strftime('http://www.harpers.org/archive/%Y/%m')
LOGIN = 'http://www.harpers.org'
cover_url = strftime('http://www.harpers.org/media/pages/%Y/%m/gif/0001.gif')
extra_css = ' body{font-family: "Georgia",serif} '
needs_subscription = True
INDEX = strftime('http://www.harpers.org/archive/%Y/%m')
LOGIN = 'http://www.harpers.org'
cover_url = strftime('http://www.harpers.org/media/pages/%Y/%m/gif/0001.gif')
html2lrf_options = [
'--comment', description
, '--category', category
, '--publisher', publisher
]
html2epub_options = 'publisher="' + publisher + '"\ncomments="' + description + '"\ntags="' + category + '"\noverride_css=" p {text-indent: 0em; margin-top: 0em; margin-bottom: 0.5em} img {margin-top: 0em; margin-bottom: 0.4em}"'
conversion_options = {
'comment' : description
, 'tags' : category
, 'publisher' : publisher
, 'language' : language
}
keep_only_tags = [ dict(name='div', attrs={'id':'cached'}) ]
remove_tags = [
dict(name='table', attrs={'class':['rcnt','rcnt topline']})
,dict(name='link')
]
remove_attributes=['xmlns']
def get_browser(self):
br = BasicNewsRecipe.get_browser()
@ -71,12 +70,3 @@ class Harpers_full(BasicNewsRecipe):
,'description':''
})
return [(soup.head.title.string, articles)]
def preprocess_html(self, soup):
mcharset = Tag(soup,'meta',[("http-equiv","Content-Type"),("content","text/html; charset=utf-8")])
soup.head.insert(1,mcharset)
for item in soup.findAll(style=True):
del item['style']
for item in soup.findAll(xmlns=True):
del item['xmlns']
return soup

View File

@ -9,15 +9,16 @@ from calibre.web.feeds.news import BasicNewsRecipe
class heiseDe(BasicNewsRecipe):
title = 'heise'
description = 'Computernews from Germany'
__author__ = 'Oliver Niesner'
use_embedded_content = False
language = 'de'
timefmt = ' [%d %b %Y]'
max_articles_per_feed = 40
no_stylesheets = True
remove_tags = [dict(id='navi_top'),
dict(id='navi_bottom'),
dict(id='logo'),
@ -35,8 +36,8 @@ class heiseDe(BasicNewsRecipe):
dict(name='p', attrs={'class':'news_navi'}),
dict(name='div', attrs={'class':'news_foren'})]
remove_tags_after = [dict(name='div', attrs={'class':'news_foren'})]
feeds = [ ('heise', 'http://www.heise.de/newsticker/heise.rdf') ]
feeds = [ ('heise', 'http://www.heise.de/newsticker/heise.rdf') ]

View File

@ -0,0 +1,53 @@
from __future__ import with_statement
__license__ = 'GPL 3'
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
import re
from calibre.web.feeds.news import BasicNewsRecipe
class TheHindu(BasicNewsRecipe):
title = u'The Business Line'
language = 'en_IN'
oldest_article = 7
__author__ = 'Dhiru'
max_articles_per_feed = 100
no_stylesheets = True
remove_tags_before = {'name':'font', 'class':'storyhead'}
preprocess_regexps = [
(re.compile(r'<!-- story ends -->.*', re.DOTALL),
lambda match: '</body></html>'),
]
extra_css = '''
.storyhead{font-family:Arial,Helvetica,sans-serif; font-size:large; color:#000099;}
body{font-family:Verdana,Arial,Helvetica,sans-serif; font-size:x-small; text-align:left;}
'''
feeds = [
(u'Main - Latest News', u'http://www.thehindubusinessline.com/rss/blnus.xml'),
(u'Main - Front Page', u'http://www.thehindubusinessline.com/rss/14hdline.xml'),
(u'Main - Corporate', u'http://www.thehindubusinessline.com/rss/02hdline.xml'),
(u'Main - Market', u'http://www.thehindubusinessline.com/rss/05hdline.xml'),
(u'Main - Opinion', u'http://www.thehindubusinessline.com/rss/04hdline.xml'),
(u'Main - Infotech', u'http://www.thehindubusinessline.com/rss/15hdline.xml'),
(u'Main - Marketing', u'http://www.thehindubusinessline.com/rss/19hdline.xml'),
(u'Main - Money & banking',
u'http://www.thehindubusinessline.com/rss/06hdline.xml'),
(u'Main - Agri & Commodities', u'http://www.thehindubusinessline.com/rss/07hdline.xml'),
(u'Industry',
u'http://www.thehindubusinessline.com/rss/03hdline.xml'),
(u'Logistic',
u'http://www.thehindubusinessline.com/rss/09hdline.xml'),
(u'Result', u'http://www.thehindubusinessline.com/rss/26hdline.xml'),
(u'Government',
u'http://www.thehindubusinessline.com/rss/27hdline.xml'),
(u'Investment World',
u'http://www.thehindubusinessline.com/rss/iw20hdline.xml'),
(u'Supplement - Life',
u'http://www.thehindubusinessline.com/rss/lf10hdline.xml')
]
def postprocess_html(self, soup, first_fetch):
for t in soup.findAll(['table', 'tr', 'td','center']):
t.name = 'div'
return soup

View File

@ -4,7 +4,7 @@ import re
class SmeRecipe(BasicNewsRecipe):
__license__ = 'GPL v3'
__author__ = 'Abelturd'
language = 'cz'
language = 'cs'
version = 1
title = u'iLiteratura.cz'

View File

@ -10,7 +10,7 @@ class IrishIndependent(BasicNewsRecipe):
title = u'Irish Independent'
description = 'Irish and World news from Irelands Bestselling Daily Broadsheet'
__author__ = 'Neil Grogan'
language = 'en_GB'
language = 'en_IE'
oldest_article = 7
max_articles_per_feed = 100
remove_tags_before = dict(id='article')

View File

@ -10,7 +10,7 @@ from calibre.web.feeds.news import BasicNewsRecipe
class IrishTimes(BasicNewsRecipe):
title = u'The Irish Times'
__author__ = "Derry FitzGerald, Ray Kinsella and David O'Callaghan"
language = 'en'
language = 'en_IE'
timefmt = ' (%A, %B %d, %Y)'

View File

@ -9,6 +9,7 @@ class JournalofHospitalMedicine(BasicNewsRecipe):
description = 'Medical news'
timefmt = ' [%d %b, %Y]'
needs_subscription = True
language = 'en'
no_stylesheets = True
#remove_tags_before = dict(name='div', attrs={'align':'center'})

View File

@ -1,7 +1,5 @@
#!/usr/bin/env python
__license__ = 'GPL v3'
__copyright__ = '2008-2009, Darko Miletic <darko.miletic at gmail.com>'
__copyright__ = '2008-2010, Darko Miletic <darko.miletic at gmail.com>'
'''
mondediplo.com
'''
@ -21,11 +19,14 @@ class LeMondeDiplomatiqueEn(BasicNewsRecipe):
delay = 1
encoding = 'utf-8'
needs_subscription = True
masthead_url = 'http://mondediplo.com/squelettes/pics/logo-30.gif'
publication_type = 'magazine'
PREFIX = 'http://mondediplo.com/'
LOGIN = PREFIX + '2009/09/02congo'
INDEX = PREFIX + strftime('%Y/%m/')
use_embedded_content = False
language = 'en'
extra_css = ' body{font-family: "Luxi sans","Lucida sans","Lucida Grande",Lucida,"Lucida Sans Unicode",sans-serif} .surtitre{font-size: 1.2em; font-variant: small-caps; margin-bottom: 0.5em} .chapo{font-size: 1.2em; font-weight: bold; margin: 1em 0 0.5em} .texte{font-family: Georgia,"Times New Roman",serif} h1{color: #990000} .notes{border-top: 1px solid #CCCCCC; font-size: 0.9em; line-height: 1.4em} '
conversion_options = {
'comment' : description
@ -45,7 +46,10 @@ class LeMondeDiplomatiqueEn(BasicNewsRecipe):
br.open(self.LOGIN,data)
return br
keep_only_tags =[dict(name='div', attrs={'id':'contenu'})]
keep_only_tags =[
dict(name='div', attrs={'id':'contenu'})
, dict(name='div',attrs={'class':'notes surlignable'})
]
remove_tags = [dict(name=['object','link','script','iframe','base'])]
def parse_index(self):

View File

@ -0,0 +1,13 @@
from calibre.web.feeds.news import CalibrePeriodical
class MiDDay(CalibrePeriodical):
title = 'MiDDay'
calibre_periodicals_slug = 'midday'
description = '''Get your dose of the latest news, views and fun - from the
world of politics, sports and Bollywood to the cartoons, comics and games of
the entertainment section - Indias leading tabloid has it all. To subscribe
visit <a href="http://news.calibre-ebook.com/periodical/midday">calibre
Periodicals</a>.'''
language = 'en_IN'

View File

@ -25,7 +25,8 @@ class Nin(BasicNewsRecipe):
LOGIN = PREFIX + '/?logout=true'
use_embedded_content = False
language = 'sr'
extra_css = ' @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)} body{font-family: Verdana, Lucida, sans1, sans-serif} .article_description{font-family: Verdana, Lucida, sans1, sans-serif} .artTitle{font-size: x-large; font-weight: bold; color: #900} .izjava{font-size: x-large; font-weight: bold} .columnhead{font-size: small; font-weight: bold;} img{margin-top:0.5em; margin-bottom: 0.7em} b{margin-top: 1em} '
publication_type = 'magazine'
extra_css = ' @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)} body{font-family: Verdana, Lucida, sans1, sans-serif} .article_description{font-family: Verdana, Lucida, sans1, sans-serif} .artTitle{font-size: x-large; font-weight: bold; color: #900} .izjava{font-size: x-large; font-weight: bold} .columnhead{font-size: small; font-weight: bold;} img{margin-top:0.5em; margin-bottom: 0.7em} b{margin-top: 1em} '
conversion_options = {
'comment' : description

View File

@ -1,14 +1,12 @@
#!/usr/bin/env python
__license__ = 'GPL v3'
__copyright__ = '2008-2009, Darko Miletic <darko.miletic at gmail.com>'
__copyright__ = '2008-2010, Darko Miletic <darko.miletic at gmail.com>'
'''
novosti.rs
'''
import re
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag
class Novosti(BasicNewsRecipe):
title = 'Vecernje Novosti'
@ -21,17 +19,16 @@ class Novosti(BasicNewsRecipe):
no_stylesheets = True
use_embedded_content = False
encoding = 'utf-8'
language = 'sr'
lang = 'sr-Latn-RS'
extra_css = '@font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)} @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)} body{font-family: serif1, serif} .article_description{font-family: sans1, sans-serif}'
language = 'sr'
publication_type = 'newspaper'
extra_css = '@font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)} @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)} .article_description,body{font-family: Tahoma,Arial,Helvetica,sans1,sans-serif} '
conversion_options = {
'comment' : description
, 'tags' : category
, 'publisher' : publisher
, 'language' : lang
, 'pretty_print' : True
, 'language' : language
, 'linearize_tables' : True
}
preprocess_regexps = [(re.compile(u'\u0110'), lambda match: u'\u00D0')]
@ -42,17 +39,6 @@ class Novosti(BasicNewsRecipe):
feeds = [(u'Vesti', u'http://www.novosti.rs/php/vesti/rss.php')]
def preprocess_html(self, soup):
mlang = Tag(soup,'meta',[("http-equiv","Content-Language"),("content",self.lang)])
soup.head.insert(0,mlang)
attribs = [ 'style','font','valign'
,'colspan','width','height'
,'rowspan','summary','align'
,'cellspacing','cellpadding'
,'frames','rules','border'
]
for item in soup.body.findAll(name=['table','td','tr','th','caption','thead','tfoot','tbody','colgroup','col']):
item.name = 'div'
for attrib in attribs:
if item.has_key(attrib):
del item[attrib]
return soup
for item in soup.findAll(style=True):
del item['style']
return self.adeify_images(soup)

View File

@ -20,6 +20,7 @@ class Nspm(BasicNewsRecipe):
INDEX = 'http://www.nspm.rs/?alphabet=l'
encoding = 'utf-8'
language = 'sr'
publication_type = 'magazine'
masthead_url = 'http://www.nspm.rs/templates/jsn_epic_pro/images/logol.jpg'
extra_css = '@font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)} @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)} body{text-align: justify; font-family: serif1, serif} .article_description{font-family: sans1, sans-serif}'

View File

@ -18,7 +18,7 @@ class NursingTimes(BasicNewsRecipe):
encoding = 'utf-8'
publisher = 'emap'
category = 'news, health, nursing, UK'
language = 'en-UK'
language = 'en_GB'
needs_subscription = True
LOGIN = 'http://www.nursingtimes.net/sign-in'

View File

@ -0,0 +1,36 @@
__license__ = 'GPL v3'
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
'''
nypost.com
'''
from calibre.web.feeds.news import BasicNewsRecipe
class NYPost(BasicNewsRecipe):
title = 'New York Post'
__author__ = 'Darko Miletic'
description = 'Daily newspaper'
publisher = 'NYP Holdings, Inc.'
category = 'news, politics, USA'
oldest_article = 2
max_articles_per_feed = 200
no_stylesheets = True
encoding = 'utf8'
use_embedded_content = False
language = 'en'
masthead_url = 'http://www.nypost.com/rw/SysConfig/WebPortal/nypost/images/nyp_logo_230x32.gif'
extra_css = ' body{font-family: Arial,Helvetica,sans-serif } img{margin-bottom: 0.4em} '
conversion_options = {
'comment' : description
, 'tags' : category
, 'publisher' : publisher
, 'language' : language
}
keep_only_tags=[dict(name='div', attrs={'id':'story'})]
feeds = [(u'Articles', u'http://www.nypost.com/rss/all_section.xml')]
def print_version(self, url):
return url.replace('nypost.com/p/','nypost.com/f/print/')

View File

@ -5,16 +5,18 @@ __copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'
'''
nytimes.com
'''
import re, time
import re
import time
from calibre import entity_to_unicode
from calibre.web.feeds.recipes import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import BeautifulSoup, Tag, NavigableString, Comment
from calibre.ebooks.BeautifulSoup import BeautifulSoup, Tag, NavigableString, \
Comment, BeautifulStoneSoup
class NYTimes(BasicNewsRecipe):
title = 'New York Times Top Stories'
__author__ = 'GRiker'
language = 'en'
language = _('English')
description = 'Top Stories from the New York Times'
# List of sections typically included in Top Stories. Use a keyword from the
@ -39,9 +41,6 @@ class NYTimes(BasicNewsRecipe):
'world' : 'World'
}
# By default, no sections are skipped.
excludeSectionKeywords = []
# Add section keywords from the right column above to skip that section
# For example, to skip sections containing the word 'Sports' or 'Dining', use:
# excludeSectionKeywords = ['Sports', 'Dining']
@ -49,36 +48,138 @@ class NYTimes(BasicNewsRecipe):
# excludeSectionKeywords = ['Arts','Dining','Editorials','Health','Magazine','Media','Region','Op-Ed','Politics','Science','Sports','Top Stories','Travel','U.S.','World']
# Fetch only Top Stories
# excludeSectionKeywords = ['Arts','Business','Dining','Editorials','Health','Magazine','Media','Region','Op-Ed','Politics','Science','Sports','Technology','Travel','U.S.','World']
# By default, no sections are skipped.
excludeSectionKeywords = []
# one_picture_per_article specifies that calibre should only use the first image
# from an article (if one exists). If one_picture_per_article = True, the image
# will be moved to a location between the headline and the byline.
# If one_picture_per_article = False, all images from the article will be included
# and shown in their original location.
one_picture_per_article = True
# The maximum number of articles that will be downloaded
max_articles_per_feed = 40
timefmt = ''
needs_subscription = True
keep_only_tags = [ dict(attrs={ 'id':['article']}),
dict(attrs={'class':['blog wrap']}) ]
masthead_url = 'http://graphics8.nytimes.com/images/misc/nytlogo379x64.gif'
remove_tags = [ dict(attrs={'class':['nextArticleLink clearfix', 'clearfix',
'inlineVideo left brightcove', 'entry-meta']}),
dict(attrs={ 'id':['toolsRight','inlineBox','sidebarArticles',
'portfolioInline','articleInline','readerscomment',
'nytRating']}) ]
remove_tags_before = dict(id='article')
remove_tags_after = dict(id='article')
remove_tags = [dict(attrs={'class':[
'articleFooter',
'articleTools',
'columnGroup doubleRule',
'columnGroup singleRule',
'columnGroup last',
'columnGroup last',
'doubleRule',
'dottedLine',
'entry-meta',
'icon enlargeThis',
'leftNavTabs',
'module box nav',
'nextArticleLink',
'nextArticleLink clearfix',
'post-tools',
'relatedSearchesModule',
'side_tool',
'singleAd',
'subNavigation tabContent active clearfix',
]}),
dict(id=[
'adxLeaderboard',
'archive',
'articleExtras',
'articleInline',
'blog_sidebar',
'cCol',
'entertainmentSearchBar',
'footer',
'header',
'header_search',
'login',
'masthead',
'memberTools',
'navigation',
'portfolioInline',
'relatedArticles',
'side_search',
'side_index',
'side_tool',
'toolsRight',
]),
dict(name=['script', 'noscript', 'style'])]
encoding = 'cp1252'
no_stylesheets = True
extra_css = '.headline {text-align: left;}\n \
.byline {font-family: monospace; \
text-align: left; \
margin-top: 0px; \
margin-bottom: 0px;}\n \
.dateline {font-size: small; \
margin-top: 0px; \
margin-bottom: 0px;}\n \
.timestamp {font-size: small; \
margin-top: 0px; \
margin-bottom: 0px;}\n \
.timestamp {font-size: smaller;}\n \
.source {text-align: left;}\n \
.image {text-align: center;}\n \
.credit {text-align: right; \
font-size: smaller;}\n \
font-size: small; \
margin-top: 0px; \
margin-bottom: 0px;}\n \
.articleBody {text-align: left;}\n \
.authorId {text-align: left; \
font-style: italic;}\n '
def dump_ans(self, ans) :
total_article_count = 0
for section in ans :
if self.verbose:
self.log("section %s: %d articles" % (section[0], len(section[1])) )
for article in section[1]:
total_article_count += 1
if self.verbose:
self.log("\t%-40.40s... \t%-60.60s..." % (article['title'].encode('cp1252','replace'),
article['url'].encode('cp1252','replace')))
self.log( "Queued %d articles" % total_article_count )
def fixChars(self,string):
# Replace lsquo (\x91)
fixed = re.sub("\x91","&#8216;",string)
# Replace rsquo (\x92)
fixed = re.sub("\x92","&#8217;",fixed)
# Replace ldquo (\x93)
fixed = re.sub("\x93","&#8220;",fixed)
# Replace rdquo (\x94)
fixed = re.sub("\x94","&#8221;",fixed)
# Replace ndash (\x96)
fixed = re.sub("\x96","&#8211;",fixed)
# Replace mdash (\x97)
fixed = re.sub("\x97","&#8212;",fixed)
return fixed
def get_browser(self):
br = BasicNewsRecipe.get_browser()
if self.username is not None and self.password is not None:
try:
br.open('http://www.nytimes.com/auth/login')
br.select_form(name='login')
br['USERID'] = self.username
br['PASSWORD'] = self.password
br.submit()
except:
self.log("\nFailed to login")
return br
def get_cover_url(self):
cover = None
st = time.localtime()
@ -94,26 +195,6 @@ class NYTimes(BasicNewsRecipe):
cover = None
return cover
def get_masthead_url(self):
masthead = 'http://graphics8.nytimes.com/images/misc/nytlogo379x64.gif'
br = BasicNewsRecipe.get_browser()
try:
br.open(masthead)
except:
self.log("\nCover unavailable")
masthead = None
return masthead
def get_browser(self):
br = BasicNewsRecipe.get_browser()
if self.username is not None and self.password is not None:
br.open('http://www.nytimes.com/auth/login')
br.select_form(name='login')
br['USERID'] = self.username
br['PASSWORD'] = self.password
br.submit()
return br
def index_to_soup(self, url_or_raw, raw=False):
'''
OVERRIDE of class method
@ -138,6 +219,7 @@ class NYTimes(BasicNewsRecipe):
return BeautifulSoup(_raw, markupMassage=massage)
# Entry point
print "index_to_soup()"
soup = get_the_soup( self.encoding, url_or_raw )
contentType = soup.find(True,attrs={'http-equiv':'Content-Type'})
docEncoding = str(contentType)[str(contentType).find('charset=') + len('charset='):str(contentType).rfind('"')]
@ -151,6 +233,16 @@ class NYTimes(BasicNewsRecipe):
return soup
def massageNCXText(self, description):
# Kindle TOC descriptions won't render certain characters
if description:
massaged = unicode(BeautifulStoneSoup(description, convertEntities=BeautifulStoneSoup.HTML_ENTITIES))
# Replace '&' with '&#38;'
massaged = re.sub("&","&#38;", massaged)
return self.fixChars(massaged)
else:
return description
def parse_index(self):
articles = {}
ans = []
@ -158,6 +250,7 @@ class NYTimes(BasicNewsRecipe):
feed = key = 'All Top Stories'
articles[key] = []
ans.append(key)
self.log("Scanning 1 section ...")
soup = self.index_to_soup('http://www.nytimes.com/pages/todaysheadlines/')
@ -191,8 +284,9 @@ class NYTimes(BasicNewsRecipe):
continue
skipThisSection = False
todays_article_count = 0
# Within this table are <font face="times new roman, times, san serif"> entries
self.log("Fetching feed Top Stories")
for tr in storyblock.findAllNext('tr'):
if tr.find('span') is not None :
@ -244,6 +338,7 @@ class NYTimes(BasicNewsRecipe):
# Fetch the article titles and URLs
articleCount = len(sectionblock.findAll('span'))
todays_article_count += articleCount
for (i,span) in enumerate(sectionblock.findAll(attrs={'class':'headlineWrapper'})) :
a = span.find('a', href=True)
url = re.sub(r'\?.*', '', a['href'])
@ -277,6 +372,7 @@ class NYTimes(BasicNewsRecipe):
if duplicateFound:
# Continue fetching, don't add this article
todays_article_count -= 1
continue
if not articles.has_key(feed):
@ -284,11 +380,138 @@ class NYTimes(BasicNewsRecipe):
articles[feed].append(
dict(title=title, url=url, date=pubdate,
description=description, author=author, content=''))
# self.log("Queuing %d articles from %s" % (todays_article_count, "Top Stories"))
ans = self.sort_index_by(ans, {'Top Stories':-1})
ans = [(key, articles[key]) for key in ans if articles.has_key(key)]
self.dump_ans(ans)
return ans
def preprocess_html(self, soup):
return self.strip_anchors(soup)
def postprocess_html(self,soup, True):
if self.one_picture_per_article:
# Remove all images after first
largeImg = soup.find(True, {'class':'articleSpanImage'})
inlineImgs = soup.findAll(True, {'class':'inlineImage module'})
if largeImg:
for inlineImg in inlineImgs:
inlineImg.extract()
else:
if inlineImgs:
firstImg = inlineImgs[0]
for inlineImg in inlineImgs[1:]:
inlineImg.extract()
# Move firstImg after headline
cgFirst = soup.find(True, {'class':'columnGroup first'})
if cgFirst:
# Strip all sibling NavigableStrings: noise
navstrings = cgFirst.findAll(text=True, recursive=False)
[ns.extract() for ns in navstrings]
headline_found = False
tag = cgFirst.find(True)
insertLoc = 0
while True:
insertLoc += 1
if hasattr(tag,'class') and tag['class'] == 'articleHeadline':
headline_found = True
break
tag = tag.nextSibling
if not tag:
headline_found = False
break
if headline_found:
cgFirst.insert(insertLoc,firstImg)
else:
self.log(">>> No class:'columnGroup first' found <<<")
# Change class="kicker" to <h3>
kicker = soup.find(True, {'class':'kicker'})
if kicker and kicker.contents[0]:
h3Tag = Tag(soup, "h3")
h3Tag.insert(0, self.fixChars(self.tag_to_string(kicker,
use_alt=False)))
kicker.replaceWith(h3Tag)
# Change captions to italic -1
for caption in soup.findAll(True, {'class':'caption'}) :
if caption and caption.contents[0]:
emTag = Tag(soup, "em")
c = self.fixChars(self.tag_to_string(caption,use_alt=False)).strip()
mp_off = c.find("More Photos")
if mp_off >= 0:
c = c[:mp_off]
emTag.insert(0, c)
hrTag = Tag(soup, 'hr')
#hrTag['style'] = "margin-top:0em;margin-bottom:0em"
emTag.insert(1, hrTag)
caption.replaceWith(emTag)
# Change <nyt_headline> to <h2>
h1 = soup.find('h1')
if h1:
headline = h1.find("nyt_headline")
if headline:
tag = Tag(soup, "h2")
tag['class'] = "headline"
tag.insert(0, self.fixChars(headline.contents[0]))
h1.replaceWith(tag)
else:
# Blog entry - replace headline, remove <hr> tags
headline = soup.find('title')
if headline:
tag = Tag(soup, "h2")
tag['class'] = "headline"
tag.insert(0, self.fixChars(headline.contents[0]))
soup.insert(0, tag)
hrs = soup.findAll('hr')
for hr in hrs:
hr.extract()
# Change <h1> to <h3> - used in editorial blogs
masthead = soup.find("h1")
if masthead:
# Nuke the href
if masthead.a:
del(masthead.a['href'])
tag = Tag(soup, "h3")
tag.insert(0, self.fixChars(masthead.contents[0]))
masthead.replaceWith(tag)
# Change <span class="bold"> to <b>
for subhead in soup.findAll(True, {'class':'bold'}) :
if subhead.contents:
bTag = Tag(soup, "b")
bTag.insert(0, subhead.contents[0])
subhead.replaceWith(bTag)
# Synthesize a section header
dsk = soup.find('meta', attrs={'name':'dsk'})
if dsk and dsk.has_key('content'):
hTag = Tag(soup,'h3')
hTag['class'] = 'section'
hTag.insert(0,NavigableString(dsk['content']))
articleTag = soup.find(True, attrs={'id':'article'})
if articleTag:
articleTag.insert(0,hTag)
# Add class="articleBody" to <div> so we can format with CSS
divTag = soup.find('div',attrs={'id':'articleBody'})
if divTag:
divTag['class'] = divTag['id']
# Add class="authorId" to <div> so we can format with CSS
divTag = soup.find('div',attrs={'id':'authorId'})
if divTag and divTag.contents[0]:
tag = Tag(soup, "p")
tag['class'] = "authorId"
tag.insert(0, self.fixChars(self.tag_to_string(divTag.contents[0],
use_alt=False)))
divTag.replaceWith(tag)
return soup
def strip_anchors(self,soup):
paras = soup.findAll(True)
for para in paras:
@ -297,94 +520,3 @@ class NYTimes(BasicNewsRecipe):
if a.img is None:
a.replaceWith(a.renderContents().decode('cp1252','replace'))
return soup
def preprocess_html(self, soup):
# refresh = soup.find('meta', {'http-equiv':'refresh'})
# if refresh is None:
# return self.strip_anchors(soup)
#
# content = refresh.get('content').partition('=')[2]
# raw = self.browser.open('http://www.nytimes.com'+content).read()
# soup = BeautifulSoup(raw.decode('cp1252', 'replace'))
return self.strip_anchors(soup)
refresh = soup.find('meta', {'http-equiv':'refresh'})
if refresh is not None:
content = refresh.get('content').partition('=')[2]
raw = self.browser.open('http://www.nytimes.com'+content).read()
soup = BeautifulSoup(raw.decode('cp1252', 'replace'))
soup = self.strip_anchors(soup)
# Test for empty content
body = soup.find('body')
tagCount = len(body.findAll(True))
if tagCount:
# print "%d tags in article" % tagCount
return soup
else:
print "no allowed content found, removing article"
raise Exception
def postprocess_html(self,soup, True):
# Change class="kicker" to <h3>
kicker = soup.find(True, {'class':'kicker'})
if kicker is not None :
h3Tag = Tag(soup, "h3")
h3Tag.insert(0, kicker.contents[0])
kicker.replaceWith(h3Tag)
# Change captions to italic -1
for caption in soup.findAll(True, {'class':'caption'}) :
if caption is not None:
emTag = Tag(soup, "em")
emTag.insert(0, caption.contents[0])
hrTag = Tag(soup, 'hr')
emTag.insert(1, hrTag)
caption.replaceWith(emTag)
# Change <nyt_headline> to <h2>
headline = soup.find("nyt_headline")
if headline is not None :
tag = Tag(soup, "h2")
tag['class'] = "headline"
tag.insert(0, headline.contents[0])
soup.h1.replaceWith(tag)
# Change <h1> to <h3> - used in editorial blogs
masthead = soup.find("h1")
if masthead is not None :
# Nuke the href
if masthead.a is not None :
del(masthead.a['href'])
tag = Tag(soup, "h3")
tag.insert(0, masthead.contents[0])
soup.h1.replaceWith(tag)
# Change <span class="bold"> to <b>
for subhead in soup.findAll(True, {'class':'bold'}) :
bTag = Tag(soup, "b")
bTag.insert(0, subhead.contents[0])
subhead.replaceWith(bTag)
# Synthesize a section header
dsk = soup.find('meta', attrs={'name':'dsk'})
if dsk is not None and dsk.has_key('content'):
hTag = Tag(soup,'h3')
hTag['class'] = 'section'
hTag.insert(0,NavigableString(dsk['content']))
articleTag = soup.find(True, attrs={'id':'article'})
articleTag.insert(0,hTag)
# Add class="articleBody" to <div> so we can format with CSS
divTag = soup.find('div',attrs={'id':'articleBody'})
if divTag is not None :
divTag['class'] = divTag['id']
# Add class="authorId" to <div> so we can format with CSS
divTag = soup.find('div',attrs={'id':'authorId'})
if divTag is not None :
divTag['class'] = divTag['id']
return soup

View File

@ -89,6 +89,7 @@ class NYTimes(BasicNewsRecipe):
'header_search',
'login',
'masthead',
'masthead-nav',
'memberTools',
'navigation',
'portfolioInline',

View File

@ -1,14 +1,11 @@
#!/usr/bin/env python
__license__ = 'GPL v3'
__copyright__ = '2008-2009, Darko Miletic <darko.miletic at gmail.com>'
__copyright__ = '2008-2010, Darko Miletic <darko.miletic at gmail.com>'
'''
pescanik.net
'''
import re
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag
class Pescanik(BasicNewsRecipe):
title = 'Pescanik'
@ -21,17 +18,16 @@ class Pescanik(BasicNewsRecipe):
no_stylesheets = True
use_embedded_content = False
encoding = 'utf-8'
language = 'sr'
lang = 'sr-Latn-RS'
extra_css = '@font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)} @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)} body{font-family: serif1, serif} .article_description{font-family: sans1, sans-serif} .contentheading{font-size: x-large; font-weight: bold} .small{font-size: small} .createdate{font-size: x-small; font-weight: bold}'
language = 'sr'
publication_type = 'newsportal'
extra_css = '@font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)} @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)} .article_description,body{font-family: Arial,"Lucida Grande",Tahoma,Verdana,sans1,sans-serif} .contentheading{font-size: x-large; font-weight: bold} .small{font-size: small} .createdate{font-size: x-small; font-weight: bold}'
conversion_options = {
'comment' : description
, 'tags' : category
, 'publisher' : publisher
, 'language' : lang
, 'pretty_print' : True
, 'language' : language
, 'linearize_tables' : True
}
@ -50,17 +46,4 @@ class Pescanik(BasicNewsRecipe):
return nurl + '&pop=1&page=0'
def preprocess_html(self, soup):
mlang = Tag(soup,'meta',[("http-equiv","Content-Language"),("content",self.lang)])
soup.head.insert(0,mlang)
attribs = [ 'style','font','valign'
,'colspan','width','height'
,'rowspan','summary','align'
,'cellspacing','cellpadding'
,'frames','rules','border'
]
for item in soup.body.findAll(name=['table','td','tr','th','caption','thead','tfoot','tbody','colgroup','col']):
item.name = 'div'
for attrib in attribs:
if item.has_key(attrib):
del item[attrib]
return self.adeify_images(soup)

View File

@ -5,7 +5,7 @@ class RTE(BasicNewsRecipe):
oldest_article = 7
max_articles_per_feed = 100
__author__ = u'Robin Phillips'
language = 'en_GB'
language = 'en_IE'
remove_tags = [dict(attrs={'class':['topAd','botad','previousNextItem','headline','footerLinks','footernav']})]

View File

@ -6,6 +6,7 @@ class TaNea(BasicNewsRecipe):
oldest_article = 1
max_articles_per_feed = 100
no_stylesheets = True
language = 'el'
remove_tags_before = dict(name='div',attrs={'id':'print-body'})
remove_tags_after = dict(name='div',attrs={'id':'text'})

View File

@ -8,43 +8,44 @@ import re
from calibre.web.feeds.news import BasicNewsRecipe
class TelepolisNews(BasicNewsRecipe):
title = u'Telepolis (News)'
__author__ = 'Gerhard Aigner'
publisher = 'Heise Zeitschriften Verlag GmbH & Co KG'
description = 'News from telepolis'
category = 'news'
oldest_article = 7
max_articles_per_feed = 100
recursion = 0
no_stylesheets = True
encoding = "utf-8"
title = u'Telepolis (News)'
__author__ = 'Gerhard Aigner'
publisher = 'Heise Zeitschriften Verlag GmbH & Co KG'
description = 'News from telepolis'
category = 'news'
oldest_article = 7
max_articles_per_feed = 100
recursion = 0
no_stylesheets = True
encoding = "utf-8"
language = 'de_AT'
use_embedded_content = False
remove_empty_feeds = True
use_embedded_content = False
remove_empty_feeds = True
preprocess_regexps = [(re.compile(r'<a[^>]*>', re.DOTALL|re.IGNORECASE), lambda match: ''),
(re.compile(r'</a>', re.DOTALL|re.IGNORECASE), lambda match: ''),]
preprocess_regexps = [(re.compile(r'<a[^>]*>', re.DOTALL|re.IGNORECASE), lambda match: ''),
(re.compile(r'</a>', re.DOTALL|re.IGNORECASE), lambda match: ''),]
keep_only_tags = [dict(name = 'table',attrs={'class':'blogtable'})]
remove_tags = [dict(name='img'), dict(name='td',attrs={'class':'blogbottom'})]
keep_only_tags = [dict(name = 'table',attrs={'class':'blogtable'})]
remove_tags = [dict(name='img'), dict(name='td',attrs={'class':'blogbottom'})]
feeds = [(u'News', u'http://www.heise.de/tp/news.rdf')]
feeds = [(u'News', u'http://www.heise.de/tp/news.rdf')]
html2lrf_options = [
'--comment' , description
, '--category' , category
, '--publisher', publisher
]
html2lrf_options = [
'--comment' , description
, '--category' , category
, '--publisher', publisher
]
html2epub_options = 'publisher="' + publisher + '"\ncomments="' + description + '"\ntags="' + category + '"'
html2epub_options = 'publisher="' + publisher + '"\ncomments="' + description + '"\ntags="' + category + '"'
def get_article_url(self, article):
'''if the linked article is of kind artikel don't take it'''
if (article.link.count('artikel') > 0) :
return None
return article.link
def get_article_url(self, article):
'''if the linked article is of kind artikel don't take it'''
if (article.link.count('artikel') > 0) :
return None
return article.link
def preprocess_html(self, soup):
mtag = '<meta http-equiv="Content-Type" content="text/html; charset=' + self.encoding + '">'
soup.head.insert(0,mtag)
return soup
def preprocess_html(self, soup):
mtag = '<meta http-equiv="Content-Type" content="text/html; charset=' + self.encoding + '">'
soup.head.insert(0,mtag)
return soup

View File

@ -8,36 +8,37 @@ import re
from calibre.web.feeds.news import BasicNewsRecipe
class TelepolisArtikel(BasicNewsRecipe):
title = u'Telepolis (Artikel)'
__author__ = 'Gerhard Aigner'
publisher = 'Heise Zeitschriften Verlag GmbH & Co KG'
category = 'news'
description = 'Telepolis Artikel'
oldest_article = 7
max_articles_per_feed = 100
recursion = 0
no_stylesheets = True
title = u'Telepolis (Artikel)'
__author__ = 'Gerhard Aigner'
publisher = 'Heise Zeitschriften Verlag GmbH & Co KG'
category = 'news'
description = 'Telepolis Artikel'
language = 'de_AT'
oldest_article = 7
max_articles_per_feed = 100
recursion = 0
no_stylesheets = True
use_embedded_content = False
remove_empty_feeds = True
use_embedded_content = False
remove_empty_feeds = True
remove_tags_before = dict(name='h1')
remove_tags = [dict(name='img')]
remove_tags_before = dict(name='h1')
remove_tags = [dict(name='img')]
feeds = [(u'Artikel', u'http://www.heise.de/tp/rss/news-a.rdf')]
feeds = [(u'Artikel', u'http://www.heise.de/tp/rss/news-a.rdf')]
preprocess_regexps = [(re.compile(r'<a[^>]*>', re.DOTALL|re.IGNORECASE), lambda match: ''),
(re.compile(r'</a>', re.DOTALL|re.IGNORECASE), lambda match: ''),]
preprocess_regexps = [(re.compile(r'<a[^>]*>', re.DOTALL|re.IGNORECASE), lambda match: ''),
(re.compile(r'</a>', re.DOTALL|re.IGNORECASE), lambda match: ''),]
html2lrf_options = [
'--comment' , description
, '--category' , category
, '--publisher', publisher]
html2lrf_options = [
'--comment' , description
, '--category' , category
, '--publisher', publisher]
html2epub_options = 'publisher="' + publisher + '"\ncomments="' + description + '"\ntags="' + category + '"'
html2epub_options = 'publisher="' + publisher + '"\ncomments="' + description + '"\ntags="' + category + '"'
def print_version(self, url):
p = re.compile(r'\d{5}', re.DOTALL|re.IGNORECASE)
m = p.search(url)
return "http://www.heise.de/bin/tp/issue/r4/dl-artikel2.cgi?artikelnr="+ m.group() +"&mode=print"
def print_version(self, url):
p = re.compile(r'\d{5}', re.DOTALL|re.IGNORECASE)
m = p.search(url)
return "http://www.heise.de/bin/tp/issue/r4/dl-artikel2.cgi?artikelnr="+ m.group() +"&mode=print"

View File

@ -18,6 +18,7 @@ class TheCultOfGhoul(BasicNewsRecipe):
encoding = 'utf-8'
no_stylesheets = True
use_embedded_content = True
publication_type = 'blog'
extra_css = ' @font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)} @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)} body{font-family: "Trebuchet MS",Trebuchet,Verdana,sans1,sans-serif} .article_description{font-family: sans1, sans-serif} img{margin-bottom: 0.8em; border: 1px solid #333333; padding: 4px } '
conversion_options = {

View File

@ -128,7 +128,6 @@ class USAToday(BasicNewsRecipe):
def parse_feeds(self, *args, **kwargs):
parsed_feeds = BasicNewsRecipe.parse_feeds(self, *args, **kwargs)
# Count articles for progress dialog
content_feeds = []
article_count = 0
for feed in parsed_feeds:
article_count += len(feed)
@ -297,7 +296,6 @@ class USAToday(BasicNewsRecipe):
if not headline_found:
# Monolithic <div> - restructure
insert_loc = 0
tag = body.find(True)
while True:
insertLoc += 1

View File

@ -1,7 +1,6 @@
#!/usr/bin/env python
__license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
__copyright__ = '2009-2010, Darko Miletic <darko.miletic at gmail.com>'
'''
vijesti.me
@ -9,7 +8,6 @@ vijesti.me
import re
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag
class Vijesti(BasicNewsRecipe):
title = 'Vijesti'
@ -22,17 +20,16 @@ class Vijesti(BasicNewsRecipe):
no_stylesheets = True
encoding = 'cp1250'
use_embedded_content = False
language = 'sr'
lang ='sr-Latn-Me'
extra_css = '@font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)} @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)} body{font-family: serif1, serif} .article_description{font-family: sans1, sans-serif}'
language = 'sr'
publication_type = 'newspaper'
masthead_url = 'http://www.vijesti.me/img/logo.gif'
extra_css = '@font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)} @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)} body{font-family: serif1, serif} .article_description{font-family: sans1, sans-serif}'
conversion_options = {
'comment' : description
, 'tags' : category
, 'publisher' : publisher
, 'language' : lang
, 'pretty_print' : True
, 'language' : language
}
preprocess_regexps = [(re.compile(u'\u0110'), lambda match: u'\u00D0')]
@ -44,15 +41,5 @@ class Vijesti(BasicNewsRecipe):
feeds = [(u'Sve vijesti', u'http://www.vijesti.me/rss.php' )]
def preprocess_html(self, soup):
soup.html['xml:lang'] = self.lang
soup.html['lang'] = self.lang
mlang = Tag(soup,'meta',[("http-equiv","Content-Language"),("content",self.lang)])
mcharset = Tag(soup,'meta',[("http-equiv","Content-Type"),("content","text/html; charset=UTF-8")])
soup.head.insert(0,mlang)
soup.head.insert(1,mcharset)
return self.adeify_images(soup)
def get_article_url(self, article):
raw = article.get('link', None)
return raw.replace('.cg.yu','.me')

View File

@ -1,5 +1,3 @@
#!/usr/bin/env python
__license__ = 'GPL v3'
__copyright__ = '2008-2009, Darko Miletic <darko.miletic at gmail.com>'
'''
@ -9,7 +7,6 @@ vreme.com
import re
from calibre import strftime
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import Tag
class Vreme(BasicNewsRecipe):
title = 'Vreme'
@ -24,22 +21,23 @@ class Vreme(BasicNewsRecipe):
LOGIN = 'http://www.vreme.com/account/login.php?url=%2F'
use_embedded_content = False
encoding = 'utf-8'
language = 'sr'
lang = 'sr-Latn-RS'
direction = 'ltr'
language = 'sr'
publication_type = 'magazine'
masthead_url = 'http://www.vreme.com/g/vreme-logo.gif'
extra_css = ' @font-face {font-family: "serif1";src:url(res:///opt/sony/ebook/FONT/tt0011m_.ttf)} body{font-family: serif1, serif} .article_description{font-family: serif1, serif} @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)} .heading1{font-family: sans1, sans-serif; font-size: x-large; font-weight: bold} .heading2{font-family: sans1, sans-serif; font-size: large; font-weight: bold} .toc-heading{font-family: sans1, sans-serif; font-size: small} .column-heading2{font-family: sans1, sans-serif; font-size: large} .column-heading1{font-family: sans1, sans-serif; font-size: x-large} .column-normal{font-family: sans1, sans-serif; font-size: medium} .large{font-family: sans1, sans-serif; font-size: large} '
conversion_options = {
'comment' : description
, 'tags' : category
, 'publisher' : publisher
, 'language' : lang
, 'pretty_print' : True
, 'language' : language
, 'linearize_tables' : True
}
preprocess_regexps = [(re.compile(u'\u0110'), lambda match: u'\u00D0')]
remove_tags_before = dict(attrs={'class':'toc-heading'})
remove_tags_after = dict(attrs={'class':'footer' })
def get_browser(self):
br = BasicNewsRecipe.get_browser()
@ -79,31 +77,6 @@ class Vreme(BasicNewsRecipe):
def print_version(self, url):
return url + '&print=yes'
def preprocess_html(self, soup):
del soup.body['text' ]
del soup.body['bgcolor']
del soup.body['onload' ]
soup.html['lang'] = self.lang
soup.html['dir' ] = self.direction
attribs = [ 'style','font','valign'
,'colspan','width','height'
,'rowspan','summary','align'
,'cellspacing','cellpadding'
,'frames','rules','border'
]
for item in soup.body.findAll(name=['table','td','tr','th','caption','thead','tfoot','tbody','colgroup','col']):
item.name = 'div'
for attrib in attribs:
if item.has_key(attrib):
del item[attrib]
mlang = Tag(soup,'meta',[("http-equiv","Content-Language"),("content",self.lang)])
mcharset = Tag(soup,'meta',[("http-equiv","Content-Type"),("content","text/html; charset=UTF-8")])
soup.head.insert(0,mlang)
soup.head.insert(1,mcharset)
return soup
def get_cover_url(self):
cover_url = None
soup = self.index_to_soup(self.INDEX)

View File

@ -35,7 +35,7 @@ mimetypes.add_type('application/adobe-page-template+xml', '.xpgt')
mimetypes.add_type('application/x-font-opentype', '.otf')
mimetypes.add_type('application/x-font-truetype', '.ttf')
mimetypes.add_type('application/oebps-package+xml', '.opf')
mimetypes.add_type('application/ereader', '.pdb')
mimetypes.add_type('application/vnd.palm', '.pdb')
mimetypes.add_type('application/x-mobipocket-ebook', '.mobi')
mimetypes.add_type('application/x-mobipocket-ebook', '.prc')
mimetypes.add_type('application/x-mobipocket-ebook', '.azw')

View File

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

View File

@ -19,8 +19,12 @@ class ANDROID(USBMS):
VENDOR_ID = {
0x0bb4 : { 0x0c02 : [0x100], 0x0c01 : [0x100]},
0x22b8 : { 0x41d9 : [0x216]},
0x18d1 : { 0x4e11 : [0x0100], 0x4e12: [0x0100]},
# Motorola
0x22b8 : { 0x41d9 : [0x216], 0x2d67 : [0x100]},
0x18d1 : { 0x4e11 : [0x0100, 0x226], 0x4e12: [0x0100, 0x226]},
0x04e8 : { 0x681d : [0x0222]},
}
EBOOK_DIR_MAIN = ['wordplayer/calibretransfer', 'eBooks/import', 'Books']
@ -30,8 +34,8 @@ class ANDROID(USBMS):
EXTRA_CUSTOMIZATION_DEFAULT = ', '.join(EBOOK_DIR_MAIN)
VENDOR_NAME = ['HTC', 'MOTOROLA', 'GOOGLE_', 'ANDROID']
WINDOWS_MAIN_MEM = ['ANDROID_PHONE', 'A855', 'INC.NEXUS_ONE',
'___UMS_COMPOSITE',]
WINDOWS_MAIN_MEM = ['ANDROID_PHONE', 'A855', 'A853', 'INC.NEXUS_ONE',
'___UMS_COMPOSITE', '_MB200']
OSX_MAIN_MEM = 'HTC Android Phone Media'

View File

View File

@ -0,0 +1,49 @@
# -*- coding: utf-8 -*-
__license__ = 'GPL v3'
__copyright__ = '2009, John Schember <john at nachtimwald.com>'
__docformat__ = 'restructuredtext en'
'''
Device driver for Barns and Nobel's Nook
'''
from calibre.devices.usbms.driver import USBMS
class EDGE(USBMS):
name = 'Edge Device Interface'
gui_name = _('Entourage Edge')
description = _('Communicate with the Entourage Edge.')
author = 'Kovid Goyal'
supported_platforms = ['windows', 'linux', 'osx']
# Ordered list of supported formats
FORMATS = ['epub', 'pdf']
VENDOR_ID = [0x2080]
PRODUCT_ID = [0x001]
BCD = [0x322]
VENDOR_NAME = 'ANDROID'
WINDOWS_MAIN_MEM = '__FILE-STOR_GADG'
WINDOWS_CARD_A_MEM = '__FILE-STOR_GADG'
MAIN_MEMORY_VOLUME_LABEL = 'Edge Main Memory'
STORAGE_CARD_VOLUME_LABEL = 'Edge Storage Card'
EBOOK_DIR_MAIN = 'download'
SUPPORTS_SUB_DIRS = True
def windows_sort_drives(self, drives):
main = drives.get('main', None)
card = drives.get('carda', None)
if card and main and card < main:
drives['main'] = card
drives['carda'] = main
return drives
def sanitize_path_components(self, components):
return [x.replace('#', '_') for x in components]

View File

@ -25,7 +25,6 @@ from calibre.devices.mime import mime_type_ext
# are inherited from the device interface in Device.
class USBMS(CLI, Device):
name = 'USBMS Base Device Interface'
description = _('Communicate with an eBook reader.')
author = _('John Schember')
supported_platforms = ['windows', 'osx', 'linux']

View File

@ -141,7 +141,8 @@ class CHMInput(InputFormatPlugin):
log.debug('Found %d section nodes' % len(chapters))
htmlpath = os.path.splitext(hhcpath)[0] + ".html"
f = open(htmlpath, 'wb')
f.write("<HTML><HEAD></HEAD><BODY>\r\n")
f.write('<html><head><meta http-equiv="Content-type"'
' content="text/html;charset=UTF-8" /></head><body>\n')
if chapters:
path0 = chapters[0][1]
@ -152,10 +153,12 @@ class CHMInput(InputFormatPlugin):
rsrcname = os.path.basename(chapter[1])
rsrcpath = os.path.join(subpath, rsrcname)
# title should already be url encoded
url = "<br /><a href=" + rsrcpath + ">" + title + " </a>\r\n"
url = "<br /><a href=" + rsrcpath + ">" + title + " </a>\n"
if isinstance(url, unicode):
url = url.encode('utf-8')
f.write(url)
f.write("</BODY></HTML>")
f.write("</body></html>")
f.close()
return htmlpath

View File

@ -103,7 +103,8 @@ def _get_cover(soup, rdr):
r[0] = img['src']
l = r.keys()
l.sort()
ans = r[l[0]]
if l:
ans = r[l[0]]
# this link comes from the internal html, which is in a subdir
if ans is not None:
try:

View File

@ -7,7 +7,7 @@ __copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>,' \
import os, re
from mimetypes import guess_type as guess_mimetype
from BeautifulSoup import BeautifulSoup, NavigableString
from calibre.ebooks.BeautifulSoup import BeautifulSoup, NavigableString
from calibre.utils.chm.chm import CHMFile
from calibre.utils.chm.chmlib import (
@ -17,6 +17,7 @@ from calibre.utils.chm.chmlib import (
from calibre.utils.config import OptionParser
from calibre.ebooks.metadata.toc import TOC
from calibre.ebooks.chardet import xml_to_unicode
def match_string(s1, s2_already_lowered):
@ -145,8 +146,9 @@ class CHMReader(CHMFile):
def _reformat(self, data):
try:
data = xml_to_unicode(data, strip_encoding_pats=True)[0]
soup = BeautifulSoup(data)
except UnicodeEncodeError:
except ValueError:
# hit some strange encoding problems...
print "Unable to parse html for cleaning, leaving it :("
return data
@ -184,7 +186,7 @@ class CHMReader(CHMFile):
# and some don't even have a src= ?!
pass
# now give back some pretty html.
return soup.prettify()
return soup.prettify('utf-8')
def Contents(self):
if self._contents is not None:

View File

@ -171,7 +171,8 @@ class PageProcessor(list):
if not self.opts.dont_sharpen:
p.MagickSharpenImage(wand, 0.0, 1.0)
p.MagickSetImageType(wand, p.GrayscaleType)
if not self.opts.dont_grayscale:
p.MagickSetImageType(wand, p.GrayscaleType)
if self.opts.despeckle:
p.MagickDespeckleImage(wand)
@ -310,6 +311,8 @@ class ComicInput(InputFormatPlugin):
'you optimal size and look on your device.')),
OptionRecommendation(name='no_process', recommended_value=False,
help=_("Apply no processing to the image")),
OptionRecommendation(name='dont_grayscale', recommended_value=False,
help=_('Do not convert the image to grayscale (black and white)'))
])
recommendations = set([

View File

@ -12,7 +12,7 @@ from urllib import unquote
from calibre.customize.conversion import OutputFormatPlugin
from calibre.ptempfile import TemporaryDirectory
from calibre.constants import __appname__, __version__
from calibre import strftime, guess_type, prepare_string_for_xml, CurrentDir
from calibre import guess_type, CurrentDir
from calibre.customize.conversion import OptionRecommendation
from calibre.constants import filesystem_encoding
@ -110,37 +110,6 @@ class EPUBOutput(OutputFormatPlugin):
</html>
'''
TITLEPAGE = '''\
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>%(title)s</title>
<style type="text/css">
body {
text-align: center;
vertical-align: center;
overflow: hidden;
font-size: 16pt;
}
.logo {
width: 510px; height: 390px;
text-align:center;
font-size: 1pt;
overflow:hidden;
}
h1 { font-family: serif; }
h2, h4 { font-family: monospace; }
</style>
</head>
<body>
<h1>%(title)s</h1>
<div style="text-align:center">
<img class="logo" src="%(img)s" alt="calibre logo" />
</div>
<h2>%(author)s</h2>
<h4>Produced by %(app)s</h4>
</body>
</html>
'''
def workaround_webkit_quirks(self):
from calibre.ebooks.oeb.base import XPath
for x in self.oeb.spine:
@ -262,42 +231,80 @@ class EPUBOutput(OutputFormatPlugin):
'''
Create a generic cover for books that dont have a cover
'''
from calibre.utils.pil_draw import draw_centered_text
from calibre.ebooks.metadata import authors_to_string
if self.opts.no_default_epub_cover:
return None
self.log('Generating default cover')
from calibre.ebooks.metadata import authors_to_string
m = self.oeb.metadata
title = unicode(m.title[0])
a = [unicode(x) for x in m.creator if x.role == 'aut']
author = authors_to_string(a)
img_data = open(I('library.png'), 'rb').read()
id, href = self.oeb.manifest.generate('calibre-logo',
'calibre-logo.png')
self.oeb.manifest.add(id, href, 'image/png', data=img_data)
title, author = map(prepare_string_for_xml, (title, author))
if not author or not author.strip():
author = strftime('%d %b, %Y')
html = self.TITLEPAGE%dict(title=title, author=author,
app=__appname__ +' '+__version__,
img=href)
id, href = self.oeb.manifest.generate('calibre-titlepage',
'calibre-titlepage.xhtml')
return self.oeb.manifest.add(id, href, guess_type('t.xhtml')[0],
data=etree.fromstring(html))
authors = [unicode(x) for x in m.creator if x.role == 'aut']
import cStringIO
cover_file = cStringIO.StringIO()
try:
try:
from PIL import Image, ImageDraw, ImageFont
Image, ImageDraw, ImageFont
except ImportError:
import Image, ImageDraw, ImageFont
font_path = P('fonts/liberation/LiberationSerif-Bold.ttf')
app = '['+__appname__ +' '+__version__+']'
COVER_WIDTH, COVER_HEIGHT = 590, 750
img = Image.new('RGB', (COVER_WIDTH, COVER_HEIGHT), 'white')
draw = ImageDraw.Draw(img)
# Title
font = ImageFont.truetype(font_path, 44)
bottom = draw_centered_text(img, draw, font, title, 15, ysep=9)
# Authors
bottom += 14
font = ImageFont.truetype(font_path, 32)
authors = authors_to_string(authors)
bottom = draw_centered_text(img, draw, font, authors, bottom, ysep=7)
# Vanity
font = ImageFont.truetype(font_path, 28)
width, height = draw.textsize(app, font=font)
left = max(int((COVER_WIDTH - width)/2.), 0)
top = COVER_HEIGHT - height - 15
draw.text((left, top), app, fill=(0,0,0), font=font)
# Logo
logo = Image.open(I('library.png'), 'r')
width, height = logo.size
left = max(int((COVER_WIDTH - width)/2.), 0)
top = max(int((COVER_HEIGHT - height)/2.), 0)
img.paste(logo, (left, max(bottom, top)))
img = img.convert('RGB').convert('P', palette=Image.ADAPTIVE)
img.convert('RGB').save(cover_file, 'JPEG')
cover_file.flush()
id, href = self.oeb.manifest.generate('cover_image', 'cover_image.jpg')
item = self.oeb.manifest.add(id, href, guess_type('t.jpg')[0],
data=cover_file.getvalue())
m.clear('cover')
m.add('cover', item.id)
return item.href
except:
self.log.exception('Failed to generate default cover')
return None
def insert_cover(self):
from calibre.ebooks.oeb.base import urldefrag
from calibre import guess_type
g, m = self.oeb.guide, self.oeb.manifest
item = None
if 'titlepage' not in g:
if 'cover' in g:
tp = self.TITLEPAGE_COVER%unquote(g['cover'].href)
href = g['cover'].href
else:
href = self.default_cover()
if href is not None:
tp = self.TITLEPAGE_COVER%unquote(href)
id, href = m.generate('titlepage', 'titlepage.xhtml')
item = m.add(id, href, guess_type('t.xhtml')[0],
data=etree.fromstring(tp))
else:
item = self.default_cover()
else:
item = self.oeb.manifest.hrefs[
urldefrag(self.oeb.guide['titlepage'].href)[0]]

View File

@ -99,15 +99,33 @@ class OCFDirReader(OCFReader):
return open(os.path.join(self.root, path), *args, **kwargs)
def get_cover(opf, opf_path, stream):
import posixpath
from calibre.ebooks import render_html_svg_workaround
from calibre.utils.logging import default_log
raster_cover = opf.raster_cover
stream.seek(0)
zf = ZipFile(stream)
if raster_cover:
base = posixpath.dirname(opf_path)
cpath = posixpath.normpath(posixpath.join(base, raster_cover))
try:
member = zf.getinfo(cpath)
except:
pass
else:
f = zf.open(member)
data = f.read()
f.close()
zf.close()
return data
cpage = opf.first_spine_item()
if not cpage:
return
with TemporaryDirectory('_epub_meta') as tdir:
with CurrentDir(tdir):
stream.seek(0)
ZipFile(stream).extractall()
zf.extractall()
opf_path = opf_path.replace('/', os.sep)
cpage = os.path.join(tdir, os.path.dirname(opf_path), cpage)
if not os.path.exists(cpage):

View File

@ -39,7 +39,7 @@ class MetadataSource(Plugin):
self.worker.daemon = True
self.title = title
self.verbose = verbose
self.author = author
self.book_author = author
self.publisher = publisher
self.isbn = isbn
self.log = log if log is not None else default_log
@ -139,7 +139,7 @@ class GoogleBooks(MetadataSource):
def fetch(self):
from calibre.ebooks.metadata.google_books import search
try:
self.results = search(self.title, self.author, self.publisher,
self.results = search(self.title, self.book_author, self.publisher,
self.isbn, max_results=10,
verbose=self.verbose)
except Exception, e:
@ -162,8 +162,8 @@ class ISBNDB(MetadataSource):
else:
if self.title:
args.extend(['--title', self.title])
if self.author:
args.extend(['--author', self.author])
if self.book_author:
args.extend(['--author', self.book_author])
if self.publisher:
args.extend(['--publisher', self.publisher])
if self.verbose:
@ -193,7 +193,7 @@ class Amazon(MetadataSource):
return
from calibre.ebooks.metadata.amazon import get_social_metadata
try:
self.results = get_social_metadata(self.title, self.author,
self.results = get_social_metadata(self.title, self.book_author,
self.publisher, self.isbn)
except Exception, e:
self.exception = e

View File

@ -322,16 +322,18 @@ class MetadataUpdater(object):
recs = []
try:
from calibre.ebooks.conversion.config import load_defaults
prefs = load_defaults('mobi_output')
pas = prefs.get('prefer_author_sort', False)
from calibre.ebooks.conversion.config import load_defaults
prefs = load_defaults('mobi_output')
pas = prefs.get('prefer_author_sort', False)
kindle_pdoc = prefs.get('personal_doc', None)
except:
pas = False
kindle_pdoc = None
if mi.author_sort and pas:
authors = mi.author_sort
update_exth_record((100, authors.encode(self.codec, 'replace')))
elif mi.authors:
authors = '; '.join(mi.authors)
authors = ';'.join(mi.authors)
update_exth_record((100, authors.encode(self.codec, 'replace')))
if mi.publisher:
update_exth_record((101, mi.publisher.encode(self.codec, 'replace')))
@ -349,6 +351,10 @@ class MetadataUpdater(object):
if mi.tags:
subjects = '; '.join(mi.tags)
update_exth_record((105, subjects.encode(self.codec, 'replace')))
if kindle_pdoc and kindle_pdoc in mi.tags:
update_exth_record((501, str('PDOC')))
if mi.pubdate:
update_exth_record((106, str(mi.pubdate).encode(self.codec, 'replace')))
elif mi.timestamp:

View File

@ -433,6 +433,8 @@ class OPF(object):
tags_path = XPath('descendant::*[re:match(name(), "subject", "i")]')
isbn_path = XPath('descendant::*[re:match(name(), "identifier", "i") and '+
'(re:match(@scheme, "isbn", "i") or re:match(@opf:scheme, "isbn", "i"))]')
raster_cover_path = XPath('descendant::*[re:match(name(), "meta", "i") and ' +
're:match(@name, "cover", "i") and @content]')
identifier_path = XPath('descendant::*[re:match(name(), "identifier", "i")]')
application_id_path = XPath('descendant::*[re:match(name(), "identifier", "i") and '+
'(re:match(@opf:scheme, "calibre|libprs500", "i") or re:match(@scheme, "calibre|libprs500", "i"))]')
@ -804,6 +806,14 @@ class OPF(object):
if os.access(os.path.join(self.base_dir, prefix+suffix), os.R_OK):
return cpath
@property
def raster_cover(self):
covers = self.raster_cover_path(self.metadata)
if covers:
cover_id = covers[0].get('content')
for item in self.itermanifest():
if item.get('id', None) == cover_id:
return item.get('href', None)
@dynamic_property
def cover(self):

View File

@ -83,22 +83,22 @@ class MetadataUpdater(object):
sig = self.data[:4]
if not sig.startswith('TPZ'):
raise ValueError('Not a Topaz file')
raise ValueError("'%s': Not a Topaz file" % getattr(stream, 'name', 'Unnamed stream'))
offset = 4
self.header_records, consumed = self.decode_vwi(self.data[offset:offset+4])
offset += consumed
self.topaz_headers = self.get_headers(offset)
self.topaz_headers, self.th_seq = self.get_headers(offset)
# First integrity test - metadata header
if not 'metadata' in self.topaz_headers:
raise ValueError('Invalid Topaz format - no metadata record')
raise ValueError("'%s': Invalid Topaz format - no metadata record" % getattr(stream, 'name', 'Unnamed stream'))
# Second integrity test - metadata body
md_offset = self.topaz_headers['metadata']['blocks'][0]['offset']
md_offset += self.base
if self.data[md_offset+1:md_offset+9] != 'metadata':
raise ValueError('Damaged metadata record')
raise ValueError("'%s': Damaged metadata record" % getattr(stream, 'name', 'Unnamed stream'))
def book_length(self):
''' convenience method for retrieving book length '''
@ -158,6 +158,8 @@ class MetadataUpdater(object):
if value == 0:
if multi_byte:
bytes.append(b|0x80)
if bytes[-1] == 0xFF:
bytes.append(0x80)
if len(bytes) == 4:
return pack('>BBBB',bytes[3],bytes[2],bytes[1],bytes[0]).decode('iso-8859-1')
elif len(bytes) == 3:
@ -196,8 +198,9 @@ class MetadataUpdater(object):
return dks.getvalue().encode('iso-8859-1')
def get_headers(self, offset):
# Build a dict of topaz_header records
# Build a dict of topaz_header records, list of order
topaz_headers = {}
th_seq = []
for x in range(self.header_records):
offset += 1
taglen, consumed = self.decode_vwi(self.data[offset:offset+4])
@ -216,10 +219,11 @@ class MetadataUpdater(object):
offset += consumed
blocks[val] = dict(offset=hdr_offset,len_uncomp=len_uncomp,len_comp=len_comp)
topaz_headers[tag] = dict(blocks=blocks)
th_seq.append(tag)
self.eoth = self.data[offset]
offset += 1
self.base = offset
return topaz_headers
return topaz_headers, th_seq
def generate_metadata_stream(self):
ms = StringIO.StringIO()
@ -229,7 +233,8 @@ class MetadataUpdater(object):
ms.write(chr(len(self.metadata)))
# Add the metadata fields.
for tag in self.metadata:
#for tag in self.metadata:
for tag in self.md_seq:
ms.write(self.encode_vwi(len(tag)).encode('iso-8859-1'))
ms.write(tag)
ms.write(self.encode_vwi(len(self.metadata[tag])).encode('iso-8859-1'))
@ -256,6 +261,7 @@ class MetadataUpdater(object):
#print "self.md_header: %s" % self.md_header
self.metadata = {}
self.md_seq = []
for x in range(self.md_header['num_recs']):
taglen, consumed = self.decode_vwi(self.data[offset:offset+4])
offset += consumed
@ -266,16 +272,10 @@ class MetadataUpdater(object):
metadata = self.data[offset:offset + md_len]
offset += md_len
self.metadata[tag] = metadata
self.md_seq.append(tag)
def regenerate_headers(self, updated_md_len):
headers = {}
for tag in self.topaz_headers:
if self.topaz_headers[tag]['blocks']:
headers[tag] = self.topaz_headers[tag]['blocks'][0]['offset']
else:
headers[tag] = None
original_md_len = self.topaz_headers['metadata']['blocks'][0]['len_uncomp']
original_md_offset = self.topaz_headers['metadata']['blocks'][0]['offset']
delta = updated_md_len - original_md_len
@ -285,7 +285,7 @@ class MetadataUpdater(object):
ths.write(self.data[:5])
# Rewrite the offsets for hdr_offsets > metadata offset
for tag in headers.keys():
for tag in self.th_seq:
ths.write('c')
ths.write(self.encode_vwi(len(tag)))
ths.write(tag)
@ -330,12 +330,15 @@ class MetadataUpdater(object):
self.metadata['Title'] = mi.title.encode('utf-8')
updated_metadata = self.generate_metadata_stream()
head = self.regenerate_headers(len(updated_metadata))
# Skip tag_len, tag, extra
prefix = len('metadata') + 2
um_buf_len = len(updated_metadata) - prefix
head = self.regenerate_headers(um_buf_len)
# Chunk1: self.base -> original metadata start
# Chunk2: original metadata end -> eof
chunk1 = self.data[self.base:self.original_md_start]
chunk2 = self.data[self.original_md_start + self.original_md_len:]
chunk2 = self.data[prefix + self.original_md_start + self.original_md_len:]
self.stream.seek(0)
self.stream.truncate(0)
@ -366,7 +369,7 @@ if __name__ == '__main__':
data = open(sys.argv[1], 'rb')
stream = cStringIO.StringIO()
stream.write(data.read())
mi = MetaInformation(title="A Marvelously Long Title", authors=['Riker, Gregory; Riker, Charles'])
mi = MetaInformation(title="Updated Title", authors=['Author, Random'])
set_metadata(stream, mi)
# Write the result

View File

@ -36,6 +36,9 @@ class MOBIOutput(OutputFormatPlugin):
recommended_value=False, level=OptionRecommendation.LOW,
help=_('Disable compression of the file contents.')
),
OptionRecommendation(name='personal_doc', recommended_value='[PDOC]',
help=_('Tag marking book to be filed with Personal Docs')
),
])
def check_for_periodical(self):

View File

@ -320,6 +320,7 @@ class MobiReader(object):
from lxml.html import soupparser
self.log.warning('Malformed markup, parsing using BeautifulSoup')
try:
self.processed_html = self.processed_html.replace('</</', '</')
root = soupparser.fromstring(self.processed_html)
except Exception:
self.log.warning('MOBI markup appears to contain random bytes. Stripping.')

View File

@ -2030,9 +2030,7 @@ class MobiWriter(object):
if (not self._periodicalCount and not self._sectionCount and not self._articleCount) or \
not self.opts.mobi_periodical :
mobiType = 0x002
elif self._periodicalCount and self._sectionCount == 1 :
mobiType = 0x102
elif self._periodicalCount and self._sectionCount > 1 :
elif self._periodicalCount:
pt = None
if self._oeb.metadata.publication_type:
x = unicode(self._oeb.metadata.publication_type[0]).split(':')

View File

@ -1191,7 +1191,8 @@ class Manifest(object):
href = urlnormalize(href)
base, ext = os.path.splitext(href)
index = 1
while href in self.hrefs:
lhrefs = set([x.lower() for x in self.hrefs])
while href.lower() in lhrefs:
href = base + str(index) + ext
index += 1
return id, href

View File

@ -359,7 +359,7 @@ class OEBReader(object):
self._toc_from_navpoint(item, node, child)
def _toc_from_ncx(self, item):
if item is None:
if (item is None) or (item.data is None):
return False
self.log.debug('Reading TOC from NCX...')
ncx = item.data

View File

@ -592,6 +592,11 @@ def is_ok_to_use_qt():
gui_thread = QThread.currentThread()
return gui_thread is QThread.currentThread()
def is_gui_thread():
global gui_thread
return gui_thread is QThread.currentThread()
def find_forms(srcdir):
base = os.path.join(srcdir, 'calibre', 'gui2')
forms = []

View File

@ -19,7 +19,8 @@ class PluginWidget(Widget, Ui_Form):
Widget.__init__(self, parent, 'comic_input',
['colors', 'dont_normalize', 'keep_aspect_ratio', 'right2left',
'despeckle', 'no_sort', 'no_process', 'landscape',
'dont_sharpen', 'disable_trim', 'wide', 'output_format']
'dont_sharpen', 'disable_trim', 'wide', 'output_format',
'dont_grayscale']
)
self.db, self.book_id = db, book_id
for x in get_option('output_format').option.choices:

View File

@ -7,14 +7,14 @@
<x>0</x>
<y>0</y>
<width>599</width>
<height>343</height>
<height>345</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="1" column="0">
<item row="2" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>&amp;Number of Colors:</string>
@ -24,83 +24,83 @@
</property>
</widget>
</item>
<item row="1" column="1">
<item row="2" column="1">
<widget class="QSpinBox" name="opt_colors">
<property name="minimum">
<number>8</number>
</property>
<property name="maximum">
<number>3200000</number>
<number>32000000</number>
</property>
<property name="singleStep">
<number>8</number>
</property>
</widget>
</item>
<item row="2" column="0">
<item row="3" column="0">
<widget class="QCheckBox" name="opt_dont_normalize">
<property name="text">
<string>Disable &amp;normalize</string>
</property>
</widget>
</item>
<item row="3" column="0">
<item row="4" column="0">
<widget class="QCheckBox" name="opt_keep_aspect_ratio">
<property name="text">
<string>Keep &amp;aspect ratio</string>
</property>
</widget>
</item>
<item row="4" column="0">
<item row="5" column="0">
<widget class="QCheckBox" name="opt_dont_sharpen">
<property name="text">
<string>Disable &amp;Sharpening</string>
</property>
</widget>
</item>
<item row="5" column="0">
<item row="6" column="0">
<widget class="QCheckBox" name="opt_disable_trim">
<property name="text">
<string>Disable &amp;Trimming</string>
</property>
</widget>
</item>
<item row="6" column="0">
<item row="7" column="0">
<widget class="QCheckBox" name="opt_wide">
<property name="text">
<string>&amp;Wide</string>
</property>
</widget>
</item>
<item row="7" column="0">
<item row="8" column="0">
<widget class="QCheckBox" name="opt_landscape">
<property name="text">
<string>&amp;Landscape</string>
</property>
</widget>
</item>
<item row="8" column="0">
<item row="9" column="0">
<widget class="QCheckBox" name="opt_right2left">
<property name="text">
<string>&amp;Right to left</string>
</property>
</widget>
</item>
<item row="9" column="0">
<item row="10" column="0">
<widget class="QCheckBox" name="opt_no_sort">
<property name="text">
<string>Don't so&amp;rt</string>
</property>
</widget>
</item>
<item row="10" column="0">
<item row="11" column="0">
<widget class="QCheckBox" name="opt_despeckle">
<property name="text">
<string>De&amp;speckle</string>
</property>
</widget>
</item>
<item row="12" column="0">
<item row="13" column="0">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
@ -120,7 +120,7 @@
</property>
</widget>
</item>
<item row="11" column="0">
<item row="12" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>&amp;Output format:</string>
@ -130,9 +130,16 @@
</property>
</widget>
</item>
<item row="11" column="1">
<item row="12" column="1">
<widget class="QComboBox" name="opt_output_format"/>
</item>
<item row="1" column="0">
<widget class="QCheckBox" name="opt_dont_grayscale">
<property name="text">
<string>Disable conversion of images to &amp;black and white</string>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
@ -148,8 +155,8 @@
<y>11</y>
</hint>
<hint type="destinationlabel">
<x>210</x>
<y>44</y>
<x>216</x>
<y>76</y>
</hint>
</hints>
</connection>
@ -164,8 +171,8 @@
<y>17</y>
</hint>
<hint type="destinationlabel">
<x>371</x>
<y>39</y>
<x>592</x>
<y>76</y>
</hint>
</hints>
</connection>
@ -180,8 +187,8 @@
<y>15</y>
</hint>
<hint type="destinationlabel">
<x>20</x>
<y>67</y>
<x>26</x>
<y>101</y>
</hint>
</hints>
</connection>
@ -196,8 +203,8 @@
<y>11</y>
</hint>
<hint type="destinationlabel">
<x>38</x>
<y>98</y>
<x>44</x>
<y>126</y>
</hint>
</hints>
</connection>
@ -212,8 +219,8 @@
<y>12</y>
</hint>
<hint type="destinationlabel">
<x>110</x>
<y>124</y>
<x>116</x>
<y>151</y>
</hint>
</hints>
</connection>
@ -224,12 +231,12 @@
<slot>setDisabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>153</x>
<y>5</y>
<x>159</x>
<y>11</y>
</hint>
<hint type="destinationlabel">
<x>67</x>
<y>155</y>
<x>73</x>
<y>176</y>
</hint>
</hints>
</connection>
@ -244,8 +251,8 @@
<y>13</y>
</hint>
<hint type="destinationlabel">
<x>84</x>
<y>180</y>
<x>90</x>
<y>201</y>
</hint>
</hints>
</connection>
@ -292,8 +299,8 @@
<y>11</y>
</hint>
<hint type="destinationlabel">
<x>105</x>
<y>256</y>
<x>111</x>
<y>276</y>
</hint>
</hints>
</connection>
@ -329,5 +336,21 @@
</hint>
</hints>
</connection>
<connection>
<sender>opt_no_process</sender>
<signal>toggled(bool)</signal>
<receiver>opt_dont_grayscale</receiver>
<slot>setDisabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>229</x>
<y>22</y>
</hint>
<hint type="destinationlabel">
<x>231</x>
<y>36</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -147,8 +147,9 @@ class MetadataWidget(Widget, Ui_Form):
if comments:
mi.comments = comments
mi.series_index = float(self.series_index.value())
if self.series.currentIndex() > -1:
mi.series = unicode(self.series.currentText()).strip()
series = unicode(self.series.currentText()).strip()
if series:
mi.series = series
tags = [t.strip() for t in unicode(self.tags.text()).strip().split(',')]
if tags:
mi.tags = tags

View File

@ -24,7 +24,7 @@ class PluginWidget(Widget, Ui_Form):
def __init__(self, parent, get_option, get_help, db=None, book_id=None):
Widget.__init__(self, parent, 'mobi_output',
['prefer_author_sort', 'rescale_images', 'toc_title',
'dont_compress', 'no_inline_toc', 'masthead_font']
'dont_compress', 'no_inline_toc', 'masthead_font','personal_doc']
)
self.db, self.book_id = db, book_id

View File

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>421</width>
<height>300</height>
<width>521</width>
<height>331</height>
</rect>
</property>
<property name="windowTitle">
@ -64,13 +64,27 @@
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>Masthead font:</string>
<string>Periodical masthead font:</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="opt_masthead_font"/>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label_3">
<property name="text">
<string>Personal Doc tag:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="opt_personal_doc"/>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
@ -79,7 +93,7 @@
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>55</height>
<height>40</height>
</size>
</property>
</spacer>

View File

@ -205,6 +205,7 @@ class Scheduler(QObject):
def __init__(self, parent, db):
QObject.__init__(self, parent)
self.internet_connection_failed = False
self._parent = parent
self.recipe_model = RecipeModel(db)
self.lock = QMutex(QMutex.Recursive)
@ -305,9 +306,17 @@ class Scheduler(QObject):
self.download(urn)
def download(self, urn):
if not internet_connected():
return
self.lock.lock()
if not internet_connected():
if not self.internet_connection_failed:
self.internet_connection_failed = True
d = error_dialog(self._parent, _('No internet connection'),
_('Cannot download news as no internet connection '
'is active'))
d.setModal(False)
d.show()
return
self.internet_connection_failed = False
doit = urn not in self.download_queue
self.lock.unlock()
if doit:

View File

@ -35,6 +35,7 @@ class LibraryDelegate(QItemDelegate):
def __init__(self, parent):
QItemDelegate.__init__(self, parent)
self._parent = parent
self.star_path = QPainterPath()
self.star_path.moveTo(90, 50)
for i in range(1, 5):
@ -65,7 +66,8 @@ class LibraryDelegate(QItemDelegate):
painter.save()
if hasattr(QStyle, 'CE_ItemViewItem'):
QApplication.style().drawControl(QStyle.CE_ItemViewItem, option, painter)
QApplication.style().drawControl(QStyle.CE_ItemViewItem, option,
painter, self._parent)
elif option.state & QStyle.State_Selected:
painter.fillRect(option.rect, option.palette.highlight())
self.drawFocus(painter, option, option.rect)
@ -82,8 +84,8 @@ class LibraryDelegate(QItemDelegate):
draw_star()
painter.translate(-self.SIZE, 0)
i += 1
except Exception, e:
traceback.print_exc(e)
except:
traceback.print_exc()
painter.restore()
def createEditor(self, parent, option, index):
@ -859,6 +861,9 @@ class BooksView(TableView):
def search_done(self, ok):
self._search_done(self, ok)
def row_count(self):
return self._model.count()
class DeviceBooksView(BooksView):

View File

@ -206,6 +206,13 @@
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="search_count">
<property name="text">
<string>set in ui.py</string>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="clear_button">
<property name="toolTip">
@ -220,6 +227,64 @@
</property>
</widget>
</item>
<item>
<widget class="SavedSearchBox" name="saved_search">
<property name="toolTip">
<string>Choose saved search or enter name for new saved search</string>
</property>
<property name="minimumContentsLength">
<number>15</number>
</property>
<property name="maximumSize">
<size>
<width>150</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="copy_search_button">
<property name="toolTip">
<string>Copy current search text (instead of search name)</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../resources/images.qrc">
<normaloff>:/images/search_copy_saved.svg</normaloff>:/images/search_copy_saved.svg</iconset>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="save_search_button">
<property name="toolTip">
<string>Save current search under the name shown in the box</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../resources/images.qrc">
<normaloff>:/images/search_add_saved.svg</normaloff>:/images/search_add_saved.svg</iconset>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="delete_search_button">
<property name="toolTip">
<string>Delete current search and clear search box</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../resources/images.qrc">
<normaloff>:/images/search_delete_saved.svg</normaloff>:/images/search_delete_saved.svg</iconset>
</property>
</widget>
</item>
</layout>
</item>
<item row="2" column="0">
@ -686,6 +751,11 @@
<extends>QComboBox</extends>
<header>calibre.gui2.search_box</header>
</customwidget>
<customwidget>
<class>SavedSearchBox</class>
<extends>QComboBox</extends>
<header>calibre.gui2.search_box</header>
</customwidget>
</customwidgets>
<resources>
<include location="../../../resources/images.qrc"/>

View File

@ -7,6 +7,7 @@ __copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
__docformat__ = 'restructuredtext en'
from PyQt4.Qt import QComboBox, SIGNAL, Qt, QLineEdit, QStringList, pyqtSlot
from PyQt4.QtGui import QCompleter
from calibre.gui2 import config
@ -20,6 +21,10 @@ class SearchLineEdit(QLineEdit):
self.emit(SIGNAL('mouse_released(PyQt_PyObject)'), event)
QLineEdit.mouseReleaseEvent(self, event)
def focusOutEvent(self, event):
self.emit(SIGNAL('focus_out(PyQt_PyObject)'), event)
QLineEdit.focusOutEvent(self, event)
def dropEvent(self, ev):
if self.parent().help_state:
self.parent().normalize_state()
@ -176,3 +181,130 @@ class SearchBox2(QComboBox):
def search_as_you_type(self, enabled):
self.as_you_type = enabled
class SavedSearchBox(QComboBox):
'''
To use this class:
* Call initialize()
* Connect to the changed() signal from this widget
if you care about changes to the list of saved searches.
'''
def __init__(self, parent=None):
QComboBox.__init__(self, parent)
self.normal_background = 'rgb(255, 255, 255, 0%)'
self.line_edit = SearchLineEdit(self)
self.setLineEdit(self.line_edit)
self.connect(self.line_edit, SIGNAL('key_pressed(PyQt_PyObject)'),
self.key_pressed, Qt.DirectConnection)
self.connect(self.line_edit, SIGNAL('mouse_released(PyQt_PyObject)'),
self.mouse_released, Qt.DirectConnection)
self.connect(self.line_edit, SIGNAL('focus_out(PyQt_PyObject)'),
self.focus_out, Qt.DirectConnection)
self.connect(self, SIGNAL('activated(const QString&)'),
self.saved_search_selected)
completer = QCompleter(self) # turn off auto-completion
self.setCompleter(completer)
self.setEditable(True)
self.help_state = True
self.prev_search = ''
self.setInsertPolicy(self.NoInsert)
def initialize(self, _saved_searches, _search_box, colorize=False, help_text=_('Search')):
self.tool_tip_text = self.toolTip()
self.saved_searches = _saved_searches
self.search_box = _search_box
self.help_text = help_text
self.colorize = colorize
self.clear_to_help()
def normalize_state(self):
#print 'in normalize_state'
self.setEditText('')
self.line_edit.setStyleSheet(
'QLineEdit { color: black; background-color: %s; }' %
self.normal_background)
self.help_state = False
def clear_to_help(self):
#print 'in clear_to_help'
self.setToolTip(self.tool_tip_text)
self.initialize_saved_search_names()
self.setEditText(self.help_text)
self.line_edit.home(False)
self.help_state = True
self.line_edit.setStyleSheet(
'QLineEdit { color: gray; background-color: %s; }' %
self.normal_background)
def focus_out(self, event):
#print 'in focus_out'
if self.currentText() == '':
self.clear_to_help()
def key_pressed(self, event):
#print 'in key_pressed'
if self.help_state:
self.normalize_state()
def mouse_released(self, event):
if self.help_state:
self.normalize_state()
def saved_search_selected (self, qname):
#print 'in saved_search_selected'
qname = unicode(qname)
if qname is None or not qname.strip():
return
self.normalize_state()
self.search_box.set_search_string(u'search:"%s"' % qname)
self.setEditText(qname)
self.setToolTip(self.saved_searches.lookup(qname))
def initialize_saved_search_names(self):
#print 'in initialize_saved_search_names'
self.clear()
qnames = self.saved_searches.names()
self.addItems(qnames)
self.setCurrentIndex(-1)
# SIGNALed from the main UI
def delete_search_button_clicked(self):
#print 'in delete_search_button_clicked'
idx = self.currentIndex
if idx < 0:
return
self.saved_searches.delete(unicode(self.currentText()))
self.clear_to_help()
self.search_box.set_search_string('')
self.emit(SIGNAL('changed()'))
# SIGNALed from the main UI
def save_search_button_clicked(self):
#print 'in save_search_button_clicked'
name = unicode(self.currentText())
if self.help_state or not name.strip():
name = unicode(self.search_box.text()).replace('"', '')
self.saved_searches.delete(name)
self.saved_searches.add(name, unicode(self.search_box.text()))
# now go through an initialization cycle to ensure that the combobox has
# the new search in it, that it is selected, and that the search box
# references the new search instead of the text in the search.
self.clear_to_help()
self.normalize_state()
self.setCurrentIndex(self.findText(name))
self.saved_search_selected (name)
self.emit(SIGNAL('changed()'))
# SIGNALed from the main UI
def copy_search_button_clicked (self):
#print 'in copy_search_button_clicked'
idx = self.currentIndex();
if idx < 0:
return
self.search_box.set_search_string(self.saved_searches.lookup(unicode(self.currentText())))

View File

@ -12,7 +12,9 @@ from itertools import izip
from PyQt4.Qt import Qt, QTreeView, QApplication, \
QFont, SIGNAL, QSize, QIcon, QPoint, \
QAbstractItemModel, QVariant, QModelIndex
from calibre.gui2 import config, NONE
from calibre.gui2 import config, NONE, is_gui_thread, Dispatcher
from calibre.utils.search_query_parser import saved_searches
from calibre.library.database2 import Tag
class TagsView(QTreeView):
@ -31,6 +33,7 @@ class TagsView(QTreeView):
self.connect(self, SIGNAL('clicked(QModelIndex)'), self.toggle)
self.popularity.setChecked(config['sort_by_popularity'])
self.connect(self.popularity, SIGNAL('stateChanged(int)'), self.sort_changed)
self.connect(self, SIGNAL('need_refresh()'), self.recount, Qt.QueuedConnection)
@property
def match_all(self):
@ -51,6 +54,9 @@ class TagsView(QTreeView):
self.model().clear_state()
def recount(self, *args):
if not is_gui_thread():
# Re-call in GUI thread
return Dispatcher(self.recount)(*args)
ci = self.currentIndex()
if not ci.isValid():
ci = self.indexAt(QPoint(10, 10))
@ -119,9 +125,14 @@ class TagTreeItem(object):
def tag_data(self, role):
if role == Qt.DisplayRole:
return QVariant('[%d] %s'%(self.tag.count, self.tag.name))
if self.tag.count == 0:
return QVariant('%s'%(self.tag.name))
else:
return QVariant('[%d] %s'%(self.tag.count, self.tag.name))
if role == Qt.DecorationRole:
return self.icon_map[self.tag.state]
if role == Qt.ToolTipRole and self.tag.tooltip:
return QVariant(self.tag.tooltip)
return NONE
def toggle(self):
@ -129,36 +140,44 @@ class TagTreeItem(object):
self.tag.state = (self.tag.state + 1)%3
class TagsModel(QAbstractItemModel):
categories = [_('Authors'), _('Series'), _('Formats'), _('Publishers'), _('News'), _('Tags')]
row_map = ['author', 'series', 'format', 'publisher', 'news', 'tag']
categories = [_('Authors'), _('Series'), _('Formats'), _('Publishers'), _('News'), _('Tags'), _('Searches')]
row_map = ['author', 'series', 'format', 'publisher', 'news', 'tag', 'search']
def __init__(self, db, parent=None):
QAbstractItemModel.__init__(self, parent)
self.cmap = tuple(map(QIcon, [I('user_profile.svg'),
I('series.svg'), I('book.svg'), I('publisher.png'),
I('news.svg'), I('tags.svg')]))
I('news.svg'), I('tags.svg'), I('search.svg')]))
self.icon_map = [QIcon(), QIcon(I('plus.svg')),
QIcon(I('minus.svg'))]
self.db = db
self.ignore_next_search = 0
self.root_item = TagTreeItem()
data = self.db.get_categories(config['sort_by_popularity'])
data['search'] = self.get_search_nodes()
for i, r in enumerate(self.row_map):
c = TagTreeItem(parent=self.root_item,
data=self.categories[i], category_icon=self.cmap[i])
for tag in data[r]:
t = TagTreeItem(parent=c, data=tag, icon_map=self.icon_map)
t
TagTreeItem(parent=c, data=tag, icon_map=self.icon_map)
self.db.add_listener(self.database_changed)
self.connect(self, SIGNAL('need_refresh()'), self.refresh,
Qt.QueuedConnection)
def get_search_nodes(self):
l = []
for i in saved_searches.names():
l.append(Tag(i, tooltip=saved_searches.lookup(i)))
return l
def database_changed(self, event, ids):
self.emit(SIGNAL('need_refresh()'))
def refresh(self):
data = self.db.get_categories(config['sort_by_popularity'])
data['search'] = self.get_search_nodes()
for i, r in enumerate(self.row_map):
category = self.root_item.children[i]
names = [t.tag.name for t in category.children]

View File

@ -29,6 +29,7 @@ from calibre.utils.filenames import ascii_filename
from calibre.ptempfile import PersistentTemporaryFile
from calibre.utils.config import prefs, dynamic
from calibre.utils.ipc.server import Server
from calibre.utils.search_query_parser import saved_searches
from calibre.gui2 import warning_dialog, choose_files, error_dialog, \
question_dialog,\
pixmap_to_data, choose_dir, \
@ -140,9 +141,22 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
Ui_MainWindow.__init__(self)
self.setupUi(self)
self.setWindowTitle(__appname__)
self.search.initialize('main_search_history', colorize=True,
help_text=_('Search (For Advanced Search click the button to the left)'))
self.connect(self.clear_button, SIGNAL('clicked()'), self.search.clear)
self.connect(self.clear_button, SIGNAL('clicked()'), self.search_clear)
self.connect(self.clear_button, SIGNAL('clicked()'), self.saved_search.clear_to_help)
self.search_clear()
self.saved_search.initialize(saved_searches, self.search, colorize=True,
help_text=_('Saved Searches'))
self.connect(self.save_search_button, SIGNAL('clicked()'),
self.saved_search.save_search_button_clicked)
self.connect(self.delete_search_button, SIGNAL('clicked()'),
self.saved_search.delete_search_button_clicked)
self.connect(self.copy_search_button, SIGNAL('clicked()'),
self.saved_search.copy_search_button_clicked)
self.progress_indicator = ProgressIndicator(self)
self.verbose = opts.verbose
self.get_metadata = GetMetadata()
@ -511,6 +525,9 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
self.connect(self.tags_view,
SIGNAL('tags_marked(PyQt_PyObject, PyQt_PyObject)'),
self.search.search_from_tags)
self.connect(self.tags_view,
SIGNAL('tags_marked(PyQt_PyObject, PyQt_PyObject)'),
self.saved_search.clear_to_help)
self.connect(self.status_bar.tag_view_button,
SIGNAL('toggled(bool)'), self.toggle_tags_view)
self.connect(self.search,
@ -519,8 +536,9 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
self.connect(self.library_view.model(),
SIGNAL('count_changed(int)'), self.location_view.count_changed)
self.connect(self.library_view.model(), SIGNAL('count_changed(int)'),
self.tags_view.recount)
self.connect(self.search, SIGNAL('cleared()'), self.tags_view.clear)
self.tags_view.recount, Qt.QueuedConnection)
self.connect(self.search, SIGNAL('cleared()'), self.tags_view_clear)
self.connect(self.saved_search, SIGNAL('changed()'), self.tags_view.recount, Qt.QueuedConnection)
if not gprefs.get('quick_start_guide_added', False):
from calibre.ebooks.metadata import MetaInformation
mi = MetaInformation(_('Calibre Quick Start Guide'), ['John Schember'])
@ -762,8 +780,17 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
self.tag_match.setVisible(False)
self.popularity.setVisible(False)
def tags_view_clear(self):
self.search_count.setText(_("(all books)"))
self.tags_view.clear()
def search_clear(self):
self.search_count.setText(_("(all books)"))
self.search.clear()
def search_done(self, view, ok):
if view is self.current_view():
self.search_count.setText(_("(%d found)") % self.current_view().row_count())
self.search.search_done(ok)
def sync_cf_to_listview(self, current, previous):

View File

@ -299,6 +299,11 @@ class StanzaPage(QWizardPage, StanzaUI):
return FinishPage.ID
def commit(self):
from calibre.ebooks.conversion.config import load_defaults, save_defaults
recs = load_defaults('comic_input')
recs['dont_grayscale'] = True
save_defaults('comic_input', recs)
p = self.set_port()
if p is not None:
from calibre.library import server_config

View File

@ -409,11 +409,21 @@ class ResultCache(SearchQueryParser):
class Tag(object):
def __init__(self, name, id=None, count=0, state=0):
def __init__(self, name, id=None, count=0, state=0, tooltip=None):
self.name = name
self.id = id
self.count = count
self.state = state
self.tooltip = tooltip
def __unicode__(self):
return u'%s:%s:%s:%s:%s'%(self.name, self.count, self.id, self.state, self.tooltip)
def __str__(self):
return unicode(self).encode('utf-8')
def __repr__(self):
return str(self)
class LibraryDatabase2(LibraryDatabase):
@ -462,14 +472,14 @@ class LibraryDatabase2(LibraryDatabase):
not os.path.exists(self.dbpath.replace('metadata.db', 'MeTAdAtA.dB'))
# Upgrade database
while True:
meth = getattr(self, 'upgrade_version_%d'%self.user_version, None)
uv = self.user_version
meth = getattr(self, 'upgrade_version_%d'%uv, None)
if meth is None:
break
else:
print 'Upgrading database to version %d...'%(self.user_version+1)
print 'Upgrading database to version %d...'%(uv+1)
meth()
self.conn.commit()
self.user_version += 1
self.user_version = uv+1
self.data = ResultCache()
self.search = self.data.search
@ -712,6 +722,24 @@ class LibraryDatabase2(LibraryDatabase):
END TRANSACTION;
''')
def upgrade_version_8(self):
'Add Tag Browser views'
def create_tag_browser_view(table_name, column_name):
self.conn.executescript('''
DROP VIEW IF EXISTS tag_browser_{tn};
CREATE VIEW tag_browser_{tn} AS SELECT
id,
name,
(SELECT COUNT(id) FROM books_{tn}_link WHERE {cn}={tn}.id) count
FROM {tn};
'''.format(tn=table_name, cn=column_name))
for tn in ('authors', 'tags', 'publishers', 'series'):
cn = tn[:-1]
if tn == 'series':
cn = tn
create_tag_browser_view(tn, cn)
def last_modified(self):
''' Return last modified time as a UTC datetime object'''
@ -929,7 +957,7 @@ class LibraryDatabase2(LibraryDatabase):
im.convert('RGB').save(path, 'JPEG')
def all_formats(self):
formats = self.conn.get('SELECT format from data')
formats = self.conn.get('SELECT DISTINCT format from data')
if not formats:
return set([])
return set([f[0] for f in formats])
@ -1083,50 +1111,44 @@ class LibraryDatabase2(LibraryDatabase):
return self.conn.get('SELECT script FROM feeds WHERE id=?', (id,), all=False)
def get_categories(self, sort_on_count=False):
categories = {}
def get(name, category, field='name'):
ans = self.conn.get('SELECT DISTINCT %s FROM %s'%(field, name))
ans = [x[0].strip() for x in ans]
try:
ans.remove('')
except ValueError: pass
categories[category] = list(map(Tag, ans))
tags = categories[category]
if name != 'data':
for tag in tags:
id = self.conn.get('SELECT id FROM %s WHERE %s=?'%(name,
field), (tag.name,), all=False)
tag.id = id
for tag in tags:
if tag.id is not None:
tag.count = self.conn.get('SELECT COUNT(id) FROM books_%s_link WHERE %s=?'%(name, category), (tag.id,), all=False)
else:
for tag in tags:
tag.count = self.conn.get('SELECT COUNT(format) FROM data WHERE format=?',
(tag.name,), all=False)
tags.sort(reverse=sort_on_count, cmp=(lambda
x,y:cmp(x.count,y.count)) if sort_on_count else (lambda
x,y:cmp(x.name, y.name)))
for x in (('authors', 'author'), ('tags', 'tag'), ('publishers', 'publisher'),
('series', 'series')):
get(*x)
get('data', 'format', 'format')
self.conn.executescript(u'''
CREATE TEMP VIEW IF NOT EXISTS tag_browser_news AS SELECT DISTINCT
id,
name,
(SELECT COUNT(id) FROM books_tags_link WHERE tag=x.id) count
FROM tags as x WHERE name!="{0}" AND id IN
(SELECT DISTINCT tag FROM books_tags_link WHERE book IN
(SELECT DISTINCT book FROM books_tags_link WHERE tag IN
(SELECT id FROM tags WHERE name="{0}")));
'''.format(_('News')))
self.conn.commit()
categories['news'] = []
newspapers = self.conn.get('SELECT name FROM tags WHERE id IN (SELECT DISTINCT tag FROM books_tags_link WHERE book IN (select book from books_tags_link where tag IN (SELECT id FROM tags WHERE name=?)))', (_('News'),))
if newspapers:
newspapers = [f[0] for f in newspapers]
try:
newspapers.remove(_('News'))
except ValueError:
pass
categories['news'] = list(map(Tag, newspapers))
for tag in categories['news']:
tag.count = self.conn.get('SELECT COUNT(id) FROM books_tags_link WHERE tag IN (SELECT DISTINCT id FROM tags WHERE name=?)', (tag.name,), all=False)
categories = {}
for x in ('tags', 'series', 'news', 'publishers', 'authors'):
query = 'SELECT id,name,count FROM tag_browser_'+x
if sort_on_count:
query += ' ORDER BY count DESC'
else:
query += ' ORDER BY name ASC'
data = self.conn.get(query)
category = x if x in ('series', 'news') else x[:-1]
categories[category] = [Tag(r[1], count=r[2], id=r[0]) for r in data]
categories['format'] = []
for fmt in self.conn.get('SELECT DISTINCT format FROM data'):
fmt = fmt[0]
count = self.conn.get('SELECT COUNT(id) FROM data WHERE format="%s"'%fmt,
all=False)
categories['format'].append(Tag(fmt, count=count))
if sort_on_count:
categories['format'].sort(cmp=lambda x,y:cmp(x.count, y.count),
reverse=True)
else:
categories['format'].sort(cmp=lambda x,y:cmp(x.name, y.name))
return categories
def tags_older_than(self, tag, delta):
tag = tag.lower().strip()
now = nowf()

View File

@ -6,8 +6,9 @@ __copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'
import sys, os, shutil, cPickle, textwrap, stat
from subprocess import check_call
from calibre import __appname__, prints
from calibre import __appname__, prints, guess_type
from calibre.constants import islinux, isfreebsd
from calibre.customize.ui import all_input_formats
entry_points = {
@ -375,14 +376,25 @@ class PostInstall:
check_call('xdg-icon-resource install --size 128 calibre-viewer.png calibre-viewer', shell=True)
self.icon_resources.append(('apps', 'calibre-viewer', '128'))
mimetypes = set([])
for x in all_input_formats():
mt = guess_type('dummy.'+x)[0]
if mt and 'chemical' not in mt:
mimetypes.add(mt)
def write_mimetypes(f):
f.write('MimeType=%s;\n'%';'.join(mimetypes))
f = open('calibre-lrfviewer.desktop', 'wb')
f.write(VIEWER)
f.close()
f = open('calibre-ebook-viewer.desktop', 'wb')
f.write(EVIEWER)
write_mimetypes(f)
f.close()
f = open('calibre-gui.desktop', 'wb')
f.write(GUI)
write_mimetypes(f)
f.close()
des = ('calibre-gui.desktop', 'calibre-lrfviewer.desktop',
'calibre-ebook-viewer.desktop')
@ -465,7 +477,8 @@ def opts_and_exts(name, op, exts):
opts = ' '.join(options(op))
exts.extend([i.upper() for i in exts])
exts='|'.join(exts)
return '_'+name+'()'+\
fname = name.replace('-', '_')
return '_'+fname+'()'+\
'''
{
local cur prev opts
@ -498,7 +511,7 @@ def opts_and_exts(name, op, exts):
esac
}
complete -o filenames -F _'''%(opts,exts) + name + ' ' + name +"\n\n"
complete -o filenames -F _'''%(opts,exts) + fname + ' ' + name +"\n\n"
VIEWER = '''\
@ -521,11 +534,10 @@ Version=1.0
Type=Application
Name=E-book Viewer
GenericName=Viewer for E-books
Comment=Viewer for E-books
Comment=Viewer for E-books in all the major formats
TryExec=ebook-viewer
Exec=ebook-viewer %F
Icon=calibre-viewer
MimeType=application/epub+zip;
Categories=Graphics;Viewer;
'''
@ -536,7 +548,7 @@ Version=1.0
Type=Application
Name=calibre
GenericName=E-book library management
Comment=E-book library management
Comment=E-book library management: Convert, view, share, catalogue all your e-books
TryExec=calibre
Exec=calibre
Icon=calibre-gui

View File

@ -8,13 +8,13 @@ msgstr ""
"Project-Id-Version: calibre\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2010-03-12 07:36+0000\n"
"PO-Revision-Date: 2010-03-16 00:45+0000\n"
"PO-Revision-Date: 2010-03-17 02:12+0000\n"
"Last-Translator: Kovid Goyal <Unknown>\n"
"Language-Team: Arabic <ar@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2010-03-16 04:44+0000\n"
"X-Launchpad-Export-Date: 2010-03-18 04:32+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43

View File

@ -7,13 +7,13 @@ msgstr ""
"Project-Id-Version: calibre 0.4.51\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-03-12 07:36+0000\n"
"PO-Revision-Date: 2010-03-15 23:10+0000\n"
"Last-Translator: svilborg <Unknown>\n"
"PO-Revision-Date: 2010-03-17 02:27+0000\n"
"Last-Translator: Kovid Goyal <Unknown>\n"
"Language-Team: bg\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2010-03-16 04:44+0000\n"
"X-Launchpad-Export-Date: 2010-03-18 04:32+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
"Generated-By: pygettext.py 1.5\n"
@ -4132,7 +4132,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:366
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:193
msgid "Preferences"
msgstr ""
msgstr "Предпочитания"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:505
msgid ""
@ -4168,7 +4168,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:513
msgid " seconds"
msgstr ""
msgstr " секунди"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:514
msgid "Choose &language (requires restart):"
@ -4232,23 +4232,23 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:531
msgid "Toolbar"
msgstr ""
msgstr "Лента с инструменти"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:532
msgid "Large"
msgstr ""
msgstr "Голям"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:533
msgid "Medium"
msgstr ""
msgstr "Среден"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:534
msgid "Small"
msgstr ""
msgstr "Малък"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:535
msgid "&Button size in toolbar"
msgstr ""
msgstr "Размер на &бутоните в лентата с инструменти"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:536
msgid "Show &text in toolbar buttons"
@ -4325,20 +4325,22 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:210
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:117
msgid "&Username:"
msgstr ""
msgstr "&Потребителско име:"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:555
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:59
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:211
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:119
msgid "&Password:"
msgstr ""
msgstr "П&арола:"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:556
msgid ""
"If you leave the password blank, anyone will be able to access your book "
"collection using the web interface."
msgstr ""
"Ако оставите празно полето с паролата, всеки ще може да достъпи вашата "
"колекция от книга през уеб интерфейса."
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:557
msgid ""
@ -4362,15 +4364,15 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:561
msgid "&Start Server"
msgstr ""
msgstr "&Стартиране на Сървъра"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:562
msgid "St&op Server"
msgstr ""
msgstr "С&пиране на Сървъра"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:563
msgid "&Test Server"
msgstr ""
msgstr "&Тестване на Сървъра"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:564
msgid "Run server &automatically on startup"
@ -4396,6 +4398,8 @@ msgid ""
"Here you can customize the behavior of Calibre by controlling what plugins "
"it uses."
msgstr ""
"Тук можете да персонализирате поведението на Calibre, контролирайки "
"приставките, които той използва."
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:569
msgid "Enable/&Disable plugin"
@ -4419,7 +4423,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:575
msgid "&Add"
msgstr ""
msgstr "&Добавяне"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/device_debug.py:21
msgid "Getting debug information"
@ -4464,7 +4468,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:48
msgid "Are you sure?"
msgstr ""
msgstr "Сигурни ли сте?"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:50
msgid "&Show this warning again"
@ -4472,7 +4476,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/conversion_error_ui.py:41
msgid "ERROR"
msgstr ""
msgstr "ГРЕШКА"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:63
msgid "Author Sort"
@ -4480,7 +4484,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:65
msgid "ISBN"
msgstr ""
msgstr "ISBN"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:165
msgid "Finding metadata..."
@ -4496,7 +4500,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:189
msgid "Warning"
msgstr ""
msgstr "Внимание"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:190
msgid "Could not fetch metadata from:"
@ -4606,16 +4610,16 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:147
msgid "No change"
msgstr ""
msgstr "Без промяна"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:148
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:366
msgid " stars"
msgstr ""
msgstr " звезди"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:150
msgid "Add ta&gs: "
msgstr ""
msgstr "Добавяне на &етикети: "
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:152
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:153
@ -4642,7 +4646,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:123
msgid "Not a valid picture"
msgstr ""
msgstr "Невалидна картинка"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:136
msgid "Choose formats for "
@ -4651,7 +4655,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:137
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1202
msgid "Books"
msgstr ""
msgstr "Книги"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:165
msgid "No permission"
@ -4659,12 +4663,12 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:166
msgid "You do not have permission to read the following files:"
msgstr ""
msgstr "Нямате права за четене на следните файлове:"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:189
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:190
msgid "No format selected"
msgstr ""
msgstr "Няма избран формат"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:201
msgid "Could not read metadata"
@ -4694,15 +4698,15 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:406
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:411
msgid "This ISBN number is valid"
msgstr ""
msgstr "Това е валиден ISBN номер"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:414
msgid "This ISBN number is invalid"
msgstr ""
msgstr "Това е невалиден ISBN номер"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:510
msgid "Downloading cover..."
msgstr ""
msgstr "Изтегляне на обложка..."
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:522
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:527
@ -4722,6 +4726,8 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:528
msgid "Could not find cover for this book. Try specifying the ISBN first."
msgstr ""
"За тази книга не може да бъде намерена обложка. Опитайте се да посочите ISBN "
"."
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:540
msgid "Bad cover"
@ -4746,6 +4752,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:602
msgid "You must specify at least one of ISBN, Title, Authors or Publisher"
msgstr ""
"Трябва да посочите поне едно от ISBN, Заглавие, Автори или Производител"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:671
msgid "Permission denied"
@ -4778,7 +4785,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:377
msgid "IS&BN:"
msgstr ""
msgstr "IS&BN:"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:378
msgid "Publishe&d:"
@ -4786,15 +4793,15 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:381
msgid "dd MMM yyyy"
msgstr ""
msgstr "dd MMM yyyy"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:382
msgid "&Date:"
msgstr ""
msgstr "&Дата:"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:383
msgid "&Comments"
msgstr ""
msgstr "&Коментари"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384
msgid "&Fetch metadata from server"
@ -4802,7 +4809,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:385
msgid "Available Formats"
msgstr ""
msgstr "Налични формати"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:386
msgid "Add a new format for this book to the database"
@ -4834,7 +4841,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress.py:52
msgid "Aborting..."
msgstr ""
msgstr "Прекъсване..."
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:119
msgid "Need username and password"
@ -4854,16 +4861,16 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:193
msgid "%d days, %d hours and %d minutes ago"
msgstr ""
msgstr "преди %d дни, %d часа и %d минути"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:195
msgid "Last downloaded"
msgstr ""
msgstr "Последно изтегляне"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:215
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:190
msgid "Schedule news download"
msgstr ""
msgstr "График за изтегляне на новини"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:218
msgid "Add a custom news source"
@ -4893,43 +4900,43 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:196
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:206
msgid "Every "
msgstr ""
msgstr "Всеки "
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:197
msgid "day"
msgstr ""
msgstr "ден"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:198
msgid "Monday"
msgstr ""
msgstr "Понеделник"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:199
msgid "Tuesday"
msgstr ""
msgstr "Вторник"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:200
msgid "Wednesday"
msgstr ""
msgstr "Сряда"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:201
msgid "Thursday"
msgstr ""
msgstr "Четвъртък"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:202
msgid "Friday"
msgstr ""
msgstr "Петък"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:203
msgid "Saturday"
msgstr ""
msgstr "Събота"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:204
msgid "Sunday"
msgstr ""
msgstr "Неделя"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:205
msgid "at"
msgstr ""
msgstr "в"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:207
msgid ""
@ -4941,7 +4948,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:220
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:263
msgid " days"
msgstr ""
msgstr " дни"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:209
msgid "&Account"
@ -4965,7 +4972,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:217
msgid "&Advanced"
msgstr ""
msgstr "Д&опълнителни"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:218
msgid "&Download now"
@ -4983,7 +4990,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:36
msgid "contains"
msgstr ""
msgstr "съдържа"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:37
msgid "The text to search for. It is interpreted as a regular expression."
@ -5046,7 +5053,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:124
msgid " "
msgstr ""
msgstr " "
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:125
msgid ""
@ -5060,7 +5067,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor.py:66
msgid "Are your sure?"
msgstr ""
msgstr "Сигурни ли сте?"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor.py:67
msgid ""
@ -5070,7 +5077,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123
msgid "Tag Editor"
msgstr ""
msgstr "Редактор на етикети"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124
msgid "A&vailable tags"
@ -5084,7 +5091,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:127
msgid "Apply tag to current book"
msgstr ""
msgstr "Добавяне на етикет към текущата книга"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:129
msgid "A&pplied tags"
@ -5119,7 +5126,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:52
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:115
msgid "&Test"
msgstr ""
msgstr "Про&ба"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:127
msgid "No recipe selected"
@ -5162,7 +5169,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:185
msgid "Already exists"
msgstr ""
msgstr "Вече съществува"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:186
msgid "This feed has already been added to the recipe"
@ -5172,7 +5179,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:236
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:286
msgid "Invalid input"
msgstr ""
msgstr "Невалидни входящи данни"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:228
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:237
@ -5327,7 +5334,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:114
msgid "Regular &expression"
msgstr ""
msgstr "&Регулярен израз"
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:116
msgid "File &name:"
@ -5335,11 +5342,11 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:117
msgid "Test"
msgstr ""
msgstr "Проба"
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:118
msgid "Title:"
msgstr ""
msgstr "Заглавие:"
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:119
msgid "Regular expression (?P&lt;title&gt;)"
@ -5356,11 +5363,11 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:92
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:94
msgid "No match"
msgstr ""
msgstr "Няма съвпадение"
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:121
msgid "Authors:"
msgstr ""
msgstr "Автори:"
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:122
msgid "Regular expression (?P<author>)"
@ -5396,7 +5403,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:54
msgid "Status"
msgstr ""
msgstr "Състояние"
#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:55
msgid "Progress"
@ -5444,16 +5451,16 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:171
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1151
msgid "Size (MB)"
msgstr ""
msgstr "Размер (MB)"
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:172
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1152
msgid "Date"
msgstr ""
msgstr "Дата"
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:174
msgid "Rating"
msgstr ""
msgstr "Рейтинг"
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:358
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:364
@ -5467,11 +5474,11 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:375
msgid "Book <font face=\"serif\">%s</font> of %s."
msgstr ""
msgstr "Книга <font face=\"serif\">%s</font> of %s."
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:889
msgid "Not allowed"
msgstr ""
msgstr "Не е позволено"
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:890
msgid ""
@ -5514,7 +5521,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:160
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:433
msgid "No matches found"
msgstr ""
msgstr "Не са намерени съвпадения"
#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:128
msgid "LRF Viewer"
@ -5530,21 +5537,21 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:131
msgid "Next Page"
msgstr ""
msgstr "Следваща страница"
#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:132
msgid "Previous Page"
msgstr ""
msgstr "Предишна страница"
#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:133
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:182
msgid "Back"
msgstr ""
msgstr "Назад"
#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:134
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:183
msgid "Forward"
msgstr ""
msgstr "Напред"
#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:135
msgid "Next match"
@ -5557,7 +5564,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:137
msgid "Configure"
msgstr ""
msgstr "Настройки"
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:25
msgid "Use the library located at the specified path."
@ -5585,7 +5592,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:89
msgid "%s is already running."
msgstr ""
msgstr "%s вече се изпълнява."
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:92
msgid "may be running in the system tray, in the"
@ -5606,7 +5613,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:101
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:113
msgid "try deleting the file"
msgstr ""
msgstr "опитайте да изтриете файла"
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:331
msgid "calibre"
@ -5618,11 +5625,11 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:335
msgid "Alt+S"
msgstr ""
msgstr "Alt+S"
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:336
msgid "&Search:"
msgstr ""
msgstr "&Търсене:"
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:337
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:338
@ -5633,7 +5640,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:339
msgid "Reset Quick Search"
msgstr ""
msgstr "Изчистване на бързото търсене"
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:341
msgid "Sort by &popularity"
@ -5649,7 +5656,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:344
msgid "Add books"
msgstr ""
msgstr "Добавяне на книги"
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:345
msgid "A"
@ -5658,11 +5665,11 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:346
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:347
msgid "Remove books"
msgstr ""
msgstr "Премахване на книги"
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:348
msgid "Del"
msgstr ""
msgstr "Изтр."
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:349
msgid "Edit meta information"
@ -5704,7 +5711,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:358
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:316
msgid "View"
msgstr ""
msgstr "Преглед"
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:359
msgid "V"
@ -5740,7 +5747,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:368
msgid "Ctrl+P"
msgstr ""
msgstr "Ctrl+P"
#: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:20
msgid ""
@ -5754,7 +5761,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:60
msgid "&Quit"
msgstr ""
msgstr "&Изход"
#: /home/kovid/work/calibre/src/calibre/gui2/main_window.py:85
msgid "ERROR: Unhandled exception"
@ -5762,7 +5769,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:89
msgid "Book has neither title nor ISBN"
msgstr ""
msgstr "Книгата няма нито заглавие нито ISBN"
#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:115
msgid "No matches found for this book"
@ -5770,7 +5777,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:71
msgid "Search"
msgstr ""
msgstr "Търсене"
#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:58
msgid "Press a key..."
@ -5787,7 +5794,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:131
#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:223
msgid " or "
msgstr ""
msgstr " или "
#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:133
#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:68
@ -5800,7 +5807,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:223
msgid "Keys"
msgstr ""
msgstr "Клавиши"
#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:225
msgid "Double click to change"
@ -5812,21 +5819,21 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:69
msgid "&Custom"
msgstr ""
msgstr "Потреб&ителски"
#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:70
msgid "&Shortcut:"
msgstr ""
msgstr "&Бърз клавиш:"
#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:71
#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:76
msgid "Click to change"
msgstr ""
msgstr "Щракнете, за да промените"
#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:73
#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:78
msgid "Clear"
msgstr ""
msgstr "Изчистване"
#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:75
msgid "&Alternate shortcut:"
@ -5860,7 +5867,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:132
msgid "Authors"
msgstr ""
msgstr "Автори"
#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:132
msgid "Publishers"
@ -5919,7 +5926,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:178
msgid "&Restore"
msgstr ""
msgstr "&Възстановяване"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:180
msgid "&Donate to support calibre"
@ -5927,7 +5934,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:185
msgid "&Restart"
msgstr ""
msgstr "&Рестартиране"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:224
msgid "<p>For help see the: <a href=\"%s\">User Manual</a><br>"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -8,13 +8,13 @@ msgstr ""
"Project-Id-Version: calibre\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2010-03-12 07:36+0000\n"
"PO-Revision-Date: 2010-03-12 06:56+0000\n"
"Last-Translator: Kovid Goyal <Unknown>\n"
"PO-Revision-Date: 2010-03-26 19:48+0000\n"
"Last-Translator: Peregrinus <peregrin_bral2@seznam.cz>\n"
"Language-Team: Czech <cs@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2010-03-13 04:48+0000\n"
"X-Launchpad-Export-Date: 2010-03-27 04:58+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43
@ -766,7 +766,7 @@ msgstr "Cesta k grafickámu souboru, který bude použit jako náhled"
#: /home/kovid/work/calibre/src/calibre/ebooks/chm/reader.py:58
msgid "Path to a txt file containing a comment."
msgstr ""
msgstr "Cesta k txt souboru obsahující komentář."
#: /home/kovid/work/calibre/src/calibre/ebooks/chm/reader.py:61
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:607
@ -1250,6 +1250,9 @@ msgid ""
"1.5em. Spacing removal will not work if the source file does not use "
"paragraphs (<p> or <div> tags)."
msgstr ""
"Odstraní mezery mezi odstavci. Dále nastaví odsazení prvního řádku na 1,5em. "
"Odstranění mezer nebude fungovat, pokud nejsou ve zdrojovém souboru odstavce "
"označeny (tagy <p> nebo <div>)."
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:318
msgid ""
@ -1338,11 +1341,11 @@ msgstr "Nastavit Autory. Více autorů by mělo být odděleno znakem &."
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:420
msgid "The version of the title to be used for sorting. "
msgstr ""
msgstr "Varianta názvu, která bude použita při řazení. "
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:424
msgid "String to be used when sorting by author. "
msgstr ""
msgstr "Řetězec, který bude použit při řazení dle autora. "
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:428
msgid "Set the cover to the specified file or URL"

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2010-03-16 04:44+0000\n"
"X-Launchpad-Export-Date: 2010-03-17 04:37+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
"Generated-By: pygettext.py 1.5\n"

View File

@ -11,18 +11,18 @@ msgstr ""
"Project-Id-Version: es\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-03-12 07:36+0000\n"
"PO-Revision-Date: 2010-03-16 00:49+0000\n"
"Last-Translator: Kovid Goyal <Unknown>\n"
"PO-Revision-Date: 2010-03-19 06:02+0000\n"
"Last-Translator: Meme de la Torre <Unknown>\n"
"Language-Team: Spanish\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2010-03-16 04:45+0000\n"
"X-Launchpad-Export-Date: 2010-03-20 04:41+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43
msgid "Does absolutely nothing"
msgstr "No hacer nada en absoluto"
msgstr "No hace nada en lo absoluto"
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:46
#: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:72
@ -153,7 +153,7 @@ msgstr "Base"
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:172
msgid "File type"
msgstr "Tipo de fichero"
msgstr "Tipo de archivo"
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:206
msgid "Metadata reader"
@ -161,7 +161,7 @@ msgstr "Lector de metadatos"
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:237
msgid "Metadata writer"
msgstr "Escritor de metadados"
msgstr "Escritor de metadatos"
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:263
msgid "Catalog generator"
@ -173,16 +173,16 @@ msgid ""
"linked files. This plugin is run every time you add an HTML file to the "
"library."
msgstr ""
"Seguir todos los enlaces locales de un fichero HTML y crear un archivo ZIP "
"con los ficheros enlazados. Este complemento se ejecuta cada vez que se "
"añade un fichero HTML a la biblioteca."
"Seguir todos los enlaces locales de un archivo HTML y crear un archivo ZIP "
"con los archivos enlazados. Este complemento se ejecuta cada vez que se "
"añade un archivo HTML a la biblioteca."
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:50
msgid ""
"Character encoding for the input HTML files. Common choices include: cp1252, "
"latin1, iso-8859-1 and utf-8."
msgstr ""
"Codificación de los ficheros HTML de entrada. Las opciones comunes incluyen: "
"Codificación de los archivos HTML de entrada. Las opciones comunes incluyen: "
"cp1252, latin1, iso-8859-1 and utf-8."
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:57
@ -197,7 +197,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:89
msgid "Extract cover from comic files"
msgstr "Extraer la portada de los ficheros de cómic"
msgstr "Extraer la portada de los archivos de cómic"
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:110
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:121
@ -235,11 +235,11 @@ msgstr "Leer metadatos de libros electrónicos en archivos ZIP"
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:375
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:385
msgid "Set metadata in %s files"
msgstr "Asignar metadatos a los ficheros %s"
msgstr "Asignar metadatos a los archivos %s"
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:353
msgid "Set metadata from %s files"
msgstr "Establecer metadatos desde ficheros %s"
msgstr "Establecer metadatos desde archivos %s"
#: /home/kovid/work/calibre/src/calibre/customize/conversion.py:102
msgid "Conversion Input"
@ -394,7 +394,7 @@ msgstr "Complementos instalados"
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:32
msgid "Mapping for filetype plugins"
msgstr "Asociaciones para complementos por tipos de fichero"
msgstr "Asociaciones para complementos por tipos de archivo"
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:33
msgid "Local plugin customization"
@ -704,12 +704,12 @@ msgstr "Lista ordenada de formatos que el dispositivo aceptará"
#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:32
msgid "Place files in sub directories if the device supports them"
msgstr "Colocar los ficheros en subdirectorios si el dispositivo los soporta"
msgstr "Colocar los archivos en subdirectorios si el dispositivo los soporta"
#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:34
#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:78
msgid "Read metadata from files on device"
msgstr "Leer los metadatos de los ficheros del dispositivo"
msgstr "Leer los metadatos de los archivos del dispositivo"
#: /home/kovid/work/calibre/src/calibre/devices/usbms/deviceconfig.py:36
msgid "Template to control how books are saved"
@ -783,7 +783,7 @@ msgstr "Ruta a un archivo TXT que contenga un comentario."
#: /home/kovid/work/calibre/src/calibre/ebooks/chm/reader.py:61
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:607
msgid "Extract thumbnail from LRF file"
msgstr "Extraer la miniatura del fichero LRF"
msgstr "Extraer la miniatura del archivo LRF"
#: /home/kovid/work/calibre/src/calibre/ebooks/chm/reader.py:62
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:608
@ -811,7 +811,7 @@ msgid ""
"Extract cover from LRF file. Note that the LRF format has no defined cover, "
"so we use some heuristics to guess the cover."
msgstr ""
"Extraer la portada de un fichero LRF. Nótese que el formato LRF no define "
"Extraer la portada de un archivo LRF. Nótese que el formato LRF no define "
"una portada, así que se usa heurística para encontrar la portada."
#: /home/kovid/work/calibre/src/calibre/ebooks/chm/reader.py:69
@ -910,7 +910,7 @@ msgid ""
"Don't sort the files found in the comic alphabetically by name. Instead use "
"the order they were added to the comic."
msgstr ""
"No ordenar los ficheros encontrados en el cómic por nombre alfabético. En su "
"No ordenar los archivos encontrados en el cómic por nombre alfabético. En su "
"lugar usar el orden en el que fueron agregados al cómic."
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:308
@ -957,27 +957,27 @@ msgid ""
"\n"
"For full documentation of the conversion system see\n"
msgstr ""
"fichero_entrada fichero-salida [opciones]\n"
"archivo_entrada archivo-salida [opciones]\n"
"\n"
"Convertir un libro electrónico de un formato a otro.\n"
"\n"
"fichero_entrada es la entrada y fichero_salida es la salida. Deben indicarse "
"archivo_entrada es la entrada y archivo_salida es la salida. Deben indicarse "
"ambos como los dos primeros argumentos de la orden.\n"
"\n"
"El formato del libro electrónico de salida se define a partir de la "
"extensión de fichero_salida. fichero_salida puede también tener el formato "
"especial .EXT, donde EXT es la extensión del fichero de salida. En este "
"caso, el nombre del fichero de salida se obtiene a partir del nombre del "
"fichero de entrada. Tenga en cuenta que los nombres de fichero no deben "
"comenzar con guión. Por último, si fichero_salida no tiene extensión, se "
"extensión de archivo_salida. archivo_salida puede también tener el formato "
"especial .EXT, donde EXT es la extensión del archivo de salida. En este "
"caso, el nombre del archivo de salida se obtiene a partir del nombre del "
"archivo de entrada. Tenga en cuenta que los nombres de archivo no deben "
"comenzar con guión. Por último, si archivo_salida no tiene extensión, se "
"interpreta como un directorio y se generará un \"open eBook\" (OEB), formado "
"por un conjunto de ficheros HTML, en ese directorio. Estos ficheros son los "
"por un conjunto de archivos HTML, en ese directorio. Estos archivos son los "
"que normalmente se habrían pasado al complemento de salida.\n"
"\n"
"Tras especificar los ficheros de entrada y salida, se puede personalizar la "
"Tras especificar los archivos de entrada y salida, se puede personalizar la "
"conversión indicando varias opciones. Las opciones disponibles dependen de "
"los tipos de fichero de entrada y salida. Para obtener ayuda sobre estas "
"opciones, utilice la opción -h después de los nombres de fichero de entrada "
"los tipos de archivo de entrada y salida. Para obtener ayuda sobre estas "
"opciones, utilice la opción -h después de los nombres de archivo de entrada "
"y salida.\n"
"\n"
"Para una documentación completa del sistema de conversión, ver\n"
@ -988,7 +988,7 @@ msgstr "OPCIONES DE ENTRADA"
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:98
msgid "Options to control the processing of the input %s file"
msgstr "Opciones para controlar el procesamiento del fichero de entrada %s."
msgstr "Opciones para controlar el procesamiento del archivo de entrada %s."
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:104
msgid "OUTPUT OPTIONS"
@ -1012,7 +1012,7 @@ msgid ""
"source file has a Table of Contents, it will be used in preference to the "
"automatically generated one."
msgstr ""
"Controla la generación automática del Índice. Por defecto, si el fichero de "
"Controla la generación automática del Índice. Por defecto, si el archivo de "
"entrada tiene un Índice, se usará éste en lugar del generado automáticamente."
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:155
@ -1228,7 +1228,7 @@ msgid ""
"rules."
msgstr ""
"La ruta a una hoja de estilo CSS o CSS en bruto. Este CSS se agregará a las "
"reglas de estilo del fichero de origen, por lo que puede usarse para anular "
"reglas de estilo del archivo de origen, por lo que puede usarse para anular "
"dichas reglas."
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:278
@ -1284,7 +1284,7 @@ msgid ""
msgstr ""
"Eliminar el espacio entre párrafos. También establece sangrado en la primera "
"línea de cada párrafo de 1,5em. La eliminación del espacio no funciona si el "
"fichero de origen no define párrafos (etiquetas <p> o <div>)."
"archivo de origen no define párrafos (etiquetas <p> o <div>)."
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:318
msgid ""
@ -1318,7 +1318,7 @@ msgid ""
"the source file is a cover and you are specifying an external cover."
msgstr ""
"Eliminar la primera imagen del libro electrónico de entrada. Es útil si la "
"primera imagen del fichero es una portada y se está especificando una "
"primera imagen del archivo es una portada y se está especificando una "
"portada externa."
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:346
@ -1335,7 +1335,7 @@ msgid ""
"source file. This may make things worse, so use with care."
msgstr ""
"Intentar detectar y corregir saltos de línea manuales y otros problemas en "
"el fichero de origen. Esto puede empeorar las cosas, úsese con cuidado."
"el archivo de origen. Esto puede empeorar las cosas, úsese con cuidado."
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:362
msgid "Use a regular expression to try and remove the header."
@ -1359,8 +1359,8 @@ msgid ""
"Read metadata from the specified OPF file. Metadata read from this file will "
"override any metadata in the source file."
msgstr ""
"Leer metadatos del fichero OPF especificado. Los metadatos leídos de este "
"fichero anularán cualquier metadato que haya en el fichero de origen."
"Leer metadatos del archivo OPF especificado. Los metadatos leídos de este "
"archivo anularán cualquier metadato que haya en el archivo de origen."
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:396
msgid ""
@ -1486,7 +1486,7 @@ msgid ""
"Extract the contents of the generated EPUB file to the specified directory. "
"The contents of the directory are first deleted, so be careful."
msgstr ""
"Extraer los contenidos del fichero EPUB generado al directorio especificado. "
"Extraer los contenidos del archivo EPUB generado al directorio especificado. "
"El contenido del directorio será borrado, así que tenga cuidado."
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:64
@ -1497,10 +1497,10 @@ msgid ""
"if your source file contains a very large number of page breaks, you should "
"turn off splitting on page breaks."
msgstr ""
"Desactivar la división en los saltos de página. Normalmente los ficheros de "
"entrada se dividen automáticamente en dos ficheros en cada salto de página. "
"Desactivar la división en los saltos de página. Normalmente los archivos de "
"entrada se dividen automáticamente en dos archivos en cada salto de página. "
"Esto genera un libro electrónico que se procesa más rápidamente y con menos "
"recursos. Sin embargo, la división es un proceso lento y, si el fichero de "
"recursos. Sin embargo, la división es un proceso lento y, si el archivo de "
"entrada contiene muchos saltos de página, es mejor desactivar la división."
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:75
@ -1509,9 +1509,9 @@ msgid ""
"most EPUB readers cannot handle large file sizes. The default of %defaultKB "
"is the size required for Adobe Digital Editions."
msgstr ""
"Dividir todos los ficheros HTML mayores de este tamaño (en kB). Esto es "
"Dividir todos los archivos HTML mayores de este tamaño (en kB). Esto es "
"necesario porque la mayor parte de los lectores EPUB no pueden manejar "
"ficheros muy grandes. El valor por defecto de %defaultKB is el tamaño "
"archivos muy grandes. El valor por defecto de %defaultKB is el tamaño "
"requerido por Adobe Digital Editions."
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:82
@ -1548,7 +1548,7 @@ msgid ""
"Traverse links in HTML files breadth first. Normally, they are traversed "
"depth first."
msgstr ""
"Hacer una búsqueda en anchura de los enlaces en ficheros HTML. Normalmente "
"Hacer una búsqueda en anchura de los enlaces en archivos HTML. Normalmente "
"se hace una búsqueda en profundidad."
#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:250
@ -1557,8 +1557,8 @@ msgid ""
"negative. 0 implies that no links in the root HTML file are followed. "
"Default is %default."
msgstr ""
"Nivel de recursión máximo para segir enlaces en ficheros HTML. No debe ser "
"negativo. El valor 0 implica que no se seguirá ningún enlace en el fichero "
"Nivel de recursión máximo para segir enlaces en archivos HTML. No debe ser "
"negativo. El valor 0 implica que no se seguirá ningún enlace en el archivo "
"HTML raíz. El valor por defecto es %default."
#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:259
@ -1568,7 +1568,7 @@ msgid ""
"can result in various nasty side effects in the rest of of the conversion "
"pipeline."
msgstr ""
"Normalmente este complemento de entrada recoloca todos los ficheros de "
"Normalmente este complemento de entrada recoloca todos los archivos de "
"entrada en un árbol de carpetas estándar. Use esta opción sólo si sabe lo "
"que está haciendo, ya que puede ocasionar varios efectos desagradables en el "
"resto del proceso de conversión."
@ -1579,16 +1579,16 @@ msgid ""
"conversion of a PDF file. Default is %default which disables this."
msgstr ""
"Longitud de línea promedio para la división de líneas si el HTML viene de "
"una conversión parcial previa de un fichero PDF. El valor por defecto es "
"una conversión parcial previa de un archivo PDF. El valor por defecto es "
"%default, que desactiva esta opción."
#: /home/kovid/work/calibre/src/calibre/ebooks/lit/from_any.py:47
msgid "Creating LIT file from EPUB..."
msgstr "Creando fichero LIT a partir de EPUB..."
msgstr "Creando archivo LIT a partir de EPUB..."
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:320
msgid "\tBook Designer file detected."
msgstr "\tFichero de Book Designer detectado."
msgstr "\tArchivo de Book Designer detectado."
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:322
msgid "\tParsing HTML..."
@ -1596,7 +1596,7 @@ msgstr "\tAnalizando HTML..."
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:345
msgid "\tBaen file detected. Re-parsing..."
msgstr "\tFichero Baen detectado. Volviendo a analizar..."
msgstr "\tArchivo Baen detectado. Volviendo a analizar..."
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:361
msgid "Written preprocessed HTML to "
@ -1617,7 +1617,7 @@ msgstr "No se pudo analizar el fichero: %s"
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:544
msgid "%s is an empty file"
msgstr "%s es un fichero vacío"
msgstr "%s es un archivo vacío"
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:564
msgid "Failed to parse link %s %s"
@ -1671,7 +1671,7 @@ msgstr "No se pudo leer de: %s"
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1994
msgid "Failed to process opf file"
msgstr "No se pudo procesar el fichero OPF"
msgstr "No se pudo procesar el archivo OPF"
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrfparser.py:136
msgid ""
@ -1679,7 +1679,7 @@ msgid ""
"Convert an LRF file into an LRS (XML UTF-8 encoded) file"
msgstr ""
"%prog libro.lrf\n"
"Convierte un fichero LRF en un fichero LRS (XML codificado en UTF-8)"
"Convierte un archivo LRF en un archivo LRS (XML codificado en UTF-8)"
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrfparser.py:137
msgid "Output LRS file"
@ -5147,12 +5147,12 @@ msgstr "Detener &todas las tareas"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:138
msgid "Edit Meta information"
msgstr "Editar metainformación"
msgstr "Editar metadatos"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:139
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:353
msgid "Meta information"
msgstr "Metainformación"
msgstr "Metadatos"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:141
msgid "A&utomatically set author sort"
@ -5340,7 +5340,7 @@ msgstr "No se pudo abrir %s. ¿Lo está usando algún otro programa?"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:352
msgid "Edit Meta Information"
msgstr "Editar metainformación"
msgstr "Editar metadatos"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:356
msgid "Swap the author and title"
@ -6320,7 +6320,7 @@ msgstr "Supr"
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:349
msgid "Edit meta information"
msgstr "Editar la metainformación"
msgstr "Editar metadatos"
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:350
msgid "E"

View File

@ -7,13 +7,13 @@ msgstr ""
"Project-Id-Version: calibre 0.4.22\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-03-12 07:36+0000\n"
"PO-Revision-Date: 2010-03-16 00:47+0000\n"
"PO-Revision-Date: 2010-03-17 02:13+0000\n"
"Last-Translator: Kovid Goyal <Unknown>\n"
"Language-Team: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2010-03-16 04:44+0000\n"
"X-Launchpad-Export-Date: 2010-03-18 04:32+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
"Generated-By: pygettext.py 1.5\n"

View File

@ -8,13 +8,13 @@ msgstr ""
"Project-Id-Version: calibre\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2010-03-12 07:36+0000\n"
"PO-Revision-Date: 2010-03-16 01:01+0000\n"
"PO-Revision-Date: 2010-03-17 02:11+0000\n"
"Last-Translator: Miguel Anxo Bouzada <mbouzada@gmail.com>\n"
"Language-Team: Galician <gl@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2010-03-16 04:44+0000\n"
"X-Launchpad-Export-Date: 2010-03-18 04:32+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43
@ -359,7 +359,7 @@ msgid ""
"produce a document intended to be read at a computer or on a range of "
"devices."
msgstr ""
"Este perfil tenta fornecr valores predefinidos adecuados e resulta útil se "
"Este perfil tenta fornecer valores predefinidos adecuados e resulta útil se "
"quere producir un documento apropiado para ser lido nun computador ou noutro "
"tipo de dispositivos."
@ -1515,7 +1515,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:288
msgid "Path to output file"
msgstr "Traxectoria do ficheiro de saída"
msgstr "Camiño do ficheiro de saída"
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:290
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:113
@ -2450,7 +2450,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/add.py:251
msgid "Path error"
msgstr "Erro na traxectoria"
msgstr "Erro no camiño"
#: /home/kovid/work/calibre/src/calibre/gui2/add.py:252
msgid "The specified directory could not be processed."
@ -3359,12 +3359,12 @@ msgstr "Expresión regular non válida: %s"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:62
#: /home/kovid/work/calibre/src/calibre/gui2/convert/toc.py:38
msgid "Invalid XPath"
msgstr "XPath non válida"
msgstr "O XPath é incorrecto"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:63
#: /home/kovid/work/calibre/src/calibre/gui2/convert/toc.py:39
msgid "The XPath expression %s is invalid."
msgstr "A expresión da XPath %s non é válida."
msgstr "A expresión XPath %s é incorrecta"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:60
msgid "Chapter &mark:"
@ -3372,7 +3372,7 @@ msgstr "´&Marca de capítulo"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:61
msgid "Remove first &image"
msgstr ""
msgstr "Quitar primeira &imaxe"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:62
msgid "Insert &metadata as page at start of book"
@ -3384,11 +3384,11 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:64
msgid "Remove F&ooter"
msgstr ""
msgstr "Quitar &Pés de páxina"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:65
msgid "Remove H&eader"
msgstr ""
msgstr "Quitar &Cabeceiras"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/toc.py:16
msgid ""
@ -3784,7 +3784,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1091
#: /home/kovid/work/calibre/src/calibre/gui2/status.py:92
msgid "Path"
msgstr ""
msgstr "Camiño"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:111
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:112
@ -3795,7 +3795,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/status.py:93
#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:132
msgid "Formats"
msgstr ""
msgstr "Formatos"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:68
msgid "Fit &cover to view"
@ -3924,6 +3924,7 @@ msgstr "Correo electrónico"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:221
msgid "Formats to email. The first matching format will be sent."
msgstr ""
"Formatos para o correo. O primeiro formato que coincida será o enviado."
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:222
msgid ""
@ -3962,11 +3963,11 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:535
msgid "No valid plugin path"
msgstr ""
msgstr "O camiño do engadido non é correcto"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:536
msgid "%s is not a valid plugin path"
msgstr ""
msgstr "%s non é correcto como camiño do engadido"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:539
msgid "Choose plugin"
@ -4141,7 +4142,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:121
msgid "File &formats to save:"
msgstr ""
msgstr "Ficheiro &formatos para gardar:"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:122
msgid "Replace space with &underscores"
@ -4314,7 +4315,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:544
msgid "&Remove email"
msgstr ""
msgstr "&Quitar correo"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:545
msgid ""
@ -4445,7 +4446,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:571
msgid "&Remove plugin"
msgstr ""
msgstr "&Quitar engadido"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:572
msgid "Add new plugin"
@ -4567,7 +4568,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:87
msgid "Fetch"
msgstr ""
msgstr "Obter"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:88
msgid "Matches"
@ -4592,7 +4593,7 @@ msgstr "Detalles do traballo"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:44
msgid "Active Jobs"
msgstr ""
msgstr "Traballos activos"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:45
msgid "&Stop selected job"
@ -4604,11 +4605,11 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:47
msgid "Stop &all jobs"
msgstr ""
msgstr "Parar &todos os traballos"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:138
msgid "Edit Meta information"
msgstr ""
msgstr "Editar metainformación"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:139
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:353
@ -4664,7 +4665,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:154
msgid "&Remove tags:"
msgstr ""
msgstr "&Quitar etiquetas:"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:155
msgid "Comma separated list of tags to remove from the books. "
@ -4672,7 +4673,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:159
msgid "Remove &format:"
msgstr ""
msgstr "Quitar &formato:"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:160
msgid "&Swap title and author"
@ -4684,7 +4685,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:136
msgid "Choose formats for "
msgstr ""
msgstr "Escolla os formatos para "
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:137
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1202
@ -4779,7 +4780,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:601
msgid "Cannot fetch metadata"
msgstr ""
msgstr "Non é posíbel oter metadatos"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:602
msgid "You must specify at least one of ISBN, Title, Authors or Publisher"
@ -4795,7 +4796,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:352
msgid "Edit Meta Information"
msgstr ""
msgstr "Editar metainformación"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:356
msgid "Swap the author and title"
@ -4812,7 +4813,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:375
msgid "Remove unused series (Series that have no books)"
msgstr ""
msgstr "Quitar series inútiles (Series que non teñen libros)"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:377
msgid "IS&BN:"
@ -4836,11 +4837,11 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:384
msgid "&Fetch metadata from server"
msgstr ""
msgstr "&Obter metadatos desde servidor"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:385
msgid "Available Formats"
msgstr ""
msgstr "Formatos dispoñíbeis"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:386
msgid "Add a new format for this book to the database"
@ -4848,7 +4849,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:388
msgid "Remove the selected formats for this book from the database."
msgstr ""
msgstr "Quitar os formatos seleccionados para este libro da base de datos"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:390
msgid "Set the cover for the book from the selected format"
@ -5094,7 +5095,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/select_formats.py:45
msgid "Choose formats"
msgstr ""
msgstr "Escoller formatos"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor.py:66
msgid "Are your sure?"
@ -5256,7 +5257,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:251
msgid "&Remove recipe"
msgstr ""
msgstr "&Quitar receita"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:252
msgid "&Share recipe"
@ -5442,7 +5443,7 @@ msgstr "Progreso"
#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:56
msgid "Running time"
msgstr ""
msgstr "Tempo en execución"
#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:68
msgid "There are %d running jobs:"
@ -5477,7 +5478,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:254
msgid " - Jobs"
msgstr ""
msgstr " - Traballos"
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:171
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1151
@ -5660,7 +5661,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:336
msgid "&Search:"
msgstr ""
msgstr "&Buscar:"
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:337
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:338
@ -5687,7 +5688,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:344
msgid "Add books"
msgstr ""
msgstr "Engadir libros"
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:345
msgid "A"
@ -5696,7 +5697,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:346
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:347
msgid "Remove books"
msgstr ""
msgstr "Quitar libros"
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:348
msgid "Del"
@ -5704,7 +5705,7 @@ msgstr "Supr"
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:349
msgid "Edit meta information"
msgstr ""
msgstr "Editar metainformación"
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:350
msgid "E"
@ -5712,12 +5713,12 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:351
msgid "Send to device"
msgstr ""
msgstr "Enviar ao dispositivo"
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:352
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:306
msgid "Save to disk"
msgstr ""
msgstr "Gardar no disco"
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:353
msgid "S"
@ -5725,7 +5726,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:354
msgid "Fetch news"
msgstr ""
msgstr "Obter novas"
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:355
msgid "F"
@ -5733,7 +5734,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:356
msgid "Convert E-books"
msgstr ""
msgstr "Converter libros"
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:357
msgid "C"
@ -5872,11 +5873,11 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/status.py:149
msgid "Jobs:"
msgstr ""
msgstr "Traballos:"
#: /home/kovid/work/calibre/src/calibre/gui2/status.py:158
msgid "Click to see list of active jobs."
msgstr ""
msgstr "Prema para ver a lista dos traballos activos."
#: /home/kovid/work/calibre/src/calibre/gui2/status.py:196
msgid "Click to browse books by their covers"
@ -5931,7 +5932,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:237
msgid "Fetch news from "
msgstr ""
msgstr "Obter novas de "
#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:299
msgid "Convert existing"
@ -6021,7 +6022,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:307
msgid "Save to disk in a single directory"
msgstr ""
msgstr "Gardar no disco nun único cartafol"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:308
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1967
@ -6034,7 +6035,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:321
msgid "Remove selected books"
msgstr ""
msgstr "Quitar os libros seleccionados"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:323
msgid "Remove files of a specific format from selected books.."
@ -6076,12 +6077,12 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:478
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:558
msgid "Calibre Library"
msgstr ""
msgstr "Biblioteca do Calibre"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:488
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2123
msgid "Choose a location for your ebook library."
msgstr ""
msgstr "Elixa unha localización para a súa biblioteca de libros."
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:526
msgid "Calibre Quick Start Guide"
@ -6126,7 +6127,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:958
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1098
msgid "Use library only"
msgstr ""
msgstr "Usar só a biblioteca"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:959
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1099
@ -6292,7 +6293,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1528
msgid "Cannot save to disk"
msgstr ""
msgstr "Non é posíbel gardar no disco"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1531
msgid "Choose destination directory"
@ -6343,7 +6344,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1646
msgid "Fetching news from "
msgstr ""
msgstr "Obtendo novas de "
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1660
msgid " fetched."
@ -6388,7 +6389,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1952
msgid "Cannot configure while there are running jobs."
msgstr ""
msgstr "Non se pode configurar mentres haxa traballos en execución."
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1995
msgid "No detailed info available"
@ -6429,7 +6430,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2132
msgid "Invalid library location"
msgstr ""
msgstr "A localización da biblioteca non é correcta"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2133
msgid "Could not access %s. Using %s as the library."
@ -6443,7 +6444,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2208
msgid "There are active jobs. Are you sure you want to quit?"
msgstr ""
msgstr "Hai traballos en activo. Está seguro de querer saír?"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2211
msgid ""
@ -6454,7 +6455,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2215
msgid "WARNING: Active jobs"
msgstr ""
msgstr "Aviso: traballos en activo"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2267
msgid ""
@ -6908,6 +6909,9 @@ msgid ""
"%d\n"
"books"
msgstr ""
"Biblioteca\n"
"%d\n"
"libros"
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:227
msgid ""
@ -7847,7 +7851,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/config.py:674
msgid "Add new formats to existing book records"
msgstr ""
msgstr "Engadir formatos novos aos rexistros de libros existentes"
#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:43
msgid "Waiting..."

File diff suppressed because it is too large Load Diff

View File

@ -8,13 +8,13 @@ msgstr ""
"Project-Id-Version: calibre\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2010-03-12 07:36+0000\n"
"PO-Revision-Date: 2010-03-16 00:52+0000\n"
"PO-Revision-Date: 2010-03-17 02:17+0000\n"
"Last-Translator: Kovid Goyal <Unknown>\n"
"Language-Team: Latvian <ivars_a@inbox.lv>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2010-03-16 04:44+0000\n"
"X-Launchpad-Export-Date: 2010-03-18 04:32+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
"X-Poedit-Country: LATVIA\n"
"X-Poedit-Language: Latvian\n"

View File

@ -8,13 +8,13 @@ msgstr ""
"Project-Id-Version: calibre\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2010-03-12 07:36+0000\n"
"PO-Revision-Date: 2010-03-16 00:48+0000\n"
"Last-Translator: Kovid Goyal <Unknown>\n"
"PO-Revision-Date: 2010-03-22 19:53+0000\n"
"Last-Translator: Anders Skogheim Liane <Unknown>\n"
"Language-Team: Norwegian Bokmal <nb@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2010-03-16 04:44+0000\n"
"X-Launchpad-Export-Date: 2010-03-23 04:46+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43
@ -988,7 +988,7 @@ msgstr "VALG FOR UTDATA"
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:105
msgid "Options to control the processing of the output %s"
msgstr "Valgmuligheter for å kontorllere prosseseringen av utdata %s"
msgstr "Valgmuligheter for å kontrollere prosesseringen av utdata %s"
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:119
msgid "Options to control the look and feel of the output"
@ -1299,7 +1299,7 @@ msgid ""
"does not use paragraphs (<p> or <div> tags)."
msgstr ""
"Sett inn en blank linje mellom avsnitt. Dette vil ikke fungere dersom "
"kildefilen ikke benytter avsnitt (<p> eller <div> emneord)."
"kildefilen ikke benytter avsnitt (<p> eller <div> tagger)."
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:338
msgid ""
@ -2790,7 +2790,7 @@ msgstr "Feil i stien"
#: /home/kovid/work/calibre/src/calibre/gui2/add.py:252
msgid "The specified directory could not be processed."
msgstr "Det spesifiserte mappen kunne ikke prossesseres"
msgstr "Den spesifiserte mappen kunne ikke prosesseres"
#: /home/kovid/work/calibre/src/calibre/gui2/add.py:256
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:517
@ -3053,7 +3053,7 @@ msgstr "Kant&utgjevning"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:95
msgid "&Disable comic processing"
msgstr "&Slå av tegneserieprossessering"
msgstr "&Slå av tegneserieprosessering"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:96
#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:111
@ -3818,7 +3818,7 @@ msgstr "TXT Inndata"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:45
msgid "Process using markdown"
msgstr "Prosseser ved å benytte markdown"
msgstr "Prosesser ved å benytte markdown"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:46
msgid ""
@ -6043,7 +6043,7 @@ msgid ""
"Dropping onto a device is not supported. First add the book to the calibre "
"library."
msgstr ""
"Legger inn på en enhet som ikke er støttet. Legg først boken til "
"Å legge direkte inn på en enhet er ikke støttet. Legg først boken til i "
"Calibrebiblioteket."
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1090
@ -8494,8 +8494,8 @@ msgid ""
"Normally, calibre will update the metadata in the saved files from what is "
"in the calibre library. Makes saving to disk slower."
msgstr ""
"Normalt vil Calibre oppdatere metadata i de lagrede filene i "
"Calibrebiblioteket. Dette gjør lagring til disk tregere."
"Normalt vil Calibre oppdatere metadata i de lagrede filene ut i fra hva som "
"ligger i Calibrebiblioteket. Dette gjør lagring til disk tregere."
#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:55
msgid ""

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,13 +7,13 @@ msgstr ""
"Project-Id-Version: calibre 0.4.55\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-03-12 07:36+0000\n"
"PO-Revision-Date: 2010-03-16 01:01+0000\n"
"PO-Revision-Date: 2010-03-17 02:09+0000\n"
"Last-Translator: Kovid Goyal <Unknown>\n"
"Language-Team: American English <kde-i18n-doc@lists.kde.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2010-03-16 04:44+0000\n"
"X-Launchpad-Export-Date: 2010-03-18 04:33+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
"X-Poedit-Country: RUSSIAN FEDERATION\n"
"X-Poedit-Language: Russian\n"
@ -2952,7 +2952,7 @@ msgstr "Сортировать числа как текст"
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_tab_template_ui.py:28
msgid "Tab template for catalog.ui"
msgstr ""
msgstr "Шаблон вкладки для catalog.ui"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:36
msgid ""
@ -3155,7 +3155,7 @@ msgstr "Не вставлять &Содержание в начало книги
#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output.py:14
msgid "FB2 Output"
msgstr ""
msgstr "Вывод FB2"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/fb2_output_ui.py:29
#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_output_ui.py:37
@ -3251,7 +3251,7 @@ msgstr "Размер основного шрифта:"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:123
msgid "Wizard to help you choose an appropriate font size key"
msgstr ""
msgstr "Мастер, чтобы помочь вам выбрать подходящий ключ размера шрифта"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:125
msgid "Line &height:"
@ -3275,6 +3275,9 @@ msgid ""
"paragraph indent, to ensure that paragraphs can be easily distinguished. "
"This option controls the width of that indent."
msgstr ""
"<p>Когда calibre убирает расстояние между абзацами, она автоматически "
"устанавливает отступ абзацу, с тем чтобы абзацы можно было бы легко "
"отличить. Этот параметр контролирует ширину этого отступа."
#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:131
msgid " em"

File diff suppressed because it is too large Load Diff

View File

@ -8,13 +8,13 @@ msgstr ""
"Project-Id-Version: calibre\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2010-03-12 07:36+0000\n"
"PO-Revision-Date: 2010-03-16 00:47+0000\n"
"PO-Revision-Date: 2010-03-17 02:13+0000\n"
"Last-Translator: Besnik <besnik@programeshqip.org>\n"
"Language-Team: Albanian <sq@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2010-03-16 04:43+0000\n"
"X-Launchpad-Export-Date: 2010-03-18 04:32+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43

View File

@ -8,13 +8,13 @@ msgstr ""
"Project-Id-Version: calibre\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2010-03-12 07:36+0000\n"
"PO-Revision-Date: 2010-03-16 00:49+0000\n"
"Last-Translator: Kovid Goyal <Unknown>\n"
"PO-Revision-Date: 2010-03-19 15:07+0000\n"
"Last-Translator: Vladimir Oka <Unknown>\n"
"Language-Team: Serbian <sr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2010-03-16 04:45+0000\n"
"X-Launchpad-Export-Date: 2010-03-20 04:41+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43
@ -281,7 +281,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:246
msgid ""
"This profile is intended for the SONY PRS line. The 500/505/600/700 etc."
msgstr "Ovaj profil je namenjen SONY PRS čitačima 500/505/600&700 i drugima."
msgstr "Ovaj profil je namenjen SONY PRS čitačima 500/505/600/700 i drugima."
#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:68
msgid "This profile is intended for the SONY PRS 300."
@ -374,8 +374,8 @@ msgid ""
"This profile is intended for the SONY PRS line. The 500/505/700 etc, in "
"landscape mode. Mainly useful for comics."
msgstr ""
"Ovaj profil je namenjen SONY PRS liniji čitača. Konkretno za 500/505/700 "
"itd. u horizontalnom položaju. Uglavnom je koristan za stripove."
"Ovaj profil je namenjen SONY PRS liniji čitača. Konkretno za 500/505/700/... "
"u horizontalnom položaju. Uglavnom je koristan za stripove."
#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:383
msgid "This profile is intended for the Amazon Kindle DX."
@ -602,7 +602,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:116
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:118
msgid "Transferring books to device..."
msgstr "Prebacujem knjige na uređaj..."
msgstr "Šaljem knjige na uređaj..."
#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:174
#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:181
@ -1813,7 +1813,7 @@ msgstr "Naslov"
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:414
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1150
msgid "Author(s)"
msgstr "Autor(i)"
msgstr "Autori"
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:365
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:64
@ -1851,7 +1851,7 @@ msgstr "Etikete"
#: /home/kovid/work/calibre/src/calibre/gui2/status.py:95
#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:132
msgid "Series"
msgstr "Serije"
msgstr "Serija"
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:378
msgid "Language"
@ -1998,7 +1998,7 @@ msgstr "Nije nađena nijedna naslovna strana"
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:34
msgid "Metadata download"
msgstr "Preuzimam metapodatke"
msgstr "Preuzimanje metapodataka"
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:111
msgid "ratings"
@ -2709,7 +2709,7 @@ msgstr "Najstarije vesti koje će se čuvati u bazi podataka"
#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:59
msgid "Show system tray icon"
msgstr "Prikaži ikonu u sistemskoj kaseti"
msgstr "Prikaži sistemsku ikonu"
#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:61
msgid "Upload downloaded news to device"
@ -2728,7 +2728,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:67
msgid "Disable notifications from the system tray icon"
msgstr "Onemogući poruke iz ikone u sistemskoj kaseti"
msgstr "Onemogući poruke iz sistemske ikone"
#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:69
msgid "Default action to perform when send to device button is clicked"
@ -2906,7 +2906,7 @@ msgstr "Obrazac"
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_csv_xml_ui.py:37
msgid "Fields to include in output:"
msgstr "Polja koja će biti uključena u izlaz:"
msgstr "Polja koja će biti uključena u katalog:"
#: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:17
msgid "E-book options"
@ -3025,12 +3025,12 @@ msgstr "Isključi &opsecanje"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:90
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:103
msgid "&Wide"
msgstr "&Široko"
msgstr "&Položen ekran"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:91
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:99
msgid "&Landscape"
msgstr "&Horizontalno"
msgstr "Sačuvaj &horizontalnu orijentaciju originala"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:92
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:101
@ -3045,7 +3045,7 @@ msgstr "Ne so&rtiraj"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:94
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:102
msgid "De&speckle"
msgstr "&Omekšaj"
msgstr "&Omekšaj sliku"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:95
msgid "&Disable comic processing"
@ -3235,7 +3235,7 @@ msgstr "&Ključ za veličinu slova:"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:124
#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:126
msgid " pt"
msgstr " štamparska tačka"
msgstr " pt"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:107
msgid "Use &default values"
@ -3251,7 +3251,7 @@ msgstr "&Veličina slova: "
#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:113
msgid " will map to size: "
msgstr " će biti povezano s veličinom: "
msgstr " će biti povezana s veličinom: "
#: /home/kovid/work/calibre/src/calibre/gui2/convert/font_key_ui.py:114
msgid "0.0 pt"
@ -3330,7 +3330,7 @@ msgstr "Dodatni &CSS"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output.py:19
msgid "LRF Output"
msgstr "LRF Izlaz"
msgstr "LRF izlaz"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:116
msgid "Enable &autorotation of wide images"
@ -3358,7 +3358,7 @@ msgstr "Dodaj &zaglavlje"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:124
msgid "Header &separation:"
msgstr "&Razmak zaglavlja:"
msgstr "&Razmak između zaglavlja:"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:126
msgid "Header &format:"
@ -3458,7 +3458,7 @@ msgstr "Promeni naslov ove knjige"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:140
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:358
msgid "&Author(s): "
msgstr "&Autor(i): "
msgstr "&Autor: "
#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:174
msgid "Author So&rt:"
@ -3518,7 +3518,7 @@ msgstr "MOBI izlaz"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output.py:42
msgid "Default"
msgstr "Podrazumevano"
msgstr "Podrazumevana"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:58
msgid "&Title for Table of Contents:"
@ -3570,19 +3570,19 @@ msgstr "Margine"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:119
msgid "&Left:"
msgstr "&Levo:"
msgstr "&Leva:"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:121
msgid "&Top:"
msgstr "&Vrh:"
msgstr "&Gornja:"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:123
msgid "&Right:"
msgstr "&Desno:"
msgstr "&Desna:"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:125
msgid "&Bottom:"
msgstr "D&no:"
msgstr "D&onja:"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_input.py:12
msgid "PDB Input"
@ -3616,7 +3616,7 @@ msgstr "Faktor za &uklanjanje preloma reda:"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_input_ui.py:40
msgid "No &Images"
msgstr "Bez &slika"
msgstr "Ignoriši &slike"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_output.py:17
msgid "PDF Output"
@ -3637,7 +3637,7 @@ msgstr "RB izlaz"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:77
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1862
msgid "Choose the format to view"
msgstr "Izaberite format za pregledanje"
msgstr "Izaberite format za prikaz"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:83
msgid "Cannot build regex using the GUI builder without a book."
@ -3823,8 +3823,8 @@ msgid ""
"advanced formatting. To learn more visit <a "
"href=\"http://daringfireball.net/projects/markdown\">markdown</a>."
msgstr ""
"<p>Markdown je jednostavan jezik za tekst fajlove koji omogućava napredno "
"formatiranje. Za više infomracija vidite <a "
"<p>Markdown je jednostavan jezik koji omogućava napredno formatiranje "
"teksta. Za više infomracija vidite <a "
"href=\"http://daringfireball.net/projects/markdown\">markdown</a>."
#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:47
@ -3845,7 +3845,7 @@ msgstr "&Maksimalna dužina reda:"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:49
msgid "Force maximum line lenght"
msgstr "Nametni maksimalnu dužinu reda:"
msgstr "Nametni maksimalnu dužinu reda"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:50
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:65
@ -3997,7 +3997,7 @@ msgstr "Postavi podrazumevanu akciju pri prenošenju na uređaj"
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:333
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:335
msgid "Email to"
msgstr "Pošalji elektronskom poštom"
msgstr "Pošalji elektronskom poštom na"
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:346
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:353
@ -4167,7 +4167,7 @@ msgstr "Koristi pod-direktorijume"
#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:81
msgid "Save &template:"
msgstr "&Snimi šablon"
msgstr "Šablon za &snimanje:"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:108
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:109
@ -4195,11 +4195,11 @@ msgstr "Prilagodi veličinu &naslovne strane"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:69
msgid "&Previous"
msgstr "&Prethodno"
msgstr "&Prethodna"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:70
msgid "&Next"
msgstr "&Sledeće"
msgstr "&Sledeća"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog.py:38
msgid "My Books"
@ -4251,7 +4251,7 @@ msgstr "&Naslov:"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:93
msgid "&Author(s):"
msgstr "&Autor(i):"
msgstr "&Autor:"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:95
msgid "&Profile:"
@ -4263,7 +4263,7 @@ msgstr "%(plugin_type)s %(plugins)s"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:171
msgid "plugins"
msgstr "dodaci"
msgstr "..."
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:180
msgid ""
@ -4279,7 +4279,7 @@ msgstr "Konverzija"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:196
msgid "General"
msgstr "Opšte"
msgstr "Opšta"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:196
msgid "Interface"
@ -4514,13 +4514,12 @@ msgid ""
"punctuation, case, etc. Author match is exact."
msgstr ""
"Ako je pronađena knjiga sa sličnim naslovom i autorima, a koja nije u "
"formatu koji se dodaje, format će se dodati postojećoj knjizi, umesto da se "
"doda kao nova knjiga. Ako postojeća knjiga već postoji u datom formatu biće "
"ignorisana bez ikakve poruke.\n"
"formatu koji se dodaje, format će se dodati postojećoj knjizi \n"
"umesto da se doda kao nova knjiga. Ako postojeća knjiga već postoji u datom "
"formatu biće ignorisana bez ikakve poruke.\n"
"\n"
"Sličnost naslova ne zavisi od vodećih neodređenih članova (\"the\", \"a\", "
"\"an\"), interpunkcije, veličine slova, itd. Imena autora moraju biti po "
"svemu identična."
"Sličnost naslova ne zavisi od vodećih članova (\"the\", \"a\", \"an\"), "
"interpunkcije, veličine slova, itd. Imena autora moraju biti identična."
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:112
msgid ""
@ -4608,7 +4607,7 @@ msgid ""
"&Location of ebooks (The ebooks are stored in folders sorted by author and "
"metadata is stored in the file metadata.db)"
msgstr ""
"&Mesto za e-knjige (E-knjige se smeštaju u direktorijume sortirane po "
"&Mesto za e-knjige (e-knjige se smeštaju u direktorijume sortirane po "
"autoru, a metapodaci se snimaju u fajl metadata.db)"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:506
@ -4621,7 +4620,7 @@ msgstr "Prikaži poruku ako postoji &nova verzija programa"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:509
msgid "Download &social metadata (tags/ratings/etc.) by default"
msgstr "Automatski preuzmi &društvene metapodatke (etikete/ocene/itd)"
msgstr "Automatski preuzmi &društvene metapodatke (etikete, ocene, itd)"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:510
msgid "&Overwrite author and title by default when fetching metadata"
@ -4649,15 +4648,15 @@ msgstr "Izaberi &jezik (zahteva ponovno pokretanje programa):"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:515
msgid "Normal"
msgstr "Normalno"
msgstr "Normalan"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:516
msgid "High"
msgstr "Visoko"
msgstr "Visok"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:517
msgid "Low"
msgstr "Nisko"
msgstr "Nizak"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:518
msgid "Job &priority:"
@ -4669,7 +4668,7 @@ msgstr "Poželjni izlazni f&ormat:"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:520
msgid "Preferred &input format order:"
msgstr "Poželjni redosled ulazn&ih formata:"
msgstr "Poželjan redosled ulazn&ih formata:"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:523
msgid "Use &Roman numerals for series number"
@ -4682,7 +4681,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:525
msgid "Show &notifications in system tray"
msgstr "Prikazuj obaveštenja u sistmeskoj kaseti"
msgstr "Prikazuj obaveštenja u sistemskoj ikoni"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:526
msgid "Show cover &browser in a separate window (needs restart)"
@ -4714,15 +4713,15 @@ msgstr "Traka sa alatkama"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:532
msgid "Large"
msgstr "Veliko"
msgstr "Velika"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:533
msgid "Medium"
msgstr "Srednje"
msgstr "Srednja"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:534
msgid "Small"
msgstr "Malo"
msgstr "Mala"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:535
msgid "&Button size in toolbar"
@ -4895,7 +4894,7 @@ msgid ""
"it uses."
msgstr ""
"Ovde možete promeniti ponašanje Calibrea izborom dodataka koji će biti "
"korišćeni."
"korišćeni za:"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:569
msgid "Enable/&Disable plugin"
@ -4953,11 +4952,11 @@ msgid ""
"particular book does not have some metadata, the variable will be replaced "
"by the empty string."
msgstr ""
"Podešavanjem ovog šablona možete u birati u koje direktorijume i kako će "
"biti snimljeni fajlovi. Možete koristitii znak / da navedete pod-"
"direktorijume. Metapodaci (promenljive) koji su vam na raspolaganju su "
"takođe navedeni niže. Ako određena knjiga nema neke metapodatke oni će biti "
"zamenjeni praznim nizom znakova."
"Podešavanjem ovog šablona možete birati u koje direktorijume i kako će biti "
"snimljeni fajlovi. Možete koristitii znak / da navedete pod-direktorijume. "
"Metapodaci (promenljive) koji su vam na raspolaganju su takođe navedeni "
"niže. Ako određena knjiga nema neki od metapodataka oni će biti zamenjeni "
"praznim nizom znakova."
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/save_template_ui.py:44
msgid "Available variables:"
@ -5896,7 +5895,7 @@ msgstr ""
"right:0px; -qt-block-indent:0; text-indent:0px;\">Koristite <span style=\" "
"font-weight:600;\">Test</span> funkciju niže, koja će vaš regularni izraz "
"proveriti na nekoliko primera imena fajlova. Imena za grupe različitih "
"stavki u metapodacima su opisane u \"oblačićima\" za pomoć.</p></body></html>"
"stavki u metapodacima su opisane u oblačićima za pomoć.</p></body></html>"
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:114
msgid "Regular &expression"
@ -5908,7 +5907,7 @@ msgstr "&Ime fajla:"
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:117
msgid "Test"
msgstr "Proba"
msgstr "Probaj"
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:118
msgid "Title:"
@ -5933,7 +5932,7 @@ msgstr "Ništa nije pronađeno"
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:121
msgid "Authors:"
msgstr "Autori:"
msgstr "Autor:"
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:122
msgid "Regular expression (?P<author>)"
@ -6008,7 +6007,7 @@ msgstr "Posao je već završen"
#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:243
msgid "Unavailable"
msgstr "Nedostupno"
msgstr "Nedostupan"
#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:254
msgid " - Jobs"
@ -6036,11 +6035,11 @@ msgstr "Ocena"
#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:77
#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:440
msgid "None"
msgstr "Nijedno"
msgstr "Nema"
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:375
msgid "Book <font face=\"serif\">%s</font> of %s."
msgstr "Knjiga <font face=\"serif\">%s</font> od %s."
msgstr "Knjiga <font face=\"serif\">%s</font> autora %s."
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:889
msgid "Not allowed"
@ -6141,7 +6140,7 @@ msgstr "Koristi biblioteku na navedenoj putanji."
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:27
msgid "Start minimized to system tray."
msgstr "Pokreni program sakriven u sistemsku kasetu."
msgstr "Pokreni program sakriven u sistemsku ikonu."
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:29
msgid "Log debugging information to console"
@ -6165,7 +6164,7 @@ msgstr "%s je već pokrenut."
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:92
msgid "may be running in the system tray, in the"
msgstr "i možda je već u sistemskoj kaseti, u"
msgstr "i možda je sakriven u sistemsk ikonu, u"
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:94
msgid "upper right region of the screen."
@ -6306,7 +6305,7 @@ msgstr "Knjige iz iste serije"
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:364
msgid "Books by this publisher"
msgstr "Knjige od ovog izdavača"
msgstr "Knjige od istog izdavača"
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:365
msgid "Books with the same tags"
@ -6505,7 +6504,7 @@ msgstr "Greška u komunikaciji sa uređajem"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:178
msgid "&Restore"
msgstr "Pov&rati"
msgstr "V&rati na ekran"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:180
msgid "&Donate to support calibre"
@ -6521,7 +6520,8 @@ msgstr "<p>Za pomoć vidi: <a href=\"%s\">Korisničko uputstvo</a><br>"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:226
msgid "<b>%s</b>: %s by <b>Kovid Goyal %%(version)s</b><br>%%(device)s</p>"
msgstr "<b>%s</b>: %s autor <b>Kovid Goyal %%(version)s</b><br>%%(device)s</p>"
msgstr ""
"<b>%s</b>: %s autor <b>Kovid Goyal %%(version)s</b><br>%%(device)s</p>"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:249
msgid "Edit metadata individually"
@ -6579,11 +6579,11 @@ msgstr "Snimi na disk u jedan direktorijum"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:308
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1967
msgid "Save only %s format to disk"
msgstr "Snimi samo format %s na disk"
msgstr "Snimi na disk samo %s format"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:317
msgid "View specific format"
msgstr "Pregledaj određeni format"
msgstr "Prikaži određeni format"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:321
msgid "Remove selected books"
@ -6591,7 +6591,7 @@ msgstr "Ukloni izabrane knjige"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:323
msgid "Remove files of a specific format from selected books.."
msgstr "Ukloni fajlove navedenih formata za izabrane knjige.."
msgstr "Ukloni fajlove navedenih formata za izabrane knjige..."
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:325
msgid "Remove all formats from selected books, except..."
@ -6599,7 +6599,7 @@ msgstr "Ukloni sve formate za izabrane knjige, osim..."
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:327
msgid "Remove covers from selected books"
msgstr "Ukloni naslovne strane za izabrane knjige"
msgstr "Ukloni naslovne strane izabranih knjiga"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:359
msgid "Convert individually"
@ -6654,7 +6654,7 @@ msgstr " detektovan."
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:885
msgid "Connected "
msgstr "Povezan "
msgstr "Priključen je "
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:897
msgid "Device database corrupted"
@ -7048,7 +7048,7 @@ msgid ""
"will keep running in the system tray. To close it, choose <b>Quit</b> in the "
"context menu of the system tray."
msgstr ""
"će nastaviti da radi u sistemskoj kaseti. Da prekinete rad izaberite "
"će nastaviti da radi kao sistemska ikona. Da prekinete rad izaberite "
"<b>Izlaz</b> u meniju."
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2286
@ -7792,7 +7792,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:108
msgid "Send email &from:"
msgstr "Pošalji elektronsku poštu &sa:"
msgstr "&Pošiljalac:"
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:109
msgid ""
@ -7821,7 +7821,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:113
msgid "&Hostname:"
msgstr "&Ime računara"
msgstr "&Server"
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:114
msgid "The hostname of your mail server. For e.g. smtp.gmail.com"
@ -8696,7 +8696,7 @@ msgstr "Zaustavljeno"
#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:53
msgid "Finished"
msgstr "Završeno"
msgstr "Gotovo"
#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:75
msgid "Working..."
@ -8841,7 +8841,7 @@ msgstr "Recept \"%s\" zahteva korisničko ime i lozinku"
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:633
msgid "Download finished"
msgstr "Preuzimanje završeno"
msgstr "Preuzimanje gotovo"
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:635
msgid "Failed to download the following articles:"

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 ""
"Project-Id-Version: calibre\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2010-03-12 07:36+0000\n"
"PO-Revision-Date: 2010-03-16 01:01+0000\n"
"Last-Translator: Thruth Wang <wanglihao@gmail.com>\n"
"POT-Creation-Date: 2010-03-28 04:18+0000\n"
"PO-Revision-Date: 2010-03-28 14:59+0000\n"
"Last-Translator: Kovid Goyal <Unknown>\n"
"Language-Team: Simplified Chinese <wanglihao@gmail.com>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2010-03-16 04:45+0000\n"
"X-Launchpad-Export-Date: 2010-03-29 03:45+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
"X-Poedit-Country: CHINA\n"
"X-Poedit-Language: Chinese\n"
@ -31,7 +31,7 @@ msgstr "不做任何处理"
#: /home/kovid/work/calibre/src/calibre/devices/prs500/books.py:267
#: /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/usbms/driver.py:205
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:204
#: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:98
#: /home/kovid/work/calibre/src/calibre/ebooks/chm/input.py:101
#: /home/kovid/work/calibre/src/calibre/ebooks/chm/metadata.py:56
@ -137,7 +137,7 @@ msgstr "不做任何处理"
#: /home/kovid/work/calibre/src/calibre/library/server.py:664
#: /home/kovid/work/calibre/src/calibre/library/server.py:740
#: /home/kovid/work/calibre/src/calibre/library/server.py:787
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:111
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:112
#: /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:77
@ -488,7 +488,7 @@ msgstr "与 IRex Iliad eBook reader 通信。"
#: /home/kovid/work/calibre/src/calibre/devices/iliad/driver.py:17
#: /home/kovid/work/calibre/src/calibre/devices/irexdr/driver.py:18
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:30
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:29
msgid "John Schember"
msgstr "John Schember"
@ -516,11 +516,11 @@ msgstr "与 JetBook eBook reader 通信。"
msgid "Communicate with the Kindle eBook reader."
msgstr "与 Kindle eBook reader 通信。"
#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:140
#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:147
msgid "Communicate with the Kindle 2 eBook reader."
msgstr "与 Kindle 2 eBook reader 通信。"
#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:150
#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:157
msgid "Communicate with the Kindle DX eBook reader."
msgstr "与 Kindle DX 通信。"
@ -553,12 +553,12 @@ msgstr "与 Sony PRS-500 eBook reader 通信。"
#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:105
#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:108
#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:119
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:45
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:48
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:51
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:71
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:81
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:90
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:44
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:47
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:50
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:70
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:80
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:89
msgid "Getting list of books on device..."
msgstr "从设备中获取书籍列表..."
@ -574,24 +574,24 @@ msgstr "逗号间隔的元数据域列表,用以在设备形成合集。可能
#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:139
#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:141
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:116
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:118
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:115
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:117
msgid "Transferring books to device..."
msgstr "传输书籍到设备中..."
#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:174
#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:181
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:145
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:162
#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:179
#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:186
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:144
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:161
msgid "Removing books from device..."
msgstr "正在从设备中删除书籍..."
#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:207
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:177
#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:212
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:176
msgid "Sending metadata to device..."
msgstr "正在传输元数据到设备..."
#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:213
#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:218
msgid "Communicate with the Sony PRS-600/700/900 eBook reader."
msgstr "与索尼 PRS-600/700/900 eBook reader 通信。"
@ -683,21 +683,21 @@ msgstr "控制书籍保存方式的模板"
msgid "Extra customization"
msgstr "额外定制"
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:29
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:28
msgid "Communicate with an eBook reader."
msgstr "与电子书阅读设备通信。"
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:37
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:36
msgid "Get device information..."
msgstr "获取设备信息..."
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:133
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:141
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:132
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:140
msgid "Adding books to device metadata listing..."
msgstr "将书籍添加到设备的元数据列表中..."
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:166
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:171
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:165
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:170
msgid "Removing books from device metadata listing..."
msgstr "将书籍从设备的元数据列表移除中..."
@ -1947,7 +1947,11 @@ msgstr "生成的行内目录标题。"
msgid "Disable compression of the file contents."
msgstr "不压缩文件内容。"
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/output.py:105
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/output.py:40
msgid "Tag marking book to be filed with Personal Docs"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/output.py:108
msgid "All articles"
msgstr "所有文章"
@ -2558,7 +2562,7 @@ msgid "No books"
msgstr "没有书籍"
#: /home/kovid/work/calibre/src/calibre/gui2/add.py:257
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1617
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1654
msgid "No books found"
msgstr "未找到书籍"
@ -2644,7 +2648,7 @@ msgstr "输出"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:118
#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output_ui.py:115
#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:165
#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:57
#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:66
#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup_ui.py:114
#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_input_ui.py:31
#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_output_ui.py:35
@ -3243,33 +3247,37 @@ msgstr "MOBI 输出"
msgid "Default"
msgstr "默认"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:58
#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:67
msgid "&Title for Table of Contents:"
msgstr "书籍目录标题(&T)"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:59
#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:68
msgid "Rescale images for &Palm devices"
msgstr "为 Palm 设备缩放图片(&P)"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:60
#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:69
msgid "Use author &sort for author"
msgstr "使用作者项作为按作者排序索引(&S)"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:61
#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:70
msgid "Disable compression of the file contents"
msgstr "禁用文件内容压缩"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:62
#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:71
msgid "Do not add Table of Contents to book"
msgstr "不将目录添加到书籍"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:63
#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:72
msgid "Kindle options"
msgstr "Kindle 选项"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:64
msgid "Masthead font:"
msgstr "刊头字体:"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:73
msgid "Periodical masthead font:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output_ui.py:74
msgid "Personal Doc tag:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/page_setup.py:35
msgid "Page Setup"
@ -3357,39 +3365,44 @@ msgstr "纸张方向(&O)"
msgid "RB Output"
msgstr "RB 输出"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:77
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1862
#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:85
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1899
msgid "Choose the format to view"
msgstr "选择格式进行查看"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:83
#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:91
msgid "Cannot build regex using the GUI builder without a book."
msgstr "缺少书籍,无法使用图形界面构建器构建正则表达式。"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:83
#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:91
msgid "No formats available"
msgstr "无格式何用"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:99
#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:107
msgid "Open book"
msgstr "打开书籍"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:99
#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:107
msgid "~"
msgstr "~"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder_ui.py:46
#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder_ui.py:52
msgid "Regex Builder"
msgstr "正则表达式生成器"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder_ui.py:47
#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder_ui.py:53
msgid "Preview"
msgstr "预览"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder_ui.py:48
#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder_ui.py:54
msgid "Regex:"
msgstr "正则表达式:"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder_ui.py:55
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:117
msgid "Test"
msgstr "测试"
#: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:171
msgid "Convert"
msgstr "转换"
@ -4044,7 +4057,7 @@ msgstr "新邮件地址"
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:478
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:823
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:160
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1456
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1493
#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:53
msgid "Error"
msgstr "错误"
@ -4801,7 +4814,7 @@ msgid "Choose formats for "
msgstr "选择格式 "
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:137
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1202
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1239
msgid "Books"
msgstr "书籍"
@ -5515,10 +5528,6 @@ msgstr "正则表达式(&E)"
msgid "File &name:"
msgstr "文件名(&N)"
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:117
msgid "Test"
msgstr "测试"
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:118
msgid "Title:"
msgstr "标题:"
@ -6168,7 +6177,7 @@ msgid "Save to disk in a single directory"
msgstr "保存到磁盘单个目录"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:308
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1967
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2004
msgid "Save only %s format to disk"
msgstr "仅保存 %s 到磁盘"
@ -6223,7 +6232,7 @@ msgid "Calibre Library"
msgstr "Calibre 书库"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:488
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2123
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2160
msgid "Choose a location for your ebook library."
msgstr "为您的电子书库选择一个位置。"
@ -6277,22 +6286,22 @@ msgstr ""
" "
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:958
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1098
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1135
msgid "Use library only"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:959
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1099
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1136
msgid "User annotations generated from main library only"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:966
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1410
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1467
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1447
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1504
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1529
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1594
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1712
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1541
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1566
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1631
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1749
msgid "No books selected"
msgstr "未选择书籍"
@ -6300,183 +6309,203 @@ msgstr "未选择书籍"
msgid "No books selected to fetch annotations from"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:989
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:992
msgid "Merging user annotations into database"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1142
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1020
msgid "%s<br />Last Page Read: %d (%d%%)"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1026
msgid "%s<br />Last Page Read: Location %d (%d%%)"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1045
msgid "<b>Location %d &bull; %s</b><br />%s<br />"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1054
msgid "<b>Page %d &bull; %s</b><br />"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1059
msgid "<b>Location %d &bull; %s</b><br />"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1179
msgid "How many empty books?"
msgstr "多少空白书籍?"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1143
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1180
msgid "How many empty books should be added?"
msgstr "应添加多少空白书籍?"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1191
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1242
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1228
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1279
msgid "Uploading books to device."
msgstr "正在上传书籍到设备。"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1203
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1240
msgid "EPUB Books"
msgstr "EPUB 书籍"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1204
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1241
msgid "LRF Books"
msgstr "LRF 书籍"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1205
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1242
msgid "HTML Books"
msgstr "HTML 书籍"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1206
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1243
msgid "LIT Books"
msgstr "LIT 书籍"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1207
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1244
msgid "MOBI Books"
msgstr "MOBI 书籍"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1208
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1245
msgid "Topaz books"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1209
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1246
msgid "Text books"
msgstr "文本书籍"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1210
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1247
msgid "PDF Books"
msgstr "PDF 书籍"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1211
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1248
msgid "Comics"
msgstr "漫画"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1212
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1249
msgid "Archives"
msgstr "归档"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1216
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1253
msgid "Supported books"
msgstr "支持的书j"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1251
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1288
msgid "Merged some books"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1252
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1289
msgid ""
"Some duplicates were found and merged into the following existing books:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1261
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1298
msgid "Failed to read metadata"
msgstr "无法读取元数据"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1262
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1299
msgid "Failed to read metadata from the following"
msgstr "无法从下列项目读取元数据"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1282
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1319
msgid "Cannot delete"
msgstr "无法删除"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1285
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1856
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1872
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1322
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1893
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1909
msgid "No book selected"
msgstr "未选择书籍"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1295
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1332
msgid "Choose formats to be deleted"
msgstr "选择删除格式"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1313
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1350
msgid "Choose formats <b>not</b> to be deleted"
msgstr "选择<b>非</b>删除格式"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1351
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1388
msgid ""
"The selected books will be <b>permanently deleted</b> and the files removed "
"from your computer. Are you sure?"
msgstr "选定书籍将被<b>永久删除</b>,文件会从您的电脑中移除。是否确定?"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1378
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1415
msgid "Deleting books from device."
msgstr "从设备删除书籍。"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1409
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1446
msgid "Cannot download metadata"
msgstr "无法下载元数据"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1425
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1462
msgid "social metadata"
msgstr "社会性元数据"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1427
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1464
msgid "covers"
msgstr "封面"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1427
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1464
msgid "metadata"
msgstr "元数据"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1429
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1466
msgid "Downloading %s for %d book(s)"
msgstr "正在为 %d 本书下载 %s"
msgstr "正在为 %s 本书下载 %s"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1451
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1488
msgid "Failed to download some metadata"
msgstr "下载一些元数据失败"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1452
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1489
msgid "Failed to download metadata for the following:"
msgstr "下载下列书籍元数据失败:"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1455
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1492
msgid "Failed to download metadata:"
msgstr "下载元数据失败。"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1466
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1503
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1540
msgid "Cannot edit metadata"
msgstr "无法编辑元数据"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1528
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1565
msgid "Cannot save to disk"
msgstr "无法保存到磁盘"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1531
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1568
msgid "Choose destination directory"
msgstr "选择目标目录"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1564
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1601
msgid "Error while saving"
msgstr "保存出错"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1565
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1602
msgid "There was an error while saving."
msgstr "保存时出错。"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1572
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1573
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1609
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1610
msgid "Could not save some books"
msgstr "无法保存一些书籍"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1574
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1611
msgid "Click the show details button to see which ones."
msgstr "点击显示详情按钮查看具体哪些。"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1595
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1632
msgid "No books selected to generate catalog for"
msgstr "未选定书籍生成类目"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1612
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1649
msgid "Generating %s catalog..."
msgstr "正在生成 %s 类目..."
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1618
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1655
msgid ""
"No books to catalog\n"
"Check exclude tags"
@ -6484,48 +6513,48 @@ msgstr ""
"没有书籍收入类目\n"
"检查不含标签"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1628
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1665
msgid "Catalog generated."
msgstr "已经生成类目。"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1631
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1668
msgid "Export Catalog Directory"
msgstr "输出类目目录"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1632
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1669
msgid "Select destination for %s.%s"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1646
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1683
msgid "Fetching news from "
msgstr "正在抓取新闻,来源于 "
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1660
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1697
msgid " fetched."
msgstr " 已抓取。"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1711
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1748
msgid "Cannot convert"
msgstr "无法转换"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1740
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1777
msgid "Starting conversion of %d book(s)"
msgstr "开始转换 %d 本书"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1856
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1909
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1893
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1946
msgid "Cannot view"
msgstr "无法查看"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1871
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1908
msgid "Cannot open folder"
msgstr "无法打开文件夹"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1893
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1930
msgid "Multiple Books Selected"
msgstr "选定多本书籍"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1894
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1931
msgid ""
"You are attempting to open %d books. Opening too many books at once can be "
"slow and have a negative effect on the responsiveness of your computer. Once "
@ -6533,74 +6562,74 @@ msgid ""
"continue?"
msgstr "您正在试图打开 %d 本书籍。同时打开太多书籍可能会变慢,并对电脑响应速度有消极影响。一旦开始,需等待进程完成。是否继续?"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1910
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1947
msgid "%s has no available formats."
msgstr "%s 无可用格式。"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1951
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1988
msgid "Cannot configure"
msgstr "无法配置"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1952
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1989
msgid "Cannot configure while there are running jobs."
msgstr "有正在运行任务时无法进行配置。"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1995
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2032
msgid "No detailed info available"
msgstr "无可用详细信息"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1996
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2033
msgid "No detailed information is available for books on the device."
msgstr "设备上书籍没有详细信息可用。"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2051
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2088
msgid "Error talking to device"
msgstr "设备通讯错误。"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2052
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2089
msgid ""
"There was a temporary error talking to the device. Please unplug and "
"reconnect the device and or reboot."
msgstr "与设备通讯出现临时性错误。请拔下再重新连接设备,或可能需要重启。"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2075
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2103
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2112
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2140
msgid "Conversion Error"
msgstr "转换错误"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2076
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2113
msgid ""
"<p>Could not convert: %s<p>It is a <a href=\"%s\">DRM</a>ed book. You must "
"first remove the DRM using third party tools."
msgstr "<p>无法转换:%s<p> 它是 <a href=\"%s\">DRM</a> 保护书籍。您需要首先使用第三方工具去除 DRM。"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2089
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2126
msgid "Recipe Disabled"
msgstr "清单禁用"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2104
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2141
msgid "<b>Failed</b>"
msgstr "<b>失败</b>"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2132
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2169
msgid "Invalid library location"
msgstr "无效书库位置"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2133
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2170
msgid "Could not access %s. Using %s as the library."
msgstr "无法访问 %s。使用 %s 作为书库。"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2183
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2220
msgid ""
"is the result of the efforts of many volunteers from all over the world. If "
"you find it useful, please consider donating to support its development."
msgstr "是众多全球志愿者的努力结晶。如果您觉得它有用,请考虑捐助支持开发。"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2208
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2245
msgid "There are active jobs. Are you sure you want to quit?"
msgstr "仍有任务运行。您是否希望退出?"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2211
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2248
msgid ""
" is communicating with the device!<br>\n"
" Quitting may cause corruption on the device.<br>\n"
@ -6610,28 +6639,28 @@ msgstr ""
" 退出可能导致设备损坏。<br>\n"
" 确定退出么?"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2215
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2252
msgid "WARNING: Active jobs"
msgstr "警告:正在运行任务"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2267
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2304
msgid ""
"will keep running in the system tray. To close it, choose <b>Quit</b> in the "
"context menu of the system tray."
msgstr "将在系统栏中继续运行。要关闭,在系统栏菜单中选择<b>退出</b>。"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2286
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2323
msgid ""
"<span style=\"color:red; font-weight:bold\">Latest version: <a "
"href=\"%s\">%s</a></span>"
msgstr ""
"<span style=\"color:red; font-weight:bold\">最新版本:<a href=\"%s\">%s</a></span>"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2294
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2331
msgid "Update available"
msgstr "有可用更新"
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2295
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:2332
msgid ""
"%s has been updated to version %s. See the <a href=\"http://calibre-"
"ebook.com/whats-new\">new features</a>. Visit the download page?"
@ -8168,14 +8197,18 @@ msgid "English (Yemen)"
msgstr "英语(也门)"
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:108
msgid "English (Ireland)"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:109
msgid "German (AT)"
msgstr "德语(奥地利)"
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:109
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:110
msgid "Dutch (NL)"
msgstr "荷兰语(荷兰)"
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:110
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:111
msgid "Dutch (BE)"
msgstr "荷兰语(比利时)"
@ -8714,3 +8747,6 @@ msgstr "不下载 CSS 样式表。"
#~ msgid "dummy option until real options are determined."
#~ msgstr "虚假选项,在实际选项出现前使用。"
#~ msgid "Masthead font:"
#~ msgstr "刊头字体:"

View File

@ -8,13 +8,13 @@ msgstr ""
"Project-Id-Version: calibre\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2010-03-12 07:36+0000\n"
"PO-Revision-Date: 2010-03-16 00:51+0000\n"
"PO-Revision-Date: 2010-03-17 02:15+0000\n"
"Last-Translator: Chao-Hsiung Liao <j_h_liau@yahoo.com.tw>\n"
"Language-Team: Chinese (traditional)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2010-03-16 04:45+0000\n"
"X-Launchpad-Export-Date: 2010-03-18 04:33+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
"Language: zh_TW\n"

Some files were not shown because too many files have changed in this diff Show More