mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
KG wip
This commit is contained in:
commit
f1be0f9c16
@ -44,6 +44,7 @@
|
|||||||
tickets: [7356]
|
tickets: [7356]
|
||||||
|
|
||||||
- title: "News download: Workaround lack of thread safety in python mechanize, causing corrupted network packets (degrading network performance) on Ubuntu Maverick 64bit kernels"
|
- title: "News download: Workaround lack of thread safety in python mechanize, causing corrupted network packets (degrading network performance) on Ubuntu Maverick 64bit kernels"
|
||||||
|
tickets: [7321]
|
||||||
|
|
||||||
- title: "Convert comments to HTML for book details panel in separate thread to make scrolling through the book list faster when large comments are present"
|
- title: "Convert comments to HTML for book details panel in separate thread to make scrolling through the book list faster when large comments are present"
|
||||||
|
|
||||||
|
BIN
resources/images/format-text-bold.png
Normal file
BIN
resources/images/format-text-bold.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 5.0 KiB |
BIN
resources/images/format-text-italic.png
Normal file
BIN
resources/images/format-text-italic.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.1 KiB |
BIN
resources/images/format-text-strikethrough.png
Normal file
BIN
resources/images/format-text-strikethrough.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 5.9 KiB |
BIN
resources/images/format-text-underline.png
Normal file
BIN
resources/images/format-text-underline.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.4 KiB |
BIN
resources/images/news/rollingstone.png
Normal file
BIN
resources/images/news/rollingstone.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.3 KiB |
51
resources/recipes/european_voice.recipe
Normal file
51
resources/recipes/european_voice.recipe
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
|
||||||
|
from calibre.web.feeds.news import BasicNewsRecipe
|
||||||
|
|
||||||
|
class EuropeanVoice(BasicNewsRecipe):
|
||||||
|
title = u'European Voice'
|
||||||
|
__author__ = 'malfi'
|
||||||
|
oldest_article = 14
|
||||||
|
max_articles_per_feed = 100
|
||||||
|
no_stylesheets = True
|
||||||
|
cover_url = 'http://www.europeanvoice.com/Css/images/logo.gif'
|
||||||
|
language = 'en'
|
||||||
|
keep_only_tags = [dict(name='div', attrs={'id':'articleLeftColumn'})]
|
||||||
|
remove_tags = [dict(name='div', attrs={'id':'BreadCrump'})]
|
||||||
|
feeds = [
|
||||||
|
(u'Whole site ',u'http://www.europeanvoice.com/Rss/2.xml'),
|
||||||
|
(u'News and analysis',u'http://www.europeanvoice.com/Rss/6.xml'),
|
||||||
|
(u'Comment',u'http://www.europeanvoice.com/Rss/7.xml'),
|
||||||
|
(u'Special reports',u'http://www.europeanvoice.com/Rss/5.xml'),
|
||||||
|
(u'People',u'http://www.europeanvoice.com/Rss/8.xml'),
|
||||||
|
(u'Career',u'http://www.europeanvoice.com/Rss/11.xml'),
|
||||||
|
(u'Policies',u'http://www.europeanvoice.com/Rss/4.xml'),
|
||||||
|
(u'EVents',u'http://www.europeanvoice.com/Rss/10.xml'),
|
||||||
|
(u'Policies - Economics',u'http://www.europeanvoice.com/Rss/31.xml'),
|
||||||
|
(u'Policies - Business',u'http://www.europeanvoice.com/Rss/19.xml'),
|
||||||
|
(u'Policies - Trade',u'http://www.europeanvoice.com/Rss/25.xml'),
|
||||||
|
(u'Policies - Information society',u'http://www.europeanvoice.com/Rss/20.xml'),
|
||||||
|
(u'Policies - Energy',u'http://www.europeanvoice.com/Rss/15.xml'),
|
||||||
|
(u'Policies - Transport',u'http://www.europeanvoice.com/Rss/18.xml'),
|
||||||
|
(u'Policies - Climate change',u'http://www.europeanvoice.com/Rss/16.xml'),
|
||||||
|
(u'Policies - Environment',u'http://www.europeanvoice.com/Rss/17.xml'),
|
||||||
|
(u'Policies - Farming & food',u'http://www.europeanvoice.com/Rss/23.xml'),
|
||||||
|
(u'Policies - Health & society',u'http://www.europeanvoice.com/Rss/24.xml'),
|
||||||
|
(u'Policies - Justice',u'http://www.europeanvoice.com/Rss/29.xml'),
|
||||||
|
(u'Policies - Foreign affairs',u'http://www.europeanvoice.com/Rss/27.xml')
|
||||||
|
]
|
||||||
|
extra_css = '''
|
||||||
|
h1{font-family:Arial,Helvetica,sans-serif; font-weight:bold;font-size:large;}
|
||||||
|
h2{font-family:Arial,Helvetica,sans-serif; font-weight:normal;font-size:small;}
|
||||||
|
p{font-family:Arial,Helvetica,sans-serif;font-size:small;}
|
||||||
|
body{font-family:Helvetica,Arial,sans-serif;font-size:small;}
|
||||||
|
'''
|
||||||
|
|
||||||
|
def print_version(self, url):
|
||||||
|
return url + '?bPrint=1'
|
||||||
|
|
||||||
|
def preprocess_html(self, soup):
|
||||||
|
denied = soup.findAll(True,text='Subscribers')
|
||||||
|
if denied:
|
||||||
|
raise Exception('Article skipped, because content can only be seen with subscription')
|
||||||
|
return soup
|
||||||
|
|
@ -33,13 +33,14 @@ class IrishTimes(BasicNewsRecipe):
|
|||||||
('Letters', 'http://www.irishtimes.com/feeds/rss/newspaper/letters.rss'),
|
('Letters', 'http://www.irishtimes.com/feeds/rss/newspaper/letters.rss'),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
def print_version(self, url):
|
def print_version(self, url):
|
||||||
if url.count('rss.feedsportal.com'):
|
if url.count('rss.feedsportal.com'):
|
||||||
u = url.replace('0Bhtml/story01.htm','_pf0Bhtml/story01.htm')
|
u = 'http://www.irishtimes.com' + \
|
||||||
else:
|
(((url[69:].replace('0C','/')).replace('0A','0'))).replace('0Bhtml/story01..htm','_pf.html')
|
||||||
u = url.replace('.html','_pf.html')
|
else:
|
||||||
return u
|
u = url.replace('.html','_pf.html')
|
||||||
|
return u
|
||||||
|
|
||||||
|
|
||||||
def get_article_url(self, article):
|
def get_article_url(self, article):
|
||||||
return article.link
|
return article.link
|
||||||
|
@ -21,8 +21,16 @@ class Pagina12(BasicNewsRecipe):
|
|||||||
use_embedded_content = False
|
use_embedded_content = False
|
||||||
language = 'es'
|
language = 'es'
|
||||||
remove_empty_feeds = True
|
remove_empty_feeds = True
|
||||||
|
publication_type = 'newspaper'
|
||||||
masthead_url = 'http://www.pagina12.com.ar/commons/imgs/logo-home.gif'
|
masthead_url = 'http://www.pagina12.com.ar/commons/imgs/logo-home.gif'
|
||||||
extra_css = ' body{font-family: Arial,Helvetica,sans-serif } img{margin-bottom: 0.4em} #autor{font-weight: bold} #fecha,#epigrafe{font-size: 0.9em; margin: 5px} #imagen{border: 1px solid black; margin: 0 0 1.25em 1.25em; width: 232px } '
|
extra_css = """
|
||||||
|
body{font-family: Arial,Helvetica,sans-serif }
|
||||||
|
img{margin-bottom: 0.4em; display:block}
|
||||||
|
#autor{font-weight: bold}
|
||||||
|
#fecha,#epigrafe{font-size: 0.9em; margin: 5px}
|
||||||
|
#imagen{border: 1px solid black; margin: 0 0 1.25em 1.25em; width: 232px }
|
||||||
|
.fgprincipal{font-size: large; font-weight: bold}
|
||||||
|
"""
|
||||||
|
|
||||||
conversion_options = {
|
conversion_options = {
|
||||||
'comment' : description
|
'comment' : description
|
||||||
@ -31,7 +39,11 @@ class Pagina12(BasicNewsRecipe):
|
|||||||
, 'language' : language
|
, 'language' : language
|
||||||
}
|
}
|
||||||
|
|
||||||
remove_tags = [dict(name='div', attrs={'id':['volver','logo','logo_suple','fin','permalink']})]
|
remove_tags = [
|
||||||
|
dict(name=['meta','link'])
|
||||||
|
,dict(name='div', attrs={'id':['volver','logo','logo_suple','fin','permalink']})
|
||||||
|
]
|
||||||
|
remove_attributes=['lang']
|
||||||
|
|
||||||
|
|
||||||
feeds = [
|
feeds = [
|
||||||
@ -65,4 +77,13 @@ class Pagina12(BasicNewsRecipe):
|
|||||||
def preprocess_html(self, soup):
|
def preprocess_html(self, soup):
|
||||||
for item in soup.findAll(style=True):
|
for item in soup.findAll(style=True):
|
||||||
del item['style']
|
del item['style']
|
||||||
|
for item in soup.findAll('span', attrs={'id':'seccion'}):
|
||||||
|
it = item.a
|
||||||
|
it.name='span'
|
||||||
|
del it['href']
|
||||||
|
del it['title']
|
||||||
|
for item in soup.findAll('p'):
|
||||||
|
it = item.find('h3')
|
||||||
|
if it:
|
||||||
|
it.name='span'
|
||||||
return soup
|
return soup
|
69
resources/recipes/rollingstone.recipe
Normal file
69
resources/recipes/rollingstone.recipe
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
__license__ = 'GPL v3'
|
||||||
|
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
|
||||||
|
'''
|
||||||
|
rollingstone.com
|
||||||
|
'''
|
||||||
|
|
||||||
|
import re
|
||||||
|
from calibre.web.feeds.news import BasicNewsRecipe
|
||||||
|
|
||||||
|
class RollingStone(BasicNewsRecipe):
|
||||||
|
title = 'Rolling Stone Magazine - free content'
|
||||||
|
__author__ = 'Darko Miletic'
|
||||||
|
description = 'Rolling Stone Magazine features music, album and artist news, movie reviews, political, economic and pop culture commentary, videos, photos, and more.'
|
||||||
|
publisher = 'Werner Media inc.'
|
||||||
|
category = 'news, music, USA, world'
|
||||||
|
oldest_article = 15
|
||||||
|
max_articles_per_feed = 200
|
||||||
|
no_stylesheets = True
|
||||||
|
encoding = 'utf8'
|
||||||
|
use_embedded_content = False
|
||||||
|
language = 'en'
|
||||||
|
remove_empty_feeds = True
|
||||||
|
publication_type = 'magazine'
|
||||||
|
masthead_url = 'http://www.rollingstone.com/templates/rolling-stone-templates/theme/rstheme/images/rsLogo.png'
|
||||||
|
extra_css = """
|
||||||
|
body{font-family: Georgia,Times,serif }
|
||||||
|
img{margin-bottom: 0.4em; display:block}
|
||||||
|
"""
|
||||||
|
|
||||||
|
conversion_options = {
|
||||||
|
'comment' : description
|
||||||
|
, 'tags' : category
|
||||||
|
, 'publisher' : publisher
|
||||||
|
, 'language' : language
|
||||||
|
}
|
||||||
|
|
||||||
|
preprocess_regexps = [
|
||||||
|
(re.compile(r'xml:lang="en">.*?<head>', re.DOTALL|re.IGNORECASE),lambda match: 'xml:lang="en">\n<head>\n')
|
||||||
|
,(re.compile(r'</title>.*?</head>' , re.DOTALL|re.IGNORECASE),lambda match: '</title>\n</head>\n' )
|
||||||
|
]
|
||||||
|
|
||||||
|
keep_only_tags=[
|
||||||
|
dict(attrs={'class':['headerImgHolder','headerContent']})
|
||||||
|
,dict(name='div',attrs={'id':['teaser','storyTextContainer']})
|
||||||
|
,dict(name='div',attrs={'class':'blogDetailModule clearfix'})
|
||||||
|
]
|
||||||
|
|
||||||
|
remove_tags = [
|
||||||
|
dict(name=['meta','iframe','object','embed'])
|
||||||
|
,dict(attrs={'id':'mpStoryHeader'})
|
||||||
|
,dict(attrs={'class':'relatedTopics'})
|
||||||
|
]
|
||||||
|
remove_attributes=['lang','onclick','width','height','name']
|
||||||
|
remove_tags_before=dict(attrs={'class':'bloggerInfo'})
|
||||||
|
remove_tags_after=dict(attrs={'class':'relatedTopics'})
|
||||||
|
|
||||||
|
|
||||||
|
feeds = [
|
||||||
|
(u'All News' , u'http://www.rollingstone.com/siteServices/rss/allNews' )
|
||||||
|
,(u'All Blogs' , u'http://www.rollingstone.com/siteServices/rss/allBlogs' )
|
||||||
|
,(u'Movie Reviews' , u'http://www.rollingstone.com/siteServices/rss/movieReviews' )
|
||||||
|
,(u'Album Reviews' , u'http://www.rollingstone.com/siteServices/rss/albumReviews' )
|
||||||
|
,(u'Song Reviews' , u'http://www.rollingstone.com/siteServices/rss/songReviews' )
|
||||||
|
]
|
||||||
|
|
||||||
|
def preprocess_html(self, soup):
|
||||||
|
for item in soup.findAll(style=True):
|
||||||
|
del item['style']
|
||||||
|
return soup
|
@ -348,8 +348,12 @@ class Build(Command):
|
|||||||
VERSION = 1.0.0
|
VERSION = 1.0.0
|
||||||
CONFIG += %s
|
CONFIG += %s
|
||||||
''')%(ext.name, ' '.join(ext.headers), ' '.join(ext.sources), archs)
|
''')%(ext.name, ' '.join(ext.headers), ' '.join(ext.sources), archs)
|
||||||
|
pro = pro.replace('\\', '\\\\')
|
||||||
open(ext.name+'.pro', 'wb').write(pro)
|
open(ext.name+'.pro', 'wb').write(pro)
|
||||||
subprocess.check_call([QMAKE, '-o', 'Makefile', ext.name+'.pro'])
|
qmc = [QMAKE, '-o', 'Makefile']
|
||||||
|
if iswindows:
|
||||||
|
qmc += ['-spec', 'win32-msvc2008']
|
||||||
|
subprocess.check_call(qmc + [ext.name+'.pro'])
|
||||||
subprocess.check_call([make, '-f', 'Makefile'])
|
subprocess.check_call([make, '-f', 'Makefile'])
|
||||||
objects = glob.glob(obj_pat)
|
objects = glob.glob(obj_pat)
|
||||||
return list(map(self.a, objects))
|
return list(map(self.a, objects))
|
||||||
|
@ -13,7 +13,7 @@ from setup import Command, modules, functions, basenames, __version__, \
|
|||||||
from setup.build_environment import msvc, MT, RC
|
from setup.build_environment import msvc, MT, RC
|
||||||
from setup.installer.windows.wix import WixMixIn
|
from setup.installer.windows.wix import WixMixIn
|
||||||
|
|
||||||
QT_DIR = 'C:\\Qt\\4.6.3'
|
QT_DIR = 'Q:\\Qt\\4.7.1'
|
||||||
QT_DLLS = ['Core', 'Gui', 'Network', 'Svg', 'WebKit', 'Xml', 'XmlPatterns']
|
QT_DLLS = ['Core', 'Gui', 'Network', 'Svg', 'WebKit', 'Xml', 'XmlPatterns']
|
||||||
LIBUSB_DIR = 'C:\\libusb'
|
LIBUSB_DIR = 'C:\\libusb'
|
||||||
LIBUNRAR = 'C:\\Program Files\\UnrarDLL\\unrar.dll'
|
LIBUNRAR = 'C:\\Program Files\\UnrarDLL\\unrar.dll'
|
||||||
|
@ -37,8 +37,7 @@ Qt
|
|||||||
|
|
||||||
Extract Qt sourcecode to C:\Qt\4.x.x. Run configure and make::
|
Extract Qt sourcecode to C:\Qt\4.x.x. Run configure and make::
|
||||||
|
|
||||||
configure -opensource -qt-zlib -qt-gif -qt-libmng -qt-libpng -qt-libtiff -qt-libjpeg -release -platform win32-msvc -no-qt3support -webkit -xmlpatterns -no-phonon
|
configure -opensource -release -qt-zlib -qt-gif -qt-libmng -qt-libpng -qt-libtiff -qt-libjpeg -release -platform win32-msvc2008 -no-qt3support -webkit -xmlpatterns -no-phonon -no-style-plastique -no-style-cleanlooks -no-style-motif -no-style-cde -no-declarative -no-scripttools -no-audio-backend -no-multimedia -no-dbus -no-openvg -no-opengl -no-qt3support -confirm-license && nmake
|
||||||
nmake
|
|
||||||
|
|
||||||
SIP
|
SIP
|
||||||
-----
|
-----
|
||||||
|
@ -221,7 +221,10 @@ class MetadataHeader(BookHeader):
|
|||||||
else:
|
else:
|
||||||
end = self.section_offset(number + 1)
|
end = self.section_offset(number + 1)
|
||||||
self.stream.seek(start)
|
self.stream.seek(start)
|
||||||
return self.stream.read(end - start)
|
try:
|
||||||
|
return self.stream.read(end - start)
|
||||||
|
except OverflowError:
|
||||||
|
return self.stream.read(os.stat(self.stream.name).st_size - start)
|
||||||
|
|
||||||
|
|
||||||
class MobiReader(object):
|
class MobiReader(object):
|
||||||
@ -398,6 +401,8 @@ class MobiReader(object):
|
|||||||
elem.getparent().remove(elem)
|
elem.getparent().remove(elem)
|
||||||
fname = self.name.encode('ascii', 'replace')
|
fname = self.name.encode('ascii', 'replace')
|
||||||
fname = re.sub(r'[\x08\x15\0]+', '', fname)
|
fname = re.sub(r'[\x08\x15\0]+', '', fname)
|
||||||
|
if not fname:
|
||||||
|
fname = 'dummy'
|
||||||
htmlfile = os.path.join(output_dir,
|
htmlfile = os.path.join(output_dir,
|
||||||
ascii_filename(fname) + '.html')
|
ascii_filename(fname) + '.html')
|
||||||
try:
|
try:
|
||||||
|
@ -9,7 +9,8 @@ __docformat__ = 'restructuredtext en'
|
|||||||
from lxml import html
|
from lxml import html
|
||||||
from lxml.html import soupparser
|
from lxml.html import soupparser
|
||||||
|
|
||||||
from PyQt4.Qt import QApplication, QFontInfo, QPalette
|
from PyQt4.Qt import QApplication, QFontInfo, QPalette, QSize, QWidget, \
|
||||||
|
QToolBar, QVBoxLayout, QAction, QIcon
|
||||||
from PyQt4.QtWebKit import QWebView
|
from PyQt4.QtWebKit import QWebView
|
||||||
|
|
||||||
from calibre.ebooks.chardet import xml_to_unicode
|
from calibre.ebooks.chardet import xml_to_unicode
|
||||||
@ -17,6 +18,22 @@ from calibre import xml_replace_entities
|
|||||||
|
|
||||||
class EditorWidget(QWebView):
|
class EditorWidget(QWebView):
|
||||||
|
|
||||||
|
def __init__(self, parent=None):
|
||||||
|
QWebView.__init__(self, parent)
|
||||||
|
|
||||||
|
for name, icon, text, checkable in [
|
||||||
|
('bold', 'format-text-bold', _('Bold'), True),
|
||||||
|
('italic', 'format-text-italic', _('Italic'), True),
|
||||||
|
('underline', 'format-text-underline', _('Underline'), True),
|
||||||
|
('strikethrough', 'format-text-underline', _('Underline'), True),
|
||||||
|
]:
|
||||||
|
ac = QAction(QIcon(I(icon+'.png')), text, self)
|
||||||
|
ac.setCheckable(checkable)
|
||||||
|
setattr(self, 'action_'+name, ac)
|
||||||
|
|
||||||
|
def sizeHint(self):
|
||||||
|
return QSize(150, 150)
|
||||||
|
|
||||||
@dynamic_property
|
@dynamic_property
|
||||||
def html(self):
|
def html(self):
|
||||||
|
|
||||||
@ -63,9 +80,31 @@ class EditorWidget(QWebView):
|
|||||||
|
|
||||||
return property(fget=fget, fset=fset)
|
return property(fget=fget, fset=fset)
|
||||||
|
|
||||||
|
|
||||||
|
class Editor(QWidget):
|
||||||
|
|
||||||
|
def __init__(self, parent=None):
|
||||||
|
QWidget.__init__(self, parent)
|
||||||
|
self.toolbar = QToolBar(self)
|
||||||
|
self.editor = EditorWidget(self)
|
||||||
|
self._layout = QVBoxLayout(self)
|
||||||
|
self.setLayout(self._layout)
|
||||||
|
self._layout.setContentsMargins(0, 0, 0, 0)
|
||||||
|
self._layout.addWidget(self.toolbar)
|
||||||
|
self._layout.addWidget(self.editor)
|
||||||
|
|
||||||
|
@dynamic_property
|
||||||
|
def html(self):
|
||||||
|
def fset(self, v):
|
||||||
|
self.editor.html = v
|
||||||
|
return property(fget=lambda self:self.editor.html, fset=fset)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
app = QApplication([])
|
app = QApplication([])
|
||||||
w = EditorWidget()
|
w = Editor()
|
||||||
|
w.resize(800, 600)
|
||||||
w.show()
|
w.show()
|
||||||
# testing {{{
|
# testing {{{
|
||||||
|
|
||||||
@ -101,4 +140,4 @@ if __name__ == '__main__':
|
|||||||
#print w.html.encode('utf-8')
|
#print w.html.encode('utf-8')
|
||||||
|
|
||||||
# }}}
|
# }}}
|
||||||
print w.html
|
#print w.html
|
||||||
|
@ -1014,7 +1014,13 @@ class DeviceMixin(object): # {{{
|
|||||||
self.status_bar.show_message(_('Sent by email:') + ', '.join(good),
|
self.status_bar.show_message(_('Sent by email:') + ', '.join(good),
|
||||||
5000)
|
5000)
|
||||||
if remove:
|
if remove:
|
||||||
self.library_view.model().delete_books_by_id(remove)
|
try:
|
||||||
|
self.library_view.model().delete_books_by_id(remove)
|
||||||
|
except:
|
||||||
|
# Probably the user deleted the files, in any case, failing
|
||||||
|
# to delete the book is not catastrophic
|
||||||
|
traceback.print_exc()
|
||||||
|
|
||||||
|
|
||||||
def cover_to_thumbnail(self, data):
|
def cover_to_thumbnail(self, data):
|
||||||
ht = self.device_manager.device.THUMBNAIL_HEIGHT \
|
ht = self.device_manager.device.THUMBNAIL_HEIGHT \
|
||||||
|
@ -101,9 +101,9 @@ class Category(QWidget): # {{{
|
|||||||
ac.setStatusTip(p.description)
|
ac.setStatusTip(p.description)
|
||||||
self.actions.append(ac)
|
self.actions.append(ac)
|
||||||
w = self.bar.widgetForAction(ac)
|
w = self.bar.widgetForAction(ac)
|
||||||
w.setStyleSheet('QToolButton { margin-right: 20px; min-width: 100px }')
|
|
||||||
w.setCursor(Qt.PointingHandCursor)
|
w.setCursor(Qt.PointingHandCursor)
|
||||||
w.setAutoRaise(True)
|
w.setAutoRaise(True)
|
||||||
|
w.setMinimumWidth(100)
|
||||||
|
|
||||||
def triggered(self, plugin, *args):
|
def triggered(self, plugin, *args):
|
||||||
self.plugin_activated.emit(plugin)
|
self.plugin_activated.emit(plugin)
|
||||||
|
@ -625,7 +625,11 @@ class ResultCache(SearchQueryParser): # {{{
|
|||||||
# }}}
|
# }}}
|
||||||
|
|
||||||
def remove(self, id):
|
def remove(self, id):
|
||||||
self._data[id] = None
|
try:
|
||||||
|
self._data[id] = None
|
||||||
|
except IndexError:
|
||||||
|
# id is out of bounds, no point setting it to None anyway
|
||||||
|
pass
|
||||||
try:
|
try:
|
||||||
self._map.remove(id)
|
self._map.remove(id)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
|
@ -235,7 +235,7 @@ class MobileServer(object):
|
|||||||
no_tag_count=True)
|
no_tag_count=True)
|
||||||
book['title'] = record[FM['title']]
|
book['title'] = record[FM['title']]
|
||||||
for x in ('timestamp', 'pubdate'):
|
for x in ('timestamp', 'pubdate'):
|
||||||
book[x] = strftime('%b, %Y', record[FM[x]])
|
book[x] = strftime('%d %b, %Y', record[FM[x]])
|
||||||
book['id'] = record[FM['id']]
|
book['id'] = record[FM['id']]
|
||||||
books.append(book)
|
books.append(book)
|
||||||
for key in CKEYS:
|
for key in CKEYS:
|
||||||
|
@ -5,8 +5,8 @@
|
|||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: calibre 0.7.27\n"
|
"Project-Id-Version: calibre 0.7.27\n"
|
||||||
"POT-Creation-Date: 2010-11-06 09:35+MDT\n"
|
"POT-Creation-Date: 2010-11-10 07:14+MST\n"
|
||||||
"PO-Revision-Date: 2010-11-06 09:35+MDT\n"
|
"PO-Revision-Date: 2010-11-10 07:14+MST\n"
|
||||||
"Last-Translator: Automatically generated\n"
|
"Last-Translator: Automatically generated\n"
|
||||||
"Language-Team: LANGUAGE\n"
|
"Language-Team: LANGUAGE\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
@ -72,9 +72,9 @@ msgstr ""
|
|||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:78
|
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:78
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:119
|
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:119
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:153
|
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:153
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:611
|
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:616
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:817
|
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:822
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:819
|
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:824
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49
|
#: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51
|
#: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:911
|
#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:911
|
||||||
@ -273,7 +273,7 @@ msgid "Change the way calibre behaves"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:734
|
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:734
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:206
|
#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:208
|
||||||
msgid "Add your own columns"
|
msgid "Add your own columns"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -1881,8 +1881,8 @@ msgstr ""
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:605
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:605
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:45
|
#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:45
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:102
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:108
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:103
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:109
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:75
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:75
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:58
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:58
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:65
|
#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:65
|
||||||
@ -1916,8 +1916,8 @@ msgstr ""
|
|||||||
#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:39
|
#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:39
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:206
|
#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:206
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:189
|
#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:189
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:104
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:110
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:74
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:79
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:325
|
#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:325
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1131
|
#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1131
|
||||||
#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:178
|
#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:178
|
||||||
@ -2213,7 +2213,7 @@ msgstr ""
|
|||||||
msgid "All articles"
|
msgid "All articles"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:259
|
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:262
|
||||||
msgid "This is an Amazon Topaz book. It cannot be processed."
|
msgid "This is an Amazon Topaz book. It cannot be processed."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -3140,7 +3140,7 @@ msgstr ""
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:391
|
#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:391
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101
|
#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:739
|
#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:741
|
||||||
msgid "Not allowed"
|
msgid "Not allowed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -3207,7 +3207,7 @@ msgstr ""
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:147
|
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:147
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:720
|
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:720
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:683
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:685
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:189
|
#: /home/kovid/work/calibre/src/calibre/gui2/metadata.py:189
|
||||||
msgid "Failed"
|
msgid "Failed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -3878,11 +3878,11 @@ msgstr ""
|
|||||||
#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:25
|
#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:25
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:49
|
#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:49
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:58
|
#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:58
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:403
|
#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:405
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:119
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:125
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:120
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:126
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:121
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:127
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:131
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:137
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:320
|
#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:320
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1117
|
#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1117
|
||||||
@ -3891,10 +3891,10 @@ msgstr ""
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26
|
#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:26
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:52
|
#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:52
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:122
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:128
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:123
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:129
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:124
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:130
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:127
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:133
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:319
|
#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:319
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/emailp.py:24
|
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/emailp.py:24
|
||||||
#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:117
|
#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:117
|
||||||
@ -3925,7 +3925,7 @@ msgstr ""
|
|||||||
msgid "None"
|
msgid "None"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:402
|
#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:404
|
||||||
msgid "Double-click to open Book Details window"
|
msgid "Double-click to open Book Details window"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -4146,6 +4146,19 @@ msgstr ""
|
|||||||
msgid "Tab template for catalog.ui"
|
msgid "Tab template for catalog.ui"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:25
|
||||||
|
msgid "Bold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:26
|
||||||
|
msgid "Italic"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:27
|
||||||
|
#: /home/kovid/work/calibre/src/calibre/gui2/comments_editor.py:28
|
||||||
|
msgid "Underline"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:36
|
#: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:36
|
||||||
msgid "For settings that cannot be specified in this dialog, use the values saved in a previous conversion (if they exist) instead of using the defaults specified in the Preferences"
|
msgid "For settings that cannot be specified in this dialog, use the values saved in a previous conversion (if they exist) instead of using the defaults specified in the Preferences"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -4613,6 +4626,7 @@ msgstr ""
|
|||||||
#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:185
|
#: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:185
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:353
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:353
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:393
|
||||||
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:214
|
||||||
msgid "&Series:"
|
msgid "&Series:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -4798,7 +4812,7 @@ msgid "Options specific to the input format."
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:117
|
#: /home/kovid/work/calibre/src/calibre/gui2/convert/single_ui.py:117
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:71
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:76
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:96
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:96
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress_ui.py:53
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/progress_ui.py:53
|
||||||
msgid "Dialog"
|
msgid "Dialog"
|
||||||
@ -4988,8 +5002,8 @@ msgid "Force maximum line length"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:56
|
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xexp_edit_ui.py:56
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:72
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:77
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:73
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:78
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:46
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:46
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:54
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:54
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:62
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:62
|
||||||
@ -5400,15 +5414,15 @@ msgstr ""
|
|||||||
msgid "&Paste from clipboard"
|
msgid "&Paste from clipboard"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:75
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:80
|
||||||
msgid "Fit &cover within view"
|
msgid "Fit &cover within view"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:76
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:81
|
||||||
msgid "&Previous"
|
msgid "&Previous"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:77
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:82
|
||||||
msgid "&Next"
|
msgid "&Next"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -5565,6 +5579,7 @@ msgid "Set options for converting %s"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:97
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf_ui.py:97
|
||||||
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:211
|
||||||
msgid "&Title:"
|
msgid "&Title:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -5813,40 +5828,40 @@ msgid "Book %d:"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:274
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:274
|
||||||
msgid "<b>You can destroy your library using this feature.</b> Changes are permanent. There is no undo function. This feature is experimental, and there may be bugs. You are strongly encouraged to back up your library before proceeding.<p>Search and replace in text fields using character matching or regular expressions. "
|
msgid "<b>You can destroy your library using this feature.</b> Changes are permanent. There is no undo function. You are strongly encouraged to back up your library before proceeding.<p>Search and replace in text fields using character matching or regular expressions. "
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:283
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:282
|
||||||
msgid "In character mode, the field is searched for the entered search text. The text is replaced by the specified replacement text everywhere it is found in the specified field. After replacement is finished, the text can be changed to upper-case, lower-case, or title-case. If the case-sensitive check box is checked, the search text must match exactly. If it is unchecked, the search text will match both upper- and lower-case letters"
|
msgid "In character mode, the field is searched for the entered search text. The text is replaced by the specified replacement text everywhere it is found in the specified field. After replacement is finished, the text can be changed to upper-case, lower-case, or title-case. If the case-sensitive check box is checked, the search text must match exactly. If it is unchecked, the search text will match both upper- and lower-case letters"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:294
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:293
|
||||||
msgid "In regular expression mode, the search text is an arbitrary python-compatible regular expression. The replacement text can contain backreferences to parenthesized expressions in the pattern. The search is not anchored, and can match and replace multiple times on the same string. The modification functions (lower-case etc) are applied to the matched text, not to the field as a whole. The destination box specifies the field where the result after matching and replacement is to be assigned. You can replace the text in the field, or prepend or append the matched text. See <a href=\"http://docs.python.org/library/re.html\"> this reference</a> for more information on python's regular expressions, and in particular the 'sub' function."
|
msgid "In regular expression mode, the search text is an arbitrary python-compatible regular expression. The replacement text can contain backreferences to parenthesized expressions in the pattern. The search is not anchored, and can match and replace multiple times on the same string. The modification functions (lower-case etc) are applied to the matched text, not to the field as a whole. The destination box specifies the field where the result after matching and replacement is to be assigned. You can replace the text in the field, or prepend or append the matched text. See <a href=\"http://docs.python.org/library/re.html\"> this reference</a> for more information on python's regular expressions, and in particular the 'sub' function."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:436
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:438
|
||||||
msgid "You must specify a destination when source is a composite field"
|
msgid "You must specify a destination when source is a composite field"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:528
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:530
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:536
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:538
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:631
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:633
|
||||||
msgid "Search/replace invalid"
|
msgid "Search/replace invalid"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:529
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:531
|
||||||
msgid "Authors cannot be set to the empty string. Book title %s not processed"
|
msgid "Authors cannot be set to the empty string. Book title %s not processed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:537
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:539
|
||||||
msgid "Title cannot be set to the empty string. Book title %s not processed"
|
msgid "Title cannot be set to the empty string. Book title %s not processed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:632
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:634
|
||||||
msgid "Search pattern is invalid: %s"
|
msgid "Search pattern is invalid: %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:669
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:671
|
||||||
msgid ""
|
msgid ""
|
||||||
"Applying changes to %d books.\n"
|
"Applying changes to %d books.\n"
|
||||||
"Phase {0} {1}%%."
|
"Phase {0} {1}%%."
|
||||||
@ -6071,7 +6086,7 @@ msgid "Your test:"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:401
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:401
|
||||||
msgid "&Search and replace (experimental)"
|
msgid "&Search and replace"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:91
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:91
|
||||||
@ -6570,56 +6585,92 @@ msgstr ""
|
|||||||
msgid "Negate"
|
msgid "Negate"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:118
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:198
|
||||||
msgid "Advanced Search"
|
msgid "Advanced Search"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:119
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:199
|
||||||
msgid "Find entries that have..."
|
msgid "Find entries that have..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:120
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:200
|
||||||
msgid "&All these words:"
|
msgid "&All these words:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:121
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:201
|
||||||
msgid "This exact &phrase:"
|
msgid "This exact &phrase:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:122
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:202
|
||||||
msgid "&One or more of these words:"
|
msgid "&One or more of these words:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:123
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:203
|
||||||
msgid "But dont show entries that have..."
|
msgid "But dont show entries that have..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:124
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:204
|
||||||
msgid "Any of these &unwanted words:"
|
msgid "Any of these &unwanted words:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:125
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:205
|
||||||
msgid "What kind of match to use:"
|
msgid "What kind of match to use:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:126
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:206
|
||||||
msgid "Contains: the word or phrase matches anywhere in the metadata"
|
msgid "Contains: the word or phrase matches anywhere in the metadata"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:127
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:207
|
||||||
msgid "Equals: the word or phrase must match an entire metadata field"
|
msgid "Equals: the word or phrase must match an entire metadata field"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:128
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:208
|
||||||
msgid "Regular expression: the expression must match anywhere in the metadata"
|
msgid "Regular expression: the expression must match anywhere in the metadata"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:129
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:209
|
||||||
msgid " "
|
msgid "See the <a href=\"http://calibre-ebook.com/user_manual/gui.html#the-search-interface\">User Manual</a> for more help"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:130
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:210
|
||||||
msgid "See the <a href=\"http://calibre-ebook.com/user_manual/gui.html#the-search-interface\">User Manual</a> for more help"
|
msgid "A&dvanced Search"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:212
|
||||||
|
msgid "Enter the title."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:213
|
||||||
|
msgid "&Author:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:215
|
||||||
|
msgid "Ta&gs:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:216
|
||||||
|
msgid "Enter an author's name. Only one author can be used."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:217
|
||||||
|
msgid "Enter a series name, without an index. Only one series name can be used."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:218
|
||||||
|
msgid "Enter tags separated by spaces"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:219
|
||||||
|
msgid "&Clear"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:220
|
||||||
|
msgid "Search only in specific fields:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:221
|
||||||
|
msgid "Titl&e/Author/Series ..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/select_formats.py:45
|
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/select_formats.py:45
|
||||||
@ -7231,35 +7282,39 @@ msgstr ""
|
|||||||
msgid "Books display will be restricted to those matching the selected saved search"
|
msgid "Books display will be restricted to those matching the selected saved search"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:172
|
#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:170
|
||||||
|
msgid "Shift+Ctrl+F"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:173
|
||||||
msgid "Advanced search"
|
msgid "Advanced search"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:177
|
#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:178
|
||||||
msgid "<p>Search the list of books by title, author, publisher, tags, comments, etc.<br><br>Words separated by spaces are ANDed"
|
msgid "<p>Search the list of books by title, author, publisher, tags, comments, etc.<br><br>Words separated by spaces are ANDed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:180
|
#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:181
|
||||||
msgid "&Go!"
|
msgid "&Go!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:186
|
#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:187
|
||||||
msgid "Do Quick Search (you can also press the Enter key)"
|
msgid "Do Quick Search (you can also press the Enter key)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:192
|
#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:193
|
||||||
msgid "Reset Quick Search"
|
msgid "Reset Quick Search"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:204
|
#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:205
|
||||||
msgid "Copy current search text (instead of search name)"
|
msgid "Copy current search text (instead of search name)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:210
|
#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:211
|
||||||
msgid "Save current search under the name shown in the box"
|
msgid "Save current search under the name shown in the box"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:216
|
#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:217
|
||||||
msgid "Delete current saved search"
|
msgid "Delete current saved search"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -7316,47 +7371,47 @@ msgstr ""
|
|||||||
msgid "Double click to <b>edit</b> me<br><br>"
|
msgid "Double click to <b>edit</b> me<br><br>"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:144
|
#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:146
|
||||||
msgid "Hide column %s"
|
msgid "Hide column %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:149
|
#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:151
|
||||||
msgid "Sort on %s"
|
msgid "Sort on %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:150
|
#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:152
|
||||||
msgid "Ascending"
|
msgid "Ascending"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:153
|
#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:155
|
||||||
msgid "Descending"
|
msgid "Descending"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:165
|
#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:167
|
||||||
msgid "Change text alignment for %s"
|
msgid "Change text alignment for %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:167
|
#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:169
|
||||||
msgid "Left"
|
msgid "Left"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:167
|
#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:169
|
||||||
msgid "Right"
|
msgid "Right"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:168
|
#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:170
|
||||||
msgid "Center"
|
msgid "Center"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:187
|
#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:189
|
||||||
msgid "Show column"
|
msgid "Show column"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:199
|
#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:201
|
||||||
msgid "Restore default layout"
|
msgid "Restore default layout"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:740
|
#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:742
|
||||||
msgid "Dropping onto a device is not supported. First add the book to the calibre library."
|
msgid "Dropping onto a device is not supported. First add the book to the calibre library."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -9027,7 +9082,7 @@ msgid "Options to customize the ebook viewer"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:42
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:42
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:704
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:708
|
||||||
msgid "Remember last used window size"
|
msgid "Remember last used window size"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -9197,63 +9252,63 @@ msgstr ""
|
|||||||
msgid "No matches found for: %s"
|
msgid "No matches found for: %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:481
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:485
|
||||||
msgid "Loading flow..."
|
msgid "Loading flow..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:517
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:521
|
||||||
msgid "Laying out %s"
|
msgid "Laying out %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:548
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:552
|
||||||
msgid "Bookmark #%d"
|
msgid "Bookmark #%d"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:552
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:556
|
||||||
msgid "Add bookmark"
|
msgid "Add bookmark"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:553
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:557
|
||||||
msgid "Enter title for bookmark:"
|
msgid "Enter title for bookmark:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:563
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:567
|
||||||
msgid "Manage Bookmarks"
|
msgid "Manage Bookmarks"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:600
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:604
|
||||||
msgid "Loading ebook..."
|
msgid "Loading ebook..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:608
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:612
|
||||||
msgid "DRM Error"
|
msgid "DRM Error"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:609
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:613
|
||||||
msgid "<p>This book is protected by <a href=\"%s\">DRM</a>"
|
msgid "<p>This book is protected by <a href=\"%s\">DRM</a>"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:613
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:617
|
||||||
msgid "Could not open ebook"
|
msgid "Could not open ebook"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:691
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:695
|
||||||
msgid "Options to control the ebook viewer"
|
msgid "Options to control the ebook viewer"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:698
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:702
|
||||||
msgid "If specified, viewer window will try to come to the front when started."
|
msgid "If specified, viewer window will try to come to the front when started."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:701
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:705
|
||||||
msgid "If specified, viewer window will try to open full screen when started."
|
msgid "If specified, viewer window will try to open full screen when started."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:706
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:710
|
||||||
msgid "Print javascript alert and console messages to the console"
|
msgid "Print javascript alert and console messages to the console"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:712
|
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:716
|
||||||
msgid ""
|
msgid ""
|
||||||
"%prog [options] file\n"
|
"%prog [options] file\n"
|
||||||
"\n"
|
"\n"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user