diff --git a/manual/conversion.rst b/manual/conversion.rst index feae2a4273..817821a9b1 100644 --- a/manual/conversion.rst +++ b/manual/conversion.rst @@ -672,6 +672,7 @@ Some limitations of PDF input are: * Links and Tables of Contents are not supported * PDFs that use embedded non-unicode fonts to represent non-English characters will result in garbled output for those characters * Some PDFs are made up of photographs of the page with OCRed text behind them. In such cases |app| uses the OCRed text, which can be very different from what you see when you view the PDF file + * PDFs that are used to display complex text, like right to left languages and math typesetting will not convert correctly To re-iterate **PDF is a really, really bad** format to use as input. If you absolutely must use PDF, then be prepared for an output ranging anywhere from decent to unusable, depending on the input PDF. diff --git a/recipes/tvn24.recipe b/recipes/tvn24.recipe index ed0eae574f..06629e8873 100644 --- a/recipes/tvn24.recipe +++ b/recipes/tvn24.recipe @@ -30,11 +30,6 @@ class tvn24(BasicNewsRecipe): feeds = [(u'Najnowsze', u'http://www.tvn24.pl/najnowsze.xml'), ] #(u'Polska', u'www.tvn24.pl/polska.xml'), (u'\u015awiat', u'http://www.tvn24.pl/swiat.xml'), (u'Sport', u'http://www.tvn24.pl/sport.xml'), (u'Biznes', u'http://www.tvn24.pl/biznes.xml'), (u'Meteo', u'http://www.tvn24.pl/meteo.xml'), (u'Micha\u0142ki', u'http://www.tvn24.pl/michalki.xml'), (u'Kultura', u'http://www.tvn24.pl/kultura.xml')] - def preprocess_html(self, soup): - for item in soup.findAll(style=True): - del item['style'] - return soup - def preprocess_html(self, soup): for alink in soup.findAll('a'): if alink.string is not None: diff --git a/src/calibre/gui2/actions/__init__.py b/src/calibre/gui2/actions/__init__.py index ef731ed0b1..3dda2292d5 100644 --- a/src/calibre/gui2/actions/__init__.py +++ b/src/calibre/gui2/actions/__init__.py @@ -101,9 +101,9 @@ class InterfaceAction(QObject): #: on calibre as a whole action_type = 'global' - #: If True, the action may inspect the event at accept_enter_event() and - #: accept_drag_move_event(), returning True or False if it wants to handle the event. - #: drop_event() will be called in the subclass from calibre.gui2.bars + #: If True, then this InterfaceAction will have the opportunity to interact + #: with drag and drop events. See the methods, :meth:`accept_enter_event`, + #: :meth`:accept_drag_move_event`, :meth:`drop_event` for details. accepts_drops = False def __init__(self, parent, site_customization): @@ -113,14 +113,26 @@ class InterfaceAction(QObject): self.site_customization = site_customization self.interface_action_base_plugin = None - def accept_enter_event(self, mime_data): + def accept_enter_event(self, event, mime_data): + ''' This method should return True iff this interface action is capable + of handling the drag event. Do not call accept/ignore on the event, + that will be taken care of by the calibre UI.''' return False - def accept_drag_move_event(self, mime_data): + def accept_drag_move_event(self, event, mime_data): + ''' This method should return True iff this interface action is capable + of handling the drag event. Do not call accept/ignore on the event, + that will be taken care of by the calibre UI.''' return False - def drop_event(self, event): - pass + def drop_event(self, event, mime_data): + ''' This method should perform some useful action and return True + iff this interface action is capable of handling the drop event. Do not + call accept/ignore on the event, that will be taken care of by the + calibre UI. You should not perform blocking/long operations in this + function. Instead emit a signal or use QTimer.singleShot and return + quickly. See the builtin actions for examples.''' + return False def do_genesis(self): self.Dispatcher = partial(Dispatcher, parent=self) @@ -145,7 +157,6 @@ class InterfaceAction(QObject): else: action = QAction(text, self.gui) if attr == 'qaction': - action.associated_interface_action = self mt = (action.text() if self.action_menu_clone_qaction is True else unicode(self.action_menu_clone_qaction)) self.menuless_qaction = ma = QAction(action.icon(), mt, self.gui) diff --git a/src/calibre/gui2/actions/catalog.py b/src/calibre/gui2/actions/catalog.py index 6c8568e83a..a6c0877049 100644 --- a/src/calibre/gui2/actions/catalog.py +++ b/src/calibre/gui2/actions/catalog.py @@ -18,7 +18,8 @@ from calibre import sanitize_file_name_unicode class GenerateCatalogAction(InterfaceAction): name = 'Generate Catalog' - action_spec = (_('Create catalog'), 'catalog.png', 'Catalog builder', ()) + action_spec = (_('Create catalog'), 'catalog.png', + _('Create a catalog of the books in your calibre library in different formats'), ()) dont_add_to = frozenset(['context-menu-device']) def genesis(self): diff --git a/src/calibre/gui2/actions/convert.py b/src/calibre/gui2/actions/convert.py index 4289158b78..68415db748 100644 --- a/src/calibre/gui2/actions/convert.py +++ b/src/calibre/gui2/actions/convert.py @@ -8,7 +8,7 @@ __docformat__ = 'restructuredtext en' import os from functools import partial -from PyQt4.Qt import QModelIndex +from PyQt4.Qt import QModelIndex, QTimer from calibre.gui2 import error_dialog, Dispatcher from calibre.gui2.tools import convert_single_ebook, convert_bulk_ebook @@ -19,11 +19,36 @@ from calibre.customize.ui import plugin_for_input_format class ConvertAction(InterfaceAction): name = 'Convert Books' - action_spec = (_('Convert books'), 'convert.png', None, _('C')) + action_spec = (_('Convert books'), 'convert.png', _('Convert books between different ebook formats'), _('C')) dont_add_to = frozenset(['context-menu-device']) action_type = 'current' action_add_menu = True + accepts_drops = True + + def accept_enter_event(self, event, mime_data): + if mime_data.hasFormat("application/calibre+from_library"): + return True + return False + + def accept_drag_move_event(self, event, mime_data): + if mime_data.hasFormat("application/calibre+from_library"): + return True + return False + + def drop_event(self, event, mime_data): + mime = 'application/calibre+from_library' + if mime_data.hasFormat(mime): + self.dropped_ids = tuple(map(int, str(mime_data.data(mime)).split())) + QTimer.singleShot(1, self.do_drop) + return True + return False + + def do_drop(self): + book_ids = self.dropped_ids + del self.dropped_ids + self.do_convert(book_ids) + def genesis(self): m = self.convert_menu = self.qaction.menu() cm = partial(self.create_menu_action, self.convert_menu) @@ -112,6 +137,9 @@ class ConvertAction(InterfaceAction): def convert_ebook(self, checked, bulk=None): book_ids = self.get_books_for_conversion() if book_ids is None: return + self.do_convert(book_ids, bulk=bulk) + + def do_convert(self, book_ids, bulk=None): previous = self.gui.library_view.currentIndex() rows = [x.row() for x in \ self.gui.library_view.selectionModel().selectedRows()] diff --git a/src/calibre/gui2/actions/delete.py b/src/calibre/gui2/actions/delete.py index ac71d4d4c3..fb3efd36c0 100644 --- a/src/calibre/gui2/actions/delete.py +++ b/src/calibre/gui2/actions/delete.py @@ -83,11 +83,37 @@ class MultiDeleter(QObject): # {{{ class DeleteAction(InterfaceAction): name = 'Remove Books' - action_spec = (_('Remove books'), 'trash.png', None, 'Del') + action_spec = (_('Remove books'), 'trash.png', _('Delete books'), 'Del') action_type = 'current' action_add_menu = True action_menu_clone_qaction = _('Remove selected books') + accepts_drops = True + + def accept_enter_event(self, event, mime_data): + if mime_data.hasFormat("application/calibre+from_library"): + return True + return False + + def accept_drag_move_event(self, event, mime_data): + if mime_data.hasFormat("application/calibre+from_library"): + return True + return False + + def drop_event(self, event, mime_data): + mime = 'application/calibre+from_library' + if mime_data.hasFormat(mime): + self.dropped_ids = tuple(map(int, str(mime_data.data(mime)).split())) + QTimer.singleShot(1, self.do_drop) + return True + return False + + def do_drop(self): + book_ids = self.dropped_ids + del self.dropped_ids + if book_ids: + self.do_library_delete(book_ids) + def genesis(self): self.qaction.triggered.connect(self.delete_books) self.delete_menu = self.qaction.menu() @@ -296,6 +322,44 @@ class DeleteAction(InterfaceAction): current_row = rmap.get(next_id, None) self.library_ids_deleted(ids_deleted, current_row=current_row) + def do_library_delete(self, to_delete_ids): + view = self.gui.current_view() + # Ask the user if they want to delete the book from the library or device if it is in both. + if self.gui.device_manager.is_device_connected: + on_device = False + on_device_ids = self._get_selected_ids() + for id in on_device_ids: + res = self.gui.book_on_device(id) + if res[0] or res[1] or res[2]: + on_device = True + if on_device: + break + if on_device: + loc = confirm_location('

