Merge from source

This commit is contained in:
Sengian 2010-10-30 11:16:06 +02:00
commit 02cf6bb1b3
30 changed files with 16270 additions and 11793 deletions

View File

@ -4,6 +4,137 @@
# for important features/bug fixes.
# Also, each release can have new and improved recipes.
- version: 0.7.25
date: 2010-10-29
new features:
- title: "Add support for the SONY periodical format."
description: "This means that news downloaded by calibre and sent to a newer SONY device (350/650/900) should appear in the Periodicals section and have the special periodicals navigation user interface"
type: major
- title: "Content server: Make the new browsing interface the default. The old interface can be accessed at /old"
- title: "Content server: Allow running of content server as a WSGI application within another server. Add tutorial for this to the User Manual."
- title: "Support for the Pico Life reader, Kobo Wifi and HTC Aria"
- title: "Content server: Add a new --url-prefix command line option to ease the use of the server with a reverse proxy"
- title: "New social metadata plugin for Amazon that does not rely on AWS. Since Amazon broke AWS, it is recommended you upgrade to this version if you use metadata from Amazon"
- title: "Add a tweak to specify the fonts used when geenrating the default cover"
- title: "Add an output profile for generic Tablet devices"
tickets: [7289]
- title: "SONY driver: Allow sorting of collections by arbitrary field via a new tweak."
- title: "Content server: Make /mobile a little prettier"
- title: "Add button to 'Library Check' to automatically delete spurious files and folders"
bug fixes:
- title: "FB2 Input: Lots of love. Handle stylesheets and style attributes. Make parsinf malformed FB2 files more robust."
tickets: [7219, 7230]
- title: "Fix auto send of news to device with multiple calibre libraries. The fix means that if you have any pending news to be sent, it will be ignored after the update. Future news downloads will once again be automatically sent to the device."
- title: "MOBI Output: Conversion of super/sub scripts now handles nested tags."
tickets: [7264]
- title: "Conversion pipeline: Fix parsing of XML encoding declarations."
tickets: [7328]
- title: "Pandigital (Kobo): Upload thumbnails to correct location"
tickets: [7165]
- title: "Fix auto emailed news with non asci characters in title not being deliverd to Kindle"
tickets: [7322]
- title: "Read metadata only after on import plugins have run when adding books to GUI"
tickets: [7245]
- title: "Various fixes for bugs caused by non ascii temporary paths on windows with non UTF-8 filesystem encodings"
tickets: [7288]
- title: "Various fixes/enhancements to SNB Output"
- title: "Allow Tag editor in edit metadata dialog to be used even if tags have been changed"
tickets: [7298]
- title: "Fix crash on some OS X machines when Preferences->Conversion->Output is clicked"
- title: "MOBI indexing: Fix last entry missing sometimes"
tickets: [6595]
- title: "Fix regression causing books to be deselected after sending to device"
tickets: [7271]
- title: "Conversion pipeline: Fix rescaling of GIF images not working"
tickets: [7306]
- title: "Update PDF metadata/conversion libraries in windows build"
- title: "Fix timezone bug when searching on date fields"
tickets: [7300]
- title: "Fix regression that caused the viewr to crash if the main application is closed"
tickets: [7276]
- title: "Fix bug causing a spurious metadata.opf file to be written at the root of the calibre library when adding books"
- title: "Use the same title casing algorithm in all places"
- title: "Fix bulk edit of dual state boolean custom columns"
- title: "Increase image size for comics in Kindle DX profile for better conversion of comics to PDF"
- title: "Fix restore db to not dies when conflicting custom columns are encountered and report conflicting columns errors. Fix exceptions when referencing invalid _index fields."
- title: "Fix auto merge books not respecting article sort tweak"
tickets: [7147]
- title: "Linux device drivers: Fix udisks based ejecting for devices with multiple nodes"
- title: "Linux device mounting: Mount the drive with the lowest kernel name as main memory"
- title: "Fix use of numeric fields in templates"
- title: "EPUB Input: Handle EPUB files with multiple OPF files."
tickets: [7229]
- title: "Setting EPUB metadata: Fix date format. Fix language being overwritten by und when unspecified. Fix empty ISBN identifier being created"
- title: "Fix cannot delete a Series listing from List view also dismiss fetch metadata dialog when no metadata found automatically"
tickets: [7221, 7220]
- title: "Content server: Handle switch library in GUI gracefully"
- title: "calibre-server: Use cherrypy implementation of --pidfile and --daemonize"
new recipes:
- title: "Ming Pao"
author: "Eddie Lau"
- title: "lenta.ru"
author: "Nikolai Kotchetkov"
- title: "frazpc.pl"
author: "Tomasz Dlugosz"
- title: "Perfil and The Economic Collapse Blog"
author: "Darko Miletic"
- title: "STNN"
author: "Larry Chan"
improved recipes:
- CubaDebate
- El Pais
- Fox News
- New Scientist
- The Economic Times of India
- version: 0.7.24
date: 2010-10-17

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,24 @@
from calibre.web.feeds.news import BasicNewsRecipe
class Tagesschau(BasicNewsRecipe):
title = 'Tagesschau'
description = 'Nachrichten der ARD'
publisher = 'ARD'
language = 'de_DE'
__author__ = 'Florian Andreas Pfaff'
oldest_article = 7
max_articles_per_feed = 100
no_stylesheets = True
feeds = [('Tagesschau', 'http://www.tagesschau.de/xml/rss2')]
remove_tags = [
dict(name='div', attrs={'class':['linksZumThema schmal','teaserBox','boxMoreLinks','directLinks','teaserBox boxtext','fPlayer','zitatBox breit flashaudio']}),
dict(name='div',
attrs={'id':['socialBookmarks','seitenanfang']}),
dict(name='ul',
attrs={'class':['directLinks','directLinks weltatlas']}),
dict(name='strong', attrs={'class':['boxTitle inv','inv']})
]
keep_only_tags = [dict(name='div', attrs={'id':'centerCol'})]

