mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-07 10:14:46 -04:00
Sync to trunk.
This commit is contained in:
commit
eb2b11e9dc
100
Changelog.yaml
100
Changelog.yaml
@ -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
|
||||
|
||||
|
BIN
resources/images/news/nypost.png
Normal file
BIN
resources/images/news/nypost.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 400 B |
3544
resources/images/search_add_saved.svg
Normal file
3544
resources/images/search_add_saved.svg
Normal file
File diff suppressed because it is too large
Load Diff
After Width: | Height: | Size: 134 KiB |
3547
resources/images/search_copy_saved.svg
Normal file
3547
resources/images/search_copy_saved.svg
Normal file
File diff suppressed because it is too large
Load Diff
After Width: | Height: | Size: 151 KiB |
3544
resources/images/search_delete_saved.svg
Normal file
3544
resources/images/search_delete_saved.svg
Normal file
File diff suppressed because it is too large
Load Diff
After Width: | Height: | Size: 134 KiB |
@ -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 = {
|
||||
|
@ -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 = {
|
||||
|
@ -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 = {
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
||||
|
||||
|
@ -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'
|
||||
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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} '
|
||||
|
||||
|
@ -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} '
|
||||
|
||||
|
@ -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 = {
|
||||
|
@ -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
|
||||
|
@ -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') ]
|
||||
|
||||
|
||||
|
||||
|
53
resources/recipes/hindu_business_line.recipe
Normal file
53
resources/recipes/hindu_business_line.recipe
Normal 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
|
@ -4,7 +4,7 @@ import re
|
||||
class SmeRecipe(BasicNewsRecipe):
|
||||
__license__ = 'GPL v3'
|
||||
__author__ = 'Abelturd'
|
||||
language = 'cz'
|
||||
language = 'cs'
|
||||
version = 1
|
||||
|
||||
title = u'iLiteratura.cz'
|
||||
|
@ -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')
|
||||
|
@ -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)'
|
||||
|
||||
|
||||
|
@ -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'})
|
||||
|
@ -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):
|
||||
|
13
resources/recipes/midday.recipe
Normal file
13
resources/recipes/midday.recipe
Normal 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 - India’s leading tabloid has it all. To subscribe
|
||||
visit <a href="http://news.calibre-ebook.com/periodical/midday">calibre
|
||||
Periodicals</a>.'''
|
||||
language = 'en_IN'
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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}'
|
||||
|
||||
|
@ -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'
|
||||
|
||||
|
36
resources/recipes/nypost.recipe
Normal file
36
resources/recipes/nypost.recipe
Normal 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/')
|
@ -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","‘",string)
|
||||
|
||||
# Replace rsquo (\x92)
|
||||
fixed = re.sub("\x92","’",fixed)
|
||||
|
||||
# Replace ldquo (\x93)
|
||||
fixed = re.sub("\x93","“",fixed)
|
||||
|
||||
# Replace rdquo (\x94)
|
||||
fixed = re.sub("\x94","”",fixed)
|
||||
|
||||
# Replace ndash (\x96)
|
||||
fixed = re.sub("\x96","–",fixed)
|
||||
|
||||
# Replace mdash (\x97)
|
||||
fixed = re.sub("\x97","—",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 '&'
|
||||
massaged = re.sub("&","&", 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
|
||||
|
||||
|
@ -89,6 +89,7 @@ class NYTimes(BasicNewsRecipe):
|
||||
'header_search',
|
||||
'login',
|
||||
'masthead',
|
||||
'masthead-nav',
|
||||
'memberTools',
|
||||
'navigation',
|
||||
'portfolioInline',
|
||||
|
@ -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)
|
||||
|
@ -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']})]
|
||||
|
||||
|
@ -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'})
|
||||
|
@ -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
|
||||
|
@ -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"
|
||||
|
||||
|
@ -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 = {
|
||||
|
@ -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
|
||||
|
@ -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')
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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')
|
||||
|
@ -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
|
||||
|
@ -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'
|
||||
|
||||
|
0
src/calibre/devices/edge/__init__.py
Normal file
0
src/calibre/devices/edge/__init__.py
Normal file
49
src/calibre/devices/edge/driver.py
Normal file
49
src/calibre/devices/edge/driver.py
Normal 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]
|
@ -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']
|
||||
|
@ -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
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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:
|
||||
|
@ -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([
|
||||
|
@ -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]]
|
||||
|
@ -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):
|
||||
|
@ -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
|
||||
|
@ -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:
|
||||
|
@ -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):
|
||||
|
@ -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
|
||||
|
@ -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):
|
||||
|
@ -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.')
|
||||
|
@ -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(':')
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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 = []
|
||||
|
@ -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:
|
||||
|
@ -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>&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 &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 &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 &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 &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>&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>&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>&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&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&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>&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 &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>
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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>
|
||||
|
@ -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:
|
||||
|
@ -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):
|
||||
|
||||
|
@ -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"/>
|
||||
|
@ -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())))
|
||||
|
||||
|
||||
|
@ -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]
|
||||
|
@ -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):
|
||||
|
@ -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
|
||||
|
@ -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()
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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<title>)"
|
||||
@ -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
@ -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"
|
||||
|
@ -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"
|
||||
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
||||
|
@ -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
@ -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"
|
||||
|
@ -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
8112
src/calibre/translations/oc.po
Normal file
8112
src/calibre/translations/oc.po
Normal file
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
@ -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
@ -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
|
||||
|
@ -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 ¬ifications 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
@ -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 • %s</b><br />%s<br />"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1054
|
||||
msgid "<b>Page %d • %s</b><br />"
|
||||
msgstr ""
|
||||
|
||||
#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1059
|
||||
msgid "<b>Location %d • %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 "刊头字体:"
|
||||
|
@ -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
Loading…
x
Reference in New Issue
Block a user