' + _('Some of the selected books are on the attached device. ' + 'Where do you want the selected files deleted from?'), + self.gui) + if not loc: + return + elif loc == 'dev': + self.remove_matching_books_from_device() + return + elif loc == 'both': + self.remove_matching_books_from_device() + # The following will run if the selected books are not on a connected device. + # The user has selected to delete from the library or the device and library. + if not confirm('

'+_('The selected books will be ' + 'permanently deleted and the files ' + 'removed from your calibre library. Are you sure?') + +'

', 'library_delete_books', self.gui): + return + next_id = view.next_id + if len(to_delete_ids) < 5: + view.model().delete_books_by_id(to_delete_ids) + self.library_ids_deleted2(to_delete_ids, next_id=next_id) + else: + self.__md = MultiDeleter(self.gui, to_delete_ids, + partial(self.library_ids_deleted2, next_id=next_id)) + def delete_books(self, *args): ''' Delete selected books from device or library. @@ -307,41 +371,7 @@ class DeleteAction(InterfaceAction): # Library view is visible. if self.gui.stack.currentIndex() == 0: to_delete_ids = [view.model().id(r) for r in rows] - # Ask the user if they want to delete the book from the library or device if it is in both. - if self.gui.device_manager.is_device_connected: - on_device = False - on_device_ids = self._get_selected_ids() - for id in on_device_ids: - res = self.gui.book_on_device(id) - if res[0] or res[1] or res[2]: - on_device = True - if on_device: - break - if on_device: - loc = confirm_location('

' + _('Some of the selected books are on the attached device. ' - 'Where do you want the selected files deleted from?'), - self.gui) - if not loc: - return - elif loc == 'dev': - self.remove_matching_books_from_device() - return - elif loc == 'both': - self.remove_matching_books_from_device() - # The following will run if the selected books are not on a connected device. - # The user has selected to delete from the library or the device and library. - if not confirm('

'+_('The selected books will be ' - 'permanently deleted and the files ' - 'removed from your calibre library. Are you sure?') - +'