View File

@ -20,40 +20,40 @@
<title>
<xsl:value-of select="fb:description/fb:title-info/fb:book-title" />
</title>
<style type="text/x-oeb1-css">
A { color : #0002CC }
A:HOVER { color : #BF0000 }
BODY { background-color : #FEFEFE; color : #000000; font-family :
Verdana, Geneva, Arial, Helvetica, sans-serif; text-align : justify
}
H1{ font-size : 160%; font-style : normal; font-weight : bold;
text-align : left; border : 1px solid Black; background-color :
#E7E7E7; margin-left : 0px; page-break-before : always; }
H2{
font-size : 130%; font-style : normal; font-weight : bold;
text-align : left; background-color : #EEEEEE; border : 1px solid
Gray; page-break-before : always; }
H3{ font-size : 110%; font-style
: normal; font-weight : bold; text-align : left; background-color :
#F1F1F1; border : 1px solid Silver;}
H4{ font-size : 100%;
font-style : normal; font-weight : bold; text-align : left; border
: 1px solid Gray; background-color : #F4F4F4;}
H5{ font-size : 100%;
font-style : italic; font-weight : bold; text-align : left; border
: 1px solid Gray; background-color : #F4F4F4;}
H6{ font-size : 100%;
font-style : italic; font-weight : normal; text-align : left;
border : 1px solid Gray; background-color : #F4F4F4;}
SMALL{
font-size : 80% }
BLOCKQUOTE{ margin-left :4em; margin-top:1em;
margin-right:0.2em;}
HR{ color : Black }
DIV{font-family : "Times New Roman", Times, serif; text-align : justify}
UL{margin-left: 0}
.epigraph{width:50%; margin-left : 35%;}
<style type="text/css">
a { color : #0002CC }
a:hover { color : #BF0000 }
body { background-color : #FEFEFE; color : #000000; font-family : Verdana, Geneva, Arial, Helvetica, sans-serif; text-align : justify }
h1{ font-size : 160%; font-style : normal; font-weight : bold; text-align : left; border : 1px solid Black; background-color : #E7E7E7; margin-left : 0px; page-break-before : always; }
h2{ font-size : 130%; font-style : normal; font-weight : bold; text-align : left; background-color : #EEEEEE; border : 1px solid Gray; page-break-before : always; }
h3{ font-size : 110%; font-style : normal; font-weight : bold; text-align : left; background-color : #F1F1F1; border : 1px solid Silver;}
h4{ font-size : 100%; font-style : normal; font-weight : bold; text-align : left; border : 1px solid Gray; background-color : #F4F4F4;}
h5{ font-size : 100%; font-style : italic; font-weight : bold; text-align : left; border : 1px solid Gray; background-color : #F4F4F4;}
h6{ font-size : 100%; font-style : italic; font-weight : normal; text-align : left; border : 1px solid Gray; background-color : #F4F4F4;}
small { font-size : 80% }
blockquote { margin-left :4em; margin-top:1em; margin-right:0.2em;}
hr { color : Black }
div {font-family : "Times New Roman", Times, serif; text-align : justify}
ul {margin-left: 0}
.epigraph{width:50%; margin-left : 35%;}
div.paragraph { text-align: justify; text-indent: 2em; }
</style>
<link rel="stylesheet" type="text/css" href="inline-styles.css" />
</head>
<body>
<xsl:for-each select="fb:description/fb:title-info/fb:annotation">
@ -143,12 +143,13 @@
</xsl:choose>
</xsl:variable>
<xsl:if test="$section_has_title = 'None'">
<a name="TOC_{generate-id()}" />
<xsl:if test="@id">
<xsl:element name="a">
<xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute>
</xsl:element>
</xsl:if>
<div id="TOC_{generate-id()}">
<xsl:if test="@id">
<xsl:element name="a">
<xsl:attribute name="id"><xsl:value-of select="@id"/></xsl:attribute>
</xsl:element>
</xsl:if>
</div>
</xsl:if>
<xsl:apply-templates>
<xsl:with-param name="section_toc_id" select="$section_has_title" />
@ -167,13 +168,13 @@
</xsl:if>
<xsl:if test="$section_toc_id != 'None'">
<xsl:element name="a">
<xsl:attribute name="name">TOC_<xsl:value-of select="$section_toc_id"/></xsl:attribute>
<xsl:attribute name="id">TOC_<xsl:value-of select="$section_toc_id"/></xsl:attribute>
</xsl:element>
</xsl:if>
<a name="TOC_{generate-id()}"></a>
<xsl:if test="@id">
<xsl:element name="a">
<xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute>
<xsl:attribute name="id"><xsl:value-of select="@id"/></xsl:attribute>
</xsl:element>
</xsl:if>
<xsl:apply-templates/>
@ -183,7 +184,7 @@
<xsl:element name="h6">
<xsl:if test="@id">
<xsl:element name="a">
<xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute>
<xsl:attribute name="id"><xsl:value-of select="@id"/></xsl:attribute>
</xsl:element>
</xsl:if>
<xsl:apply-templates/>
@ -214,11 +215,18 @@
</xsl:template>
<!-- p -->
<xsl:template match="fb:p">
<div align="justify"><xsl:if test="@id">
<xsl:element name="div">
<xsl:attribute name="class">paragraph</xsl:attribute>
<xsl:if test="@id">
<xsl:element name="a">
<xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute>
</xsl:element>
</xsl:if> &#160;&#160;&#160;<xsl:apply-templates/></div>
</xsl:if>
<xsl:if test="@style">
<xsl:attribute name="style"><xsl:value-of select="@style"/></xsl:attribute>
</xsl:if>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<!-- strong -->
<xsl:template match="fb:strong">

View File

@ -8,7 +8,7 @@ __docformat__ = 'restructuredtext en'
__all__ = [
'pot', 'translations', 'get_translations', 'iso639',
'build', 'build_pdf2xml',
'build', 'build_pdf2xml', 'server',
'gui',
'develop', 'install',
'resources',
@ -35,6 +35,9 @@ from setup.extensions import Build, BuildPDF2XML
build = Build()
build_pdf2xml = BuildPDF2XML()
from setup.server import Server
server = Server()
from setup.install import Develop, Install, Sdist
develop = Develop()
install = Install()

48
setup/server.py Normal file
View File

@ -0,0 +1,48 @@
#!/usr/bin/env python
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
__license__ = 'GPL v3'
__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'
__docformat__ = 'restructuredtext en'
import subprocess, tempfile, os, time
from setup import Command
class Server(Command):
description = 'Run the calibre server in development mode conveniently'
MONOCLE_PATH = '../monocle'
def rebuild_monocole(self):
subprocess.check_call(['sprocketize', '-C', self.MONOCLE_PATH,
'-I', 'src', 'src/monocle.js'],
stdout=open('resources/content_server/monocle.js', 'wb'))
def launch_server(self, log):
self.rebuild_monocole()
p = subprocess.Popen(['calibre-server', '--develop'],
stderr=subprocess.STDOUT, stdout=log)
return p
def run(self, opts):
tdir = tempfile.gettempdir()
logf = os.path.join(tdir, 'calibre-server.log')
log = open(logf, 'ab')
print 'Server log available at:', logf
while True:
print 'Starting server...'
p = self.launch_server(log)
try:
raw_input('Press Enter to kill/restart server. Ctrl+C to quit: ')
except:
break
else:
while p.returncode is None:
p.terminate()
time.sleep(0.1)
p.kill()
print

View File

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

View File

@ -30,9 +30,9 @@ def detect(aBuf):
# Added by Kovid
ENCODING_PATS = [
re.compile(r'<\?[^<>]+encoding=[\'"](.*?)[\'"][^<>]*>',
re.compile(r'<\?[^<>]+encoding\s*=\s*[\'"](.*?)[\'"][^<>]*>',
re.IGNORECASE),
re.compile(r'''<meta\s+?[^<>]+?content=['"][^'"]*?charset=([-a-z0-9]+)[^'"]*?['"][^<>]*>''',
re.compile(r'''<meta\s+?[^<>]+?content\s*=\s*['"][^'"]*?charset=([-a-z0-9]+)[^'"]*?['"][^<>]*>''',
re.IGNORECASE)
]
ENTITY_PATTERN = re.compile(r'&(\S+?);')

View File

@ -40,14 +40,35 @@ class FB2Input(InputFormatPlugin):
accelerators):
from calibre.ebooks.metadata.opf2 import OPFCreator
from calibre.ebooks.metadata.meta import get_metadata
from calibre.ebooks.oeb.base import XLINK_NS
from calibre.ebooks.oeb.base import XLINK_NS, XHTML_NS, RECOVER_PARSER
NAMESPACES = {'f':FB2NS, 'l':XLINK_NS}
log.debug('Parsing XML...')
raw = stream.read()
raw = stream.read().replace('\0', '')
try:
doc = etree.fromstring(raw.replace('\0', ''))
doc = etree.fromstring(raw)
except etree.XMLSyntaxError:
doc = etree.fromstring(raw.replace('& ', '&amp;'))
try:
doc = etree.fromstring(raw, parser=RECOVER_PARSER)
except:
doc = etree.fromstring(raw.replace('& ', '&amp;'),
parser=RECOVER_PARSER)
stylesheets = doc.xpath('//*[local-name() = "stylesheet" and @type="text/css"]')
css = ''
for s in stylesheets:
css += etree.tostring(s, encoding=unicode, method='text',
with_tail=False) + '\n\n'
if css:
import cssutils, logging
parser = cssutils.CSSParser(fetcher=None,
log=logging.getLogger('calibre.css'))
XHTML_CSS_NAMESPACE = '@namespace "%s";\n' % XHTML_NS
text = XHTML_CSS_NAMESPACE + css
log.debug('Parsing stylesheet...')
stylesheet = parser.parseString(text)
stylesheet.namespaces['h'] = XHTML_NS
css = unicode(stylesheet.cssText).replace('h|style', 'h|span')
css = re.sub(r'name\s*=\s*', 'class=', css)
self.extract_embedded_content(doc)
log.debug('Converting XML to HTML...')
ss = open(P('templates/fb2.xsl'), 'rb').read()
@ -63,7 +84,9 @@ class FB2Input(InputFormatPlugin):
for img in result.xpath('//img[@src]'):
src = img.get('src')
img.set('src', self.binary_map.get(src, src))
open('index.xhtml', 'wb').write(transform.tostring(result))
index = transform.tostring(result)
open('index.xhtml', 'wb').write(index)
open('inline-styles.css', 'wb').write(css)
stream.seek(0)
mi = get_metadata(stream, 'fb2')
if not mi.title:

View File

@ -22,7 +22,8 @@ def get_metadata(stream):
'xlink':XLINK_NS})
tostring = lambda x : etree.tostring(x, method='text',
encoding=unicode).strip()
root = etree.fromstring(stream.read())
parser = etree.XMLParser(recover=True, no_network=True)
root = etree.fromstring(stream.read(), parser=parser)
authors, author_sort = [], None
for au in XPath('//fb2:author')(root):
fname = lname = author = None

View File

@ -27,6 +27,8 @@ TABLE_TAGS = set(['table', 'tr', 'td', 'th', 'caption'])
SPECIAL_TAGS = set(['hr', 'br'])
CONTENT_TAGS = set(['img', 'hr', 'br'])
NOT_VTAGS = HEADER_TAGS | NESTABLE_TAGS | TABLE_TAGS | SPECIAL_TAGS | \
CONTENT_TAGS
PAGE_BREAKS = set(['always', 'left', 'right'])
COLLAPSE = re.compile(r'[ \t\r\n\v]+')
@ -57,8 +59,6 @@ class FormatState(object):
self.indent = 0.
self.fsize = 3
self.ids = set()
self.valign = 'baseline'
self.nest = False
self.italic = False
self.bold = False
self.strikethrough = False
@ -76,7 +76,6 @@ class FormatState(object):
and self.italic == other.italic \
and self.bold == other.bold \
and self.href == other.href \
and self.valign == other.valign \
and self.preserve == other.preserve \
and self.family == other.family \
and self.bgcolor == other.bgcolor \
@ -224,7 +223,6 @@ class MobiMLizer(object):
return
if not pstate or istate != pstate:
inline = para
valign = istate.valign
fsize = istate.fsize
href = istate.href
if not href:
@ -234,19 +232,8 @@ class MobiMLizer(object):
else:
inline = etree.SubElement(inline, XHTML('a'), href=href)
bstate.anchor = inline
if valign == 'super':
parent = inline
if istate.nest and bstate.inline is not None:
parent = bstate.inline
istate.nest = False
inline = etree.SubElement(parent, XHTML('sup'))
elif valign == 'sub':
parent = inline
if istate.nest and bstate.inline is not None:
parent = bstate.inline
istate.nest = False
inline = etree.SubElement(parent, XHTML('sub'))
elif fsize != 3:
if fsize != 3:
inline = etree.SubElement(inline, XHTML('font'),
size=str(fsize))
if istate.family == 'monospace':
@ -279,7 +266,8 @@ class MobiMLizer(object):
else:
inline.append(item)
def mobimlize_elem(self, elem, stylizer, bstate, istates):
def mobimlize_elem(self, elem, stylizer, bstate, istates,
ignore_valign=False):
if not isinstance(elem.tag, basestring) \
or namespace(elem.tag) != XHTML_NS:
return
@ -351,15 +339,6 @@ class MobiMLizer(object):
istate.family = 'sans-serif'
else:
istate.family = 'serif'
valign = style['vertical-align']
if valign in ('super', 'text-top') or asfloat(valign) > 0:
istate.nest = istate.valign in ('sub', 'super')
istate.valign = 'super'
elif valign == 'sub' or asfloat(valign) < 0:
istate.nest = istate.valign in ('sub', 'super')
istate.valign = 'sub'
else:
istate.valign = 'baseline'
if 'id' in elem.attrib:
istate.ids.add(elem.attrib['id'])
if 'name' in elem.attrib:
@ -407,6 +386,30 @@ class MobiMLizer(object):
text = None
else:
text = COLLAPSE.sub(' ', elem.text)
valign = style['vertical-align']
not_baseline = valign in ('super', 'sub', 'text-top',
'text-bottom')
vtag = 'sup' if valign in ('super', 'text-top') else 'sub'
if not_baseline and not ignore_valign and tag not in NOT_VTAGS and not isblock:
nroot = etree.Element(XHTML('html'), nsmap=MOBI_NSMAP)
vbstate = BlockState(etree.SubElement(nroot, XHTML('body')))
vbstate.para = etree.SubElement(vbstate.body, XHTML('p'))
self.mobimlize_elem(elem, stylizer, vbstate, istates,
ignore_valign=True)
if len(istates) > 0:
istates.pop()
if len(istates) == 0:
istates.append(FormatState())
at_start = bstate.para is None
if at_start:
self.mobimlize_content('span', '', bstate, istates)
parent = bstate.para if bstate.inline is None else bstate.inline
if parent is not None:
vtag = etree.SubElement(parent, XHTML(vtag))
for child in vbstate.para:
vtag.append(child)
return
if text or tag in CONTENT_TAGS or tag in NESTABLE_TAGS:
self.mobimlize_content(tag, text, bstate, istates)
for child in elem:
@ -421,6 +424,8 @@ class MobiMLizer(object):
tail = COLLAPSE.sub(' ', child.tail)
if tail:
self.mobimlize_content(tag, tail, bstate, istates)
if bstate.content and style['page-break-after'] in PAGE_BREAKS:
bstate.pbreak = True
if isblock:

File diff suppressed because it is too large Load Diff

View File

@ -4,9 +4,9 @@
#
msgid ""
msgstr ""
"Project-Id-Version: calibre 0.7.24\n"
"POT-Creation-Date: 2010-10-27 18:05+MDT\n"
"PO-Revision-Date: 2010-10-27 18:05+MDT\n"
"Project-Id-Version: calibre 0.7.25\n"
"POT-Creation-Date: 2010-10-29 12:53+MDT\n"
"PO-Revision-Date: 2010-10-29 12:53+MDT\n"
"Last-Translator: Automatically generated\n"
"Language-Team: LANGUAGE\n"
"MIME-Version: 1.0\n"
@ -36,8 +36,8 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/chm/metadata.py:56
#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:407
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/periodical.py:124
#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:70
#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:72
#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:93
#: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:95
#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:336
#: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:339
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1894
@ -52,7 +52,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:606
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:36
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:61
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:49
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:50
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fetch.py:333
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:36
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:64
@ -143,7 +143,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2161
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2163
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2295
#: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:224
#: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:228
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:139
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:142
#: /home/kovid/work/calibre/src/calibre/library/server/xml.py:78
@ -249,163 +249,163 @@ msgstr ""
msgid "Set metadata from %s files"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:706
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:708
msgid "Look and Feel"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:708
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:720
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:731
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:742
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:710
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:722
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:733
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:744
msgid "Interface"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:712
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:714
msgid "Adjust the look and feel of the calibre interface to suit your tastes"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:718
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:720
msgid "Behavior"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:724
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:726
msgid "Change the way calibre behaves"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:729
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:731
#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:202
msgid "Add your own columns"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:735
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:737
msgid "Add/remove your own columns to the calibre book list"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:740
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:742
msgid "Customize the toolbar"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:746
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:748
msgid "Customize the toolbars and context menus, changing which actions are available in each"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:752
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:754
msgid "Input Options"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:754
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:765
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:776
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:756
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:767
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:778
msgid "Conversion"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:758
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:760
msgid "Set conversion options specific to each input format"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:763
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:765
msgid "Common Options"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:769
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:771
msgid "Set conversion options common to all formats"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:774
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:776
msgid "Output Options"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:780
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:782
msgid "Set conversion options specific to each output format"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:785
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:787
msgid "Adding books"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:787
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:799
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:811
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:823
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:789
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:801
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:813
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:825
msgid "Import/Export"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:791
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:793
msgid "Control how calibre reads metadata from files when adding books"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:797
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:799
msgid "Saving books to disk"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:803
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805
msgid "Control how calibre exports files from its database to disk when using Save to disk"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:809
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:811
msgid "Sending books to devices"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:815
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:817
msgid "Control how calibre transfers files to your ebook reader"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:821
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:823
msgid "Metadata plugboards"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:827
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:829
msgid "Change metadata fields before saving/sending"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:832
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:834
msgid "Sharing books by email"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:834
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:846
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:836
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:848
msgid "Sharing"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:838
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:840
msgid "Setup sharing of books via email. Can be used for automatic sending of downloaded news to your devices"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:844
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:846
msgid "Sharing over the net"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:850
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:852
msgid "Setup the calibre Content Server which will give you access to your calibre library from anywhere, on any device, over the internet"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:857
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:859
msgid "Plugins"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:859
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:871
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:882
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:861
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:873
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:884
msgid "Advanced"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:863
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:865
msgid "Add/remove/customize various bits of calibre functionality"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:869
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:871
msgid "Tweaks"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:875
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:877
msgid "Fine tune how calibre behaves in various contexts"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:880
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:882
msgid "Miscellaneous"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:886
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:888
msgid "Miscellaneous advanced configuration"
msgstr ""
@ -538,7 +538,7 @@ msgstr ""
msgid "This profile is intended for the Amazon Kindle DX."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:663
#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:664
msgid "This profile is intended for the Sanda Bambook."
msgstr ""
@ -913,11 +913,11 @@ msgstr ""
msgid "Communicate with the Pandigital Novel"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/devices/misc.py:124
#: /home/kovid/work/calibre/src/calibre/devices/misc.py:130
msgid "Communicate with the VelocityMicro"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/devices/misc.py:142
#: /home/kovid/work/calibre/src/calibre/devices/misc.py:148
msgid "Communicate with the GM2000"
msgstr ""
@ -974,11 +974,15 @@ msgstr ""
msgid "Communicate with the Newsmy reader."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/devices/teclast/driver.py:48
#: /home/kovid/work/calibre/src/calibre/devices/teclast/driver.py:47
msgid "Communicate with the Pico reader."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/devices/teclast/driver.py:57
msgid "Communicate with the iPapyrus reader."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/devices/teclast/driver.py:59
#: /home/kovid/work/calibre/src/calibre/devices/teclast/driver.py:68
msgid "Communicate with the Sovos reader."
msgstr ""
@ -1542,7 +1546,7 @@ msgid "When using an SVG cover, this option will cause the cover to scale to cov
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/epub/output.py:170
#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:205
#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:203
msgid "Start"
msgstr ""
@ -1865,7 +1869,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:380
#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:930
#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:303
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:569
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:570
msgid "Title"
msgstr ""
@ -1909,7 +1913,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:320
#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1134
#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:160
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:608
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:618
msgid "Tags"
msgstr ""
@ -2272,7 +2276,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:153
#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:71
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:606
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:616
msgid "Rating"
msgstr ""
@ -2538,27 +2542,39 @@ msgid ""
"%s"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:32
#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:25
#: /home/kovid/work/calibre/src/calibre/ebooks/tcr/output.py:23
msgid "Specify the character encoding of the output document. The default is utf-8."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:39
#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:29
#: /home/kovid/work/calibre/src/calibre/ebooks/txt/output.py:38
msgid "The maximum number of characters per line. This splits on the first space before the specified value. If no space is found the line will be broken at the space after and will exceed the specified value. Also, there is a minimum of 25 characters. Use 0 to disable line splitting."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:124
#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:36
msgid "Specify whether or not to insert an empty line between two paragraphs."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:40
msgid "Specify whether or not to insert two space characters to indent the first line of each paragraph."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:44
msgid "Specify whether or not to hide the chapter title for each chapter. Useful for image-only output (eg. comics)."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:122
msgid "Start Page"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:132
#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:134
#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:136
msgid "Cover Pages"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:149
#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:152
#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:147
#: /home/kovid/work/calibre/src/calibre/ebooks/snb/output.py:150
msgid " (Preface)"
msgstr ""
@ -2699,7 +2715,7 @@ msgid "Disable UI animations"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:183
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:487
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:494
msgid "Copied"
msgstr ""
@ -2711,7 +2727,7 @@ msgstr ""
msgid "Copy to Clipboard"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:466
#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:467
msgid "Choose Files"
msgstr ""
@ -3531,7 +3547,7 @@ msgid "Click the show details button to see which ones."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:16
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:613
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:623
msgid "Show book details"
msgstr ""
@ -3948,7 +3964,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_input_ui.py:43
#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_output_ui.py:47
#: /home/kovid/work/calibre/src/calibre/gui2/convert/rb_output_ui.py:33
#: /home/kovid/work/calibre/src/calibre/gui2/convert/snb_output_ui.py:28
#: /home/kovid/work/calibre/src/calibre/gui2/convert/snb_output_ui.py:39
#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection_ui.py:80
#: /home/kovid/work/calibre/src/calibre/gui2/convert/toc_ui.py:67
#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_input_ui.py:51
@ -4777,6 +4793,18 @@ msgstr ""
msgid "SNB Output"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/snb_output_ui.py:40
msgid "Hide chapter name"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/snb_output_ui.py:41
msgid "Insert space before the first line for each paragraph"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/snb_output_ui.py:42
msgid "Insert empty line between paragraphs"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/structure_detection.py:17
msgid ""
"Structure\n"
@ -5154,7 +5182,7 @@ msgid "Send and delete from library"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:492
msgid "Send specific format"
msgid "Send specific format to"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:528
@ -5465,7 +5493,7 @@ msgid "No location selected"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:84
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:628
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:635
msgid "Bad location"
msgstr ""
@ -5545,7 +5573,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:932
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:31
#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:294
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:568
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:569
msgid "Date"
msgstr ""
@ -6091,71 +6119,71 @@ msgid "This ISBN number is invalid"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:611
msgid "Cannot use tag editor"
msgid "Tags changed"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:612
msgid "The tags editor cannot be used if you have modified the tags"
msgid "You have changed the tags. In order to use the tags editor, you must either discard or apply these changes"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:632
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:639
msgid "Downloading cover..."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:644
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:649
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:655
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:660
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:651
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:656
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:662
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:667
msgid "Cannot fetch cover"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:645
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:656
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:661
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:652
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:663
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:668
msgid "<b>Could not fetch cover.</b><br/>"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:646
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:653
msgid "The download timed out."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:650
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:657
msgid "Could not find cover for this book. Try specifying the ISBN first."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:662
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:669
msgid "For the error message from each cover source, click Show details below."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:669
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:676
msgid "Bad cover"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:670
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:677
msgid "The cover is not a valid picture"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:703
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:710
msgid "There were errors"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:704
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:711
msgid "There were errors downloading social metadata"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:735
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:742
msgid "Cannot fetch metadata"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:736
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:743
msgid "You must specify at least one of ISBN, Title, Authors or Publisher"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:823
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:833
msgid "Permission denied"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:824
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:834
msgid "Could not open %s. Is it being used by another program?"
msgstr ""
@ -7385,7 +7413,7 @@ msgid "Do not check for updates"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:58
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:636
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:643
msgid "Calibre Library"
msgstr ""
@ -7535,7 +7563,7 @@ msgid "Successfully downloaded metadata for %d out of %d books"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:287
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:612
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:622
msgid "Details"
msgstr ""
@ -9301,48 +9329,48 @@ msgstr ""
msgid "Toggle"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:378
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:385
msgid "If you use the WordPlayer e-book app on your Android phone, you can access your calibre book collection directly on the device. To do this you have to turn on the content server."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:382
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:389
msgid "Remember to leave calibre running as the server only runs as long as calibre is running."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:384
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:391
msgid "You have to add the URL http://myhostname:8080 as your calibre library in WordPlayer. Here myhostname should be the fully qualified hostname or the IP address of the computer calibre is running on."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:461
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:468
msgid "Moving library..."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:477
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:478
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:484
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:485
msgid "Failed to move library"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:532
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:539
msgid "Invalid database"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:533
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:540
msgid "<p>An invalid library already exists at %s, delete it before trying to move the existing library.<br>Error: %s"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:544
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:551
msgid "Could not move library"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:615
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:622
msgid "Select location for books"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:629
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:636
msgid "You must choose an empty folder for the calibre library. %s is not empty."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:703
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:710
msgid "welcome wizard"
msgstr ""
@ -10402,12 +10430,16 @@ msgstr ""
msgid "Group items in categories such as author/tags by first letter when there are more than this number of items. Default: %default. Set to a large number to disable grouping."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/base.py:131
#: /home/kovid/work/calibre/src/calibre/library/server/__init__.py:48
msgid "Prefix to prepend to all URLs. Useful for reverseproxying to this server from Apache/nginx/etc."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/base.py:149
msgid "Password to access your calibre library. Username is "
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:51
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:399
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:401
msgid "Loading, please wait"
msgstr ""
@ -10452,74 +10484,74 @@ msgstr ""
msgid "Sort by"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:307
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:505
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:568
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:308
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:512
#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:569
msgid "Newest"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:308
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:506
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:309
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:513
msgid "All books"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:340
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:341
msgid "Browse books by"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:345
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:346
msgid "Choose a category to browse by:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:418
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:421
msgid "Browsing by"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:419
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:422
msgid "Up"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:535
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:543
msgid "in"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:538
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:546
msgid "Books in"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:588
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:597
msgid "Other formats"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:595
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:604
msgid "Read %s in the %s format"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:600
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:609
msgid "Get"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:614
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:624
msgid "Permalink"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:615
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:625
msgid "A permanent link to this book"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:626
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:636
msgid "This book has been deleted"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:707
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:720
msgid "in search"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:709
#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:722
msgid "Matching books"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/main.py:28
#: /home/kovid/work/calibre/src/calibre/library/server/main.py:39
msgid ""
"[options]\n"
"\n"
@ -10532,15 +10564,15 @@ msgid ""
"The OPDS interface is advertised via BonJour automatically.\n"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/main.py:41
#: /home/kovid/work/calibre/src/calibre/library/server/main.py:52
msgid "Path to the library folder to serve with the content server"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/main.py:43
#: /home/kovid/work/calibre/src/calibre/library/server/main.py:54
msgid "Write process PID to the specified file"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/server/main.py:47
#: /home/kovid/work/calibre/src/calibre/library/server/main.py:58
msgid "Specifies a restriction to be used for this invocation. This option overrides any per-library settings specified in the GUI"
msgstr ""
@ -10862,91 +10894,91 @@ msgstr ""
msgid "Unknown News Source"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:615
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:614
msgid "The \"%s\" recipe needs a username and password."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:714
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:713
msgid "Download finished"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:716
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:715
msgid "Failed to download the following articles:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:722
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:721
msgid "Failed to download parts of the following articles:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:724
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:723
msgid " from "
msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:726
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:725
msgid "\tFailed links:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:815
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:814
msgid "Could not fetch article. Run with -vv to see the reason"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:836
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:835
msgid "Fetching feeds..."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:841
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:840
msgid "Got feeds from index page"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:850
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:849
msgid "Trying to download cover..."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:852
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:851
msgid "Generating masthead..."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:933
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:932
msgid "Starting download [%d thread(s)]..."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:949
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:948
msgid "Feeds downloaded to %s"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:958
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:957
msgid "Could not download cover: %s"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:965
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:964
msgid "Downloading cover from %s"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1010
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1009
msgid "Masthead image downloaded"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1178
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1177
msgid "Untitled Article"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1249
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1248
msgid "Article downloaded: %s"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1260
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1259
msgid "Article download failed: %s"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1277
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1276
msgid "Fetching feed"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1424
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1423
msgid "Failed to log in, check your username and password for the calibre Periodicals service."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1439
#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1438
msgid "You do not have permission to download this issue. Either your subscription has expired or you have exceeded the maximum allowed downloads for today."
msgstr ""

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff