diff --git a/Makefile b/Makefile index ec15096405..6087586232 100644 --- a/Makefile +++ b/Makefile @@ -25,7 +25,7 @@ manual: pictureflow : mkdir -p src/calibre/plugins && rm -f src/calibre/plugins/*pictureflow* && \ - cd src/calibre/gui2/pictureflow && \ + cd src/calibre/gui2/pictureflow && rm *.o && \ mkdir -p .build && cd .build && rm -f * && \ qmake ../pictureflow-lib.pro && make && \ cd ../PyQt && \ diff --git a/osx_installer.py b/osx_installer.py index 17618d9519..672af57541 100644 --- a/osx_installer.py +++ b/osx_installer.py @@ -3,7 +3,7 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' ''' Create an OSX installer ''' -import sys, re, os, shutil, subprocess, stat +import sys, re, os, shutil, subprocess, stat, glob from setup import VERSION, APPNAME, scripts, main_modules, basenames, main_functions from setuptools import setup from py2app.build_app import py2app @@ -132,7 +132,13 @@ _check_symlinks_prescript() fp = '@executable_path/../Frameworks/' print 'Fixing qt dependencies for:', os.path.basename(path) for dep in deps: - module = re.search(r'(Qt\w+?)\.framework', dep).group(1) + match = re.search(r'(Qt\w+?)\.framework', dep) + if not match: + match = re.search(r'(phonon)\.framework', dep) + if not match: + print dep + raise Exception('Unknown Qt dependency') + module = match.group(1) newpath = fp + '%s.framework/Versions/Current/%s'%(module, module) cmd = ' '.join(['install_name_tool', '-change', dep, newpath, path]) subprocess.check_call(cmd, shell=True) @@ -156,11 +162,35 @@ _check_symlinks_prescript() #deps = BuildAPP.qt_dependencies(path) + + def build_plugins(self): + cwd = os.getcwd() + qmake = '/Users/kovid/qt/bin/qmake' + files = [] + try: + print 'Building pictureflow' + os.chdir('src/calibre/gui2/pictureflow') + for f in glob.glob('*.o'): os.unlink(f) + subprocess.check_call([qmake, 'pictureflow-lib.pro']) + subprocess.check_call(['make']) + files.append((os.path.abspath(os.path.realpath('libpictureflow.dylib')), 'libpictureflow.dylib')) + os.chdir('PyQt/.build') + subprocess.check_call(['python', '../configure.py']) + subprocess.check_call(['make']) + files.append((os.path.abspath('pictureflow.so'), 'pictureflow.so')) + subprocess.check_call(['install_name_tool', '-change', 'libpictureflow.0.dylib', '@executable_path/../Frameworks/libpictureflow.dylib', 'pictureflow.so']) + subprocess.check_call(['install_name_tool', '-change', '/System/Library/Frameworks/Python.framework/Versions/2.5/Python', '@executable_path/../Frameworks/Python.framework/Versions/2.5/Python', 'pictureflow.so']) + for i in range(2): + deps = BuildAPP.qt_dependencies(files[i][0]) + BuildAPP.fix_qt_dependencies(files[i][0], deps) + + return files + finally: + os.chdir(cwd) def run(self): py2app.run(self) - self.add_qt_plugins() resource_dir = os.path.join(self.dist_dir, APPNAME + '.app', 'Contents', 'Resources') frameworks_dir = os.path.join(os.path.dirname(resource_dir), 'Frameworks') @@ -178,6 +208,8 @@ _check_symlinks_prescript() f.close() os.chmod(path, stat.S_IXUSR|stat.S_IXGRP|stat.S_IXOTH|stat.S_IREAD\ |stat.S_IWUSR|stat.S_IROTH|stat.S_IRGRP) + self.add_qt_plugins() + plugin_files = self.build_plugins() print print 'Adding clit' @@ -188,6 +220,13 @@ _check_symlinks_prescript() print print 'Adding pdftohtml' os.link(os.path.expanduser('~/pdftohtml'), os.path.join(frameworks_dir, 'pdftohtml')) + print 'Adding plugins' + module_dir = os.path.join(resource_dir, 'lib', 'python2.5', 'lib-dynload') + for src, dest in plugin_files: + if 'dylib' in dest: + os.link(src, os.path.join(frameworks_dir, dest)) + else: + os.link(src, os.path.join(module_dir, dest)) print print 'Installing prescipt' sf = [os.path.basename(s) for s in all_names] @@ -231,7 +270,8 @@ def main(): 'argv_emulation' : True, 'iconfile' : 'icons/library.icns', 'frameworks': ['libusb.dylib', 'libunrar.dylib'], - 'includes' : ['sip', 'pkg_resources', 'PyQt4.QtSvg', + 'includes' : ['sip', 'pkg_resources', 'PyQt4.QtXml', + 'PyQt4.QtSvg', 'mechanize', 'ClientForm', 'usbobserver', 'genshi', 'calibre.web.feeds.recipes.*', 'IPython.Extensions.*', 'pydoc'], @@ -251,7 +291,7 @@ def main(): setup_requires = ['py2app'], ) if auto: - subprocess.call(('sudo', 'shutdown', '-h', '+1')) + subprocess.call(('sudo', 'shutdown', '-h', '+2')) return 0 if __name__ == '__main__': diff --git a/src/calibre/__init__.py b/src/calibre/__init__.py index 231f6636ea..7880ef04de 100644 --- a/src/calibre/__init__.py +++ b/src/calibre/__init__.py @@ -1,7 +1,7 @@ ''' E-book management software''' __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' -__version__ = '0.4.55' +__version__ = '0.4.56' __docformat__ = "epytext" __author__ = "Kovid Goyal " __appname__ = 'calibre' diff --git a/src/calibre/devices/prs500/books.py b/src/calibre/devices/prs500/books.py index 5308a7dcc7..db25e7d14c 100644 --- a/src/calibre/devices/prs500/books.py +++ b/src/calibre/devices/prs500/books.py @@ -155,6 +155,7 @@ class BookList(_BookList): src = src.decode('latin1') except UnicodeDecodeError: src = src.decode('cp1252') + src = src.replace('', re.IGNORECASE).match(raw) + match = re.compile(r'<[^<>]+encoding=[\'"](.*?)[\'"][^<>]*>', re.IGNORECASE).search(raw) if match is None: match = re.compile(r' 0: self.log_info('\tRationalizing font sizes...') @@ -1427,6 +1426,11 @@ class HTMLConverter(object, LoggingInterface): path = munge_paths(self.target_prefix, tag['href'])[0] ext = os.path.splitext(path)[1] if ext: ext = ext[1:].lower() + enc = sys.getfilesystemencoding() + if not enc: + enc = 'utf8' + if isinstance(path, unicode): + path = path.encode(enc, 'replace') if os.access(path, os.R_OK) and os.path.isfile(path): if ext in ['png', 'jpg', 'bmp', 'jpeg']: self.process_image(path, tag_css) diff --git a/src/calibre/ebooks/metadata/ncx.xml b/src/calibre/ebooks/metadata/ncx.xml index 7bcb9ac479..68971f63f1 100644 --- a/src/calibre/ebooks/metadata/ncx.xml +++ b/src/calibre/ebooks/metadata/ncx.xml @@ -1,6 +1,7 @@ diff --git a/src/calibre/ebooks/metadata/toc.py b/src/calibre/ebooks/metadata/toc.py index df668fc49e..c77836c457 100644 --- a/src/calibre/ebooks/metadata/toc.py +++ b/src/calibre/ebooks/metadata/toc.py @@ -7,6 +7,7 @@ from urllib import unquote from calibre import __appname__ from calibre.ebooks.BeautifulSoup import BeautifulStoneSoup, BeautifulSoup +from calibre.ebooks.chardet import xml_to_unicode class NCXSoup(BeautifulStoneSoup): @@ -95,7 +96,7 @@ class TOC(list): def read_ncx_toc(self, toc): self.base_path = os.path.dirname(toc) - soup = NCXSoup(open(toc, 'rb').read()) + soup = NCXSoup(xml_to_unicode(open(toc, 'rb').read())[0]) def process_navpoint(np, dest): play_order = np.get('playOrder', 1) diff --git a/src/calibre/gui2/__init__.py b/src/calibre/gui2/__init__.py index 0ed0484bca..1406bef962 100644 --- a/src/calibre/gui2/__init__.py +++ b/src/calibre/gui2/__init__.py @@ -5,11 +5,11 @@ import sys, os, re, StringIO, traceback from PyQt4.QtCore import QVariant, QFileInfo, QObject, SIGNAL, QBuffer, \ QByteArray, QLocale, QTranslator, QUrl from PyQt4.QtGui import QFileDialog, QMessageBox, QPixmap, QFileIconProvider, \ - QIcon, QTableView + QIcon, QTableView, QDialogButtonBox ORG_NAME = 'KovidsBrain' APP_UID = 'libprs500' -from calibre import __author__, islinux, iswindows, Settings +from calibre import __author__, islinux, iswindows, Settings, isosx NONE = QVariant() #: Null value to return from the data function of item models @@ -339,3 +339,42 @@ def pixmap_to_data(pixmap, format='JPEG'): buf.open(QBuffer.WriteOnly) pixmap.save(buf, format) return str(ba.data()) + +class TranslatedDialogButtonBox(QDialogButtonBox): + + STRINGS = { + QDialogButtonBox.Ok : (_('&OK'), QDialogButtonBox.AcceptRole), + QDialogButtonBox.Open : (_('&Open'), QDialogButtonBox.AcceptRole), + QDialogButtonBox.Save : (_('&Save'), QDialogButtonBox.AcceptRole), + QDialogButtonBox.Cancel : (_('Cancel'), QDialogButtonBox.RejectRole), + QDialogButtonBox.Close : (_('&Close'), QDialogButtonBox.RejectRole), + QDialogButtonBox.Discard : (_("&Don't Save") if isosx else _('&Discard'), QDialogButtonBox.DestructiveRole), + QDialogButtonBox.Apply : (_('&Apply'), QDialogButtonBox.ApplyRole), + QDialogButtonBox.Reset : (_('&Reset'), QDialogButtonBox.ResetRole), + QDialogButtonBox.RestoreDefaults : (_('Restore &Defaults'), QDialogButtonBox.ResetRole), + QDialogButtonBox.Help : (_('&Help'), QDialogButtonBox.HelpRole), + QDialogButtonBox.SaveAll : (_('Save &All'), QDialogButtonBox.AcceptRole), + QDialogButtonBox.Yes : (_('&Yes'), QDialogButtonBox.YesRole), + QDialogButtonBox.YesToAll : (_('Yes to &All'), QDialogButtonBox.YesRole), + QDialogButtonBox.No : (_('&No'), QDialogButtonBox.NoRole), + QDialogButtonBox.NoToAll : (_('N&o to All'), QDialogButtonBox.NoRole), + QDialogButtonBox.Abort : (_('A&bort'), QDialogButtonBox.RejectRole), + QDialogButtonBox.Retry : (_('Re&try'), QDialogButtonBox.AcceptRole), + QDialogButtonBox.Ignore : (_('I&gnore'), QDialogButtonBox.AcceptRole), + } + + def setStandardButtons(self, buttons): + default = False + for i in self.STRINGS.keys(): + if i & buttons: + msg, role = self.STRINGS[i] + button = self.addButton(msg, role) + if not default: + default = True + button.setDefault(True) + + +try: + from calibre.utils.single_qt_application import SingleApplication +except: + SingleApplication = None \ No newline at end of file diff --git a/src/calibre/gui2/dialogs/fetch_metadata.py b/src/calibre/gui2/dialogs/fetch_metadata.py index 246752dd6f..de59134278 100644 --- a/src/calibre/gui2/dialogs/fetch_metadata.py +++ b/src/calibre/gui2/dialogs/fetch_metadata.py @@ -33,11 +33,11 @@ class Matches(QAbstractTableModel): return NONE text = "" if orientation == Qt.Horizontal: - if section == 0: text = "Title" - elif section == 1: text = "Author(s)" - elif section == 2: text = "Author Sort" - elif section == 3: text = "Publisher" - elif section == 4: text = "ISBN" + if section == 0: text = _("Title") + elif section == 1: text = _("Author(s)") + elif section == 2: text = _("Author Sort") + elif section == 3: text = _("Publisher") + elif section == 4: text = _("ISBN") return QVariant(self.trUtf8(text)) else: diff --git a/src/calibre/gui2/dialogs/user_profiles.py b/src/calibre/gui2/dialogs/user_profiles.py index aabc2d6ca1..b949a5cfbb 100644 --- a/src/calibre/gui2/dialogs/user_profiles.py +++ b/src/calibre/gui2/dialogs/user_profiles.py @@ -13,6 +13,7 @@ from calibre.gui2 import qstring_to_unicode, error_dialog, question_dialog from calibre.gui2.widgets import PythonHighlighter from calibre.utils import sendmail from calibre.ptempfile import PersistentTemporaryFile +from calibre import isosx class UserProfiles(QDialog, Ui_Dialog): @@ -69,7 +70,7 @@ class UserProfiles(QDialog, Ui_Dialog): pt.close() sendmail(subject='Recipe for '+title, attachments=[pt.name], - body='The attached file: %s is a recipe to download %s.'%(os.path.basename(pt.name), title)) + body=_('Save the text below into a file named recipe.py and send the file to your friends, to allow them to use this recipe.') if isosx else _('The attached file: %s is a recipe to download %s.')%(os.path.basename(pt.name), title)) diff --git a/src/calibre/gui2/library.py b/src/calibre/gui2/library.py index 3a65889373..e9e62c336e 100644 --- a/src/calibre/gui2/library.py +++ b/src/calibre/gui2/library.py @@ -298,13 +298,12 @@ class BooksModel(QAbstractTableModel): if col == 0: text = self.db.title(row) if text: - return QVariant(BooksView.wrap(text, width=35)) + return QVariant(text) elif col == 1: au = self.db.authors(row) if au: au = au.split(',') - jau = [ BooksView.wrap(a, width=30).strip() for a in au ] - return QVariant("\n".join(jau)) + return QVariant("\n".join(au)) elif col == 2: size = self.db.max_size(row) if size: @@ -321,7 +320,7 @@ class BooksModel(QAbstractTableModel): elif col == 5: pub = self.db.publisher(row) if pub: - return QVariant(BooksView.wrap(pub, 20)) + return QVariant(pub) elif col == 6: tags = self.db.tags(row) if tags: diff --git a/src/calibre/gui2/main.py b/src/calibre/gui2/main.py index b22553ca18..d70519d8bd 100644 --- a/src/calibre/gui2/main.py +++ b/src/calibre/gui2/main.py @@ -1,7 +1,7 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' import os, sys, textwrap, collections, traceback, shutil, time - +from xml.parsers.expat import ExpatError from PyQt4.QtCore import Qt, SIGNAL, QObject, QCoreApplication, \ QVariant, QThread, QString from PyQt4.QtGui import QPixmap, QColor, QPainter, QMenu, QIcon, QMessageBox, \ @@ -16,7 +16,8 @@ from calibre.devices.interface import Device from calibre.gui2 import APP_UID, warning_dialog, choose_files, error_dialog, \ initialize_file_icon_provider, question_dialog,\ pixmap_to_data, choose_dir, ORG_NAME, \ - qstring_to_unicode, set_sidebar_directories + qstring_to_unicode, set_sidebar_directories, \ + SingleApplication from calibre import iswindows, isosx from calibre.library.database import LibraryDatabase from calibre.gui2.update import CheckForUpdates @@ -55,8 +56,13 @@ class Main(MainWindow, Ui_MainWindow): p.end() self.default_thumbnail = (pixmap.width(), pixmap.height(), pixmap_to_data(pixmap)) - def __init__(self, parent=None): + def __init__(self, single_instance, parent=None): MainWindow.__init__(self, parent) + self.single_instance = single_instance + if self.single_instance is not None: + self.connect(self.single_instance, SIGNAL('message_received(PyQt_PyObject)'), + self.another_instance_wants_to_talk) + Ui_MainWindow.__init__(self) self.setupUi(self) self.setWindowTitle(__appname__) @@ -75,6 +81,7 @@ class Main(MainWindow, Ui_MainWindow): self.tb_wrapper = textwrap.TextWrapper(width=40) self.device_connected = False self.viewers = collections.deque() + ####################### Location View ######################## QObject.connect(self.location_view, SIGNAL('location_selected(PyQt_PyObject)'), self.location_selected) @@ -82,7 +89,8 @@ class Main(MainWindow, Ui_MainWindow): self.location_view.location_changed) ####################### Vanity ######################## - self.vanity_template = qstring_to_unicode(self.vanity.text().arg(__version__)).replace('%2', '%(version)s').replace('%3', '%(device)s') + self.vanity_template = _('

For help visit %s.kovidgoyal.net
')%(__appname__, __appname__) + self.vanity_template += _('%s: %s by Kovid Goyal %%(version)s
%%(device)s

')%(__appname__, __version__) self.latest_version = ' ' self.vanity.setText(self.vanity_template%dict(version=' ', device=' ')) self.device_info = ' ' @@ -198,6 +206,13 @@ class Main(MainWindow, Ui_MainWindow): self.news_menu.set_custom_feeds(self.library_view.model().db.get_feeds()) + def another_instance_wants_to_talk(self, msg): + if msg.startswith('launched:'): + self.setWindowState(self.windowState() & ~Qt.WindowMinimized|Qt.WindowActive) + self.show() + self.raise_() + self.activateWindow() + def current_view(self): '''Convenience method that returns the currently visible view ''' @@ -258,7 +273,8 @@ class Main(MainWindow, Ui_MainWindow): Called once metadata has been read for all books on the device. ''' if exception: - if 'not well-formed' in str(exception): + print exception, type(exception) + if isinstance(exception, ExpatError): error_dialog(self, _('Device database corrupted'), _('''

The database of books on the reader is corrupted. Try the following: @@ -701,10 +717,6 @@ class Main(MainWindow, Ui_MainWindow): warning_dialog(self, 'Could not convert some books', msg).exec_() - - - - def set_conversion_defaults(self, checked): d = LRFSingleDialog(self, None, None) d.exec_() @@ -1057,13 +1069,18 @@ def main(args=sys.argv): app = QApplication(args) QCoreApplication.setOrganizationName(ORG_NAME) QCoreApplication.setApplicationName(APP_UID) - if not singleinstance('mainGUI'): + single_instance = None if SingleApplication is None else SingleApplication('calibre GUI') + if not singleinstance('calibre GUI'): + if single_instance is not None and single_instance.is_running() and \ + single_instance.send_message('launched:'+''.join(sys.argv)): + return 0 + QMessageBox.critical(None, 'Cannot Start '+__appname__, '

%s is already running.

'%__appname__) return 1 initialize_file_icon_provider() try: - main = Main() + main = Main(single_instance) except DatabaseLocked, err: QMessageBox.critical(None, 'Cannot Start '+__appname__, '

Another program is using the database.
Perhaps %s is already running?
If not try deleting the file %s'%(__appname__, err.lock_file_path)) diff --git a/src/calibre/gui2/main.ui b/src/calibre/gui2/main.ui index b8fc6035c5..e04fd437b5 100644 --- a/src/calibre/gui2/main.ui +++ b/src/calibre/gui2/main.ui @@ -102,10 +102,7 @@ - <html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For help visit <a href="http://__appname__.kovidgoyal.net/user_manual"><span style=" text-decoration: underline; color:#0000ff;">__appname__.kovidgoyal.net</span></a><br /><br /><span style=" font-weight:600;">__appname__</span>: %1 by <span style=" font-weight:600;">Kovid Goyal</span> %2<br />%3</p></body></html> + Qt::RichText diff --git a/src/calibre/gui2/make.py b/src/calibre/gui2/make.py index f20227cf5c..9190dd8855 100644 --- a/src/calibre/gui2/make.py +++ b/src/calibre/gui2/make.py @@ -39,7 +39,9 @@ def build_forms(forms): dat = dat.replace('import images_rc', 'from calibre.gui2 import images_rc') dat = dat.replace('from library import', 'from calibre.gui2.library import') dat = dat.replace('from widgets import', 'from calibre.gui2.widgets import') + dat += '\nfrom calibre.gui2 import TranslatedDialogButtonBox' dat = re.compile(r'QtGui.QApplication.translate\(.+?,\s+"(.+?)(?= 0]) @@ -152,6 +147,8 @@ class LocationModel(QAbstractListModel): data = QVariant(text) elif role == Qt.DecorationRole: data = self.icons[row] + elif role == Qt.ToolTipRole: + return QVariant(self.tooltips[row]) return data def headerData(self, section, orientation, role): @@ -176,7 +173,8 @@ class LocationView(QListView): self.reset() QObject.connect(self.selectionModel(), SIGNAL('currentChanged(QModelIndex, QModelIndex)'), self.current_changed) self.delegate = LocationDelegate() - self.setItemDelegate(self.delegate) + self.setItemDelegate(self.delegate) + self.setCursor(Qt.PointingHandCursor) def current_changed(self, current, previous): i = current.row() diff --git a/src/calibre/translations/ru.po b/src/calibre/translations/ru.po new file mode 100644 index 0000000000..4e5fac9b87 --- /dev/null +++ b/src/calibre/translations/ru.po @@ -0,0 +1,2575 @@ +# Translation template file.. +# Copyright (C) 2007 Kovid Goyal +# Kovid Goyal , 2007. +# +msgid "" +msgstr "" +"Project-Id-Version: calibre 0.4.55\n" +"POT-Creation-Date: 2008-05-18 16:39+PDT\n" +"PO-Revision-Date: 2008-05-18 08:47+PDT\n" +"Last-Translator: Automatically generated\n" +"Language-Team: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: pygettext.py 1.5\n" + +#: /home/kovid/work/calibre/src/calibre/__init__.py:95 +msgid "%sUsage%s: %s\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/__init__.py:132 +msgid "Created by " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:88 +msgid "Set the title. Default: filename." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:90 +msgid "" +"Set the author(s). Multiple authors should be set as a comma separated list. " +"Default: %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:622 +msgid "Unknown" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:93 +msgid "Set the comment." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:95 +msgid "Set the category" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:97 +msgid "Sort key for the title" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:99 +msgid "Sort key for the author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:39 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:16 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:350 +msgid "Publisher" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:103 +msgid "Path to file containing image to be used as cover" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:105 +msgid "" +"If there is a cover graphic detected in the source file, use that instead of " +"the specified cover." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:108 +msgid "Output file name. Default is derived from input filename" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:110 +msgid "" +"Render HTML tables as blocks of text instead of actual tables. This is " +"neccessary if the HTML contains very large or complex tables." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:113 +msgid "" +"Specify the base font size in pts. All fonts are rescaled accordingly. This " +"option obsoletes the --font-delta option and takes precedence over it. To " +"use --font-delta, set this to 0." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:115 +msgid "Enable autorotation of images that are wider than the screen width." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:118 +msgid "Set the space between words in pts. Default is %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:120 +msgid "Separate paragraphs by blank lines." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:122 +msgid "Add a header to all the pages with title and author." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:124 +msgid "" +"Set the format of the header. %a is replaced by the author and %t by the " +"title. Default is %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:126 +msgid "" +"Override the CSS. Can be either a path to a CSS stylesheet or a string. If " +"it is a string it is interpreted as CSS." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:128 +msgid "" +"Use the element from the OPF file to determine the order in which " +"the HTML files are appended to the LRF. The .opf file must be in the same " +"directory as the base HTML file." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:130 +msgid "" +"Minimum paragraph indent (the indent of the first line of a paragraph) in " +"pts. Default: %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:132 +msgid "" +"Increase the font size by 2 * FONT_DELTA pts and the line spacing by " +"FONT_DELTA pts. FONT_DELTA can be a fraction.If FONT_DELTA is negative, the " +"font size is decreased." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:137 +msgid "" +"Render all content as black on white instead of the colors specified by the " +"HTML or CSS." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:144 +msgid "" +"Profile of the target device for which this LRF is being generated. The " +"profile determines things like the resolution and screen size of the target " +"device. Default: %s Supported profiles: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:150 +msgid "Left margin of page. Default is %default px." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:152 +msgid "Right margin of page. Default is %default px." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:154 +msgid "Top margin of page. Default is %default px." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:156 +msgid "Bottom margin of page. Default is %default px." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:160 +msgid "" +"The maximum number of levels to recursively process links. A value of 0 " +"means thats links are not followed. A negative value means that tags are " +"ignored." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:164 +msgid "" +"A regular expression. tags whoose href matches will be ignored. Defaults " +"to %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:169 +msgid "" +"Prevent the automatic insertion of page breaks before detected chapters." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:173 +msgid "" +"The regular expression used to detect chapter titles. It is searched for in " +"heading tags (h1-h6). Defaults to %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:176 +msgid "" +"If html2lrf does not find any page breaks in the html file and cannot detect " +"chapter headings, it will automatically insert page-breaks before the tags " +"whose names match this regular expression. Defaults to %default. You can " +"disable it by setting the regexp to \"$\". The purpose of this option is to " +"try to ensure that there are no really long pages as this degrades the page " +"turn performance of the LRF. Thus this option is ignored if the current page " +"has only a few elements." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:186 +msgid "" +"Force a page break before tags whoose names match this regular expression." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:188 +msgid "" +"Force a page break before an element having the specified attribute. The " +"format for this option is tagname regexp,attribute name,attribute value " +"regexp. For example to match all heading tags that have the attribute class=" +"\"chapter\" you would use \"h\\d,class,chapter\". Default is %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:191 +msgid "Preprocess Baen HTML files to improve generated LRF." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:193 +msgid "" +"You must add this option if processing files generated by pdftohtml, " +"otherwise conversion will fail." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:195 +msgid "Use this option on html0 files from Book Designer." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:198 +msgid "" +"Specify trutype font families for serif, sans-serif and monospace fonts. " +"These fonts will be embedded in the LRF file. Note that custom fonts lead to " +"slower page turns. Each family specification is of the form: \"path to fonts " +"directory, family\" For example: --serif-family \"%s, Times New Roman\"\n" +" " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:207 +msgid "The serif family of fonts to embed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:210 +msgid "The sans-serif family of fonts to embed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:213 +msgid "The monospace family of fonts to embed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:217 +msgid "Be verbose while processing" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:219 +msgid "Convert to LRS" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:221 +msgid "" +"Minimize memory usage at the cost of longer processing times. Use this " +"option if you are on a memory constrained machine." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/__init__.py:223 +msgid "" +"Specify the character encoding of the source file. If the output LRF file " +"contains strange characters, try changing this option. A common encoding for " +"files from windows computers is cp-1252. Another common choice is utf-8. The " +"default is to try and guess the encoding." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:143 +msgid "" +"any2lrf [options] myfile\n" +"\n" +"Convert any ebook format into LRF. Supported formats are:\n" +"LIT, RTF, TXT, HTML, EPUB, MOBI, PRC and PDF. any2lrf will also process a " +"RAR or\n" +"ZIP archive, looking for an ebook inside the archive.\n" +" " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/any/convert_from.py:158 +msgid "No file to convert specified." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/epub/convert_from.py:17 +msgid "" +"Usage: %prog [options] mybook.epub\n" +" \n" +" \n" +"%prog converts mybook.epub to mybook.lrf" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:18 +msgid "" +"%prog [options] mybook.fb2\n" +"\n" +"\n" +"%prog converts mybook.fb2 to mybook.lrf" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/fb2/convert_from.py:23 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/txt/convert_from.py:22 +msgid "Print generated HTML to stdout and quit." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/feeds/convert_from.py:20 +msgid "Options to control the behavior of feeds2disk" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/feeds/convert_from.py:22 +msgid "Options to control the behavior of html2lrf" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/feeds/convert_from.py:44 +msgid "Fetching of recipe failed: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:309 +msgid "\tBook Designer file detected." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:311 +msgid "\tParsing HTML..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:333 +msgid "\tBaen file detected. Re-parsing..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:349 +msgid "Written preprocessed HTML to " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:366 +msgid "Processing %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:380 +msgid "\tConverting to BBeB..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:518 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:525 +msgid "Could not parse file: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:537 +msgid "Failed to parse link %s %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:580 +msgid "Cannot add link %s to TOC" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:922 +msgid "Unable to process image %s. Error: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:960 +msgid "Unable to process interlaced PNG %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:975 +msgid "" +"Could not process image: %s\n" +"%s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1666 +msgid "An error occurred while processing a table: %s. Ignoring table markup." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1668 +msgid "" +"Bad table:\n" +"%s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1690 +msgid "Table has cell that is too large" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1720 +msgid "" +"You have to save the website %s as an html file first and then run html2lrf " +"on it." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1760 +msgid "Could not read cover image: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1763 +msgid "Cannot read from: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1892 +msgid "Failed to process opf file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1898 +msgid "" +"Usage: %prog [options] mybook.html\n" +"\n" +"\n" +"%prog converts mybook.html to mybook.lrf. \n" +"%prog follows all links in mybook.html that point \n" +"to local files recursively. Thus, you can use it to \n" +"convert a whole tree of HTML files." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lit/convert_from.py:19 +msgid "" +"Usage: %prog [options] mybook.lit\n" +"\n" +"\n" +"%prog converts mybook.lit to mybook.lrf" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:243 +msgid "Could not read from thumbnail file:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:263 +msgid "" +"%prog [options] file.lrs\n" +"Compile an LRS file into an LRF file." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:264 +msgid "Path to output file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:266 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:113 +msgid "Verbose processing" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:268 +msgid "Convert LRS to LRS, useful for debugging." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:541 +msgid "" +"%prog [options] mybook.lrf\n" +"\n" +"\n" +"Show/edit the metadata in an LRF file.\n" +"\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:548 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:18 +msgid "Set the book title" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:550 +msgid "Set sort key for the title" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:552 +msgid "Set the author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:554 +msgid "Set sort key for the author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:556 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:22 +msgid "The category this book belongs to. E.g.: History" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:559 +msgid "Path to a graphic that will be set as this files' thumbnail" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:562 +msgid "Path to a txt file containing the comment to be stored in the lrf file." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:566 +msgid "Extract thumbnail from LRF file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:568 +msgid "Set book ID" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/meta.py:570 +msgid "Don't know what this is for" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/mobi/convert_from.py:43 +msgid "" +"Usage: %prog [options] mybook.mobi|prc\n" +"\n" +"\n" +"%prog converts mybook.mobi to mybook.lrf" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/parser.py:132 +msgid "" +"%prog book.lrf\n" +"Convert an LRF file into an LRS (XML UTF-8 encoded) file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/parser.py:133 +msgid "Output LRS file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/parser.py:151 +msgid "Parsing LRF..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/parser.py:154 +msgid "Creating XML..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/parser.py:156 +msgid "LRS written to " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/pdf/convert_from.py:48 +msgid "" +"%prog [options] mybook.pdf\n" +"\n" +"\n" +"%prog converts mybook.pdf to mybook.lrf" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/pdf/reflow.py:402 +msgid "" +"Path to output directory in which to create the HTML file. Defaults to " +"current directory." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/pdf/reflow.py:404 +msgid "Be more verbose." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/pdf/reflow.py:416 +msgid "You must specify a single PDF file." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/rtf/convert_from.py:20 +msgid "" +"%prog [options] mybook.rtf\n" +"\n" +"\n" +"%prog converts mybook.rtf to mybook.lrf" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/txt/convert_from.py:17 +msgid "" +"%prog [options] mybook.txt\n" +"\n" +"\n" +"%prog converts mybook.txt to mybook.lrf" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:20 +msgid "Set the authors" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:24 +msgid "Set the comment" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:100 +msgid "Usage:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/epub.py:100 +msgid "mybook.epub" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:95 +msgid "" +"\n" +"%prog [options] key\n" +"\n" +"Fetch metadata for books from isndb.com. You can specify either the \n" +"books ISBN ID or its title and author. If you specify the title and author,\n" +"then more than one book may be returned.\n" +"\n" +"key is the account key you generate after signing up for a free account from " +"isbndb.com.\n" +"\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:106 +msgid "The ISBN ID of the book you want metadata for." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:108 +msgid "The author whoose book to search for." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:110 +msgid "The title of the book to search for." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:112 +msgid "The publisher of the book to search for." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:46 +msgid "" +"Could not fetch cover as server is experiencing high load. Please try again " +"later." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:47 +msgid " not found." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:50 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:81 +msgid "LibraryThing.com server error. Try again later." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:59 +msgid "" +"\n" +"%prog [options] ISBN\n" +"\n" +"Fetch a cover image for the book identified by ISBN from LibraryThing.com\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:747 +msgid "Usage: %s file.lit" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/lit.py:754 +msgid "Cover saved to" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdf.py:36 +msgid "Usage: pdf-meta file.pdf" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdf.py:37 +msgid "No filename specified." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:299 +msgid "%prog [options] myebook.mobi" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:301 +msgid "Output directory. Defaults to current directory." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:320 +msgid "Raw MOBI HTML saved in" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:322 +msgid "OEB ebook created in" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:346 +msgid "&OK" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:347 +msgid "&Open" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:348 +msgid "&Save" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:349 +msgid "Cancel" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:350 +msgid "&Close" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:351 +msgid "&Discard" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:351 +msgid "&Don't Save" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:352 +msgid "&Apply" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:353 +msgid "&Reset" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:354 +msgid "Restore &Defaults" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:355 +msgid "&Help" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:356 +msgid "Save &All" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:357 +msgid "&Yes" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:358 +msgid "Yes to &All" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:359 +msgid "&No" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:360 +msgid "N&o to All" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:361 +msgid "A&bort" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:362 +msgid "Re&try" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:363 +msgid "I&gnore" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:27 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:31 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:36 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:14 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:232 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:345 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:692 +msgid "Title" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:509 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:218 +msgid "Comments" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:55 +msgid "Dialog" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:57 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:39 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:54 +msgid "TextLabel" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_format_ui.py:38 +msgid "Choose Format" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:89 +msgid "
Must be a directory." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:89 +msgid "Invalid database location " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:92 +msgid "Invalid database location" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:92 +msgid "Invalid database location.
Cannot write to " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:104 +msgid "Compacting database. This may take a while." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:104 +msgid "Compacting..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:234 +msgid "Configuration" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:175 +msgid "Basic" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:178 +msgid "Advanced" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:180 +msgid "&Location of books database (library1.db)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:181 +msgid "Browse for the new database location" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:182 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:190 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:192 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:491 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:276 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:121 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:148 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:149 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:150 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:152 +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:153 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:233 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:235 +msgid "..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:183 +msgid "Use &Roman numerals for series number" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:184 +msgid "Default network &timeout:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:185 +msgid "" +"Set the default timeout for network fetches (i.e. anytime we go out to the " +"internet to get information)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:186 +msgid " seconds" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:187 +msgid "&Priority for conversion jobs:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:188 +msgid "Frequently used directories" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:189 +msgid "Add a directory to the frequently used directories list" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:191 +msgid "Remove a directory from the frequently used directories list" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:193 +msgid "Select visible &columns in library view" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:194 +msgid "Free unused diskspace from the database" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:195 +msgid "&Compact database" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:196 +msgid "&Metadata from file name" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/conversion_error_ui.py:33 +msgid "ERROR" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:37 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:237 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:346 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:693 +msgid "Author(s)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:38 +msgid "Author Sort" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:40 +msgid "ISBN" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:101 +msgid "Cannot connect" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:102 +msgid "You must specify a valid access key for isbndb.com" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:75 +msgid "Fetch metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:76 +msgid "Fetching metadata for %1" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:77 +msgid "" +"Sign up for a free account from
ISBNdb." +"com to get an access key." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:78 +msgid "&Access Key;" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:79 +msgid "Fetch" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:80 +msgid "Matches" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata_ui.py:81 +msgid "Select the book that most closely matches your copy from the list below" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/job_view_ui.py:28 +msgid "Details of job" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:36 +msgid "Active Jobs" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/jobs_ui.py:37 +msgid "&Stop selected job" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:81 +msgid "No available formats" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:82 +msgid "Cannot convert %s as this book has no supported formats" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:86 +msgid "Choose the format to convert into LRF" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:94 +msgid "Convert %s to LRF" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:159 +msgid "Set conversion defaults" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:163 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:43 +msgid "Cannot read" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:164 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:44 +msgid "You do not have permission to read the file: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:52 +msgid "Error reading file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:53 +msgid "

There was an error reading from file:
" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:179 +msgid " is not a valid picture" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:245 +msgid "" +"Preprocess the file before converting to LRF. This is useful if you know " +"that the file is from a specific source. Known sources:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:246 +msgid "

  1. baen - Books from BAEN Publishers
  2. " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:247 +msgid "" +"
  3. pdftohtml - HTML files that are the output of the program " +"pdftohtml
  4. " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:248 +msgid "
  5. book-designer - HTML0 files from Book Designer
  6. " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:281 +msgid "" +"Specify metadata such as title and author for the book.

    Metadata will be " +"updated in the database as well as the generated LRF file." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:281 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:476 +msgid "Metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:282 +msgid "" +"Adjust the look of the generated LRF file by specifying things like font " +"sizes and the spacing between words." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:479 +msgid "Look & Feel" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:283 +msgid "" +"Specify the page settings like margins and the screen size of the target " +"device." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:283 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:482 +msgid "Page Setup" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:284 +msgid "Fine tune the detection of chapter and section headings." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:284 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:485 +msgid "Chapter Detection" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:292 +msgid "No help available" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single.py:396 +msgid "Bulk convert ebooks to LRF" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:472 +msgid "Convert to LRF" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:473 +msgid "Category" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:487 +msgid "Options" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:488 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:273 +msgid "Book Cover" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:489 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:274 +msgid "Change &cover image:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:490 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:275 +msgid "Browse for an image to use as the cover of this book." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:492 +msgid "Use cover from &source file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:493 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:241 +msgid "&Title: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:494 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:242 +msgid "Change the title of this book" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:495 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:243 +msgid "&Author(s): " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:496 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:498 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:244 +msgid "" +"Change the author(s) of this book. Multiple authors should be separated by a " +"comma" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:497 +msgid "Author So&rt:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:499 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:116 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:251 +msgid "&Publisher: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:500 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:252 +msgid "Change the publisher of this book" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:501 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:253 +msgid "Ta&gs: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:502 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:119 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:254 +msgid "" +"Tags categorize the book. This is particularly useful while searching. " +"

    They can be any words or phrases, separated by commas." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:503 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:122 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:257 +msgid "&Series:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:504 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:505 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:259 +msgid "List of known series. You can add new series." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:506 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:507 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:263 +msgid "Series index." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:508 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:264 +msgid "Book " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:510 +msgid "Base &font size:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:511 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:520 +msgid " pts" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:512 +msgid "Embedded Fonts" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:513 +msgid "&Serif:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:514 +msgid "S&ans-serif:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:515 +msgid "&Monospace:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:516 +msgid "Source en&coding:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:517 +msgid "Minimum &indent:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:519 +msgid "&Word spacing:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:521 +msgid "Enable auto &rotation of images" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:522 +msgid "Insert &blank lines between paragraphs" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:523 +msgid "Ignore &tables" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:524 +msgid "Ignore &colors" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:525 +msgid "&Preprocess:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:526 +msgid "Header" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:527 +msgid "&Show header" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:528 +msgid "&Header format:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:529 +msgid "Override
    CSS" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:530 +msgid "&Profile:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:531 +msgid "&Left Margin:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:532 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:534 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:536 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:538 +msgid " px" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:533 +msgid "&Right Margin:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:535 +msgid "&Top Margin:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:537 +msgid "&Bottom Margin:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:539 +msgid "Title based detection" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:540 +msgid "&Disable chapter detection" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:541 +msgid "&Regular expression:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:542 +msgid "Tag based detection" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:543 +msgid "&Page break before tag:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:544 +msgid "&Force page break before tag:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:545 +msgid "Force page break before &attribute:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:546 +msgid "Help on item" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/lrf_single_ui.py:547 +msgid "" +"\n" +"

    " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:106 +msgid "Edit Meta information" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:240 +msgid "Meta information" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:110 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:245 +msgid "Author S&ort: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:111 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:246 +msgid "" +"Specify how the author(s) of this book should be sorted. For example Charles " +"Dickens should be sorted as Dickens, Charles." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:247 +msgid "&Rating:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:114 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:248 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:249 +msgid "Rating of this book. 0-5 stars" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:250 +msgid " stars" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:118 +msgid "Add Ta&gs: " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:120 +msgid "&Remove tags:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:121 +msgid "Comma separated list of tags to remove from the books. " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:224 +msgid "" +"

    Enter your username and password for LibraryThing.com.
    If you " +"do not have one, you can register " +"for free!.

    " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:254 +msgid "Could not fetch cover.
    " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:254 +msgid "Could not fetch cover" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:260 +msgid "Cannot fetch cover" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:260 +msgid "You must specify the ISBN identifier for this book." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:239 +msgid "Edit Meta Information" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:256 +msgid "Open Tag Editor" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:260 +msgid "Remove unused series (Series that have no books)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:265 +msgid "IS&BN:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:267 +msgid "Fetch metadata from server" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:268 +msgid "Available Formats" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:269 +msgid "Add a new format for this book to the database" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:271 +msgid "Remove the selected formats for this book from the database." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:277 +msgid "Fetch cover image from server" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:278 +msgid "" +"Change the username and/or password for your account at LibraryThing.com" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:279 +msgid "Change password" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:53 +msgid "Password needed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:55 +msgid "&Username:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:56 +msgid "&Password:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:57 +msgid "&Show password" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:15 +msgid "Author" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:17 +msgid "Tag" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:18 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:352 +msgid "Series" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:19 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:626 +msgid "Format" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search.py:20 +msgid "Any" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:35 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:89 +msgid "Form" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:36 +msgid "contains" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:37 +msgid "The text to search for. It is interpreted as a regular expression." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:38 +msgid "" +"

    Negate this match. That is, only return results that do not match " +"this query." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:39 +msgid "Negate" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:67 +msgid "Advanced Search" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:68 +msgid "Match a&ll of the following criteria" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:69 +msgid "Match a&ny of the following criteria" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:70 +msgid "Search criteria" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:71 +msgid "More" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:72 +msgid "Fewer" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:113 +msgid "Tag Editor" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:114 +msgid "A&vailable tags" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:115 +msgid "" +"Delete tag from database. This will unapply the tag from all books and then " +"remove it from the database." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:117 +msgid "Apply tag to current book" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:119 +msgid "A&pplied tags" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:120 +msgid "Unapply (remove) tag from current book" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:122 +msgid "&Add tag:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:123 +msgid "" +"If the tag you want is not in the available list, you can add it here. " +"Accepts a comma separated list of tags." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor_ui.py:124 +msgid "Add tag to available tags and apply it to current book" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:65 +msgid "No recipe selected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:73 +msgid "" +"Save the text below into a file named recipe.py and send the file to your " +"friends, to allow them to use this recipe." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:73 +msgid "The attached file: %s is a recipe to download %s." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:200 +msgid "Switch to Advanced mode" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:98 +msgid "Switch to Basic mode" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:108 +msgid "Feed must have a title" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:109 +msgid "The feed must have a title" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:113 +msgid "Feed must have a URL" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:114 +msgid "The feed %s must have a URL" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:119 +msgid "Already exists" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:120 +msgid "This feed has already been added to the recipe" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:161 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:193 +msgid "Invalid input" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:162 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:171 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:194 +msgid "

    Could not create recipe. Error:
    %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:177 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:199 +msgid "Replace recipe?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:178 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:200 +msgid "A custom recipe named %s already exists. Do you want to replace it?" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:186 +msgid "Choose a recipe file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:186 +msgid "Recipes" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:194 +msgid "Add custom news source" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:195 +msgid "Available user recipes" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:196 +msgid "Add/Update &recipe" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:197 +msgid "&Remove recipe" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:198 +msgid "&Share recipe" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:199 +msgid "&Load recipe from file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:201 +msgid "" +"\n" +"

    Create a basic news " +"recipe, by adding RSS feeds to it.
    For most feeds, you will have to " +"use the \"Advanced mode\" to further customize the fetch process.

    " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:205 +msgid "Recipe &title:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:206 +msgid "&Oldest article:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:207 +msgid "The oldest article to download" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:208 +msgid " days" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:209 +msgid "&Max. number of articles per feed:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:210 +msgid "Maximum number of articles to download per feed." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:211 +msgid "Feeds in recipe" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:213 +msgid "Remove feed from recipe" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:219 +msgid "Add feed to recipe" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:217 +msgid "&Feed title:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:218 +msgid "Feed &URL:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:220 +msgid "&Add feed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:221 +msgid "" +"For help with writing advanced news recipes, please visit User Recipes" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:222 +msgid "Recipe source code (python)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:90 +msgid "" +"

    Set a regular expression pattern to use when trying to guess ebook " +"metadata from filenames.

    A reference on the syntax of regular expressions is available." +"

    Use the Test functionality below to test your regular expression " +"on a few sample filenames." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:91 +msgid "Regular &expression" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:92 +msgid "&Test" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:93 +msgid "File &name:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:94 +msgid "Test" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:95 +msgid "Title:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:96 +msgid "Regular expression group name (?P)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:44 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:48 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:53 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:58 +msgid "No match" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:98 +msgid "Authors:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:99 +msgid "Regular expression group name (?P<authors>)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:101 +msgid "Series:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:102 +msgid "Regular expression group name (?P<series>)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:104 +msgid "Series index:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:105 +msgid "Regular expression group name (?P<series_index>)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:279 +msgid "Job" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:280 +msgid "Status" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:281 +msgid "Progress" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:282 +msgid "Running time" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:310 +msgid "Error" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:310 +msgid "Finished" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:312 +msgid "Waiting" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:312 +msgid "Working" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:315 +msgid "Unavailable" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:343 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:347 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:351 +msgid "Cannot kill job" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:344 +msgid "" +"Cannot kill jobs that are communicating with the device as this may cause " +"data corruption." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:348 +msgid "Cannot kill already completed jobs." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:352 +msgid "Cannot kill waiting jobs." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:207 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:213 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:217 +msgid "None" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:208 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:351 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:632 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:696 +msgid "Tags" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:214 +msgid "Formats" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:223 +msgid "Book <font face=\"serif\">%s</font> of %s." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:337 +msgid "Double click to <b>edit</b> me<br><br>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:347 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:694 +msgid "Size (MB)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:348 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:695 +msgid "Date" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:349 +msgid "Rating" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:627 +msgid "Path" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:631 +msgid "Timestamp" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:731 +msgid "Search (For Advanced Search click the button to the left)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/config_ui.py:46 +msgid "Configure Viewer" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/config_ui.py:47 +msgid "Use white background" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/config_ui.py:48 +msgid "Hyphenate" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/config_ui.py:49 +msgid "<b>Changes will only take affect after a restart." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:152 +msgid "<b>No matches</b> for the search phrase <i>%s</i> were found." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:152 +msgid "No matches found" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:147 +msgid "LRF Viewer" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:154 +msgid "Parsing LRF file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:155 +msgid "Next Page" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:156 +msgid "Previous Page" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:157 +msgid "Back" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:158 +msgid "Forward" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:159 +msgid "Next match" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:160 +msgid "Open ebook" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main_ui.py:161 +msgid "Configure" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:79 +msgid "Error communicating with device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:92 +msgid "" +"<p>For help visit <a href=\"http://%s.kovidgoyal.net/user_manual\">%s." +"kovidgoyal.net</a><br>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:93 +msgid "<b>%s</b>: %s by <b>Kovid Goyal %%(version)s</b><br>%%(device)s</p>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:112 +msgid "Send to main memory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:113 +msgid "Send to storage card" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:116 +msgid "Edit metadata individually" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:117 +msgid "Edit metadata in bulk" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:120 +msgid "Add books from a single directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:121 +msgid "" +"Add books recursively (One book per directory, assumes every ebook file is " +"the same book in a different format)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:122 +msgid "" +"Add books recursively (Multiple books per directory, assumes every ebook " +"file is a different book)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:136 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:244 +msgid "Save to disk" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:137 +msgid "Save to disk in a single directory" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:140 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:247 +msgid "View" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:141 +msgid "View specific format" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:156 +msgid "Convert individually" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:157 +msgid "Bulk convert" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:278 +msgid "Device database corrupted" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:279 +msgid "" +"\n" +" <p>The database of books on the reader is corrupted. Try the " +"following:\n" +" <ol>\n" +" <li>Unplug the reader. Wait for it to finish regenerating " +"the database (i.e. wait till it is ready to be used). Plug it back in. Now " +"it should work with %(app)s. If not try the next step.</li>\n" +" <li>Quit %(app)s. Find the file media.xml in the reader's " +"main memory. Delete it. Unplug the reader. Wait for it to regenerate the " +"file. Re-connect it and start %(app)s.</li>\n" +" </ol>\n" +" " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:331 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:397 +msgid "" +"<p>Books with the same title as the following already exist in the database. " +"Add them anyway?<ul>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:334 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:400 +msgid "Duplicates found!" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:430 +msgid "No space on device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:431 +msgid "<p>Cannot upload books to device there is no more free space available " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:500 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:519 +msgid "Cannot edit metadata" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:500 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:519 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:605 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:666 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:727 +msgid "No books selected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:605 +msgid "Cannot save to disk" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:644 +msgid "Fetch news from " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:646 +msgid "Fetching news from " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:656 +msgid "News fetched. Uploading to device." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:666 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:727 +msgid "Cannot convert" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:797 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:815 +msgid "No book selected" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:797 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:815 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:829 +msgid "Cannot view" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:803 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:834 +msgid "Choose the format to view" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:830 +msgid "%s has no available formats." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:868 +msgid "Cannot configure" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:868 +msgid "Cannot configure while there are running jobs." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:903 +msgid "Invalid database" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:904 +msgid "" +"<p>An invalid database already exists at %s, delete it before trying to move " +"the existing database.<br>Error: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:912 +msgid "Could not move database" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:933 +msgid "No detailed info available" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:934 +msgid "No detailed information is available for books on the device." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:976 +msgid "Error talking to device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:977 +msgid "" +"There was a temporary error talking to the device. Please unplug and " +"reconnect the device and or reboot." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1057 +msgid "" +"<span style=\"color:red; font-weight:bold\">Latest version: <a href=\"%s\">%" +"s</a></span>" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:225 +msgid "calibre" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:226 +msgid "Advanced search" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:228 +msgid "Alt+S" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:229 +msgid "&Search:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:230 +msgid "" +"Search the list of books by title or author<br><br>Words separated by spaces " +"are ANDed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:231 +msgid "" +"Search the list of books by title, author, publisher, tags and " +"comments<br><br>Words separated by spaces are ANDed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:232 +msgid "Reset Quick Search" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:236 +msgid "Add books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:237 +msgid "A" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:239 +msgid "Remove books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:240 +msgid "Del" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:241 +msgid "Edit meta information" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:242 +msgid "E" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:243 +msgid "Send to device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:245 +msgid "Fetch news" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:246 +msgid "Convert E-books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/news.py:32 +msgid "Add a custom news source" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/news.py:53 +msgid "" +"<p>Please enter your username and password for %s<br>If you do not have one, " +"please subscribe to get access to the articles.<br/> Click OK to proceed." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/news.py:79 +msgid "Custom news sources" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:100 +msgid "Jobs:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/status.py:109 +msgid "Click to see list of active jobs." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:37 +msgid "Invalid regular expression" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:38 +msgid "Invalid regular expression: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:127 +msgid "Library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:128 +msgid "" +"Reader\n" +"%s available" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:129 +msgid "" +"Card\n" +"%s available" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:133 +msgid "Click to see the list of books available on your computer" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:134 +msgid "Click to see the list of books in the main memory of your reader" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:135 +msgid "Click to see the list of books on the storage card in your reader" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/parallel.py:114 +msgid "Job killed by user" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:56 +#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:77 +msgid "Unknown feed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:95 +#: /home/kovid/work/calibre/src/calibre/web/feeds/__init__.py:115 +msgid "Untitled article" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:15 +msgid "" +"%%prog [options] ARG\n" +"\n" +"%%prog parses an online source of articles, like an RSS or ATOM feed and \n" +"fetches the article contents organized in a nice hierarchy.\n" +"\n" +"ARG can be one of:\n" +"\n" +"file name - %%prog will try to load a recipe from the file\n" +"\n" +"builtin recipe title - %%prog will load the builtin recipe and use it to " +"fetch the feed. For e.g. Newsweek or \"The BBC\" or \"The New York Times\"\n" +"\n" +"recipe as a string - %%prog will load the recipe directly from the string " +"arg.\n" +"\n" +"Available builtin recipes are:\n" +"%s\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:37 +msgid "Options to control web2disk (used to fetch websites linked from feeds)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:40 +msgid "" +"Specify a list of feeds to download. For example: \n" +"\"['http://feeds.newsweek.com/newsweek/TopNews', 'http://feeds.newsweek.com/" +"headlines/politics']\"\n" +"If you specify this option, any argument to %prog is ignored and a default " +"recipe is used to download the feeds." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:44 +msgid "Be more verbose while processing." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:46 +msgid "" +"The title for this recipe. Used as the title for any ebooks created from the " +"downloaded feeds." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:47 +msgid "Username for sites that require a login to access content." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:48 +msgid "Password for sites that require a login to access content." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:51 +msgid "" +"Number of levels of links to follow on webpages that are linked to from " +"feeds. Defaul %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:53 +msgid "" +"The directory in which to store the downloaded feeds. Defaults to the " +"current directory." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:55 +msgid "Dont show the progress bar" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:57 +msgid "Very verbose output, useful for debugging." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:59 +msgid "" +"Useful for recipe development. Forces max_articles_per_feed to 2 and " +"downloads at most 2 feeds." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:84 +#: /home/kovid/work/calibre/src/calibre/web/feeds/main.py:88 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:570 +msgid "Fetching feeds..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:33 +msgid "Unknown News Source" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:471 +msgid "Download finished" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:473 +msgid "Failed to download the following articles:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:475 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:481 +msgid " from " +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:479 +msgid "Failed to download parts of the following articles:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:483 +msgid "\tFailed links:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:552 +msgid "Could not fetch article. Run with --debug to see the reason" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:574 +msgid "Got feeds from index page" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:578 +msgid "Trying to download cover..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:628 +msgid "Starting download [%d thread(s)]..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:642 +msgid "Feeds downloaded to %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:651 +msgid "Could not download cover: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:656 +msgid "Downloading cover from %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:691 +msgid "Untitled Article" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:734 +msgid "" +"\n" +"Downloaded article %s from %s\n" +"%s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:740 +msgid "Article downloaded: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:746 +msgid "Failed to download article: %s from %s\n" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:751 +msgid "Article download failed: %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:766 +msgid "Fetching feed" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:377 +msgid "" +"%prog URL\n" +"\n" +"Where URL is for example http://google.com" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:380 +msgid "Base directory into which URL is saved. Default is %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:383 +msgid "" +"Timeout in seconds to wait for a response from the server. Default: %default " +"s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:386 +msgid "" +"Maximum number of levels to recurse i.e. depth of links to follow. Default %" +"default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:389 +msgid "" +"The maximum number of files to download. This only applies to files from <a " +"href> tags. Default is %default" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:391 +msgid "" +"Minimum interval in seconds between consecutive fetches. Default is %default " +"s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:393 +msgid "" +"The character encoding for the websites you are trying to download. The " +"default is to try and guess the encoding." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:395 +msgid "" +"Only links that match this regular expression will be followed. This option " +"can be specified multiple times, in which case as long as a link matches any " +"one regexp, it will be followed. By default all links are followed." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:397 +msgid "" +"Any link that matches this regular expression will be ignored. This option " +"can be specified multiple times, in which case as long as any regexp matches " +"a link, it will be ignored.By default, no links are ignored. If both --" +"filter-regexp and --match-regexp are specified, then --filter-regexp is " +"applied first." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:399 +msgid "Do not download CSS stylesheets." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:400 +msgid "Show detailed output information. Useful for debugging" +msgstr "" diff --git a/src/calibre/utils/__init__.py b/src/calibre/utils/__init__.py index d1ea35c192..b2acb4f0ed 100644 --- a/src/calibre/utils/__init__.py +++ b/src/calibre/utils/__init__.py @@ -35,7 +35,10 @@ def sendmail(recipient='', subject='', attachments=[], body=''): pt.write(open(attachments[0], 'rb').read()) pt.close() - subprocess.check_call('open -t '+pt.name, shell=True) + try: + subprocess.call('open -t '+pt.name, shell=True) + except: # For some reason making this call leads to a system call interrupted error + pass else: body = '"' + body.replace('"', '\\"') + '"' subject = '"' + subject.replace('"', '\\"') + '"' diff --git a/src/calibre/utils/single_qt_application.py b/src/calibre/utils/single_qt_application.py new file mode 100644 index 0000000000..8e294b1550 --- /dev/null +++ b/src/calibre/utils/single_qt_application.py @@ -0,0 +1,162 @@ +#!/usr/bin/env python +__license__ = 'GPL v3' +__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' +__docformat__ = 'restructuredtext en' + +''' +Enforces running of only a single application instance and allows for messaging between +applications using a local socket. +''' +import atexit + +from PyQt4.QtCore import QByteArray, QDataStream, QIODevice, SIGNAL, QObject, Qt +from PyQt4.QtNetwork import QLocalSocket, QLocalServer + +timeout_read = 5000 +timeout_connect = 500 + +def write_message(socket, message, timeout = 5000): + block = QByteArray() + out = QDataStream(block, QIODevice.WriteOnly) + + out.writeInt32(0) + out.writeString(message) + out.device().seek(0) + out.writeInt32(len(message)) + + socket.write(block) + + return getattr(socket, 'state', lambda : None)() == QLocalSocket.ConnectedState and \ + bool(socket.waitForBytesWritten(timeout)) + +def read_message(socket): + if getattr(socket, 'state', lambda : None)() != QLocalSocket.ConnectedState: + return '' + + while socket.bytesAvailable() < 4: + if not socket.waitForReadyRead(timeout_read): + return '' + + message = '' + ins = QDataStream(socket) + block_size = ins.readInt32() + while socket.bytesAvailable() < block_size: + if not socket.waitForReadyRead(timeout_read): + return message + return str(ins.readString()) + +class Connection(QObject): + + def __init__(self, socket, name): + QObject.__init__(self) + self.socket = socket + self.name = name + self.magic = self.name + ':' + self.connect(self.socket, SIGNAL('readyRead()'), self.read_msg, Qt.QueuedConnection) + self.write_succeeded = write_message(self.socket, self.name) + self.connect(self.socket, SIGNAL('disconnected()'), self.disconnected) + if not self.write_succeeded: + self.socket.abort() + + def read_msg(self): + while self.socket.bytesAvailable() > 0: + msg = read_message(self.socket) + if msg.startswith(self.magic): + self.emit(SIGNAL('message_received(PyQt_PyObject)'), msg[len(self.magic):]) + + def disconnected(self): + self.emit(SIGNAL('disconnected()')) + + +class LocalServer(QLocalServer): + + def __init__(self, server_id, parent=None): + QLocalServer.__init__(self, parent) + self.server_id = str(server_id) + self.mr = lambda x : self.emit(SIGNAL('message_received(PyQt_PyObject)'), x) + self.connections = [] + self.connect(self, SIGNAL('newConnection()'), self.new_connection) + + def new_connection(self): + socket = self.nextPendingConnection() + conn = Connection(socket, self.server_id) + if conn.socket.state() != QLocalSocket.UnconnectedState: + self.connect(conn, SIGNAL('message_received(PyQt_PyObject)'), self.mr) + self.connect(conn, SIGNAL('disconnected()'), self.free) + self.connections.append(conn) + + def free(self): + pop = [] + for conn in self.connections: + if conn.socket.state() == QLocalSocket.UnconnectedState: + pop.append(conn) + + for conn in pop: + self.connections.remove(conn) + + + +class SingleApplication(QObject): + + def __init__(self, name, parent=None, server_name='calibre_server'): + QObject.__init__(self, parent) + self.name = name + self.server_name = server_name + self.running = False + self.mr = lambda x : self.emit(SIGNAL('message_received(PyQt_PyObject)'), x) + + # Check if server is already running + self.socket = QLocalSocket(self) + self.socket.connectToServer(self.server_name) + if self.socket.waitForConnected(timeout_connect): + msg = read_message(self.socket) + if msg == self.name: + self.running = True + + + # Start server + self.server = None + if not self.running: + self.socket.abort() + self.socket = None + self.server = LocalServer(self.name, self) + self.connect(self.server, SIGNAL('message_received(PyQt_PyObject)'), + self.mr, Qt.QueuedConnection) + + if not self.server.listen(self.server_name): + if not self.server.listen(self.server_name): + self.server = None + if self.server is not None: + atexit.register(self.server.close) + + + def is_running(self, name=None): + return self.running if name is None else SingleApplication().is_running() + + def send_message(self, msg, timeout=3000): + return self.running and write_message(self.socket, self.name+':'+msg, timeout) + +if __name__ == '__main__': + from PyQt4.Qt import QWidget, QApplication + class Test(QWidget): + + def __init__(self, sa): + QWidget.__init__(self) + self.sa = sa + self.connect(sa, SIGNAL('message_received(PyQt_PyObject)'), self.mr) + + def mr(self, msg): + print 'Message received:', msg + + app = QApplication([]) + app.connect(app, SIGNAL('lastWindowClosed()'), app.quit) + sa = SingleApplication('test SA') + if sa.is_running(): + sa.send_message('test message') + else: + widget = Test(sa) + widget.show() + app.exec_() + + + \ No newline at end of file diff --git a/src/calibre/web/feeds/recipes/__init__.py b/src/calibre/web/feeds/recipes/__init__.py index f77cf65a53..a27908bdb3 100644 --- a/src/calibre/web/feeds/recipes/__init__.py +++ b/src/calibre/web/feeds/recipes/__init__.py @@ -62,9 +62,9 @@ def compile_recipe(src): enc = match.group(1) if match else 'utf-8' src = src.decode(enc) f = open(temp, 'wb') - src = '# coding=utf-8\n' + src src = 'from %s.web.feeds.news import BasicNewsRecipe, AutomaticNewsRecipe\n'%__appname__ + src src = 'from %s.ebooks.lrf.web.profiles import DefaultProfile, FullContentProfile\n'%__appname__ + src + src = '# coding: utf-8\n' + src f.write(src.replace('from libprs500', 'from calibre').encode('utf-8')) f.close() module = imp.find_module(temp.namebase, [temp.dirname()]) diff --git a/src/calibre/web/fetch/simple.py b/src/calibre/web/fetch/simple.py index 6308eab3a0..1f489bd011 100644 --- a/src/calibre/web/fetch/simple.py +++ b/src/calibre/web/fetch/simple.py @@ -250,7 +250,10 @@ class RecursiveFetcher(object, LoggingInterface): self.log_debug('Error: %s', str(err), exc_info=True) continue c += 1 - imgpath = os.path.join(diskpath, sanitize_file_name('img'+str(c)+ext)) + fname = sanitize_file_name('img'+str(c)+ext) + if isinstance(fname, unicode): + fname = fname.encode('ascii', 'replace') + imgpath = os.path.join(diskpath, fname) with self.imagemap_lock: self.imagemap[iurl] = imgpath open(imgpath, 'wb').write(f.read())