From 181802da53d34423424452cf1b5da2c87bb176e2 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 18 Aug 2009 15:23:11 -0600 Subject: [PATCH] Saving to disk is now fully customizable. The user can control the file and directory structure of the saved files as well as various other aspects of the save process. --- src/calibre/ebooks/metadata/worker.py | 47 +- src/calibre/gui2/add.py | 15 +- src/calibre/gui2/dialogs/config/add_save.py | 7 +- src/calibre/gui2/dialogs/config/add_save.ui | 21 +- src/calibre/gui2/main.py | 22 +- src/calibre/library/cli.py | 5 +- src/calibre/library/save_to_disk.py | 10 +- src/calibre/translations/calibre.pot | 709 +++++++++++------- src/calibre/utils/config.py | 1 + .../web/feeds/recipes/recipe_guardian.py | 50 +- 10 files changed, 534 insertions(+), 353 deletions(-) diff --git a/src/calibre/ebooks/metadata/worker.py b/src/calibre/ebooks/metadata/worker.py index 684ebd6b79..c675e92b1d 100644 --- a/src/calibre/ebooks/metadata/worker.py +++ b/src/calibre/ebooks/metadata/worker.py @@ -153,14 +153,17 @@ def read_metadata(paths, result_queue, chunk=50, spare_server=None): t.start() return t + +########################################################################### +############ Saving ##################### +########################################################################### + class SaveWorker(Thread): - def __init__(self, result_queue, db, ids, path, by_author=False, - single_dir=False, single_format=None, spare_server=None): + def __init__(self, result_queue, db, ids, path, opts, spare_server=None): Thread.__init__(self) self.daemon = True - self.path, self.by_author = path, by_author - self.single_dir, self.single_format = single_dir, single_format + self.path, self.opts = path, opts self.ids = ids self.library_path = db.library_path self.canceled = False @@ -170,17 +173,22 @@ class SaveWorker(Thread): self.start() def run(self): + from calibre.library.save_to_disk import config server = Server() if self.spare_server is None else self.spare_server ids = set(self.ids) tasks = server.split(list(ids)) jobs = set([]) + c = config() + recs = {} + for pref in c.preferences: + recs[pref.name] = getattr(self.opts, pref.name) + for i, task in enumerate(tasks): tids = [x[-1] for x in task] job = ParallelJob('save_book', 'Save books (%d of %d)'%(i, len(tasks)), lambda x,y:x, - args=[tids, self.library_path, self.path, self.single_dir, - self.single_format, self.by_author]) + args=[tids, self.library_path, self.path, recs]) jobs.add(job) server.add_job(job) @@ -192,9 +200,9 @@ class SaveWorker(Thread): job.update(consume_notifications=False) while True: try: - id, title, ok = job.notifications.get_nowait()[0] + id, title, ok, tb = job.notifications.get_nowait()[0] if id in ids: - self.result_queue.put((id, title, ok)) + self.result_queue.put((id, title, ok, tb)) ids.remove(id) except Empty: break @@ -221,23 +229,18 @@ class SaveWorker(Thread): pass -def save_book(task, library_path, path, single_dir, single_format, - by_author, notification=lambda x,y:x): +def save_book(task, library_path, path, recs, notification=lambda x,y:x): from calibre.library.database2 import LibraryDatabase2 db = LibraryDatabase2(library_path) + from calibre.library.save_to_disk import config, save_to_disk + opts = config().parse() + for name in recs: + setattr(opts, name, recs[name]) - def callback(id, title): - notification((id, title, True)) + + def callback(id, title, failed, tb): + notification((id, title, not failed, tb)) return True - if single_format is None: - failures = [] - db.export_to_dir(path, task, index_is_id=True, byauthor=by_author, - callback=callback, single_dir=single_dir) - else: - failures = db.export_single_format_to_dir(path, task, single_format, - index_is_id=True, callback=callback) - - for id, title in failures: - notification((id, title, False)) + save_to_disk(db, task, path, opts, callback) diff --git a/src/calibre/gui2/add.py b/src/calibre/gui2/add.py index c7c3a9e62e..1f5670b0d3 100644 --- a/src/calibre/gui2/add.py +++ b/src/calibre/gui2/add.py @@ -295,13 +295,13 @@ class Adder(QObject): class Saver(QObject): - def __init__(self, parent, db, callback, rows, path, - by_author=False, single_dir=False, single_format=None, + def __init__(self, parent, db, callback, rows, path, opts, spare_server=None): QObject.__init__(self, parent) self.pd = ProgressDialog(_('Saving...'), parent=parent) self.spare_server = spare_server self.db = db + self.opts = opts self.pd.setModal(True) self.pd.show() self.pd.set_min(0) @@ -315,8 +315,8 @@ class Saver(QObject): self.failures = set([]) from calibre.ebooks.metadata.worker import SaveWorker - self.worker = SaveWorker(self.rq, db, self.ids, path, by_author, - single_dir, single_format, spare_server=self.spare_server) + self.worker = SaveWorker(self.rq, db, self.ids, path, self.opts, + spare_server=self.spare_server) self.connect(self.pd, SIGNAL('canceled()'), self.canceled) self.timer = QTimer(self) self.connect(self.timer, SIGNAL('timeout()'), self.update) @@ -344,15 +344,14 @@ class Saver(QObject): return try: - id, title, ok = self.rq.get_nowait() + id, title, ok, tb = self.rq.get_nowait() except Empty: return self.pd.value += 1 self.ids.remove(id) if not isinstance(title, unicode): - title = str(title).decode('utf-8', preferred_encoding) + title = str(title).decode(preferred_encoding, 'replace') self.pd.set_msg(_('Saved')+' '+title) if not ok: - self.failures.add(title) - + self.failures.add((title, tb)) diff --git a/src/calibre/gui2/dialogs/config/add_save.py b/src/calibre/gui2/dialogs/config/add_save.py index ba4289ddb9..6d91745044 100644 --- a/src/calibre/gui2/dialogs/config/add_save.py +++ b/src/calibre/gui2/dialogs/config/add_save.py @@ -52,13 +52,10 @@ class AddSave(QTabWidget, Ui_TabWidget): table = u'%s
'%(u'\n'.join(rows)) self.template_variables.setText(table) - self.opt_read_metadata_from_filename.setChecked(prefs['read_file_metadata']) - self.metadata_box.setEnabled(self.opt_read_metadata_from_filename.isChecked()) + self.opt_read_metadata_from_filename.setChecked(not prefs['read_file_metadata']) self.filename_pattern = FilenamePattern(self) self.metadata_box.layout().insertWidget(0, self.filename_pattern) - - def validate(self): tmpl = preprocess_template(self.opt_template.text()) fa = {} @@ -82,7 +79,7 @@ class AddSave(QTabWidget, Ui_TabWidget): for x in ('formats', 'template', 'timefmt'): c.set(x, unicode(getattr(self, 'opt_'+x).text()).strip()) self.opt_template.save_history('save_to_disk_template_history') - prefs['read_file_metadata'] = bool(self.opt_read_metadata_from_filename.isChecked()) + prefs['read_file_metadata'] = not bool(self.opt_read_metadata_from_filename.isChecked()) pattern = self.filename_pattern.commit() prefs['filename_pattern'] = pattern diff --git a/src/calibre/gui2/dialogs/config/add_save.ui b/src/calibre/gui2/dialogs/config/add_save.ui index e61dc102ee..6faec64626 100644 --- a/src/calibre/gui2/dialogs/config/add_save.ui +++ b/src/calibre/gui2/dialogs/config/add_save.ui @@ -34,7 +34,7 @@ - Read metadata from &file name + Read metadata only from &file name @@ -174,22 +174,5 @@ - - - opt_read_metadata_from_filename - toggled(bool) - metadata_box - setEnabled(bool) - - - 159 - 81 - - - 178 - 122 - - - - + diff --git a/src/calibre/gui2/main.py b/src/calibre/gui2/main.py index 8ca4c9a17d..dc0cc0b2a9 100644 --- a/src/calibre/gui2/main.py +++ b/src/calibre/gui2/main.py @@ -1064,11 +1064,14 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI): if self.current_view() is self.library_view: from calibre.gui2.add import Saver + from calibre.library.save_to_disk import config + opts = config().parse() + if single_format is not None: + opts.formats = single_format + if single_dir: + opts.template = '{title} - {authors}' self._saver = Saver(self, self.library_view.model().db, - Dispatcher(self._books_saved), rows, path, - by_author=self.library_view.model().by_author, - single_dir=single_dir, - single_format=single_format, + Dispatcher(self._books_saved), rows, path, opts, spare_server=self.spare_server) else: @@ -1078,19 +1081,20 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI): def _books_saved(self, path, failures, error): - single_format = self._saver.worker.single_format self._saver = None if error: return error_dialog(self, _('Error while saving'), _('There was an error while saving.'), error, show=True) - if failures and single_format: - single_format = single_format.upper() + if failures: + failures = [u'%s\n\t%s'% + (title, '\n\t'.join(err.splitlines())) for title, err in + failures] + warning_dialog(self, _('Could not save some books'), _('Could not save some books') + ', ' + - (_('as the %s format is not available for them.')%single_format) + _('Click the show details button to see which ones.'), - '\n'.join(failures), show=True) + u'\n\n'.join(failures), show=True) QDesktopServices.openUrl(QUrl.fromLocalFile(path)) def books_saved(self, job): diff --git a/src/calibre/library/cli.py b/src/calibre/library/cli.py index 14896a28f4..81d293a1cb 100644 --- a/src/calibre/library/cli.py +++ b/src/calibre/library/cli.py @@ -498,10 +498,7 @@ def do_export(db, ids, dir, opts): prints('Failed to save the following books:') for id, title, tb in failures: prints(str(id)+':', title) - if tb: - prints('\t'+'\n\t'.join(tb.splitlines())) - else: - prints('\tRequested formats not available') + prints('\t'+'\n\t'.join(tb.splitlines())) prints(' ') def command_export(args, dbpath): diff --git a/src/calibre/library/save_to_disk.py b/src/calibre/library/save_to_disk.py index a274efe5ee..cafe8addc8 100644 --- a/src/calibre/library/save_to_disk.py +++ b/src/calibre/library/save_to_disk.py @@ -176,7 +176,8 @@ def save_book_to_disk(id, db, root, opts, length): traceback.print_exc() stream.seek(0) data = stream.read() - with open(base_path+'.'+fmt, 'wb') as f: + fmt_path = base_path+'.'+str(fmt) + with open(fmt_path, 'wb') as f: f.write(data) return not written, id, mi.title @@ -189,7 +190,9 @@ def save_to_disk(db, ids, root, opts=None, callback=None): :param:`ids` iterable of book ids to save from the database. :param:`callback` is an optional callable that is called on after each - book is processed with the arguments: id, title and failed + book is processed with the arguments: id, title, failed, traceback. + If the callback returns False, further processing is terminated and + the function returns. :return: A list of failures. Each element of the list is a tuple (id, title, traceback) ''' @@ -209,13 +212,14 @@ def save_to_disk(db, ids, root, opts=None, callback=None): tb = '' try: failed, id, title = save_book_to_disk(x, db, root, opts, length) + tb = _('Requested formats not available') except: failed, id, title = True, x, db.title(x, index_is_id=True) tb = traceback.format_exc() if failed: failures.append((id, title, tb)) if callable(callback): - if not callback(int(id), title, failed): + if not callback(int(id), title, failed, tb): break return failures diff --git a/src/calibre/translations/calibre.pot b/src/calibre/translations/calibre.pot index 8b19b30307..8ec3ead55c 100644 --- a/src/calibre/translations/calibre.pot +++ b/src/calibre/translations/calibre.pot @@ -5,8 +5,8 @@ msgid "" msgstr "" "Project-Id-Version: calibre 0.6.7\n" -"POT-Creation-Date: 2009-08-14 21:48+MDT\n" -"PO-Revision-Date: 2009-08-14 21:48+MDT\n" +"POT-Creation-Date: 2009-08-18 12:04+MDT\n" +"PO-Revision-Date: 2009-08-18 12:04+MDT\n" "Last-Translator: Automatically generated\n" "Language-Team: LANGUAGE\n" "MIME-Version: 1.0\n" @@ -24,8 +24,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:52 #: /home/kovid/work/calibre/src/calibre/devices/prs505/books.py:58 #: /home/kovid/work/calibre/src/calibre/devices/prs505/books.py:199 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:701 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:705 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:698 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:702 #: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:403 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:66 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:68 @@ -37,7 +37,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:225 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:256 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:259 -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:350 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:359 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:23 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/ereader.py:45 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fb2.py:46 @@ -60,8 +60,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:79 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:121 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:154 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:567 -#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:751 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:574 +#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:761 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:44 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:46 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:882 @@ -94,8 +94,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/writer.py:29 #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:139 #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:141 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:251 -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:253 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:260 #: /home/kovid/work/calibre/src/calibre/gui2/add.py:91 #: /home/kovid/work/calibre/src/calibre/gui2/add.py:98 #: /home/kovid/work/calibre/src/calibre/gui2/convert/__init__.py:19 @@ -126,10 +126,10 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/library/database2.py:1099 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1429 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1431 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1515 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1606 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1634 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1685 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1516 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1607 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1635 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1686 #: /home/kovid/work/calibre/src/calibre/library/server.py:309 #: /home/kovid/work/calibre/src/calibre/library/server.py:373 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:45 @@ -486,43 +486,46 @@ msgstr "" msgid "Communicate with the Sony PRS-700 eBook reader." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:282 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:354 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:278 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:350 msgid "Unable to detect the %s disk drive. Try rebooting." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:422 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:527 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:418 msgid "Unable to detect the %s disk drive." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:515 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:511 msgid "Could not find mount helper: %s." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:534 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:523 +msgid "Unable to detect the %s disk drive. Your kernel is probably exporting a deprecated version of SYSFS." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:531 msgid "Unable to mount main memory (Error code: %d)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:639 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:641 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:636 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:638 msgid "The reader has no storage card in this slot." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:643 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:640 msgid "Selected slot: %s is not supported." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:667 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:664 msgid "There is insufficient free space in main memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:669 -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:671 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:666 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:668 msgid "There is insufficient free space on the storage card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:681 +#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:678 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:467 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:83 #: /home/kovid/work/calibre/src/calibre/library/database2.py:1006 @@ -669,27 +672,27 @@ msgstr "" msgid "Options to control the look and feel of the output" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:134 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:135 msgid "Control auto-detection of document structure." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:144 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:145 msgid "Control the automatic generation of a Table of Contents. By default, if the source file has a Table of Contents, it will be used in preference to the automatically generated one." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:154 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:155 msgid "Options to set metadata in the output" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:157 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:158 msgid "Options to help with debugging the conversion" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:181 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:182 msgid "List builtin recipes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:250 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:251 msgid "Output saved to" msgstr "" @@ -1226,7 +1229,7 @@ msgstr "" msgid "Comic" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:349 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:358 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:45 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:69 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:70 @@ -1237,7 +1240,7 @@ msgstr "" msgid "Title" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:350 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:359 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:57 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:159 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:393 @@ -1245,18 +1248,18 @@ msgstr "" msgid "Author(s)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:351 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:360 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:59 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:164 msgid "Publisher" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:352 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:361 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:49 msgid "Producer" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:353 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:362 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:183 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:71 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info_ui.py:64 @@ -1265,7 +1268,7 @@ msgstr "" msgid "Comments" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:361 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:370 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:165 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:338 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:1010 @@ -1275,7 +1278,7 @@ msgstr "" msgid "Tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:363 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:372 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:166 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:354 #: /home/kovid/work/calibre/src/calibre/gui2/status.py:59 @@ -1283,22 +1286,22 @@ msgstr "" msgid "Series" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:364 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:373 msgid "Language" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:366 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:375 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:1009 msgid "Timestamp" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:368 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:377 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:61 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:162 msgid "Published" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:370 +#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:379 msgid "Rights" msgstr "" @@ -1817,7 +1820,7 @@ msgid "Specify the character encoding of the output document. The default is utf msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:28 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:507 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:502 msgid "Frequently used directories" msgstr "" @@ -1905,16 +1908,16 @@ msgstr "" msgid "Default action to perform when send to device button is clicked" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:115 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:397 msgid "Copied" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:142 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:144 msgid "Copy" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:142 +#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:144 msgid "Copy to Clipboard" msgstr "" @@ -1950,7 +1953,7 @@ msgstr "" msgid "Books with the same title as the following already exist in the database. Add them anyway?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:302 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:301 msgid "Saving..." msgstr "" @@ -2302,14 +2305,14 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_edit_ui.py:44 #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:61 #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:62 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:491 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:505 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:506 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:509 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:511 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:527 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:528 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:559 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:488 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:500 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:501 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:504 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:506 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:522 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:523 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:553 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:339 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:344 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single_ui.py:358 @@ -2870,7 +2873,7 @@ msgid "Attached, you will find the e-book" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/device.py:550 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:176 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:175 msgid "by" msgstr "" @@ -2970,7 +2973,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:88 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:89 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:92 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:214 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:344 #: /home/kovid/work/calibre/src/calibre/gui2/status.py:57 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:83 @@ -3009,427 +3012,491 @@ msgstr "" msgid "&Profile:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:169 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:168 msgid "%(plugin_type)s %(plugins)s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:170 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:169 msgid "plugins" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:195 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:194 msgid "Conversion" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:195 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:194 msgid "General" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:195 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:194 msgid "Interface" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:196 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:195 +msgid "Add/Save" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:195 msgid "" "Email\n" "Delivery" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:197 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:196 msgid "Advanced" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:197 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:196 msgid "" "Content\n" "Server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:197 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:196 msgid "Plugins" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:214 msgid "Auto send" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:215 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:214 msgid "Email" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:219 msgid "Formats to email. The first matching format will be sent." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:220 msgid "If checked, downloaded news will be automatically mailed
to this email address (provided it is in one of the listed formats)." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:294 msgid "new email address" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:511 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:505 msgid "No valid plugin path" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:512 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:506 msgid "%s is not a valid plugin path" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:509 msgid "Choose plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:527 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:521 msgid "Plugin cannot be disabled" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:528 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:522 msgid "The plugin: %s cannot be disabled" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:537 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:531 msgid "Plugin not customizable" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:538 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:532 msgid "Plugin: %s does not need customization" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:562 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:556 msgid "Customize %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:572 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:566 msgid "Cannot remove builtin plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:573 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:567 msgid " cannot be removed. It is a builtin plugin. Try disabling it instead." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:606 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:600 msgid "Error log:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:613 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:607 msgid "Access log:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:638 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:632 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:562 msgid "Failed to start content server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:662 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:656 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:469 msgid "Select location for books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:679 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:673 msgid "Invalid size" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:680 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:674 msgid "The size %s is invalid. must be of the form widthxheight" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:725 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:730 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:718 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:723 msgid "Invalid database location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:726 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:719 msgid "Invalid database location " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:727 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:720 msgid "
Must be a directory." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:731 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:724 msgid "Invalid database location.
Cannot write to " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:756 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:749 msgid "Checking..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:757 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:750 msgid "Checking database integrity. This may take a while." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:770 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:763 msgid "Some inconsistencies found" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:771 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:764 msgid "The following books had formats listed in the database that are not actually available. The entries for the formats have been removed. You should check them manually. This can happen if you manipulate the files in the library folder directly." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:488 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save.py:70 +msgid "Invalid template" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save.py:71 +msgid "The template %s is invalid:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:94 +msgid "TabWidget" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:95 +msgid "Here you can control how calibre will read metadata from the files you add to it. calibre can either read metadata from the contents of the file, or from the filename." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:96 +msgid "Read metadata only from &file name" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:97 +msgid "&Configure metadata from file name" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:98 +msgid "&Adding books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:99 +msgid "Here you can control how calibre will save your books when you click the Save to Disk button:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:100 +msgid "Save &cover separately" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:101 +msgid "Update &metadata in saved copies" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:102 +msgid "Save metadata in &OPF file" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:103 +msgid "Convert non-English characters to &English equivalents" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:104 +msgid "Format &dates as:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:105 +msgid "File &formats to save:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:106 +msgid "Save &template" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:107 +msgid "By adjusting the template below, you can control what folders the files are saved in and what filenames they are given. You can use the / character to indicate sub-folders. Available metadata variables are described below. If a particular book does not have some metadata, the variable will be replaced by the empty string." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:108 +msgid "Available variables:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/add_save_ui.py:109 +msgid "&Saving books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:485 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:372 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:173 msgid "Preferences" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:489 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:486 msgid "&Location of ebooks (The ebooks are stored in folders sorted by author and metadata is stored in the file metadata.db)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:490 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:487 msgid "Browse for the new database location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:492 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:489 msgid "Show notification when &new version is available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:493 -msgid "If you disable this setting, metadata is guessed from the filename instead. This can be configured in the Advanced section." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:494 -msgid "Read &metadata from files" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:495 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:490 msgid "Default network &timeout:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:496 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:491 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:497 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:492 msgid " seconds" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:498 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:493 msgid "Choose &language (requires restart):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:499 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:494 msgid "Normal" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:500 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:495 msgid "High" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:501 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:496 msgid "Low" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:502 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:497 msgid "Job &priority:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:503 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:498 msgid "Preferred &output format:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:504 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:499 msgid "Preferred &input format order:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:508 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:503 msgid "Add a directory to the frequently used directories list" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:510 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:505 msgid "Remove a directory from the frequently used directories list" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:512 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:507 msgid "Use &Roman numerals for series number" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:513 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:508 msgid "Enable system &tray icon (needs restart)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:514 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:509 msgid "Show ¬ifications in system tray" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:515 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:510 msgid "Show cover &browser in a separate window (needs restart)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:511 msgid "Search as you type" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:517 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:512 msgid "Automatically send downloaded &news to ebook reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:518 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:513 msgid "&Delete news from library when it is automatically sent to reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:519 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:514 msgid "&Number of covers to show in browse mode (needs restart):" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:520 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:515 msgid "Toolbar" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:521 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:516 msgid "Large" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:522 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:517 msgid "Medium" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:523 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:518 msgid "Small" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:524 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:519 msgid "&Button size in toolbar" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:525 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:520 msgid "Show &text in toolbar buttons" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:526 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:521 msgid "Select visible &columns in library view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:529 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:524 msgid "Use internal &viewer for:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:530 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:525 msgid "Add an email address to which to send books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:531 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:526 msgid "&Add email" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:532 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:527 msgid "Make &default" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:533 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:528 msgid "&Remove email" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:534 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:529 msgid "calibre can send your books to you (or your reader) by email" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:535 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:530 msgid "Free unused diskspace from the database" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:536 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:531 msgid "&Check database integrity" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:537 -msgid "&Metadata from file name" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:538 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:532 msgid "calibre contains a network server that allows you to access your book collection using a browser from anywhere in the world. Any changes to the settings will only take effect after a server restart." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:539 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:533 msgid "Server &port:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:540 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:534 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:58 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:178 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:117 msgid "&Username:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:541 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:535 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:59 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:179 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:119 msgid "&Password:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:542 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:536 msgid "If you leave the password blank, anyone will be able to access your book collection using the web interface." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:543 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:537 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/password_ui.py:60 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:180 msgid "&Show password" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:544 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:538 msgid "The maximum size (widthxheight) for displayed covers. Larger covers are resized. " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:545 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:539 msgid "Max. &cover size:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:546 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:540 msgid "&Start Server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:547 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:541 msgid "St&op Server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:548 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:542 msgid "&Test Server" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:549 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:543 msgid "Run server &automatically on startup" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:550 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:544 msgid "View &server logs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:551 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:545 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/stanza_ui.py:46 msgid "" "

