'
+__docformat__ = 'restructuredtext en'
+
+from PyQt4.Qt import QVBoxLayout
+
+from calibre.gui2.preferences import (ConfigWidgetBase, test_widget)
+from calibre.gui2.keyboard import ShortcutConfig
+
+class ConfigWidget(ConfigWidgetBase):
+
+ def genesis(self, gui):
+ self.gui = gui
+ self.conf_widget = ShortcutConfig(self)
+ self.conf_widget.changed_signal.connect(self.changed_signal)
+ self._layout = l = QVBoxLayout()
+ self.setLayout(l)
+ l.addWidget(self.conf_widget)
+
+ def initialize(self):
+ ConfigWidgetBase.initialize(self)
+ self.conf_widget.initialize(self.gui.keyboard)
+
+ def restore_defaults(self):
+ ConfigWidgetBase.restore_defaults(self)
+ self.conf_widget.restore_defaults()
+
+ def commit(self):
+ self.conf_widget.commit()
+ return ConfigWidgetBase.commit(self)
+
+ def refresh_gui(self, gui):
+ gui.keyboard.finalize()
+
+if __name__ == '__main__':
+ from PyQt4.Qt import QApplication
+ app = QApplication([])
+ test_widget('Advanced', 'Keyboard')
+
diff --git a/src/calibre/gui2/ui.py b/src/calibre/gui2/ui.py
index c1cc07f56c..928e6c63ab 100644
--- a/src/calibre/gui2/ui.py
+++ b/src/calibre/gui2/ui.py
@@ -522,6 +522,7 @@ class Main(MainWindow, MainWindowMixin, DeviceMixin, EmailMixin, # {{{
self.card_a_view.reset()
self.card_b_view.reset()
self.device_manager.set_current_library_uuid(db.library_id)
+ self.library_view.set_current_row(0)
# Run a garbage collection now so that it does not freeze the
# interface later
gc.collect()
diff --git a/src/calibre/gui2/viewer/documentview.py b/src/calibre/gui2/viewer/documentview.py
index fcd02e5e1b..4661bc4899 100644
--- a/src/calibre/gui2/viewer/documentview.py
+++ b/src/calibre/gui2/viewer/documentview.py
@@ -979,6 +979,11 @@ class DocumentView(QWebView): # {{{
return ret
def keyPressEvent(self, event):
+ if not self.handle_key_press(event):
+ return QWebView.keyPressEvent(self, event)
+
+ def handle_key_press(self, event):
+ handled = True
key = self.shortcuts.get_match(event)
func = self.goto_location_actions.get(key, None)
if func is not None:
@@ -996,7 +1001,8 @@ class DocumentView(QWebView): # {{{
elif key == 'Right':
self.scroll_by(x=15)
else:
- return QWebView.keyPressEvent(self, event)
+ handled = False
+ return handled
def resizeEvent(self, event):
ret = QWebView.resizeEvent(self, event)
diff --git a/src/calibre/gui2/viewer/main.py b/src/calibre/gui2/viewer/main.py
index 5e3d9908c1..f0c67b0b49 100644
--- a/src/calibre/gui2/viewer/main.py
+++ b/src/calibre/gui2/viewer/main.py
@@ -755,6 +755,12 @@ class EbookViewer(MainWindow, Ui_EbookViewer):
if self.current_index > 0:
self.load_path(self.iterator.spine[self.current_index-1], pos=1.0)
+ def keyPressEvent(self, event):
+ MainWindow.keyPressEvent(self, event)
+ if not event.isAccepted():
+ if not self.view.handle_key_press(event):
+ event.ignore()
+
def __enter__(self):
return self
diff --git a/src/calibre/library/save_to_disk.py b/src/calibre/library/save_to_disk.py
index 2c723e0f7d..cacb607d56 100644
--- a/src/calibre/library/save_to_disk.py
+++ b/src/calibre/library/save_to_disk.py
@@ -296,8 +296,8 @@ def do_save_book_to_disk(id_, mi, cover, plugboards,
replace_whitespace=opts.replace_whitespace, safe_format=False)
except Exception, e:
raise ValueError(_('Failed to calculate path for '
- 'save to disk. Template: %s\n'
- 'Error: %s'%(opts.template, e)))
+ 'save to disk. Template: %(templ)s\n'
+ 'Error: %(err)s')%dict(templ=opts.template, err=e))
if opts.single_dir:
components = components[-1:]
if not components:
diff --git a/src/calibre/translations/calibre.pot b/src/calibre/translations/calibre.pot
index 17adb883f0..19eecb0045 100644
--- a/src/calibre/translations/calibre.pot
+++ b/src/calibre/translations/calibre.pot
@@ -5,8 +5,8 @@
msgid ""
msgstr ""
"Project-Id-Version: calibre 0.8.13\n"
-"POT-Creation-Date: 2011-08-05 09:47+MDT\n"
-"PO-Revision-Date: 2011-08-05 09:47+MDT\n"
+"POT-Creation-Date: 2011-08-10 08:16+MDT\n"
+"PO-Revision-Date: 2011-08-10 08:16+MDT\n"
"Last-Translator: Automatically generated\n"
"Language-Team: LANGUAGE\n"
"MIME-Version: 1.0\n"
@@ -62,8 +62,8 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:36
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:64
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:66
-#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:124
-#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:126
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:120
+#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/meta.py:122
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1080
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1190
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdb.py:41
@@ -133,9 +133,9 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:315
#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:376
#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:384
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:155
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:376
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:379
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:158
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:377
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:380
#: /home/kovid/work/calibre/src/calibre/gui2/add.py:161
#: /home/kovid/work/calibre/src/calibre/gui2/add.py:168
#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:555
@@ -150,7 +150,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:128
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:47
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:766
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:371
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:372
#: /home/kovid/work/calibre/src/calibre/gui2/email.py:185
#: /home/kovid/work/calibre/src/calibre/gui2/email.py:200
#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:404
@@ -176,9 +176,9 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/database2.py:554
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2006
#: /home/kovid/work/calibre/src/calibre/library/database2.py:2153
-#: /home/kovid/work/calibre/src/calibre/library/database2.py:3170
-#: /home/kovid/work/calibre/src/calibre/library/database2.py:3172
-#: /home/kovid/work/calibre/src/calibre/library/database2.py:3305
+#: /home/kovid/work/calibre/src/calibre/library/database2.py:3171
+#: /home/kovid/work/calibre/src/calibre/library/database2.py:3173
+#: /home/kovid/work/calibre/src/calibre/library/database2.py:3306
#: /home/kovid/work/calibre/src/calibre/library/server/content.py:225
#: /home/kovid/work/calibre/src/calibre/library/server/content.py:226
#: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:243
@@ -200,12 +200,13 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:148
#: /home/kovid/work/calibre/src/calibre/ebooks/html/to_zip.py:81
+#: /home/kovid/work/calibre/src/calibre/gui2/keyboard.py:228
msgid "Customize"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:156
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:51
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:56
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:52
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:57
msgid "Cannot configure"
msgstr ""
@@ -230,8 +231,8 @@ msgid "User Interface Action"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:557
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:18
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:25
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:20
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:28
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:197
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:287
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:309
@@ -545,6 +546,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1077
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1089
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1100
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1111
msgid "Advanced"
msgstr ""
@@ -600,10 +602,19 @@ msgid "Fine tune how calibre behaves in various contexts"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1098
-msgid "Miscellaneous"
+msgid "Keyboard"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1104
+msgid "Customize the keyboard shortcuts used by calibre"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1109
+#: /home/kovid/work/calibre/src/calibre/gui2/keyboard.py:80
+msgid "Miscellaneous"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1115
msgid "Miscellaneous advanced configuration"
msgstr ""
@@ -820,7 +831,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/db/backend.py:270
#: /home/kovid/work/calibre/src/calibre/db/backend.py:279
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:230
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:231
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:71
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:667
#: /home/kovid/work/calibre/src/calibre/library/database2.py:130
@@ -832,10 +843,10 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/db/cache.py:131
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:636
#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:66
-#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:564
+#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:563
#: /home/kovid/work/calibre/src/calibre/library/database2.py:972
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:758
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:770
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:806
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:818
msgid "Yes"
msgstr ""
@@ -968,12 +979,12 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:1079
#: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:1114
#: /home/kovid/work/calibre/src/calibre/gui2/actions/fetch_news.py:73
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:452
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:453
#: /home/kovid/work/calibre/src/calibre/gui2/tag_browser/model.py:1139
#: /home/kovid/work/calibre/src/calibre/gui2/tag_browser/model.py:1141
#: /home/kovid/work/calibre/src/calibre/library/database2.py:330
#: /home/kovid/work/calibre/src/calibre/library/database2.py:343
-#: /home/kovid/work/calibre/src/calibre/library/database2.py:3031
+#: /home/kovid/work/calibre/src/calibre/library/database2.py:3032
#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:171
msgid "News"
msgstr ""
@@ -1152,12 +1163,12 @@ msgstr ""
msgid "Communicate with the Sigmatek eBook reader."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/devices/folder_device/driver.py:16
-#: /home/kovid/work/calibre/src/calibre/devices/folder_device/driver.py:32
+#: /home/kovid/work/calibre/src/calibre/devices/folder_device/driver.py:17
+#: /home/kovid/work/calibre/src/calibre/devices/folder_device/driver.py:33
msgid "Use an arbitrary folder as a device."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/devices/folder_device/driver.py:28
+#: /home/kovid/work/calibre/src/calibre/devices/folder_device/driver.py:29
#: /home/kovid/work/calibre/src/calibre/devices/interface.py:14
msgid "Device Interface"
msgstr ""
@@ -1290,7 +1301,7 @@ msgid "Create tags for automatic management"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:543
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:387
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:390
msgid "Not Implemented"
msgstr ""
@@ -2587,7 +2598,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:636
#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:66
-#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:564
+#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:563
msgid "No"
msgstr ""
@@ -3507,7 +3518,7 @@ msgstr ""
msgid "tag browser categories not to display"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:490
+#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:494
msgid "Choose Files"
msgstr ""
@@ -3576,106 +3587,123 @@ msgstr ""
msgid "Add books from a single directory"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:57
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:58
msgid "Add books from directories, including sub-directories (One book per directory, assumes every ebook file is the same book in a different format)"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:61
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:62
msgid "Add books from directories, including sub directories (Multiple books per directory, assumes every ebook file is a different book)"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:65
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:67
msgid "Add Empty book. (Book entry with no formats)"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:66
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:68
msgid "Shift+Ctrl+E"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:67
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:69
msgid "Add from ISBN"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:69
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:71
msgid "Add files to selected book records"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:70
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:72
msgid "Shift+A"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:89
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:87
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:69
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:33
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:89
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:137
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:74
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:158
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:222
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:259
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:91
+msgid "No books selected"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:88
+msgid "Cannot add files as no books are selected"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:92
msgid "Are you sure"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:90
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:93
#, python-format
msgid "Are you sure you want to add the same files to all %d books? If the formatalready exists for a book, it will be replaced."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:96
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:99
msgid "Select book files"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:167
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:170
msgid "Adding"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:168
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:171
msgid "Creating book records from ISBNs"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:267
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:316
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:270
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:319
msgid "Uploading books to device."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:287
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:290
msgid "Supported books"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:290
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:293
msgid "Select books"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:328
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:331
msgid "Merged some books"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:329
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:332
msgid "The following duplicate books were found and incoming book formats were processed and merged into your Calibre database according to your automerge settings:"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:348
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:351
msgid "Failed to read metadata"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:349
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:352
msgid "Failed to read metadata from the following"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:370
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:375
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:394
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:373
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:378
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:397
msgid "Add to library"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:375
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:132
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/store.py:84
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/store.py:103
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/store.py:112
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:378
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:134
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/store.py:87
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/store.py:106
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/store.py:115
#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:30
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:139
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:185
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:137
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:183
msgid "No book selected"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:388
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:391
msgid "The following books are virtual and cannot be added to the calibre library:"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:394
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:397
msgid "No book files found"
msgstr ""
@@ -3710,18 +3738,6 @@ msgstr ""
msgid "User annotations generated from main library only"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:69
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:33
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:87
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:137
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:73
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:157
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:221
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:258
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:90
-msgid "No books selected"
-msgstr ""
-
#: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:70
msgid "No books selected to fetch annotations from"
msgstr ""
@@ -3756,7 +3772,7 @@ msgid "Location %(dl)d • %(typ)s
"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:20
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:35
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:37
msgid "Create a catalog of the books in your calibre library"
msgstr ""
@@ -3783,11 +3799,7 @@ msgid "Select destination for %(title)s.%(fmt)s"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:82
-#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:57
-#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:171
-#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:125
-#, python-format
-msgid "%d books"
+msgid "Choose Library"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:83
@@ -3798,122 +3810,130 @@ msgstr ""
msgid "Switch/create library..."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:103
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:89
+#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:57
+#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:171
+#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:125
+#, python-format
+msgid "%d books"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:104
#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:87
msgid "Quick switch"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:105
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:106
#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:88
msgid "Rename library"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:107
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:108
msgid "Remove library"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:110
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:111
#: /home/kovid/work/calibre/src/calibre/gui2/actions/random.py:17
msgid "Pick a random book"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:130
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:131
msgid "Library Maintenance"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:131
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:132
msgid "Library metadata backup status"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:135
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:136
msgid "Start backing up metadata of all books"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:139
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:140
msgid "Check library"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:143
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:144
msgid "Restore database"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:215
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:216
msgid "Rename"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:216
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:217
#, python-format
msgid "Choose a new name for the library %s. "
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:217
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:218
msgid "Note that the actual library folder will be renamed."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:224
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:225
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/plugin_updater.py:726
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:201
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:291
msgid "Already exists"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:225
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:226
#, python-format
msgid "The folder %s already exists. Delete it first."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:229
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:283
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:230
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:284
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:70
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:666
msgid "Too long"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:237
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:238
msgid "Rename failed"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:238
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:239
#, python-format
msgid "Failed to rename the library at %s. The most common cause for this is if one of the files in the library is open in another program."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:252
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:253
msgid "Library removed"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:253
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:254
#, python-format
msgid "The library %s has been removed from calibre. The files remain on your computer, if you want to delete them, you will have to do so manually."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:266
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:267
msgid "none"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:267
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:268
msgid "Backup status"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:268
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:269
#, python-format
msgid "Book metadata files remaining to be written: %s"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:274
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:275
msgid "Backup metadata"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:275
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:276
msgid "Metadata will be backed up while calibre is running, at the rate of approximately 1 book every three seconds."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:284
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:285
#, python-format
msgid "Path to library too long. Must be less than %d characters. Move your library to a location with a shorter path using Windows Explorer, then point calibre to the new location and try again."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:319
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:320
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/plugin_updater.py:733
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/restore_library.py:106
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/restore_library.py:111
@@ -3922,11 +3942,11 @@ msgstr ""
msgid "Success"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:320
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:321
msgid "Found no errors in your calibre library database. Do you want calibre to check if the files in your library match the information in the database?"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:325
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:326
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:160
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:741
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:956
@@ -3936,40 +3956,40 @@ msgstr ""
msgid "Failed"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:326
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:327
msgid "Database integrity check failed, click Show details for details."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:331
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:332
msgid "No problems found"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:332
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:333
msgid "The files in your library match the information in the database."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:341
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:342
msgid "No library found"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:342
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:343
#, python-format
msgid "No existing calibre library was found at %s. It will be removed from the list of known libraries."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:408
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:413
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:409
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:414
#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:178
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:99
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:100
#: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:886
msgid "Not allowed"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:409
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:410
msgid "You cannot change libraries while using the environment variable CALIBRE_OVERRIDE_DATABASE_PATH."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:414
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:415
msgid "You cannot change libraries while jobs are running."
msgstr ""
@@ -3981,25 +4001,25 @@ msgstr ""
msgid "Convert books"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:29
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:30
msgid "Convert individually"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:31
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:33
msgid "Bulk convert"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:86
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:562
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:88
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:569
msgid "Cannot convert"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:115
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:117
#, python-format
msgid "Starting conversion of %d book(s)"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:175
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:177
msgid "Empty output file, probably the conversion process crashed"
msgstr ""
@@ -4091,88 +4111,88 @@ msgstr ""
msgid "Remove selected books"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:94
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:95
msgid "Remove files of a specific format from selected books.."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:97
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:98
msgid "Remove all formats from selected books, except..."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:100
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:101
msgid "Remove all formats from selected books"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:103
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:104
msgid "Remove covers from selected books"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:106
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:108
msgid "Remove matching books from device"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:129
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:131
msgid "Cannot delete"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:142
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:144
msgid "Choose formats to be deleted"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:160
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:162
msgid "Choose formats not to be deleted.Note that this will never remove all formats from a book."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:186
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:188
msgid "All formats for the selected books will be deleted from your library.
The book metadata will be kept. Are you sure?"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:206
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:208
msgid "Cannot delete books"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:207
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:209
msgid "No device is connected"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:217
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:219
msgid "Main memory"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:218
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:220
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:516
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:525
msgid "Storage Card A"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:219
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:221
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:518
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:527
msgid "Storage Card B"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:224
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:226
msgid "No books to delete"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:225
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:227
msgid "None of the selected books are on the device"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:242
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:333
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:244
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:335
msgid "Deleting books from device."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:288
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:290
msgid "Some of the selected books are on the attached device. Where do you want the selected files deleted from?"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:300
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:302
msgid "The selected books will be permanently deleted and the files removed from your calibre library. Are you sure?"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:325
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:327
msgid "The selected books will be permanently deleted from your device. Are you sure?"
msgstr ""
@@ -4189,49 +4209,53 @@ msgid "Connect to Bambook"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:56
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:64
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:77
msgid "Start Content Server"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:66
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:73
+msgid "Start/stop content server"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:79
msgid "Stop Content Server"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:77
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:96
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:90
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:109
msgid "Email to"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:81
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:94
msgid "Email to and delete from library"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:90
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:103
msgid "(delete from library)"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:105
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:118
msgid "Setup email based sharing of books"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:123
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:136
msgid "D"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:123
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:136
msgid "Send to device"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:141
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:154
msgid "Connect/share"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:178
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:191
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server.py:79
msgid "Stopping"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:179
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:192
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server.py:80
msgid "Stopping server, this could take upto a minute, please wait..."
msgstr ""
@@ -4252,131 +4276,131 @@ msgstr ""
msgid "Edit metadata"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:30
-msgid "Merge book records"
-msgstr ""
-
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:31
-msgid "M"
-msgstr ""
-
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:33
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:32
msgid "Edit metadata individually"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:36
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:35
msgid "Edit metadata in bulk"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:39
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:38
msgid "Download metadata and covers"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:44
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:45
msgid "Merge into first selected book - delete others"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:47
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:48
msgid "Merge into first selected book - keep others"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:51
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:52
msgid "Merge only formats into first selected book - delete others"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:72
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:57
+msgid "Merge book records"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:58
+msgid "M"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:73
msgid "Cannot download metadata"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:82
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:83
msgid "Failed to download metadata"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:88
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:89
#: /home/kovid/work/calibre/src/calibre/gui2/dnd.py:84
#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single_download.py:472
#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single_download.py:720
msgid "Download failed"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:89
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:90
#, python-format
msgid "Failed to download metadata or covers for any of the %d book(s)."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:92
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:93
msgid "Metadata download completed"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:94
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:95
#, python-format
msgid "Finished downloading metadata for %d book(s). Proceed with updating the metadata in your library?"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:101
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:102
#, python-format
msgid "Could not download metadata and/or covers for %d of the books. Click \"Show details\" to see which books."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:108
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:109
msgid "Download complete"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:108
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:109
#: /home/kovid/work/calibre/src/calibre/gui2/metadata/single_download.py:781
msgid "Download log"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:137
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:138
msgid "Some books changed"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:138
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:139
msgid "The metadata for some books in your library has changed since you started the download. If you proceed, some of those changes may be overwritten. Click \"Show details\" to see the list of changed books. Do you want to proceed?"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:156
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:220
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:157
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:221
msgid "Cannot edit metadata"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:257
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:260
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:258
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:261
msgid "Cannot merge books"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:261
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:262
msgid "At least two books must be selected for merging"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:264
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:265
msgid "You are about to merge more than 5 books. Are you sure you want to proceed?"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:273
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:274
#, python-format
msgid "Book formats and metadata from the selected books will be added to the first selected book (%s). ISBN will not be merged.
The second and subsequently selected books will not be deleted or changed.
Please confirm you want to proceed."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:285
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:286
#, python-format
msgid "Book formats from the selected books will be merged into the first selected book (%s). Metadata in the first selected book will not be changed. Author, Title, ISBN and all other metadata will not be merged.
After merger the second and subsequently selected books, with any metadata they have will be deleted.
All book formats of the first selected book will be kept and any duplicate formats in the second and subsequently selected books will be permanently deleted from your calibre library.
Are you sure you want to proceed?"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:301
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:302
#, python-format
msgid "Book formats and metadata from the selected books will be merged into the first selected book (%s). ISBN will not be merged.
After merger the second and subsequently selected books will be deleted.
All book formats of the first selected book will be kept and any duplicate formats in the second and subsequently selected books will be permanently deleted from your calibre library.
Are you sure you want to proceed?"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:471
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:472
msgid "Applying changed metadata"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:544
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:545
msgid "Some failures"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:545
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:546
msgid "Failed to apply updated metadata for some books in your library. Click \"Show Details\" to see details."
msgstr ""
@@ -4420,7 +4444,7 @@ msgid "Move to next highlighted match"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/actions/next_match.py:13
-#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:415
+#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:421
msgid "N"
msgstr ""
@@ -4453,44 +4477,44 @@ msgstr ""
msgid "Plugin Updater"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:18
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:20
msgid "Ctrl+P"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:20
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:22
msgid "Change calibre behavior"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:26
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:29
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/main.py:208
msgid "Run welcome wizard"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:29
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:31
msgid "Get plugins to enhance calibre"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:32
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:35
msgid "Restart in debug mode"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:52
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:53
msgid "Cannot configure while there are running jobs."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:57
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:58
msgid "Cannot configure before calibre is restarted."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/restart.py:14
-msgid "&Restart"
-msgstr ""
-
#: /home/kovid/work/calibre/src/calibre/gui2/actions/restart.py:14
#: /home/kovid/work/calibre/src/calibre/utils/pyconsole/main.py:59
msgid "Ctrl+R"
msgstr ""
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/restart.py:14
+msgid "Restart"
+msgstr ""
+
#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:24
msgid "Save single format to disk..."
msgstr ""
@@ -4503,48 +4527,48 @@ msgstr ""
msgid "Save to disk"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:47
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:48
msgid "Save to disk in a single directory"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:49
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:67
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:50
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:68
#, python-format
msgid "Save only %s format to disk"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:53
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:70
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:54
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:71
#, python-format
msgid "Save only %s format to disk in a single directory"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:89
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:90
msgid "Cannot save to disk"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:92
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:93
msgid "Choose destination directory"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:100
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:101
msgid "You are trying to save files into the calibre library. This can cause corruption of your library. Save to disk is meant to export files from your calibre library elsewhere."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:134
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:132
msgid "Error while saving"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:135
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:133
msgid "There was an error while saving."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:142
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:143
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:140
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:141
msgid "Could not save some books"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:144
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:142
msgid "Click the show details button to see which ones."
msgstr ""
@@ -4629,53 +4653,58 @@ msgstr ""
msgid "Search for ebooks"
msgstr ""
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/store.py:28
+msgid "author"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/store.py:28
+msgid "title"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/store.py:29
+msgid "book"
+msgstr ""
+
#: /home/kovid/work/calibre/src/calibre/gui2/actions/store.py:32
-msgid "Search for this author"
+#, python-format
+msgid "Search for this %s"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/store.py:33
-msgid "Search for this title"
-msgstr ""
-
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/store.py:34
-msgid "Search for this book"
-msgstr ""
-
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/store.py:36
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/store.py:35
#: /home/kovid/work/calibre/src/calibre/gui2/store/search/search_ui.py:135
#: /home/kovid/work/calibre/src/calibre/gui2/store/search_ui.py:110
msgid "Stores"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/store.py:45
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/store.py:38
#: /home/kovid/work/calibre/src/calibre/gui2/store/config/chooser/chooser_dialog.py:18
#: /home/kovid/work/calibre/src/calibre/gui2/store/search/search.py:285
msgid "Choose stores"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/store.py:84
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/store.py:103
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/store.py:112
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/store.py:87
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/store.py:106
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/store.py:115
msgid "Cannot search"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/store.py:131
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/store.py:134
msgid "Calibre helps you find the ebooks you want by searching the websites of various commercial and public domain book sources for you."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/store.py:135
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/store.py:138
msgid "Using the integrated search you can easily find which store has the book you are looking for, at the best price. You also get DRM status and other useful information."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/store.py:139
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/store.py:142
msgid "All transactions (paid or otherwise) are handled between you and the book seller. Calibre is not part of this process and any issues related to a purchase should be directed to the website you are buying from. Be sure to double check that any books you get will work with your e-book reader, especially if the book you are buying has DRM."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/store.py:149
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/store.py:152
msgid "Show this message again"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/store.py:150
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/store.py:153
msgid "About Get Books"
msgstr ""
@@ -4701,15 +4730,15 @@ msgstr ""
msgid "No ePub available. First convert the book to ePub."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:36
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:37
msgid "V"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:36
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:37
msgid "View"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:46
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:48
msgid "View specific format"
msgstr ""
@@ -4717,53 +4746,53 @@ msgstr ""
msgid "Read a random book"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:54
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:55
msgid "Clear recently viewed list"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:139
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:219
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:226
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:137
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:217
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:224
msgid "Cannot view"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:152
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:166
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:150
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:164
msgid "Format unavailable"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:153
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:151
msgid "Selected books have no formats"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:155
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:153
#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:128
msgid "Choose the format to view"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:167
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:165
#, python-format
msgid "Not all the selected books were available in the %s format. You should convert them first."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:174
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:172
msgid "Multiple Books Selected"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:175
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:173
#, python-format
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/actions/view.py:184
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:182
msgid "Cannot open folder"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:220
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:218
msgid "This book no longer exists in your library"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:227
+#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:225
#, python-format
msgid "%s has no available formats."
msgstr ""
@@ -5117,7 +5146,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc_ui.py:65
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard_ui.py:113
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins_ui.py:105
-#: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template_ui.py:46
+#: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template_ui.py:56
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/saving_ui.py:67
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/search_ui.py:109
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/sending_ui.py:68
@@ -6663,11 +6692,10 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:115
#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:152
#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:186
-#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:303
-#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:568
-#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:609
-#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:632
-#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:683
+#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:567
+#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:608
+#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:631
+#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:682
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:307
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:312
#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:128
@@ -6680,23 +6708,23 @@ msgid "Undefined"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:129
-#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:640
+#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:639
msgid "star(s)"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:130
-#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:641
+#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:640
msgid "Unrated"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:173
-#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:670
+#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:669
#, python-format
msgid "Set '%s' to today"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:175
-#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:672
+#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:671
#, python-format
msgid "Clear '%s'"
msgstr ""
@@ -6705,39 +6733,39 @@ msgstr ""
msgid " index:"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:368
+#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:367
msgid "The enumeration \"{0}\" contains an invalid value that will be set to the default"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:523
+#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:522
msgid "Apply changes"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:716
+#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:715
msgid "Remove series"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:719
+#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:718
msgid "Automatically number books"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:722
+#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:721
msgid "Force numbers to start with "
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:794
+#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:793
msgid "The enumeration \"{0}\" contains invalid values that will not appear in the list"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:838
+#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:837
msgid "Remove all tags"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:858
+#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:857
msgid "tags to add"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:865
+#: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:864
msgid "tags to remove"
msgstr ""
@@ -6932,16 +6960,16 @@ msgid "You have enabled the {0} formats for your {1}. The {1} may not sup
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget.py:148
-#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:464
+#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:470
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:275
-#: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:61
+#: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:70
msgid "Invalid template"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget.py:149
-#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:465
+#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:471
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugboard.py:276
-#: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:62
+#: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:71
#, python-format
msgid "The template %s is invalid:"
msgstr ""
@@ -8580,70 +8608,71 @@ msgstr ""
msgid "Note: You can set intervals of less than a day, by typing the value manually."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:196
+#. NOTE: Number of news sources
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:197
#, python-format
msgid "%s news sources"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:310
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:311
msgid "Need username and password"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:311
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:312
msgid "You must provide a username and/or password to use this news source."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:351
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:352
msgid "Account"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:352
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:353
msgid "(optional)"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:353
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:354
msgid "(required)"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:370
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:371
msgid "Created by: "
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:377
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:378
msgid "Last downloaded: never"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:378
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:379
msgid "never"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:384
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:385
#, python-format
msgid "%(days)d days, %(hours)d hours and %(mins)d minutes ago"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:400
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:401
msgid "Last downloaded:"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:428
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:429
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:206
msgid "Schedule news download"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:431
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:432
msgid "Add a custom news source"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:436
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:437
msgid "Download all scheduled new sources"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:541
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:542
msgid "No internet connection"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:542
+#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:543
msgid "Cannot download news as no internet connection is active"
msgstr ""
@@ -9113,7 +9142,8 @@ msgid "Open Template Editor"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/template_line_editor.py:41
-#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:451
+#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:457
+#: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:48
msgid "Edit template"
msgstr ""
@@ -9566,9 +9596,6 @@ msgid "Book Details"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:221
-msgid "Alt+D"
-msgstr ""
-
#: /home/kovid/work/calibre/src/calibre/gui2/init.py:231
msgid "Shift+Alt+D"
msgstr ""
@@ -9649,6 +9676,60 @@ msgstr[1] ""
msgid "Do you really want to stop all non-device jobs?"
msgstr ""
+#: /home/kovid/work/calibre/src/calibre/gui2/keyboard.py:200
+#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:86
+#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:204
+msgid "Custom"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/keyboard.py:207
+#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:81
+msgid "&Alternate shortcut:"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/keyboard.py:207
+#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:76
+msgid "&Shortcut:"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/keyboard.py:212
+#: /home/kovid/work/calibre/src/calibre/gui2/keyboard.py:261
+#: /home/kovid/work/calibre/src/calibre/gui2/keyboard.py:296
+#: /home/kovid/work/calibre/src/calibre/gui2/keyboard.py:320
+#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:48
+#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:78
+#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:83
+#: /home/kovid/work/calibre/src/calibre/gui2/store/config/chooser/chooser_widget_ui.py:83
+#: /home/kovid/work/calibre/src/calibre/gui2/store/search/search_ui.py:138
+#: /home/kovid/work/calibre/src/calibre/gui2/store/search_ui.py:113
+#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:358
+msgid "None"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/keyboard.py:235
+#, python-format
+msgid "Default (some keys may conflict): %s"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/keyboard.py:255
+#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:59
+msgid "Press a key..."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/keyboard.py:276
+#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:80
+msgid "Already assigned"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/keyboard.py:278
+#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:82
+msgid "already assigned to"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/keyboard.py:323
+msgid "Shortcuts"
+msgstr ""
+
#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:57
msgid "Eject this device"
msgstr ""
@@ -9677,35 +9758,36 @@ msgstr ""
msgid "available"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:181
-msgid "Shift+Ctrl+F"
-msgstr ""
-
#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:184
+#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:189
msgid "Advanced search"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:189
+#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:184
+msgid "Shift+Ctrl+F"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:194
msgid "
Search the list of books by title, author, publisher, tags, comments, etc.
Words separated by spaces are ANDed"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:195
+#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:200
msgid "&Go!"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:201
+#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:206
msgid "Do Quick Search (you can also press the Enter key)"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:207
+#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:212
msgid "Reset Quick Search"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:223
+#: /home/kovid/work/calibre/src/calibre/gui2/layout.py:228
msgid "Copy current search text (instead of search name)"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:415
+#: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:421
msgid "Y"
msgstr ""
@@ -10509,7 +10591,7 @@ msgid "Here you can control how calibre will read metadata from the files you ad
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding_ui.py:66
-msgid "Read &metadata from &file contents rather than file name"
+msgid "Read &metadata from file contents rather than file name"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/adding_ui.py:67
@@ -11878,34 +11960,38 @@ msgstr ""
msgid "&Load plugin from file"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:33
+#: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:34
msgid "Any custom field"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:34
+#: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:35
msgid "The lookup name of any custom field (these names begin with \"#\")."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:57
+#: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:66
msgid "Constant template"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:58
+#: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template.py:67
msgid "The template contains no {fields}, so all books will have the same name. Is this OK?"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template_ui.py:47
+#: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template_ui.py:57
msgid "Save &template"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template_ui.py:48
+#: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template_ui.py:58
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/preferences/save_template_ui.py:49
+#: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template_ui.py:59
msgid "Available variables:"
msgstr ""
+#: /home/kovid/work/calibre/src/calibre/gui2/preferences/save_template_ui.py:60
+msgid "Template Editor"
+msgstr ""
+
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/saving_ui.py:68
msgid "Here you can control how calibre will save your books when you click the Save to Disk button:"
msgstr ""
@@ -12082,7 +12168,7 @@ msgid "Here you can control how calibre will save your books when you click the
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/server.py:70
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:424
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:431
msgid "Failed to start content server"
msgstr ""
@@ -12434,35 +12520,39 @@ msgstr ""
msgid "Search (For Advanced Search click the button to the left)"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:390
+#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:383
+msgid "Start search"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:393
msgid "Enable or disable search highlighting."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:445
+#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:448
msgid "Saved Searches"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:447
+#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:450
msgid "Choose saved search or enter name for new saved search"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:453
+#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:456
msgid "Save current search under the name shown in the box. Press and hold for a pop-up options menu."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:458
+#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:461
msgid "Create saved search"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:462
+#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:465
msgid "Delete saved search"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:466
+#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:469
msgid "Manage saved searches"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:476
+#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:479
msgid "*Current search"
msgstr ""
@@ -12491,28 +12581,6 @@ msgstr ""
msgid "({0} of all)"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:48
-#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:78
-#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:83
-#: /home/kovid/work/calibre/src/calibre/gui2/store/config/chooser/chooser_widget_ui.py:83
-#: /home/kovid/work/calibre/src/calibre/gui2/store/search/search_ui.py:138
-#: /home/kovid/work/calibre/src/calibre/gui2/store/search_ui.py:113
-#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:358
-msgid "None"
-msgstr ""
-
-#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:59
-msgid "Press a key..."
-msgstr ""
-
-#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:80
-msgid "Already assigned"
-msgstr ""
-
-#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:82
-msgid "already assigned to"
-msgstr ""
-
#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:132
#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:223
msgid " or "
@@ -12543,19 +12611,11 @@ msgstr ""
msgid "&Custom"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:76
-msgid "&Shortcut:"
-msgstr ""
-
#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:77
#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:82
msgid "Click to change"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:81
-msgid "&Alternate shortcut:"
-msgstr ""
-
#: /home/kovid/work/calibre/src/calibre/gui2/store/basic_config_widget_ui.py:38
msgid "Added Tags:"
msgstr ""
@@ -13229,55 +13289,63 @@ msgstr ""
msgid "The following books have already been converted to %s format. Do you wish to reconvert them?"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:196
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:198
msgid "&Donate to support calibre"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:232
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:234
msgid "&Restore"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:237
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:239
msgid "&Eject connected device"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:347
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:243
+msgid "Quit calibre"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:256
+msgid "Clear the current search"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:354
msgid "Debug mode"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:348
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:355
#, python-format
msgid "You have started calibre in debug mode. After you quit calibre, the debug log will be available in the file: %s
The log will be displayed automatically."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:550
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:557
msgid "Conversion Error"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:573
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:580
msgid "Recipe Disabled"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:589
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:596
msgid "Failed"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:623
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:630
msgid "There are active jobs. Are you sure you want to quit?"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:626
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:633
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/ui.py:630
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:637
msgid "Active jobs"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:698
+#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:705
msgid "will keep running in the system tray. To close it, choose Quit in the context menu of the system tray."
msgstr ""
@@ -14142,7 +14210,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/caches.py:568
#: /home/kovid/work/calibre/src/calibre/library/caches.py:582
#: /home/kovid/work/calibre/src/calibre/library/caches.py:592
-#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:219
+#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:222
msgid "yes"
msgstr ""
@@ -14150,7 +14218,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/library/caches.py:567
#: /home/kovid/work/calibre/src/calibre/library/caches.py:579
#: /home/kovid/work/calibre/src/calibre/library/caches.py:589
-#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:219
+#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:222
msgid "no"
msgstr ""
@@ -14980,17 +15048,17 @@ msgstr ""
msgid "%(tt)sAverage rating is %(rating)3.1f"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/library/database2.py:3331
+#: /home/kovid/work/calibre/src/calibre/library/database2.py:3332
#, python-format
msgid "
Migrating old database to ebook library in %s
"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/library/database2.py:3360
+#: /home/kovid/work/calibre/src/calibre/library/database2.py:3361
#, python-format
msgid "Copying %s"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/library/database2.py:3377
+#: /home/kovid/work/calibre/src/calibre/library/database2.py:3378
msgid "Compacting database"
msgstr ""
@@ -15118,8 +15186,24 @@ msgstr ""
msgid "Replace whitespace with underscores."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:382
-#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:415
+#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:125
+msgid "Save into a single directory, ignoring the template directory structure"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:298
+#, python-format
+msgid ""
+"Failed to calculate path for save to disk. Template: %(templ)s\n"
+"Error: %(err)s"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:304
+#, python-format
+msgid "Template evaluation resulted in no path components. Template: %s"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:398
+#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:431
msgid "Requested formats not available"
msgstr ""
@@ -15499,7 +15583,7 @@ msgstr ""
msgid "%s: unknown function"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter.py:348
+#: /home/kovid/work/calibre/src/calibre/utils/formatter.py:357
msgid "No such variable "
msgstr ""
@@ -15520,206 +15604,226 @@ msgid "strcat(a, b, ...) -- can take any number of arguments. Returns a string f
msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:143
+msgid "strlen(a) -- Returns the length of the string passed as the argument"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:156
msgid "add(x, y) -- returns x + y. Throws an exception if either x or y are not numbers."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:154
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:167
msgid "subtract(x, y) -- returns x - y. Throws an exception if either x or y are not numbers."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:165
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:178
msgid "multiply(x, y) -- returns x * y. Throws an exception if either x or y are not numbers."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:176
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:189
msgid "divide(x, y) -- returns x / y. Throws an exception if either x or y are not numbers."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:188
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:201
msgid "template(x) -- evaluates x as a template. The evaluation is done in its own context, meaning that variables are not shared between the caller and the template evaluation. Because the { and } characters are special, you must use [[ for the { character and ]] for the } character; they are converted automatically. For example, template('[[title_sort]]') will evaluate the template {title_sort} and return its value."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:204
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:217
msgid "eval(template) -- evaluates the template, passing the local variables (those 'assign'ed to) instead of the book metadata. This permits using the template processor to construct complex results from local variables."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:218
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:231
msgid "assign(id, val) -- assigns val to id, then returns val. id must be an identifier, not an expression"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:229
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:242
msgid "print(a, b, ...) -- prints the arguments to standard output. Unless you start calibre from the command line (calibre-debug -g), the output will go to a black hole."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:241
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:254
msgid "field(name) -- returns the metadata field named by name"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:250
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:263
msgid "raw_field(name) -- returns the metadata field named by name without applying any formatting."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:260
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:273
msgid "substr(str, start, end) -- returns the start'th through the end'th characters of str. The first character in str is the zero'th character. If end is negative, then it indicates that many characters counting from the right. If end is zero, then it indicates the last character. For example, substr('12345', 1, 0) returns '2345', and substr('12345', 1, -1) returns '234'."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:274
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:287
msgid "lookup(val, pattern, field, pattern, field, ..., else_field) -- like switch, except the arguments are field (metadata) names, not text. The value of the appropriate field will be fetched and used. Note that because composite columns are fields, you can use this function in one composite field to use the value of some other composite field. This is extremely useful when constructing variable save paths"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:289
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:302
msgid "lookup requires either 2 or an odd number of arguments"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:302
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:315
msgid "test(val, text if not empty, text if empty) -- return `text if not empty` if the field is not empty, otherwise return `text if empty`"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:315
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:328
msgid "contains(val, pattern, text if match, text if not match) -- checks if field contains matches for the regular expression `pattern`. Returns `text if match` if matches are found, otherwise it returns `text if no match`"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:331
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:344
msgid "switch(val, pattern, value, pattern, value, ..., else_value) -- for each `pattern, value` pair, checks if the field matches the regular expression `pattern` and if so, returns that `value`. If no pattern matches, then else_value is returned. You can have as many `pattern, value` pairs as you want"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:339
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:352
msgid "switch requires an odd number of arguments"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:352
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:365
+msgid "strcat_max(max, string1, prefix2, string2, ...) -- Returns a string formed by concatenating the arguments. The returned value is initialized to string1. `Prefix, string` pairs are added to the end of the value as long as the resulting string length is less than `max`. String1 is returned even if string1 is longer than max. You can pass as many `prefix, string` pairs as you wish."
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:375
+msgid "strcat_max requires 2 or more arguments"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:377
+msgid "strcat_max requires an even number of arguments"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:381
+msgid "first argument to strcat_max must be an integer"
+msgstr ""
+
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:399
msgid "in_list(val, separator, pattern, found_val, not_found_val) -- treat val as a list of items separated by separator, comparing the pattern against each value in the list. If the pattern matches a value, return found_val, otherwise return not_found_val."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:370
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:417
msgid "str_in_list(val, separator, string, found_val, not_found_val) -- treat val as a list of items separated by separator, comparing the string against each value in the list. If the string matches a value, return found_val, otherwise return not_found_val. If the string contains separators, then it is also treated as a list and each value is checked."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:391
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:438
msgid "identifier_in_list(val, id, found_val, not_found_val) -- treat val as a list of identifiers separated by commas, comparing the string against each value in the list. An identifier has the format \"identifier:value\". The id parameter should be either \"id\" or \"id:regexp\". The first case matches if there is any identifier with that id. The second case matches if the regexp matches the identifier's value. If there is a match, return found_val, otherwise return not_found_val."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:417
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:464
msgid "re(val, pattern, replacement) -- return the field after applying the regular expression. All instances of `pattern` are replaced with `replacement`. As in all of calibre, these are python-compatible regular expressions"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:429
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:476
msgid "swap_around_comma(val) -- given a value of the form \"B, A\", return \"A B\". This is most useful for converting names in LN, FN format to FN LN. If there is no comma, the function returns val unchanged"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:441
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:488
msgid "ifempty(val, text if empty) -- return val if val is not empty, otherwise return `text if empty`"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:454
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:501
msgid "shorten(val, left chars, middle text, right chars) -- Return a shortened version of the field, consisting of `left chars` characters from the beginning of the field, followed by `middle text`, followed by `right chars` characters from the end of the string. `Left chars` and `right chars` must be integers. For example, assume the title of the book is `Ancient English Laws in the Times of Ivanhoe`, and you want it to fit in a space of at most 15 characters. If you use {title:shorten(9,-,5)}, the result will be `Ancient E-nhoe`. If the field's length is less than left chars + right chars + the length of `middle text`, then the field will be used intact. For example, the title `The Dome` would not be changed."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:480
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:527
msgid "count(val, separator) -- interprets the value as a list of items separated by `separator`, returning the number of items in the list. Most lists use a comma as the separator, but authors uses an ampersand. Examples: {tags:count(,)}, {authors:count(&)}"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:492
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:539
msgid "list_item(val, index, separator) -- interpret the value as a list of items separated by `separator`, returning the `index`th item. The first item is number zero. The last item can be returned using `list_item(-1,separator)`. If the item is not in the list, then the empty value is returned. The separator has the same meaning as in the count function."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:513
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:560
msgid "select(val, key) -- interpret the value as a comma-separated list of items, with the items being \"id:value\". Find the pair with the id equal to key, and return the corresponding value."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:531
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:578
msgid "formats_modtimes(date_format) -- return a comma-separated list of colon_separated items representing modification times for the formats of a book. The date_format parameter specifies how the date is to be formatted. See the date_format function for details. You can use the select function to get the mod time for a specific format. Note that format names are always uppercase, as in EPUB."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:550
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:597
msgid "formats_sizes() -- return a comma-separated list of colon_separated items representing sizes in bytes of the formats of a book. You can use the select function to get the size for a specific format. Note that format names are always uppercase, as in EPUB."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:566
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:613
msgid "human_readable(v) -- return a string representing the number v in KB, MB, GB, etc."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:580
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:627
msgid "format_number(v, template) -- format the number v using a python formatting template such as \"{0:5.2f}\" or \"{0:,d}\" or \"${0:5,.2f}\". The field_name part of the template must be a 0 (zero) (the \"{0:\" in the above examples). See the template language and python documentation for more examples. Returns the empty string if formatting fails."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:605
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:652
msgid "sublist(val, start_index, end_index, separator) -- interpret the value as a list of items separated by `separator`, returning a new list made from the `start_index` to the `end_index` item. The first item is number zero. If an index is negative, then it counts from the end of the list. As a special case, an end_index of zero is assumed to be the length of the list. Examples using basic template mode and assuming that the tags column (which is comma-separated) contains \"A, B, C\": {tags:sublist(0,1,\\,)} returns \"A\". {tags:sublist(-1,0,\\,)} returns \"C\". {tags:sublist(0,-1,\\,)} returns \"A, B\"."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:636
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:684
msgid "subitems(val, start_index, end_index) -- This function is used to break apart lists of items such as genres. It interprets the value as a comma-separated list of items, where each item is a period-separated list. Returns a new list made by first finding all the period-separated items, then for each such item extracting the start_index` to the `end_index` components, then combining the results back together. The first component in a period-separated list has an index of zero. If an index is negative, then it counts from the end of the list. As a special case, an end_index of zero is assumed to be the length of the list. Example using basic template mode and assuming a #genre value of \"A.B.C\": {#genre:subitems(0,1)} returns \"A\". {#genre:subitems(0,2)} returns \"A.B\". {#genre:subitems(1,0)} returns \"B.C\". Assuming a #genre value of \"A.B.C, D.E.F\", {#genre:subitems(0,1)} returns \"A, D\". {#genre:subitems(0,2)} returns \"A.B, D.E\""
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:674
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:722
msgid "format_date(val, format_string) -- format the value, which must be a date, using the format_string, returning a string. The formatting codes are: d : the day as number without a leading zero (1 to 31) dd : the day as number with a leading zero (01 to 31) ddd : the abbreviated localized day name (e.g. \"Mon\" to \"Sun\"). dddd : the long localized day name (e.g. \"Monday\" to \"Sunday\"). M : the month as number without a leading zero (1 to 12). MM : the month as number with a leading zero (01 to 12) MMM : the abbreviated localized month name (e.g. \"Jan\" to \"Dec\"). MMMM : the long localized month name (e.g. \"January\" to \"December\"). yy : the year as two digit number (00 to 99). yyyy : the year as four digit number. iso : the date with time and timezone. Must be the only format present"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:703
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:751
msgid "uppercase(val) -- return value of the field in upper case"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:712
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:760
msgid "lowercase(val) -- return value of the field in lower case"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:721
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:769
msgid "titlecase(val) -- return value of the field in title case"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:730
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:778
msgid "capitalize(val) -- return value of the field capitalized"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:739
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:787
msgid "booksize() -- return value of the size field"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:753
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:801
msgid "ondevice() -- return Yes if ondevice is set, otherwise return the empty string"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:765
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:813
msgid "has_cover() -- return Yes if the book has a cover, otherwise return the empty string"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:777
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:825
msgid "first_non_empty(value, value, ...) -- returns the first value that is not empty. If all values are empty, then the empty value is returned.You can have as many values as you want."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:794
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:842
msgid "and(value, value, ...) -- returns the string \"1\" if all values are not empty, otherwise returns the empty string. This function works well with test or first_non_empty. You can have as many values as you want."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:811
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:859
msgid "or(value, value, ...) -- returns the string \"1\" if any value is not empty, otherwise returns the empty string. This function works well with test or first_non_empty. You can have as many values as you want."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:828
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:876
msgid "not(value) -- returns the string \"1\" if the value is empty, otherwise returns the empty string. This function works well with test or first_non_empty. You can have as many values as you want."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:840
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:888
msgid "list_union(list1, list2, separator) -- return a list made by merging the items in list1 and list2, removing duplicate items using a case-insensitive compare. If items differ in case, the one in list1 is used. The items in list1 and list2 are separated by separator, as are the items in the returned list."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:865
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:913
msgid "list_difference(list1, list2, separator) -- return a list made by removing from list1 any item found in list2, using a case-insensitive compare. The items in list1 and list2 are separated by separator, as are the items in the returned list."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:884
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:932
msgid "list_intersection(list1, list2, separator) -- return a list made by removing from list1 any item not found in list2, using a case-insensitive compare. The items in list1 and list2 are separated by separator, as are the items in the returned list."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:903
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:951
msgid "list_sort(list, direction, separator) -- return list sorted using a case-insensitive sort. If direction is zero, the list is sorted ascending, otherwise descending. The list items are separated by separator, as are the items in the returned list."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:916
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:964
msgid "today() -- return a date string for today. This value is designed for use in format_date or days_between, but can be manipulated like any other string. The date is in ISO format."
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:927
+#: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:975
msgid "days_between(date1, date2) -- return the number of days between date1 and date2. The number is positive if date1 is greater than date2, otherwise negative. If either date1 or date2 are not dates, the function returns the empty string."
msgstr ""
@@ -16130,11 +16234,6 @@ msgstr ""
msgid "Scheduled"
msgstr ""
-#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:86
-#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/model.py:204
-msgid "Custom"
-msgstr ""
-
#: /home/kovid/work/calibre/src/calibre/web/feeds/templates.py:118
msgid "Next section"
msgstr ""