', 'library_delete_books', self.gui): - return - next_id = view.next_id - if len(rows) < 5: - view.model().delete_books_by_id(to_delete_ids) - self.library_ids_deleted2(to_delete_ids, next_id=next_id) - else: - self.__md = MultiDeleter(self.gui, to_delete_ids, - partial(self.library_ids_deleted2, next_id=next_id)) + self.do_library_delete(to_delete_ids) # Device view is visible. else: if self.gui.stack.currentIndex() == 1: diff --git a/src/calibre/gui2/actions/device.py b/src/calibre/gui2/actions/device.py index 0f97553dcb..09cadceb9c 100644 --- a/src/calibre/gui2/actions/device.py +++ b/src/calibre/gui2/actions/device.py @@ -177,7 +177,8 @@ class SendToDeviceAction(InterfaceAction): class ConnectShareAction(InterfaceAction): name = 'Connect Share' - action_spec = (_('Connect/share'), 'connect_share.png', None, None) + action_spec = (_('Connect/share'), 'connect_share.png', + _('Share books using a web server or email. Connect to special devices, etc.'), None) popup_type = QToolButton.InstantPopup def genesis(self): diff --git a/src/calibre/gui2/actions/edit_metadata.py b/src/calibre/gui2/actions/edit_metadata.py index a9ffec10a0..4a78c6663a 100644 --- a/src/calibre/gui2/actions/edit_metadata.py +++ b/src/calibre/gui2/actions/edit_metadata.py @@ -23,10 +23,38 @@ from calibre.db.errors import NoSuchFormat class EditMetadataAction(InterfaceAction): name = 'Edit Metadata' - action_spec = (_('Edit metadata'), 'edit_input.png', None, _('E')) + action_spec = (_('Edit metadata'), 'edit_input.png', _('Change the title/author/cover etc. of books'), _('E')) action_type = 'current' action_add_menu = True + accepts_drops = True + + def accept_enter_event(self, event, mime_data): + if mime_data.hasFormat("application/calibre+from_library"): + return True + return False + + def accept_drag_move_event(self, event, mime_data): + if mime_data.hasFormat("application/calibre+from_library"): + return True + return False + + def drop_event(self, event, mime_data): + mime = 'application/calibre+from_library' + if mime_data.hasFormat(mime): + self.dropped_ids = tuple(map(int, str(mime_data.data(mime)).split())) + QTimer.singleShot(1, self.do_drop) + return True + return False + + def do_drop(self): + book_ids = self.dropped_ids + del self.dropped_ids + if book_ids: + db = self.gui.library_view.model().db + rows = [db.row(i) for i in book_ids] + self.edit_metadata_for(rows, book_ids) + def genesis(self): md = self.qaction.menu() cm = partial(self.create_menu_action, md) @@ -186,18 +214,23 @@ class EditMetadataAction(InterfaceAction): Edit metadata of selected books in library. ''' rows = self.gui.library_view.selectionModel().selectedRows() - previous = self.gui.library_view.currentIndex() if not rows or len(rows) == 0: d = error_dialog(self.gui, _('Cannot edit metadata'), _('No books selected')) d.exec_() return - - if bulk or (bulk is None and len(rows) > 1): - return self.edit_bulk_metadata(checked) - row_list = [r.row() for r in rows] + m = self.gui.library_view.model() + ids = [m.id(r) for r in rows] + self.edit_metadata_for(row_list, ids, bulk=bulk) + + def edit_metadata_for(self, rows, book_ids, bulk=None): + previous = self.gui.library_view.currentIndex() + if bulk or (bulk is None and len(rows) > 1): + return self.do_edit_bulk_metadata(rows, book_ids) + current_row = 0 + row_list = rows if len(row_list) == 1: cr = row_list[0] @@ -242,7 +275,6 @@ class EditMetadataAction(InterfaceAction): db = self.gui.library_view.model().db view.view_format(db.row(id_), fmt) - def edit_bulk_metadata(self, checked): ''' Edit metadata of selected books in library in bulk. @@ -256,6 +288,9 @@ class EditMetadataAction(InterfaceAction): _('No books selected')) d.exec_() return + self.do_edit_bulk_metadata(rows, ids) + + def do_edit_bulk_metadata(self, rows, book_ids): # Prevent the TagView from updating due to signals from the database self.gui.tags_view.blockSignals(True) changed = False @@ -278,7 +313,7 @@ class EditMetadataAction(InterfaceAction): self.gui.tags_view.recount() if self.gui.cover_flow: self.gui.cover_flow.dataChanged() - self.gui.library_view.select_rows(ids) + self.gui.library_view.select_rows(book_ids) # Merge books {{{ def merge_books(self, safe_merge=False, merge_only_formats=False): diff --git a/src/calibre/gui2/actions/fetch_news.py b/src/calibre/gui2/actions/fetch_news.py index f94dfbc88c..d80bfdffe7 100644 --- a/src/calibre/gui2/actions/fetch_news.py +++ b/src/calibre/gui2/actions/fetch_news.py @@ -16,7 +16,7 @@ from calibre.gui2.actions import InterfaceAction class FetchNewsAction(InterfaceAction): name = 'Fetch News' - action_spec = (_('Fetch news'), 'news.png', None, _('F')) + action_spec = (_('Fetch news'), 'news.png', _('Download news in ebook form from various websites all over the world'), _('F')) def location_selected(self, loc): enabled = loc == 'library' diff --git a/src/calibre/gui2/actions/open.py b/src/calibre/gui2/actions/open.py index fc78df5f33..bf8c8335bb 100644 --- a/src/calibre/gui2/actions/open.py +++ b/src/calibre/gui2/actions/open.py @@ -11,8 +11,8 @@ from calibre.gui2.actions import InterfaceAction class OpenFolderAction(InterfaceAction): name = 'Open Folder' - action_spec = (_('Open containing folder'), 'document_open.png', None, - _('O')) + action_spec = (_('Open containing folder'), 'document_open.png', + _('Open the folder containing the current book\'s files'), _('O')) dont_add_to = frozenset(['context-menu-device']) action_type = 'current' diff --git a/src/calibre/gui2/actions/plugin_updates.py b/src/calibre/gui2/actions/plugin_updates.py index 6973e80d8a..0951249b57 100644 --- a/src/calibre/gui2/actions/plugin_updates.py +++ b/src/calibre/gui2/actions/plugin_updates.py @@ -15,7 +15,7 @@ from calibre.gui2.dialogs.plugin_updater import (PluginUpdaterDialog, class PluginUpdaterAction(InterfaceAction): name = 'Plugin Updater' - action_spec = (_('Plugin Updater'), None, None, ()) + action_spec = (_('Plugin Updater'), None, _('Update any plugins you have installed in calibre'), ()) action_type = 'current' def genesis(self): diff --git a/src/calibre/gui2/actions/polish.py b/src/calibre/gui2/actions/polish.py index 1be05f181b..127749cc51 100644 --- a/src/calibre/gui2/actions/polish.py +++ b/src/calibre/gui2/actions/polish.py @@ -10,6 +10,7 @@ __docformat__ = 'restructuredtext en' import os, weakref, shutil, textwrap from collections import OrderedDict from functools import partial +from future_builtins import map from PyQt4.Qt import (QDialog, QGridLayout, QIcon, QCheckBox, QLabel, QFrame, QApplication, QDialogButtonBox, Qt, QSize, QSpacerItem, @@ -364,9 +365,35 @@ class Report(QDialog): # {{{ class PolishAction(InterfaceAction): name = 'Polish Books' - action_spec = (_('Polish books'), 'polish.png', None, _('P')) + action_spec = (_('Polish books'), 'polish.png', + _('Apply the shine of perfection to your books'), _('P')) dont_add_to = frozenset(['context-menu-device']) action_type = 'current' + accepts_drops = True + + def accept_enter_event(self, event, mime_data): + if mime_data.hasFormat("application/calibre+from_library"): + return True + return False + + def accept_drag_move_event(self, event, mime_data): + if mime_data.hasFormat("application/calibre+from_library"): + return True + return False + + def drop_event(self, event, mime_data): + mime = 'application/calibre+from_library' + if mime_data.hasFormat(mime): + self.dropped_ids = tuple(map(int, str(mime_data.data(mime)).split())) + QTimer.singleShot(1, self.do_drop) + return True + return False + + def do_drop(self): + book_id_map = self.get_supported_books(self.dropped_ids) + del self.dropped_ids + if book_id_map: + self.do_polish(book_id_map) def genesis(self): self.qaction.triggered.connect(self.polish_books) @@ -377,7 +404,6 @@ class PolishAction(InterfaceAction): self.qaction.setEnabled(enabled) def get_books_for_polishing(self): - from calibre.ebooks.oeb.polish.main import SUPPORTED rows = [r.row() for r in self.gui.library_view.selectionModel().selectedRows()] if not rows or len(rows) == 0: @@ -387,11 +413,16 @@ class PolishAction(InterfaceAction): return None db = self.gui.library_view.model().db ans = (db.id(r) for r in rows) + return self.get_supported_books(ans) + + def get_supported_books(self, book_ids): + from calibre.ebooks.oeb.polish.main import SUPPORTED + db = self.gui.library_view.model().db supported = set(SUPPORTED) for x in SUPPORTED: supported.add('ORIGINAL_'+x) ans = [(x, set( (db.formats(x, index_is_id=True) or '').split(',') ) - .intersection(supported)) for x in ans] + .intersection(supported)) for x in book_ids] ans = [x for x in ans if x[1]] if not ans: error_dialog(self.gui, _('Cannot polish'), @@ -409,6 +440,9 @@ class PolishAction(InterfaceAction): book_id_map = self.get_books_for_polishing() if not book_id_map: return + self.do_polish(book_id_map) + + def do_polish(self, book_id_map): d = Polish(self.gui.library_view.model().db, book_id_map, parent=self.gui) if d.exec_() == d.Accepted and d.jobs: show_reports = bool(d.show_reports.isChecked()) diff --git a/src/calibre/gui2/actions/preferences.py b/src/calibre/gui2/actions/preferences.py index bbb86b573e..b1e066f979 100644 --- a/src/calibre/gui2/actions/preferences.py +++ b/src/calibre/gui2/actions/preferences.py @@ -17,7 +17,7 @@ from calibre.constants import DEBUG, isosx class PreferencesAction(InterfaceAction): name = 'Preferences' - action_spec = (_('Preferences'), 'config.png', None, _('Ctrl+P')) + action_spec = (_('Preferences'), 'config.png', _('Configure calibre'), _('Ctrl+P')) action_add_menu = True action_menu_clone_qaction = _('Change calibre behavior') diff --git a/src/calibre/gui2/actions/restart.py b/src/calibre/gui2/actions/restart.py index 9bbabedbbf..19619e581f 100644 --- a/src/calibre/gui2/actions/restart.py +++ b/src/calibre/gui2/actions/restart.py @@ -11,7 +11,7 @@ from calibre.gui2.actions import InterfaceAction class RestartAction(InterfaceAction): name = 'Restart' - action_spec = (_('Restart'), None, None, _('Ctrl+R')) + action_spec = (_('Restart'), None, _('Restart calibre'), _('Ctrl+R')) def genesis(self): self.qaction.triggered.connect(self.restart) diff --git a/src/calibre/gui2/actions/save_to_disk.py b/src/calibre/gui2/actions/save_to_disk.py index d1e056b65a..10574aea29 100644 --- a/src/calibre/gui2/actions/save_to_disk.py +++ b/src/calibre/gui2/actions/save_to_disk.py @@ -17,7 +17,8 @@ from calibre.gui2.actions import InterfaceAction class SaveToDiskAction(InterfaceAction): name = "Save To Disk" - action_spec = (_('Save to disk'), 'save.png', None, _('S')) + action_spec = (_('Save to disk'), 'save.png', + _('Export ebook files from the calibre library'), _('S')) action_type = 'current' action_add_menu = True action_menu_clone_qaction = True diff --git a/src/calibre/gui2/actions/show_book_details.py b/src/calibre/gui2/actions/show_book_details.py index 2ab1e19edd..83e570d7b6 100644 --- a/src/calibre/gui2/actions/show_book_details.py +++ b/src/calibre/gui2/actions/show_book_details.py @@ -13,8 +13,8 @@ from calibre.gui2 import error_dialog class ShowBookDetailsAction(InterfaceAction): name = 'Show Book Details' - action_spec = (_('Show book details'), 'dialog_information.png', None, - _('I')) + action_spec = (_('Show book details'), 'dialog_information.png', + _('Show the detailed metadata for the current book in a separate window'), _('I')) dont_add_to = frozenset(['context-menu-device']) action_type = 'current' diff --git a/src/calibre/gui2/actions/similar_books.py b/src/calibre/gui2/actions/similar_books.py index 7e7c02ce0b..93cb631ef7 100644 --- a/src/calibre/gui2/actions/similar_books.py +++ b/src/calibre/gui2/actions/similar_books.py @@ -14,7 +14,7 @@ from calibre.gui2.actions import InterfaceAction class SimilarBooksAction(InterfaceAction): name = 'Similar Books' - action_spec = (_('Similar books...'), None, None, None) + action_spec = (_('Similar books...'), None, _('Show books similar to the current book'), None) popup_type = QToolButton.InstantPopup action_type = 'current' action_add_menu = True diff --git a/src/calibre/gui2/actions/store.py b/src/calibre/gui2/actions/store.py index b84836c465..896516c665 100644 --- a/src/calibre/gui2/actions/store.py +++ b/src/calibre/gui2/actions/store.py @@ -17,7 +17,7 @@ from calibre.gui2.dialogs.confirm_delete import confirm class StoreAction(InterfaceAction): name = 'Store' - action_spec = (_('Get books'), 'store.png', None, _('G')) + action_spec = (_('Get books'), 'store.png', _('Search dozens of online ebook retailers for the cheapest books'), _('G')) action_add_menu = True action_menu_clone_qaction = _('Search for ebooks') diff --git a/src/calibre/gui2/actions/tweak_epub.py b/src/calibre/gui2/actions/tweak_epub.py index 0872849c8c..618df6a5fa 100755 --- a/src/calibre/gui2/actions/tweak_epub.py +++ b/src/calibre/gui2/actions/tweak_epub.py @@ -64,7 +64,7 @@ class TweakBook(QDialog): self.fmt_choice_box = QGroupBox(_('Choose the format to tweak:'), self) self._fl = fl = QHBoxLayout() self.fmt_choice_box.setLayout(self._fl) - self.fmt_choice_buttons = [QRadioButton(x, self) for x in fmts] + self.fmt_choice_buttons = [QRadioButton(y, self) for y in fmts] for x in self.fmt_choice_buttons: fl.addWidget(x, stretch=10 if x is self.fmt_choice_buttons[-1] else 0) @@ -291,6 +291,32 @@ class TweakEpubAction(InterfaceAction): dont_add_to = frozenset(['context-menu-device']) action_type = 'current' + accepts_drops = True + + def accept_enter_event(self, event, mime_data): + if mime_data.hasFormat("application/calibre+from_library"): + return True + return False + + def accept_drag_move_event(self, event, mime_data): + if mime_data.hasFormat("application/calibre+from_library"): + return True + return False + + def drop_event(self, event, mime_data): + mime = 'application/calibre+from_library' + if mime_data.hasFormat(mime): + self.dropped_ids = tuple(map(int, str(mime_data.data(mime)).split())) + QTimer.singleShot(1, self.do_drop) + return True + return False + + def do_drop(self): + book_ids = self.dropped_ids + del self.dropped_ids + if book_ids: + self.do_tweak(book_ids[0]) + def genesis(self): self.qaction.triggered.connect(self.tweak_book) @@ -301,6 +327,9 @@ class TweakEpubAction(InterfaceAction): _('No book selected'), show=True) book_id = self.gui.library_view.model().id(row) + self.do_tweak(book_id) + + def do_tweak(self, book_id): db = self.gui.library_view.model().db fmts = db.formats(book_id, index_is_id=True) or '' fmts = [x.lower().strip() for x in fmts.split(',')] diff --git a/src/calibre/gui2/actions/view.py b/src/calibre/gui2/actions/view.py index fe7ef72986..55e07533c3 100644 --- a/src/calibre/gui2/actions/view.py +++ b/src/calibre/gui2/actions/view.py @@ -34,7 +34,7 @@ class HistoryAction(QAction): class ViewAction(InterfaceAction): name = 'View' - action_spec = (_('View'), 'view.png', None, _('V')) + action_spec = (_('View'), 'view.png', _('Read books'), _('V')) action_type = 'current' action_add_menu = True action_menu_clone_qaction = True diff --git a/src/calibre/gui2/bars.py b/src/calibre/gui2/bars.py index 8267eca430..f56d668f4f 100644 --- a/src/calibre/gui2/bars.py +++ b/src/calibre/gui2/bars.py @@ -117,21 +117,30 @@ class ToolBar(QToolBar): # {{{ return ch # support drag&drop from/to library, from/to reader/card, enabled plugins + def check_iactions_for_drag(self, event, md, func): + if self.added_actions: + pos = event.pos() + for iac in self.gui.iactions.itervalues(): + if iac.accepts_drops: + aa = iac.qaction + w = self.widgetForAction(aa) + m = aa.menu() + if (( (w is not None and w.geometry().contains(pos)) or + (m is not None and m.isVisible() and m.geometry().contains(pos)) ) and + getattr(iac, func)(event, md)): + return True + return False + def dragEnterEvent(self, event): md = event.mimeData() if md.hasFormat("application/calibre+from_library") or \ md.hasFormat("application/calibre+from_device"): event.setDropAction(Qt.CopyAction) event.accept() - elif self.added_actions: - for aa in self.added_actions: - if (getattr(aa.associated_interface_action, 'accepts_drops', False) and - aa.menu().geometry().contains(event.pos())): - if aa.associated_interface_action.accept_enter_event(md): - event.accept() - break - else: - event.ignore() + return + + if self.check_iactions_for_drag(event, md, 'accept_enter_event'): + event.accept() else: event.ignore() @@ -152,15 +161,8 @@ class ToolBar(QToolBar): # {{{ event.acceptProposedAction() return - if self.added_actions: - for aa in self.added_actions: - if (getattr(aa.associated_interface_action, 'accepts_drops', False) and - aa.menu().geometry().contains(event.pos())): - if aa.associated_interface_action.accept_drag_move_event(md): - event.acceptProposedAction() - break - else: - event.ignore() + if self.check_iactions_for_drag(event, md, 'accept_drag_move_event'): + event.acceptProposedAction() else: event.ignore() @@ -191,11 +193,8 @@ class ToolBar(QToolBar): # {{{ return # Give added_actions an opportunity to process the drag&drop event - for aa in self.added_actions: - if (getattr(aa.associated_interface_action, 'accepts_drops', False) and - aa.menu().geometry().contains(event.pos())): - aa.associated_interface_action.drop_event(event) - event.accept() + if self.check_iactions_for_drag(event, data, 'drop_event'): + event.accept() else: event.ignore() diff --git a/src/calibre/gui2/preferences/toolbar.py b/src/calibre/gui2/preferences/toolbar.py index bae7a83e0b..8aa85af3d9 100644 --- a/src/calibre/gui2/preferences/toolbar.py +++ b/src/calibre/gui2/preferences/toolbar.py @@ -28,9 +28,10 @@ class BaseModel(QAbstractListModel): def name_to_action(self, name, gui): if name == 'Donate': - return FakeAction('Donate', _('Donate'), 'donate.png', - dont_add_to=frozenset(['context-menu', - 'context-menu-device'])) + return FakeAction( + 'Donate', _('Donate'), 'donate.png', tooltip= + _('Donate to support the development of calibre'), + dont_add_to=frozenset(['context-menu', 'context-menu-device'])) if name == 'Location Manager': return FakeAction('Location Manager', _('Location Manager'), 'reader.png', _('Switch between library and device views'), @@ -247,6 +248,18 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): self.remove_action_button.clicked.connect(self.remove_action) self.action_up_button.clicked.connect(partial(self.move, -1)) self.action_down_button.clicked.connect(partial(self.move, 1)) + self.all_actions.setMouseTracking(True) + self.current_actions.setMouseTracking(True) + self.all_actions.entered.connect(self.all_entered) + self.current_actions.entered.connect(self.current_entered) + + def all_entered(self, index): + tt = self.all_actions.model().data(index, Qt.ToolTipRole).toString() + self.help_text.setText(tt) + + def current_entered(self, index): + tt = self.current_actions.model().data(index, Qt.ToolTipRole).toString() + self.help_text.setText(tt) def what_changed(self, idx): key = unicode(self.what.itemData(idx).toString()) @@ -264,7 +277,7 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): names = self.all_actions.model().names(x) if names: not_added = self.current_actions.model().add(names) - ns = set([x.name for x in not_added]) + ns = set([y.name for y in not_added]) added = set(names) - ns self.all_actions.model().remove(x, added) if not_added: @@ -283,7 +296,7 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): names = self.current_actions.model().names(x) if names: not_removed = self.current_actions.model().remove(x) - ns = set([x.name for x in not_removed]) + ns = set([y.name for y in not_removed]) removed = set(names) - ns self.all_actions.model().add(removed) if not_removed: diff --git a/src/calibre/gui2/preferences/toolbar.ui b/src/calibre/gui2/preferences/toolbar.ui index c8ff4977eb..2bb9547b3e 100644 --- a/src/calibre/gui2/preferences/toolbar.ui +++ b/src/calibre/gui2/preferences/toolbar.ui @@ -234,6 +234,13 @@ + + + + + + + diff --git a/src/calibre/translations/calibre.pot b/src/calibre/translations/calibre.pot index a23aa6f5b5..9b08356e97 100644 --- a/src/calibre/translations/calibre.pot +++ b/src/calibre/translations/calibre.pot @@ -5,8 +5,8 @@ msgid "" msgstr "" "Project-Id-Version: calibre 0.9.21\n" -"POT-Creation-Date: 2013-03-01 09:39+IST\n" -"PO-Revision-Date: 2013-03-01 09:39+IST\n" +"POT-Creation-Date: 2013-03-04 14:23+IST\n" +"PO-Revision-Date: 2013-03-04 14:23+IST\n" "Last-Translator: Automatically generated\n" "Language-Team: LANGUAGE\n" "MIME-Version: 1.0\n" @@ -21,11 +21,11 @@ msgid "Does absolutely nothing" msgstr "" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:59 -#: /home/kovid/work/calibre/src/calibre/db/cache.py:124 -#: /home/kovid/work/calibre/src/calibre/db/cache.py:127 -#: /home/kovid/work/calibre/src/calibre/db/cache.py:138 -#: /home/kovid/work/calibre/src/calibre/db/write.py:102 -#: /home/kovid/work/calibre/src/calibre/db/write.py:106 +#: /home/kovid/work/calibre/src/calibre/db/cache.py:125 +#: /home/kovid/work/calibre/src/calibre/db/cache.py:128 +#: /home/kovid/work/calibre/src/calibre/db/cache.py:139 +#: /home/kovid/work/calibre/src/calibre/db/write.py:127 +#: /home/kovid/work/calibre/src/calibre/db/write.py:131 #: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:383 #: /home/kovid/work/calibre/src/calibre/devices/android/driver.py:384 #: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:114 @@ -136,8 +136,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:451 #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:459 #: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:171 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:411 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:414 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:446 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:449 #: /home/kovid/work/calibre/src/calibre/gui2/add.py:167 #: /home/kovid/work/calibre/src/calibre/gui2/add.py:174 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:692 @@ -363,6 +363,7 @@ msgid "Show book details in a separate popup" msgstr "" #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:830 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/restart.py:14 msgid "Restart calibre" msgstr "" @@ -893,7 +894,7 @@ msgstr "" msgid "Path to library too long. Must be less than %d characters." msgstr "" -#: /home/kovid/work/calibre/src/calibre/db/cache.py:152 +#: /home/kovid/work/calibre/src/calibre/db/cache.py:153 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:666 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:67 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:677 @@ -925,9 +926,9 @@ msgstr "" msgid "Card B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/db/fields.py:474 -#: /home/kovid/work/calibre/src/calibre/db/fields.py:489 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2822 +#: /home/kovid/work/calibre/src/calibre/db/fields.py:481 +#: /home/kovid/work/calibre/src/calibre/db/fields.py:496 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2826 #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:106 #: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:448 #: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:471 @@ -1044,109 +1045,109 @@ msgstr "" msgid "Communicate with WebOS tablets." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:63 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:65 msgid "

If you do not want calibre to recognize your Apple iDevice when it is connected to your computer, click Disable Apple Driver.

To transfer books to your iDevice, click Disable Apple Driver, then use the 'Connect to iTunes' method recommended in the Calibre + iDevices FAQ, using the Connect/Share|Connect to iTunes menu item.

Enabling the Apple driver for direct connection to iDevices is an unsupported advanced user mode.

" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:80 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:82 msgid "Disable Apple driver" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:84 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:86 msgid "Enable Apple driver" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:121 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:123 msgid "Use Series as Category in iTunes/iBooks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:122 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:124 msgid "Enable to use the series name as the iTunes Genre, iBooks Category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:124 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:126 msgid "Cache covers from iTunes/iBooks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:126 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:128 msgid "Enable to cache and display covers from iTunes/iBooks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:127 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:129 #, python-format msgid "\"Copy files to iTunes Media folder %s\" is enabled in iTunes Preferences|Advanced" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:129 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:131 msgid "

This setting should match your iTunes Preferences|Advanced setting.

Disabling will store copies of books transferred to iTunes in your calibre configuration directory.

Enabling indicates that iTunes is configured to store copies in your iTunes Media folder.

" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:196 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:198 msgid "Apple device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:198 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:200 msgid "Communicate with iTunes/iBooks." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:212 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:214 msgid "Apple iDevice detected, launching iTunes, please wait ..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:214 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:216 msgid "Cannot copy books directly from iDevice. Drag from iTunes Library to desktop, then add to calibre's Library window." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:217 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:219 msgid "*** Unsupported direct connect mode. See http://www.mobileread.com/forums/showthread.php?t=118559 for instructions on using 'Connect to iTunes' ***" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:221 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:223 msgid "

Unable to communicate with iTunes.

Refer to this forum post for more information.

" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:381 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:384 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:383 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:386 msgid "Updating device metadata listing..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:462 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:503 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:1149 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:1196 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:3298 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:3340 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:464 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:505 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:1151 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:1198 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:3302 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:3344 #, python-format msgid "%(num)d of %(tot)d" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:511 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:1201 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:3347 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:513 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:1203 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:3351 #: /home/kovid/work/calibre/src/calibre/gui2/ebook_download.py:110 msgid "finished" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:703 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:705 msgid "" "Some books not found in iTunes database.\n" "Delete using the iBooks app.\n" "Click 'Show Details' for a list." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:1111 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:1113 msgid "" "Some cover art could not be converted.\n" "Click 'Show Details' for a list." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2823 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2827 #: /home/kovid/work/calibre/src/calibre/library/database2.py:3313 #: /home/kovid/work/calibre/src/calibre/library/database2.py:3331 msgid "Catalog" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:3190 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:3194 msgid "Communicate with iTunes." msgstr "" @@ -3931,7 +3932,7 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/polish/main.py:48 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:431 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel.py:197 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:132 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts.py:223 @@ -4086,7 +4087,7 @@ msgstr "" msgid "Rating" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/split.py:34 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/split.py:35 #, python-format msgid "Could not find reasonable point at which to split: %(path)s Sub-tree size: %(size)d KB" msgstr "" @@ -4381,15 +4382,15 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:95 #: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:120 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:38 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:39 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:132 #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:228 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:75 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:192 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:256 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:293 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:385 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:82 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:103 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:288 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:328 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:411 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:83 #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:271 msgid "No books selected" msgstr "" @@ -4457,11 +4458,11 @@ msgid "Add to library" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:392 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:163 #: /home/kovid/work/calibre/src/calibre/gui2/actions/store.py:89 #: /home/kovid/work/calibre/src/calibre/gui2/actions/store.py:108 #: /home/kovid/work/calibre/src/calibre/gui2/actions/store.py:117 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:301 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:327 #: /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" @@ -4546,28 +4547,32 @@ msgstr "" msgid "Create catalog" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:39 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:22 +msgid "Create a catalog of the books in your calibre library in different formats" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:40 msgid "No books selected for catalog generation" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:62 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:63 #, python-format msgid "Generating %s catalog..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:72 msgid "Catalog generation complete, with warnings." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:87 msgid "Catalog generated." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:89 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:90 msgid "Export Catalog Directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:90 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:91 #, python-format msgid "Select destination for %(title)s.%(fmt)s" msgstr "" @@ -4617,7 +4622,7 @@ msgid "Switch/create library..." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:162 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:59 #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:172 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:129 #, python-format @@ -4791,7 +4796,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:538 #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:543 #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:278 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:92 #: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:1021 msgid "Not allowed" msgstr "" @@ -4812,29 +4817,33 @@ msgstr "" msgid "Convert books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:30 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:22 +msgid "Convert books between different ebook formats" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:55 msgid "Convert individually" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:33 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:58 msgid "Bulk convert" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:37 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:62 msgid "Create a catalog of the books in your calibre library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:106 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:131 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:639 msgid "Cannot convert" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:136 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:164 #, python-format msgid "Starting conversion of %d book(s)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:200 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/convert.py:228 msgid "Empty output file, probably the conversion process crashed" msgstr "" @@ -4845,7 +4854,7 @@ msgid "%(title)s by %(author)s" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:137 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:59 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:60 msgid "Choose library" msgstr "" @@ -4959,6 +4968,10 @@ msgstr "" msgid "Failed to delete some books, click the Show Details button for details." msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:86 +msgid "Delete books" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:86 msgid "Remove books" msgstr "" @@ -4967,93 +4980,93 @@ msgstr "" msgid "Remove selected books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:122 msgid "Remove files of a specific format from selected books.." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:125 msgid "Remove all formats from selected books, except..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:102 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:128 msgid "Remove all formats from selected books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:131 msgid "Remove covers from selected books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:135 msgid "Remove matching books from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:160 msgid "Cannot delete" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:145 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:171 #, python-format msgid "The %(fmt)s format will be permanently deleted from %(title)s. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:162 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:188 msgid "Choose formats to be deleted" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:180 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:206 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:207 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:233 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:227 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:253 msgid "Cannot delete books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:228 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:254 msgid "No device is connected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:238 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:264 msgid "Main memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:265 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:703 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:712 msgid "Storage Card A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:240 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:266 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:705 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:714 msgid "Storage Card B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:245 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:271 msgid "No books to delete" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:246 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:272 msgid "None of the selected books are on the device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:263 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:363 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:289 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:393 msgid "Deleting books from device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:321 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:338 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:333 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:350 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:355 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:385 msgid "The selected books will be permanently deleted from your device. Are you sure?" msgstr "" @@ -5124,29 +5137,33 @@ msgstr "" msgid "Connect/share" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:181 +msgid "Share books using a web server or email. Connect to special devices, etc." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:220 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server.py:85 msgid "Stopping" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:221 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server.py:86 msgid "Stopping server, this could take upto a minute, please wait..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:239 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:240 msgid "Disable autostart" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:240 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:241 msgid "Do you want wireless device connections to be started automatically when calibre starts?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:264 msgid "Still looking for IP addresses" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/device.py:267 msgid "Many IP addresses. See Start/Stop dialog." msgstr "" @@ -5158,6 +5175,10 @@ msgstr "" msgid "Manage the collections on this device" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:26 +msgid "Change the title/author/cover etc. of books" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:26 msgid "E" msgstr "" @@ -5166,138 +5187,142 @@ msgstr "" msgid "Edit metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:33 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:61 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:64 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:67 msgid "Download metadata and covers" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:74 msgid "Merge into first selected book - delete others" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:49 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:77 msgid "Merge into first selected book - keep others" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:53 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:81 msgid "Merge only formats into first selected book - delete others" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:86 msgid "Merge book records" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:59 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:87 msgid "M" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:102 msgid "Cannot download metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:91 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:119 msgid "Failed to download metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:101 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:129 #: /home/kovid/work/calibre/src/calibre/gui2/dnd.py:84 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/single_download.py:534 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/single_download.py:846 msgid "Download failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:102 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:130 #, 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:105 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:133 msgid "Metadata download completed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:135 #, 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:115 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:143 #, 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:117 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:145 msgid "Show the &failed books in the main book list after updating metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:151 msgid "Download complete" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:123 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:151 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/single_download.py:908 msgid "Download log" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:151 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:179 msgid "Some books changed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:152 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:180 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:191 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:255 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:218 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:287 msgid "Cannot edit metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:292 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:295 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:327 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:330 msgid "Cannot merge books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:296 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:331 msgid "At least two books must be selected for merging" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:299 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:334 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:308 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:343 #, 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:320 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:355 #, 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:336 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:371 #, 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:512 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:547 msgid "Applying changed metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:602 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:637 msgid "Some failures" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:603 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:638 msgid "Failed to apply updated metadata for some books in your library. Click \"Show Details\" to see details." msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/fetch_news.py:19 +msgid "Download news in ebook form from various websites all over the world" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/actions/fetch_news.py:19 msgid "F" msgstr "" @@ -5367,208 +5392,224 @@ msgstr "" msgid "O" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/open.py:15 +msgid "Open the folder containing the current book's files" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/actions/plugin_updates.py:18 msgid "Plugin Updater" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:33 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/plugin_updates.py:18 +msgid "Update any plugins you have installed in calibre" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:34 msgid "Polish book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:35 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:36 #, python-format msgid "Polish %d books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:39 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:40 #, python-format msgid "

About Polishing books

%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:41 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:42 #, python-format msgid "

Subsetting fonts

%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:44 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:45 #, python-format msgid "

Smarten punctuation

%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:46 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:47 msgid "

Updating metadata

This will update all metadata except the cover in the ebook files to match the current metadata in the calibre library.

Note that most ebook formats are not capable of supporting all the metadata in calibre.

There is a separate option to update the cover.

" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:54 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:55 msgid "

Update the covers in the ebook files to match the current cover in the calibre library.

If the ebook file does not have an identifiable cover, a new cover is inserted.

" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:59 -#, python-format -msgid "

Book Jacket

%s" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:60 #, python-format +msgid "

Book Jacket

%s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:61 +#, python-format msgid "

Remove Book Jacket

%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:66 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:67 msgid "Select actions to perform:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:72 #: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:249 msgid "&Subset all embedded fonts" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:72 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:73 #: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:240 msgid "Smarten &punctuation" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:74 msgid "Update &metadata in the book files" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:75 msgid "Update the &cover in the book files" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:76 msgid "Add metadata as a \"book &jacket\" page" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:77 msgid "&Remove a previously inserted book jacket" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:86 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:87 msgid "About" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:106 msgid "Show &report" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:108 msgid "Show a report of all the actions performed after polishing is completed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:113 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:114 msgid "&Save Settings" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:115 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:116 msgid "&Load Settings" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:118 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:119 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/duplicates.py:47 msgid "Select &all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:120 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:121 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/duplicates.py:49 msgid "Select &none" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:136 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:201 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:202 msgid "No actions selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:138 msgid "You must select at least one action before saving" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:140 msgid "Choose name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:140 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:141 msgid "Choose a name for these settings" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:160 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:161 msgid "Remove saved settings" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:202 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:203 msgid "You must select at least one action, or click Cancel." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:217 msgid "Queueing books for polishing" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:260 -#, python-format -msgid "Polish %s" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:261 #, python-format +msgid "Polish %s" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:262 +#, python-format msgid "Polish book %(nums)s of %(tot)s (%(title)s)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:265 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:266 #, python-format msgid "Queueing book %(nums)s of %(tot)s (%(title)s)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:292 #, python-format msgid "Ignore remaining %d reports" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:298 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:299 msgid "View full &log" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:321 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:322 #, python-format msgid "Polishing of %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:327 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:328 #, python-format msgid "The original file has been saved as %s." msgid_plural "The original files have been saved as %s." msgstr[0] "" msgstr[1] "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:329 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:330 msgid " and " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:332 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:333 msgid "If you polish again, the polishing will run on the originals." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:367 -msgid "P" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:367 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:368 msgid "Polish books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:384 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:397 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:369 +msgid "Apply the shine of perfection to your books" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:369 +msgid "P" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:410 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:428 msgid "Cannot polish" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:398 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:429 #, python-format msgid "Polishing is only supported for books in the %s formats. Convert to one of those formats before polishing." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:423 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/polish.py:457 #, python-format msgid "Start polishing of %d book(s)" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:20 +msgid "Configure calibre" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/actions/preferences.py:20 msgid "Ctrl+P" msgstr "" @@ -5607,65 +5648,69 @@ msgstr "" msgid "Restart" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:20 -msgid "S" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:20 msgid "Save to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:29 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:21 +msgid "Export ebook files from the calibre library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:21 +msgid "S" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:30 msgid "Save to disk in a single directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:31 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:48 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:32 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:49 #, python-format msgid "Save only %s format to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:35 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:51 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:36 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:52 #, 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:38 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:39 msgid "Save single format to disk..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:60 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:61 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:82 msgid "Cannot save to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:64 msgid "Choose format to save to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:85 msgid "Choose destination directory" 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 "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:135 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:136 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:144 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:145 msgid "Click the show details button to see which ones." msgstr "" @@ -5678,6 +5723,10 @@ msgstr "" msgid "I" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:17 +msgid "Show the detailed metadata for the current book in a separate window" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:26 msgid "No detailed info available" msgstr "" @@ -5702,6 +5751,10 @@ msgstr "" msgid "Quickview is not available for books on the device." msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:17 +msgid "Show books similar to the current book" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:17 msgid "Similar books..." msgstr "" @@ -5746,6 +5799,10 @@ msgstr "" msgid "Get books" msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/store.py:20 +msgid "Search dozens of online ebook retailers for the cheapest books" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/actions/store.py:22 msgid "Search for ebooks" msgstr "" @@ -5911,21 +5968,25 @@ msgstr "" msgid "T" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:300 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:326 msgid "Cannot tweak Book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:310 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:339 msgid "Cannot Tweak Book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:311 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:340 msgid "" "The book must be in ePub, HTMLZ or AZW3 formats to tweak.\n" "\n" "First convert the book to one of these formats." msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:37 +msgid "Read books" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/actions/view.py:37 msgid "V" msgstr "" @@ -6169,10 +6230,10 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:95 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns_ui.py:97 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/search_ui.py:184 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:129 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:131 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:134 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:136 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:141 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:144 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:146 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:80 #: /home/kovid/work/calibre/src/calibre/gui2/shortcuts_ui.py:85 #: /home/kovid/work/calibre/src/calibre/gui2/store/config/chooser/chooser_widget_ui.py:79 @@ -6209,9 +6270,9 @@ msgstr "" msgid "Added %(num)d book(s) automatically from %(src)s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/bars.py:195 +#: /home/kovid/work/calibre/src/calibre/gui2/bars.py:224 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/plugin_updater.py:304 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:31 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:32 msgid "Donate" msgstr "" @@ -6371,7 +6432,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/sending_ui.py:68 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/server_ui.py:145 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/template_functions_ui.py:95 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:124 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:134 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks_ui.py:114 #: /home/kovid/work/calibre/src/calibre/gui2/store/basic_config_widget_ui.py:37 #: /home/kovid/work/calibre/src/calibre/gui2/store/config/chooser/chooser_widget_ui.py:77 @@ -9309,7 +9370,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/device_category_editor_ui.py:83 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor_ui.py:81 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:137 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:147 msgid "Ctrl+S" msgstr "" @@ -14960,101 +15021,105 @@ msgstr "" msgid "&Program Code: (be sure to follow python indenting rules)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:35 -msgid "Location Manager" +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:33 +msgid "Donate to support the development of calibre" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:36 +msgid "Location Manager" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:37 msgid "Switch between library and device views" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:42 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:43 msgid "Separator" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:220 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:221 msgid "The main toolbar" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:221 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:222 msgid "The main toolbar when a device is connected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:222 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:223 msgid "The optional second toolbar" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:223 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:224 msgid "The menubar" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:224 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:225 msgid "The menubar when a device is connected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:225 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:226 msgid "The context menu for the books in the calibre library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:227 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:228 msgid "The context menu for the books on the device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:229 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:230 msgid "The context menu for the cover browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:235 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:236 msgid "Click to choose toolbar or menu to customize" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:284 msgid "Cannot add" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:285 #, python-format msgid "Cannot add the actions %s to this location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:290 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:303 msgid "Cannot remove" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:291 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:304 #, python-format msgid "Cannot remove the actions %s from this location" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:135 msgid "

The toolbar in calibre is different depending on whether a device is connected or not. Choose which toolbar you would like to customize:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:136 msgid "Choose the toolbar to customize" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:127 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:137 msgid "A&vailable actions" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:128 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:138 msgid "Add selected actions to toolbar" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:130 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:140 msgid "Remove selected actions from toolbar" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:142 msgid "&Current actions" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:143 msgid "Move selected action up" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:135 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar_ui.py:145 msgid "Move selected action down" msgstr ""