Remember to leave calibre running as the server only runs as long as calibre is running.\n" "

Stanza should see your calibre collection automatically. If not, try adding the URL http://myhostname:8080 as a new catalog in the Stanza reader on your iPhone. Here myhostname should be the fully qualified hostname or the IP address of the computer calibre is running on." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:553 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:547 msgid "Here you can customize the behavior of Calibre by controlling what plugins it uses." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:554 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:548 msgid "Enable/&Disable plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:555 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:549 msgid "&Customize plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:556 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:550 msgid "&Remove plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:557 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:551 msgid "Add new plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:558 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:552 msgid "Plugin &file:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config_ui.py:560 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/config_ui.py:554 msgid "&Add" msgstr "" @@ -4473,7 +4540,7 @@ msgid "Save to disk in a single directory" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/main.py:278 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1466 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1470 msgid "Save only %s format to disk" msgstr "" @@ -4508,7 +4575,7 @@ msgid "Bad database location" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/main.py:426 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1594 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1598 msgid "Choose a location for your ebook library." msgstr "" @@ -4612,7 +4679,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1004 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1034 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1059 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1190 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1194 msgid "No books selected" msgstr "" @@ -4653,191 +4720,187 @@ msgstr "" msgid "Choose destination directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1084 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1086 msgid "Error while saving" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1085 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1087 msgid "There was an error while saving." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1089 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1090 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1094 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1095 msgid "Could not save some books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1091 -msgid "as the %s format is not available for them." -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1092 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1096 msgid "Click the show details button to see which ones." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1111 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1115 msgid "Fetching news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1124 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1128 msgid " fetched." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1189 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1193 msgid "Cannot convert" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1359 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1378 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1363 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1382 msgid "No book selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1359 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1411 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1363 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1415 msgid "Cannot view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1365 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1369 msgid "Choose the format to view" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1377 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1381 msgid "Cannot open folder" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1394 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1398 msgid "Multiple Books Selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1395 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1399 msgid "You are attempting to open %d books. Opening too many books at once can be slow and have a negative effect on the responsiveness of your computer. Once started the process cannot be stopped until complete. Do you wish to continue?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1412 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1416 msgid "%s has no available formats." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1450 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1454 msgid "Cannot configure" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1451 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1455 msgid "Cannot configure while there are running jobs." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1495 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1499 msgid "No detailed info available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1496 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1500 msgid "No detailed information is available for books on the device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1544 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1548 msgid "Error talking to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1545 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1549 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:1562 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1577 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1566 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1581 msgid "Conversion Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1563 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1567 msgid "

Could not convert: %s

It is a DRMed book. You must first remove the DRM using 3rd party tools." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1578 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1582 msgid "Failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1603 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1607 msgid "Invalid library location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1604 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1608 msgid "Could not access %s. Using %s as the library." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1652 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1656 msgid "is the result of the efforts of many volunteers from all over the world. If you find it useful, please consider donating to support its development." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1676 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1680 msgid "There are active jobs. Are you sure you want to quit?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1679 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1683 msgid "" " is communicating with the device!
\n" " Quitting may cause corruption on the device.
\n" " Are you sure you want to quit?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1683 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1687 msgid "WARNING: Active jobs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1734 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1738 msgid "will keep running in the system tray. To close it, choose Quit in the context menu of the system tray." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1753 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1757 msgid "Latest version: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1761 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1765 msgid "Update available" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1762 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1766 msgid "%s has been updated to version %s. See the new features. Visit the download page?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1780 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1784 msgid "Use the library located at the specified path." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1782 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1786 msgid "Start minimized to system tray." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1784 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1788 msgid "Log debugging information to console" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1832 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1836 msgid "If you are sure it is not running" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1834 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1838 msgid "Cannot Start " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1835 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1839 msgid "%s is already running." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1838 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1842 msgid "may be running in the system tray, in the" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1840 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1844 msgid "upper right region of the screen." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1842 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1846 msgid "lower right region of the screen." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1845 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1849 msgid "try rebooting your computer." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1847 -#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1867 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1851 +#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1871 msgid "try deleting the file" msgstr "" @@ -5857,7 +5920,7 @@ msgstr "" msgid "You must specify an id and a metadata file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:497 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:505 msgid "" "%prog export [options] ids\n" "\n" @@ -5866,27 +5929,27 @@ msgid "" "an opf file). You can get id numbers from the list command.\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:505 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:513 msgid "Export all books in database, ignoring the list of ids." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:507 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:515 msgid "Export books to the specified directory. Default is" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:509 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:517 msgid "Export all books into a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:511 -msgid "Create file names as author - title instead of title - author" +#: /home/kovid/work/calibre/src/calibre/library/cli.py:524 +msgid "Specifying this switch will turn this behavior off." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:516 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:537 msgid "You must specify some ids or the %s option" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/cli.py:526 +#: /home/kovid/work/calibre/src/calibre/library/cli.py:547 msgid "" "%%prog command [options] [arguments]\n" "\n" @@ -5898,18 +5961,102 @@ msgid "" "For help on an individual command: %%prog command --help\n" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1541 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1542 msgid "

Migrating old database to ebook library in %s

" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1570 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1571 msgid "Copying %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1587 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1588 msgid "Compacting database" msgstr "" +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:22 +msgid "The title" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:23 +msgid "The authors" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:24 +msgid "The author sort string" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:25 +msgid "The tags" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:26 +msgid "The series" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:27 +msgid "The series number" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:28 +msgid "The rating" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:29 +msgid "The ISBN" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:30 +msgid "The publisher" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:31 +msgid "The date" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:32 +msgid "The published date" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:33 +msgid "The calibre internal id" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:43 +msgid "Options to control saving to disk" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:49 +msgid "Normally, calibre will update the metadata in the saved files from what is in the calibre library. Makes saving to disk slower." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:52 +msgid "Normally, calibre will write the metadata into a separate OPF file along with the actual e-book files." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:55 +msgid "Normally, calibre will save the cover in a separate file along with the actual e-book file(s)." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:58 +msgid "Comma separated list of formats to save for each book. By default all available books are saved." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:61 +msgid "The template to control the filename and directory structure of the saved files. Default is \"%s\" which will save books into a per-author subdirectory with filenames containing title and author. Available controls are: {%s}" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:66 +msgid "Normally, calibre will convert all non English characters into English equivalents for the file names. WARNING: If you turn this off, you may experience errors when saving, depending on how well the filesystem you are saving to supports unicode." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:72 +msgid "The format in which to display dates. %d - day, %b - month, %Y - year. Default is: %b, %Y" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:214 +msgid "Requested formats not available" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/library/server.py:159 msgid "Password to access your calibre library. Username is " msgstr "" @@ -5934,43 +6081,43 @@ msgstr "" msgid "Whenever you pass arguments to %prog that have spaces in them, enclose the arguments in quotation marks." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:540 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:550 msgid "Path to the database in which books are stored" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:542 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:552 msgid "Pattern to guess metadata from filenames" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:544 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:554 msgid "Access key for isbndb.com" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:546 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:556 msgid "Default timeout for network operations (seconds)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:548 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:558 msgid "Path to directory in which your library of books is stored" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:550 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:560 msgid "The language in which to display the user interface" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:552 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:562 msgid "The default output format for ebook conversions." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:556 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:566 msgid "Ordered list of formats to prefer for input." msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:558 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:568 msgid "Read metadata from files" msgstr "" -#: /home/kovid/work/calibre/src/calibre/utils/config.py:560 +#: /home/kovid/work/calibre/src/calibre/utils/config.py:570 msgid "The priority of worker processes" msgstr "" @@ -6040,77 +6187,77 @@ msgstr "" msgid "Unknown News Source" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:578 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:587 msgid "Download finished" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:580 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:589 msgid "Failed to download the following articles:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:586 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:595 msgid "Failed to download parts of the following articles:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:588 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:597 msgid " from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:590 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:599 msgid "\tFailed links:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:671 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:680 msgid "Could not fetch article. Run with --debug to see the reason" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:692 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:701 msgid "Fetching feeds..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:696 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:705 msgid "Got feeds from index page" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:702 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:711 msgid "Trying to download cover..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:753 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:762 msgid "Starting download [%d thread(s)]..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:769 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:778 msgid "Feeds downloaded to %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:779 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:788 msgid "Could not download cover: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:786 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:795 msgid "Downloading cover from %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:907 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:916 msgid "Untitled Article" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:978 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:987 msgid "Article downloaded: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:989 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:998 msgid "Article download failed: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1004 -#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_borba.py:78 +#: /home/kovid/work/calibre/src/calibre/web/feeds/news.py:1013 +#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_borba.py:80 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_glas_srpske.py:76 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_instapaper.py:59 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_lamujerdemivida.py:59 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_laprensa_ni.py:63 -#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_pobjeda.py:85 +#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_pobjeda.py:83 msgid "Fetching feed" msgstr "" @@ -6124,25 +6271,23 @@ msgid "Croatian" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_24sata_rs.py:26 -#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_b92.py:23 +#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_24sata_rs.py:25 +#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_b92.py:22 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_blic.py:25 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_borba.py:19 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_danas.py:22 -#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_e_novine.py:26 +#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_e_novine.py:25 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_glas_srpske.py:27 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_krstarica.py:23 -#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_nin.py:31 +#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_nin.py:30 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_novosti.py:24 -#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_nspm.py:26 -#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_pescanik.py:25 -#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_pobjeda.py:26 -#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_politika.py:23 +#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_nspm.py:25 +#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_pescanik.py:24 +#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_politika.py:24 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_pressonline.py:25 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_rts.py:23 -#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_tanjug.py:22 -#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_vijesti.py:28 -#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_vreme.py:28 +#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_tanjug.py:23 +#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_vreme.py:27 msgid "Serbian" msgstr "" @@ -6151,6 +6296,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_buenosaireseconomico.py:23 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_clarin.py:26 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_criticadigital.py:17 +#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_cubadebate.py:17 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_diagonales.py:23 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_el_mercurio_chile.py:61 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_el_pais.py:14 @@ -6320,6 +6466,10 @@ msgstr "" msgid "Vietnamese" msgstr "" +#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_borba.py:20 +msgid "sr-Latn-RS" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_carta.py:24 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_der_standard.py:22 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_diepresse.py:23 @@ -6365,7 +6515,7 @@ msgid "Dutch" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_dnevni_avaz.py:27 +#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_dnevni_avaz.py:28 msgid "Bosnian" msgstr "" @@ -6400,6 +6550,11 @@ msgstr "" msgid "Skipping filtered article: %s" msgstr "" +#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_pobjeda.py:24 +#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_vijesti.py:25 +msgid "Montenegrin" +msgstr "" + #: #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_usatoday.py:18 msgid "Kovid Goyal and Sujata Raman" diff --git a/src/calibre/utils/config.py b/src/calibre/utils/config.py index f4befc6052..d343043c97 100644 --- a/src/calibre/utils/config.py +++ b/src/calibre/utils/config.py @@ -379,6 +379,7 @@ class ConfigInterface(object): self.remove_opt = self.remove = self.option_set.remove_opt self.parse_string = self.option_set.parse_string self.get_option = self.option_set.get_option + self.preferences = self.option_set.preferences def update(self, other): self.option_set.update(other.option_set) diff --git a/src/calibre/web/feeds/recipes/recipe_guardian.py b/src/calibre/web/feeds/recipes/recipe_guardian.py index 02be26cffd..f8543c7d59 100644 --- a/src/calibre/web/feeds/recipes/recipe_guardian.py +++ b/src/calibre/web/feeds/recipes/recipe_guardian.py @@ -8,6 +8,7 @@ www.guardian.co.uk ''' from calibre.web.feeds.news import BasicNewsRecipe +from calibre.ebooks.BeautifulSoup import BeautifulSoup, Tag class Guardian(BasicNewsRecipe): @@ -16,14 +17,33 @@ class Guardian(BasicNewsRecipe): language = _('English') oldest_article = 7 max_articles_per_feed = 20 - + remove_javascript = True + timefmt = ' [%a, %d %b %Y]' - - remove_tags_before = dict(id='main-article-info') - remove_tags_after = dict(id='article-wrapper') - remove_tags_after = dict(id='content') + keep_only_tags = [ + dict(name='div', attrs={'id':["content","article_header","main-article-info",]}), + ] + remove_tags = [ + dict(name='div', attrs={'class':["video-content","videos-third-column"]}), + dict(name='div', attrs={'id':["article-toolbox","subscribe-feeds",]}), + dict(name='ul', attrs={'class':["pagination"]}), + dict(name='ul', attrs={'id':["content-actions"]}), + ] + use_embedded_content = False + no_stylesheets = True - extra_css = 'h2 {font-size: medium;} \n h1 {text-align: left;}' + extra_css = ''' + .article-attributes{font-size: x-small; font-family:Arial,Helvetica,sans-serif;} + .h1{font-size: large ;font-family:georgia,serif; font-weight:bold;} + .stand-first-alone{color:#666666; font-size:small; font-family:Arial,Helvetica,sans-serif;} + .caption{color:#666666; font-size:x-small; font-family:Arial,Helvetica,sans-serif;} + #article-wrapper{font-size:small; font-family:Arial,Helvetica,sans-serif;} + .main-article-info{font-family:Arial,Helvetica,sans-serif;} + #full-contents{font-size:small; font-family:Arial,Helvetica,sans-serif;} + #match-stats-summary{font-size:small; font-family:Arial,Helvetica,sans-serif;} + ''' + + feeds = [ ('Front Page', 'http://www.guardian.co.uk/rss'), @@ -37,3 +57,21 @@ class Guardian(BasicNewsRecipe): ('Comment','http://www.guardian.co.uk/commentisfree/rss'), ] + + def preprocess_html(self, soup): + + for item in soup.findAll(style=True): + del item['style'] + + for item in soup.findAll(face=True): + del item['face'] + for tag in soup.findAll(name=['ul','li']): + tag.name = 'div' + + return soup + + + + + +