diff --git a/src/calibre/customize/conversion.py b/src/calibre/customize/conversion.py index 88f19df7af..d035ad9666 100644 --- a/src/calibre/customize/conversion.py +++ b/src/calibre/customize/conversion.py @@ -261,7 +261,7 @@ class OutputFormatPlugin(Plugin): @property def description(self): - return _('Convert ebooks to the %s format'%self.file_type) + return _('Convert ebooks to the %s format')%self.file_type def __init__(self, *args): Plugin.__init__(self, *args) diff --git a/src/calibre/devices/kobo/driver.py b/src/calibre/devices/kobo/driver.py index 650e965941..e3019b8ced 100644 --- a/src/calibre/devices/kobo/driver.py +++ b/src/calibre/devices/kobo/driver.py @@ -125,9 +125,9 @@ class KOBO(USBMS): # this shows an expired Collection so the user can decide to delete the book if expired == 3: playlist_map[lpath].append('Expired') - # Favourites are supported on the touch but the data field is there on most earlier models + # A SHORTLIST is supported on the touch but the data field is there on most earlier models if favouritesindex == 1: - playlist_map[lpath].append('Favourite') + playlist_map[lpath].append('Shortlist') path = self.normalize_path(path) # print "Normalized FileName: " + path @@ -557,6 +557,7 @@ class KOBO(USBMS): if collections: # Process any collections that exist for category, books in collections.items(): + # debug_print (category) if category == 'Im_Reading': # Reset Im_Reading list in the database if oncard == 'carda': @@ -575,7 +576,8 @@ class KOBO(USBMS): for book in books: # debug_print('Title:', book.title, 'lpath:', book.path) - book.device_collections = ['Im_Reading'] + if 'Im_Reading' not in book.device_collections: + book.device_collections.append('Im_Reading') extension = os.path.splitext(book.path)[1] ContentType = self.get_content_type_from_extension(extension) if extension != '' else self.get_content_type_from_path(book.path) @@ -618,7 +620,8 @@ class KOBO(USBMS): for book in books: # debug_print('Title:', book.title, 'lpath:', book.path) - book.device_collections = ['Read'] + if 'Read' not in book.device_collections: + book.device_collections.append('Read') extension = os.path.splitext(book.path)[1] ContentType = self.get_content_type_from_extension(extension) if extension != '' else self.get_content_type_from_path(book.path) @@ -654,7 +657,8 @@ class KOBO(USBMS): for book in books: # debug_print('Title:', book.title, 'lpath:', book.path) - book.device_collections = ['Closed'] + if 'Closed' not in book.device_collections: + book.device_collections.append('Closed') extension = os.path.splitext(book.path)[1] ContentType = self.get_content_type_from_extension(extension) if extension != '' else self.get_content_type_from_path(book.path) @@ -672,6 +676,44 @@ class KOBO(USBMS): else: connection.commit() # debug_print('Database: Commit set ReadStatus as Closed') + if category == 'Shortlist': + # Reset FavouritesIndex list in the database + if oncard == 'carda': + query= 'update content set FavouritesIndex=-1 where BookID is Null and ContentID like \'file:///mnt/sd/%\'' + elif oncard != 'carda' and oncard != 'cardb': + query= 'update content set FavouritesIndex=-1 where BookID is Null and ContentID not like \'file:///mnt/sd/%\'' + + try: + cursor.execute (query) + except: + debug_print('Database Exception: Unable to reset Shortlist list') + raise + else: +# debug_print('Commit: Reset Shortlist list') + connection.commit() + + for book in books: +# debug_print('Title:', book.title, 'lpath:', book.path) + if 'Shortlist' not in book.device_collections: + book.device_collections.append('Shortlist') + # debug_print ("Shortlist found for: ", book.title) + extension = os.path.splitext(book.path)[1] + ContentType = self.get_content_type_from_extension(extension) if extension != '' else self.get_content_type_from_path(book.path) + + ContentID = self.contentid_from_path(book.path, ContentType) +# datelastread = time.strftime("%Y-%m-%dT%H:%M:%S", time.gmtime()) + + t = (ContentID,) + + try: + cursor.execute('update content set FavouritesIndex=1 where BookID is Null and ContentID = ?', t) + except: + debug_print('Database Exception: Unable set book as Shortlist') + raise + else: + connection.commit() +# debug_print('Database: Commit set Shortlist as Shortlist') + else: # No collections # Since no collections exist the ReadStatus needs to be reset to 0 (Unread) print "Reseting ReadStatus to 0" diff --git a/src/calibre/devices/teclast/driver.py b/src/calibre/devices/teclast/driver.py index 1bbab8e120..625c53ffb4 100644 --- a/src/calibre/devices/teclast/driver.py +++ b/src/calibre/devices/teclast/driver.py @@ -19,8 +19,9 @@ class TECLAST_K3(USBMS): PRODUCT_ID = [0x3203] BCD = [0x0000, 0x0100] - VENDOR_NAME = 'TECLAST' - WINDOWS_MAIN_MEM = WINDOWS_CARD_A_MEM = ['DIGITAL_PLAYER', 'TL-K5'] + VENDOR_NAME = ['TECLAST', 'IMAGIN'] + WINDOWS_MAIN_MEM = WINDOWS_CARD_A_MEM = ['DIGITAL_PLAYER', 'TL-K5', + 'EREADER'] MAIN_MEMORY_VOLUME_LABEL = 'K3 Main Memory' STORAGE_CARD_VOLUME_LABEL = 'K3 Storage Card' diff --git a/src/calibre/gui2/actions/show_quickview.py b/src/calibre/gui2/actions/show_quickview.py index 61a41b08ae..78352e6da8 100644 --- a/src/calibre/gui2/actions/show_quickview.py +++ b/src/calibre/gui2/actions/show_quickview.py @@ -13,8 +13,7 @@ from calibre.gui2 import error_dialog class ShowQuickviewAction(InterfaceAction): name = 'Show quickview' - action_spec = (_('Show quickview'), 'user_profile.png', None, - _('Q')) + action_spec = (_('Show quickview'), 'search.png', None, _('Q')) dont_add_to = frozenset(['menubar-device', 'toolbar-device', 'context-menu-device']) action_type = 'current' diff --git a/src/calibre/gui2/add.py b/src/calibre/gui2/add.py index 3dbf4b94df..3538f019ab 100644 --- a/src/calibre/gui2/add.py +++ b/src/calibre/gui2/add.py @@ -451,7 +451,8 @@ class Saver(QObject): # {{{ self.callback_called = False self.rq = Queue() self.ids = [x for x in map(db.id, [r.row() for r in rows]) if x is not None] - self.pd.set_max(len(self.ids)) + self.pd_max = len(self.ids) + self.pd.set_max(0) self.pd.value = 0 self.failures = set([]) @@ -510,6 +511,8 @@ class Saver(QObject): # {{{ id, title, ok, tb = self.rq.get_nowait() except Empty: return + if self.pd.max != self.pd_max: + self.pd.max = self.pd_max self.pd.value += 1 self.ids.remove(id) if not isinstance(title, unicode): diff --git a/src/calibre/gui2/custom_column_widgets.py b/src/calibre/gui2/custom_column_widgets.py index 4706cce4c9..732d30e7fb 100644 --- a/src/calibre/gui2/custom_column_widgets.py +++ b/src/calibre/gui2/custom_column_widgets.py @@ -25,7 +25,7 @@ class Base(object): def __init__(self, db, col_id, parent=None): self.db, self.col_id = db, col_id self.col_metadata = db.custom_column_num_map[col_id] - self.initial_val = None + self.initial_val = self.widgets = None self.setup_ui(parent) def initialize(self, book_id): @@ -54,6 +54,9 @@ class Base(object): def normalize_ui_val(self, val): return val + def break_cycles(self): + self.db = self.widgets = self.initial_val = None + class Bool(Base): def setup_ui(self, parent): diff --git a/src/calibre/gui2/dialogs/progress.py b/src/calibre/gui2/dialogs/progress.py index 553ee4b03b..552172e4b2 100644 --- a/src/calibre/gui2/dialogs/progress.py +++ b/src/calibre/gui2/dialogs/progress.py @@ -53,6 +53,13 @@ class ProgressDialog(QDialog, Ui_Dialog): def set_max(self, max): self.bar.setMaximum(max) + @dynamic_property + def max(self): + def fget(self): return self.bar.maximum() + def fset(self, val): self.bar.setMaximum(val) + return property(fget=fget, fset=fset) + + def _canceled(self, *args): self.canceled = True self.button_box.setDisabled(True) diff --git a/src/calibre/gui2/dialogs/quickview.py b/src/calibre/gui2/dialogs/quickview.py index 5dcdbf04fa..aff37ea152 100644 --- a/src/calibre/gui2/dialogs/quickview.py +++ b/src/calibre/gui2/dialogs/quickview.py @@ -5,23 +5,27 @@ __docformat__ = 'restructuredtext en' from PyQt4.Qt import (Qt, QDialog, QAbstractItemView, QTableWidgetItem, - QListWidgetItem, QByteArray, QModelIndex) + QListWidgetItem, QByteArray, QModelIndex, QCoreApplication) from calibre.gui2.dialogs.quickview_ui import Ui_Quickview from calibre.utils.icu import sort_key from calibre.gui2 import gprefs -class tableItem(QTableWidgetItem): +class TableItem(QTableWidgetItem): + ''' + A QTableWidgetItem that sorts on a separate string and uses ICU rules + ''' - def __init__(self, val): + def __init__(self, val, sort): + self.sort = sort QTableWidgetItem.__init__(self, val) self.setFlags(Qt.ItemIsEnabled|Qt.ItemIsSelectable) def __ge__(self, other): - return sort_key(unicode(self.text())) >= sort_key(unicode(other.text())) + return sort_key(self.sort) >= sort_key(other.sort) def __lt__(self, other): - return sort_key(unicode(self.text())) < sort_key(unicode(other.text())) + return sort_key(self.sort) < sort_key(other.sort) class Quickview(QDialog, Ui_Quickview): @@ -31,12 +35,16 @@ class Quickview(QDialog, Ui_Quickview): self.setupUi(self) self.isClosed = False + self.books_table_column_widths = None try: + self.books_table_column_widths = \ + gprefs.get('quickview_dialog_books_table_widths', None) geom = gprefs.get('quickview_dialog_geometry', bytearray('')) self.restoreGeometry(QByteArray(geom)) except: pass + # Remove the help button from the window title bar icon = self.windowIcon() self.setWindowFlags(self.windowFlags()&(~Qt.WindowContextHelpButtonHint)) self.setWindowIcon(icon) @@ -44,11 +52,16 @@ class Quickview(QDialog, Ui_Quickview): self.db = view.model().db self.view = view self.gui = gui + self.is_closed = False + self.current_book_id = None + self.current_key = None + self.use_current_key_for_next_refresh = False + self.last_search = None self.items.setSelectionMode(QAbstractItemView.SingleSelection) self.items.currentTextChanged.connect(self.item_selected) -# self.items.setFixedWidth(150) + # Set up the books table columns self.books_table.setSelectionBehavior(QAbstractItemView.SelectRows) self.books_table.setSelectionMode(QAbstractItemView.SingleSelection) self.books_table.setColumnCount(3) @@ -60,67 +73,81 @@ class Quickview(QDialog, Ui_Quickview): self.books_table.setHorizontalHeaderItem(2, t) self.books_table_header_height = self.books_table.height() self.books_table.cellDoubleClicked.connect(self.book_doubleclicked) + self.books_table.sortByColumn(0, Qt.AscendingOrder) - self.is_closed = False - self.current_book_id = None - self.current_key = None - self.use_current_key_for_next_refresh = False - self.last_search = None + # get the standard table row height. Do this here because calling + # resizeRowsToContents can word wrap long cell contents, creating + # double-high rows + self.books_table.setRowCount(1) + self.books_table.setItem(0, 0, TableItem('A', '')) + self.books_table.resizeRowsToContents() + self.books_table_row_height = self.books_table.rowHeight(0) + self.books_table.setRowCount(0) + # Add the data self.refresh(row) -# self.connect(self.view.selectionModel(), SIGNAL('currentChanged(QModelIndex,QModelIndex)'), self.slave) + self.view.selectionModel().currentChanged[QModelIndex,QModelIndex].connect(self.slave) + QCoreApplication.instance().aboutToQuit.connect(self.save_state) self.search_button.clicked.connect(self.do_search) + # search button def do_search(self): if self.last_search is not None: self.use_current_key_for_next_refresh = True self.gui.search.set_search_string(self.last_search) + # clicks on the items listWidget def item_selected(self, txt): self.fill_in_books_box(unicode(txt)) + # Given a cell in the library view, display the information def refresh(self, idx): bv_row = idx.row() key = self.view.model().column_map[idx.column()] book_id = self.view.model().id(bv_row) + # Double-clicking on a book to show it in the library view will result + # in a signal emitted for column 1 of the book row. Use the original + # column for this signal. if self.use_current_key_for_next_refresh: key = self.current_key self.use_current_key_for_next_refresh = False else: + # Only show items for categories if not self.db.field_metadata[key]['is_category']: if self.current_key is None: return key = self.current_key self.items_label.setText('{0} ({1})'.format( self.db.field_metadata[key]['name'], key)) + + self.items.blockSignals(True) self.items.clear() self.books_table.setRowCount(0) mi = self.db.get_metadata(book_id, index_is_id=True, get_user_categories=False) vals = mi.get(key, None) - if not vals: - return - if not isinstance(vals, list): - vals = [vals] - vals.sort(key=sort_key) + if vals: + if not isinstance(vals, list): + vals = [vals] + vals.sort(key=sort_key) - self.items.blockSignals(True) - for v in vals: - a = QListWidgetItem(v) - self.items.addItem(a) - self.items.setCurrentRow(0) + for v in vals: + a = QListWidgetItem(v) + self.items.addItem(a) + self.items.setCurrentRow(0) + + self.current_book_id = book_id + self.current_key = key + + self.fill_in_books_box(vals[0]) self.items.blockSignals(False) - self.current_book_id = book_id - self.current_key = key - - self.fill_in_books_box(vals[0]) - def fill_in_books_box(self, selected_item): + # Do a bit of fix-up on the items so that the search works. if selected_item.startswith('.'): sv = '.' + selected_item else: @@ -129,43 +156,82 @@ class Quickview(QDialog, Ui_Quickview): self.last_search = self.current_key+':"=' + sv + '"' books = self.db.search_getting_ids(self.last_search, self.db.data.search_restriction) + self.books_table.setRowCount(len(books)) self.books_label.setText(_('Books with selected item: {0}').format(len(books))) - select_row = None + select_item = None self.books_table.setSortingEnabled(False) for row, b in enumerate(books): mi = self.db.get_metadata(b, index_is_id=True, get_user_categories=False) - a = tableItem(mi.title) + a = TableItem(mi.title, mi.title_sort) a.setData(Qt.UserRole, b) self.books_table.setItem(row, 0, a) - a = tableItem(' & '.join(mi.authors)) + if b == self.current_book_id: + select_item = a + a = TableItem(' & '.join(mi.authors), mi.author_sort) self.books_table.setItem(row, 1, a) series = mi.format_field('series')[1] if series is None: series = '' - a = tableItem(series) + a = TableItem(series, series) self.books_table.setItem(row, 2, a) - if b == self.current_book_id: - select_row = row + self.books_table.setRowHeight(row, self.books_table_row_height) - self.books_table.resizeColumnsToContents() -# self.books_table.resizeRowsToContents() - - if select_row is not None: - self.books_table.selectRow(select_row) self.books_table.setSortingEnabled(True) + if select_item is not None: + self.books_table.setCurrentItem(select_item) + self.books_table.scrollToItem(select_item, QAbstractItemView.PositionAtCenter) + + # Deal with sizing the table columns. Done here because the numbers are not + # correct until the first paint. + def resizeEvent(self, *args): + QDialog.resizeEvent(self, *args) + if self.books_table_column_widths is not None: + for c,w in enumerate(self.books_table_column_widths): + self.books_table.setColumnWidth(c, w) + else: + # the vertical scroll bar might not be rendered, so might not yet + # have a width. Assume 25. Not a problem because user-changed column + # widths will be remembered + w = self.books_table.width() - 25 - self.books_table.verticalHeader().width() + w /= self.books_table.columnCount() + for c in range(0, self.books_table.columnCount()): + self.books_table.setColumnWidth(c, w) + self.save_state() def book_doubleclicked(self, row, column): self.use_current_key_for_next_refresh = True self.view.select_rows([self.books_table.item(row, 0).data(Qt.UserRole).toInt()[0]]) + # called when a book is clicked on the library view def slave(self, current, previous): + if self.is_closed: + return self.refresh(current) self.view.activateWindow() - def done(self, r): - geom = bytearray(self.saveGeometry()) - gprefs['quickview_dialog_geometry'] = geom + def save_state(self): + if self.is_closed: + return + self.books_table_column_widths = [] + for c in range(0, self.books_table.columnCount()): + self.books_table_column_widths.append(self.books_table.columnWidth(c)) + gprefs['quickview_dialog_books_table_widths'] = self.books_table_column_widths + gprefs['quickview_dialog_geometry'] = bytearray(self.saveGeometry()) + + def close(self): + self.save_state() + # clean up to prevent memory leaks + self.db = self.view = self.gui = None self.is_closed = True - QDialog.done(self, r) + + # called by the window system + def closeEvent(self, *args): + self.close() + QDialog.closeEvent(self, *args) + + # called by the close button + def reject(self): + self.close() + QDialog.reject(self) \ No newline at end of file diff --git a/src/calibre/gui2/metadata/basic_widgets.py b/src/calibre/gui2/metadata/basic_widgets.py index 303cc51c74..e00af37d33 100644 --- a/src/calibre/gui2/metadata/basic_widgets.py +++ b/src/calibre/gui2/metadata/basic_widgets.py @@ -21,9 +21,10 @@ from calibre.utils.config import tweaks, prefs from calibre.ebooks.metadata import (title_sort, authors_to_string, string_to_authors, check_isbn, authors_to_sort_string) from calibre.ebooks.metadata.meta import get_metadata -from calibre.gui2 import (file_icon_provider, UNDEFINED_QDATE, UNDEFINED_DATE, +from calibre.gui2 import (file_icon_provider, UNDEFINED_QDATE, choose_files, error_dialog, choose_images) -from calibre.utils.date import local_tz, qt_to_dt +from calibre.utils.date import (local_tz, qt_to_dt, as_local_time, + UNDEFINED_DATE) from calibre import strftime from calibre.ebooks import BOOK_EXTENSIONS from calibre.customize.ui import run_plugins_on_import @@ -125,6 +126,9 @@ class TitleEdit(EnLineEdit): return property(fget=fget, fset=fset) + def break_cycles(self): + self.dialog = None + class TitleSortEdit(TitleEdit): TITLE_ATTR = 'title_sort' @@ -150,6 +154,7 @@ class TitleSortEdit(TitleEdit): self.title_edit.textChanged.connect(self.update_state) self.textChanged.connect(self.update_state) + self.autogen_button = autogen_button autogen_button.clicked.connect(self.auto_generate) self.update_state() @@ -168,6 +173,9 @@ class TitleSortEdit(TitleEdit): def auto_generate(self, *args): self.current_val = title_sort(self.title_edit.current_val) + self.title_edit.textChanged.disconnect() + self.textChanged.disconnect() + self.autogen_button.clicked.disconnect() # }}} @@ -185,6 +193,7 @@ class AuthorsEdit(MultiCompleteComboBox): self.setWhatsThis(self.TOOLTIP) self.setEditable(True) self.setSizeAdjustPolicy(self.AdjustToMinimumContentsLengthWithIcon) + self.manage_authors_signal = manage_authors manage_authors.triggered.connect(self.manage_authors) def manage_authors(self): @@ -269,6 +278,10 @@ class AuthorsEdit(MultiCompleteComboBox): return property(fget=fget, fset=fset) + def break_cycles(self): + self.db = self.dialog = None + self.manage_authors_signal.triggered.disconnect() + class AuthorSortEdit(EnLineEdit): TOOLTIP = _('Specify how the author(s) of this book should be sorted. ' @@ -297,6 +310,10 @@ class AuthorSortEdit(EnLineEdit): self.authors_edit.editTextChanged.connect(self.update_state_and_val) self.textChanged.connect(self.update_state) + self.autogen_button = autogen_button + self.copy_a_to_as_action = copy_a_to_as_action + self.copy_as_to_a_action = copy_as_to_a_action + autogen_button.clicked.connect(self.auto_generate) copy_a_to_as_action.triggered.connect(self.auto_generate) copy_as_to_a_action.triggered.connect(self.copy_to_authors) @@ -368,6 +385,15 @@ class AuthorSortEdit(EnLineEdit): db.set_author_sort(id_, aus, notify=False, commit=False) return True + def break_cycles(self): + self.db = None + self.authors_edit.editTextChanged.disconnect() + self.textChanged.disconnect() + self.autogen_button.clicked.disconnect() + self.copy_a_to_as_action.triggered.disconnect() + self.copy_as_to_a_action.triggered.disconnect() + self.authors_edit = None + # }}} # Series {{{ @@ -427,6 +453,10 @@ class SeriesEdit(MultiCompleteComboBox): commit=True, allow_case_change=True) return True + def break_cycles(self): + self.dialog = None + + class SeriesIndexEdit(QDoubleSpinBox): TOOLTIP = '' @@ -488,6 +518,11 @@ class SeriesIndexEdit(QDoubleSpinBox): import traceback traceback.print_exc() + def break_cycles(self): + self.series_edit.currentIndexChanged.disconnect() + self.series_edit.editTextChanged.disconnect() + self.series_edit.lineEdit().editingFinished.disconnect() + self.db = self.series_edit = self.dialog = None # }}} @@ -699,6 +734,8 @@ class FormatsManager(QWidget): # {{{ if old != prefs['read_file_metadata']: prefs['read_file_metadata'] = old + def break_cycles(self): + self.dialog = None # }}} class Cover(ImageView): # {{{ @@ -860,6 +897,10 @@ class Cover(ImageView): # {{{ db.remove_cover(id_, notify=False, commit=False) return True + def break_cycles(self): + self.cover_changed.disconnect() + self.dialog = self._cdata = self.current_val = self.original_val = None + # }}} class CommentsEdit(Editor): # {{{ @@ -1211,6 +1252,7 @@ class DateEdit(QDateEdit): # {{{ def fset(self, val): if val is None: val = UNDEFINED_DATE + val = as_local_time(val) self.setDate(QDate(val.year, val.month, val.day)) return property(fget=fget, fset=fset) diff --git a/src/calibre/gui2/metadata/single.py b/src/calibre/gui2/metadata/single.py index d818f2db2a..950d3722e5 100644 --- a/src/calibre/gui2/metadata/single.py +++ b/src/calibre/gui2/metadata/single.py @@ -481,6 +481,13 @@ class MetadataSingleDialogBase(ResizableDialog): x = getattr(self, b, None) if x is not None: disconnect(x.clicked) + for widget in self.basic_metadata_widgets: + bc = getattr(widget, 'break_cycles', None) + if bc is not None and callable(bc): + bc() + for widget in getattr(self, 'custom_metadata_widgets', []): + widget.break_cycles() + # }}} class Splitter(QSplitter): diff --git a/src/calibre/gui2/preferences/coloring.py b/src/calibre/gui2/preferences/coloring.py index 3b581be701..ad636bd600 100644 --- a/src/calibre/gui2/preferences/coloring.py +++ b/src/calibre/gui2/preferences/coloring.py @@ -72,19 +72,27 @@ class ConditionEditor(QWidget): # {{{ self.l = l = QGridLayout(self) self.setLayout(l) - self.l1 = l1 = QLabel(_('If the ')) + texts = _('If the ___ column ___ values') + try: + one, two, three = texts.split('___') + except: + one, two, three = 'If the ', ' column ', ' value ' + + self.l1 = l1 = QLabel(one) l.addWidget(l1, 0, 0) self.column_box = QComboBox(self) l.addWidget(self.column_box, 0, 1) - self.l2 = l2 = QLabel(_(' column ')) + + + self.l2 = l2 = QLabel(two) l.addWidget(l2, 0, 2) self.action_box = QComboBox(self) l.addWidget(self.action_box, 0, 3) - self.l3 = l3 = QLabel(_(' value ')) + self.l3 = l3 = QLabel(three) l.addWidget(l3, 0, 4) self.value_box = QLineEdit(self) diff --git a/src/calibre/gui2/preferences/misc.py b/src/calibre/gui2/preferences/misc.py index 80bfdffcd8..60a4540b99 100644 --- a/src/calibre/gui2/preferences/misc.py +++ b/src/calibre/gui2/preferences/misc.py @@ -10,6 +10,7 @@ from calibre.gui2.preferences import ConfigWidgetBase, test_widget, Setting from calibre.gui2.preferences.misc_ui import Ui_Form from calibre.gui2 import error_dialog, config, open_local_file, info_dialog from calibre.constants import isosx +from calibre import get_proxies class WorkersSetting(Setting): @@ -33,6 +34,13 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): self.user_defined_device_button.clicked.connect(self.user_defined_device) self.button_osx_symlinks.clicked.connect(self.create_symlinks) self.button_osx_symlinks.setVisible(isosx) + proxies = get_proxies(debug=False) + txt = _('No proxies used') + if proxies: + lines = ['
%s: %s'%(t, p) for t, p in + proxies.iteritems()] + txt = _('Using proxies:') + ''.join(lines) + self.proxies.setText(txt) def debug_device_detection(self, *args): from calibre.gui2.preferences.device_debug import DebugDevice diff --git a/src/calibre/gui2/preferences/misc.ui b/src/calibre/gui2/preferences/misc.ui index 843f0f01b7..dd9b984d48 100644 --- a/src/calibre/gui2/preferences/misc.ui +++ b/src/calibre/gui2/preferences/misc.ui @@ -118,7 +118,7 @@ - + Qt::Vertical @@ -131,6 +131,13 @@ + + + + + + + diff --git a/src/calibre/gui2/tag_view.py b/src/calibre/gui2/tag_view.py index 3b8c27866c..c3f17105dc 100644 --- a/src/calibre/gui2/tag_view.py +++ b/src/calibre/gui2/tag_view.py @@ -627,7 +627,8 @@ class TagTreeItem(object): # {{{ except: pass self.parent = self.icon_state_map = self.bold_font = self.tag = \ - self.icon = self.children = None + self.icon = self.children = self.tooltip = \ + self.py_name = self.id_set = self.category_key = None def __str__(self): if self.type == self.ROOT: @@ -1121,7 +1122,7 @@ class TagsModel(QAbstractItemModel): # {{{ self.search_restriction = s def get_node_tree(self, sort): - old_row_map = self.row_map[:] + old_row_map_len = len(self.row_map) self.row_map = [] self.categories = {} @@ -1176,7 +1177,7 @@ class TagsModel(QAbstractItemModel): # {{{ self.row_map.append(category) self.categories[category] = tb_categories[category]['name'] - if len(old_row_map) != 0 and len(old_row_map) != len(self.row_map): + if old_row_map_len != 0 and old_row_map_len != len(self.row_map): # A category has been added or removed. We must force a rebuild of # the model return None @@ -1367,6 +1368,9 @@ class TagsModel(QAbstractItemModel): # {{{ self.beginRemoveRows(self.createIndex(category.row(), 0, category), start, len(child_map)-1) category.children = ctags + for i in range(start, len(child_map)): + child_map[i].break_cycles() + child_map = None self.endRemoveRows() else: state_map = {} diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 4c61438e35..c9ed5c250a 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -7,7 +7,7 @@ __docformat__ = 'restructuredtext en' The database used to store ebook metadata ''' import os, sys, shutil, cStringIO, glob, time, functools, traceback, re, \ - json, uuid, tempfile + json, uuid, tempfile, hashlib import threading, random from itertools import repeat from math import ceil @@ -1118,9 +1118,31 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): return self.format_abspath(index, format, index_is_id) is not None def format_last_modified(self, id_, fmt): + m = self.format_metadata(id_, fmt) + if m: + return m['mtime'] + + def format_metadata(self, id_, fmt): path = self.format_abspath(id_, fmt, index_is_id=True) + ans = {} if path is not None: - return utcfromtimestamp(os.stat(path).st_mtime) + stat = os.stat(path) + ans['size'] = stat.st_size + ans['mtime'] = utcfromtimestamp(stat.st_mtime) + return ans + + def format_hash(self, id_, fmt): + path = self.format_abspath(id_, fmt, index_is_id=True) + if path is None: + raise NoSuchFormat('Record %d has no fmt: %s'%(id_, fmt)) + sha = hashlib.sha256() + with lopen(path, 'rb') as f: + while True: + raw = f.read(SPOOL_SIZE) + sha.update(raw) + if len(raw) < SPOOL_SIZE: + break + return sha.hexdigest() def format_abspath(self, index, format, index_is_id=False): ''' diff --git a/src/calibre/translations/calibre.pot b/src/calibre/translations/calibre.pot index bb43ff39be..c371179704 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.6\n" -"POT-Creation-Date: 2011-06-17 11:28+MDT\n" -"PO-Revision-Date: 2011-06-17 11:28+MDT\n" +"POT-Creation-Date: 2011-06-22 18:55+MDT\n" +"PO-Revision-Date: 2011-06-22 18:55+MDT\n" "Last-Translator: Automatically generated\n" "Language-Team: LANGUAGE\n" "MIME-Version: 1.0\n" @@ -25,7 +25,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:74 #: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:77 #: /home/kovid/work/calibre/src/calibre/devices/kobo/books.py:24 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:488 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:518 #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:70 #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:71 #: /home/kovid/work/calibre/src/calibre/devices/prs500/books.py:267 @@ -93,7 +93,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:101 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1001 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1006 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1072 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1078 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:144 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:151 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:65 @@ -126,8 +126,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:362 #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:370 #: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:156 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:364 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:367 +#: /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/add.py:160 #: /home/kovid/work/calibre/src/calibre/gui2/add.py:167 #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:519 @@ -135,21 +135,21 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:122 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:151 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:153 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1131 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1134 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1168 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1171 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_empty_book.py:56 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/add_empty_book.py:68 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:127 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:47 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:366 -#: /home/kovid/work/calibre/src/calibre/gui2/email.py:184 -#: /home/kovid/work/calibre/src/calibre/gui2/email.py:199 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:408 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1023 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1203 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1206 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1209 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1294 +#: /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:403 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1010 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1190 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1193 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1196 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1281 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:82 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:212 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:231 @@ -162,14 +162,16 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:200 #: /home/kovid/work/calibre/src/calibre/library/cli.py:217 #: /home/kovid/work/calibre/src/calibre/library/database.py:914 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:534 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:542 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:553 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1839 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1976 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2983 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2985 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:3118 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:532 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:540 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:551 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1932 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2078 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:3085 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:3087 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:3220 +#: /home/kovid/work/calibre/src/calibre/library/server/content.py:212 +#: /home/kovid/work/calibre/src/calibre/library/server/content.py:213 #: /home/kovid/work/calibre/src/calibre/library/server/mobile.py:233 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:156 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:159 @@ -303,191 +305,296 @@ msgstr "" msgid "Set metadata from %s files" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:892 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:765 +msgid "Add books to calibre or the connected device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:770 +msgid "Fetch annotations from a connected Kindle (experimental)" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:775 +msgid "Generate a catalog of the books in your calibre library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:780 +msgid "Convert books to various ebook formats" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:785 +msgid "Delete books from your calibre library or connected device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:790 +msgid "Edit the metadata of books in your calibre library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:795 +msgid "Read books in your calibre library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:800 +msgid "Download news from the internet in ebook form" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:805 +msgid "Show a list of related books quickly" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:810 +msgid "Export books from your calibre library to the hard disk" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:815 +msgid "Show book details in a separate popup" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:820 +msgid "Restart calibre" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:825 +msgid "Open the folder that contains the book files in your calibre library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:831 +msgid "Send books to the connected device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:836 +msgid "Send books via email or the web also connect to iTunes or folders on your computer as if they are devices" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:842 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/help.py:16 +msgid "Browse the calibre User Manual" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:847 +msgid "Customize calibre" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:852 +msgid "Easily find books similar to the currently selected one" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:857 +msgid "Switch between different calibre libraries and perform maintenance on them" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:863 +msgid "Copy books from the devce to your calibre library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:868 +msgid "Edit the collections in which books are placed on your device" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:873 +msgid "Copy a book from one calibre library to another" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:878 +msgid "Make small twekas to epub files in your calibre library" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:883 +msgid "Find the next or previous match when searching in your calibre library in highlight mode" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:890 +msgid "Search for books from different book sellers" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:906 +msgid "Get new calibre plugins or update your existing ones" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:925 msgid "Look and Feel" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:894 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:906 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:917 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:928 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:940 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:927 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:939 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:950 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:961 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:973 msgid "Interface" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:898 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:931 msgid "Adjust the look and feel of the calibre interface to suit your tastes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:904 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:937 msgid "Behavior" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:910 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:943 msgid "Change the way calibre behaves" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:915 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:948 #: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:225 msgid "Add your own columns" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:921 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:954 msgid "Add/remove your own columns to the calibre book list" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:926 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:959 msgid "Toolbar" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:932 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:965 msgid "Customize the toolbars and context menus, changing which actions are available in each" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:938 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:971 msgid "Searching" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:944 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:977 msgid "Customize the way searching for books works in calibre" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:949 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:982 msgid "Input Options" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:951 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:962 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:973 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:984 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:995 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1006 msgid "Conversion" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:955 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:988 msgid "Set conversion options specific to each input format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:960 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:993 msgid "Common Options" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:966 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:999 msgid "Set conversion options common to all formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:971 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1004 msgid "Output Options" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:977 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1010 msgid "Set conversion options specific to each output format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:982 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1015 msgid "Adding books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:984 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:996 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1008 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1020 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1017 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1029 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1041 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1053 msgid "Import/Export" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:988 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1021 msgid "Control how calibre reads metadata from files when adding books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:994 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1027 msgid "Saving books to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1000 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1033 msgid "Control how calibre exports files from its database to disk when using Save to disk" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1006 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1039 msgid "Sending books to devices" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1012 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1045 msgid "Control how calibre transfers files to your ebook reader" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1018 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1051 msgid "Metadata plugboards" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1024 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1057 msgid "Change metadata fields before saving/sending" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1029 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1062 msgid "Template Functions" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1031 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1078 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1090 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1101 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1064 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1111 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1123 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1134 msgid "Advanced" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1035 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1068 msgid "Create your own template functions" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1040 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1073 msgid "Sharing books by email" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1042 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1054 -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1067 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1075 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1087 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1100 msgid "Sharing" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1046 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1079 msgid "Setup sharing of books via email. Can be used for automatic sending of downloaded news to your devices" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1052 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1085 msgid "Sharing over the net" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1058 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1091 msgid "Setup the calibre Content Server which will give you access to your calibre library from anywhere, on any device, over the internet" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1065 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1098 msgid "Metadata download" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1071 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1104 msgid "Control how calibre downloads ebook metadata from the net" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1076 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1109 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:275 msgid "Plugins" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1082 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1115 msgid "Add/remove/customize various bits of calibre functionality" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1088 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1121 msgid "Tweaks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1094 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1127 msgid "Fine tune how calibre behaves in various contexts" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1099 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1132 msgid "Miscellaneous" msgstr "" -#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1105 +#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:1138 msgid "Miscellaneous advanced configuration" msgstr "" @@ -507,6 +614,10 @@ msgstr "" msgid "If specified, the output plugin will try to create output that is as human readable as possible. May not have any effect for some output plugins." msgstr "" +#: /home/kovid/work/calibre/src/calibre/customize/conversion.py:264 +msgid "Convert ebooks to the %s format" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:49 msgid "Input profile" msgstr "" @@ -696,6 +807,16 @@ msgstr "" msgid "Disable the named plugin" msgstr "" +#: /home/kovid/work/calibre/src/calibre/db/backend.py:195 +#: /home/kovid/work/calibre/src/calibre/db/backend.py:204 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:662 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:127 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:136 +msgid "Path to library too long. Must be less than %d characters." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/debug.py:154 msgid "Debug log" msgstr "" @@ -724,73 +845,73 @@ msgstr "" msgid "Enable Apple driver" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:117 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:118 msgid "Use Series as Category in iTunes/iBooks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:118 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:119 msgid "Enable to use the series name as the iTunes Genre, iBooks Category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:120 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:121 msgid "Cache covers from iTunes/iBooks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:122 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:123 msgid "Enable to cache and display covers from iTunes/iBooks" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:179 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:180 msgid "Apple device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:181 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:182 msgid "Communicate with iTunes/iBooks." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:193 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:194 msgid "Apple device detected, launching iTunes, please wait ..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:195 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:196 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:358 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:361 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:359 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:362 msgid "Updating device metadata listing..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:437 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:476 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:1058 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:1102 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:3108 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:3148 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:438 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:477 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:1059 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:1103 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:3109 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:3149 msgid "%d of %d" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:483 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:1107 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:3154 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:484 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:1108 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:3155 #: /home/kovid/work/calibre/src/calibre/gui2/ebook_download.py:106 msgid "finished" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:668 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:669 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:1019 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:1020 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:2679 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2680 #: /home/kovid/work/calibre/src/calibre/devices/nook/driver.py:102 #: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:447 #: /home/kovid/work/calibre/src/calibre/devices/prs505/sony_cache.py:470 @@ -799,22 +920,24 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:951 #: /home/kovid/work/calibre/src/calibre/gui2/actions/fetch_news.py:73 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:445 -#: /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:2847 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1657 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1659 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:328 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:341 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2949 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:170 msgid "News" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2680 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2681 #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_epub_mobi.py:65 #: /home/kovid/work/calibre/src/calibre/library/catalog.py:652 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2807 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2825 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2909 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2927 msgid "Catalog" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:3010 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:3011 msgid "Communicate with iTunes." msgstr "" @@ -853,7 +976,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:67 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:70 #: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:73 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:232 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:255 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:122 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:125 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:128 @@ -873,8 +996,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:285 #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:299 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:349 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:384 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:376 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:411 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:279 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:310 msgid "Adding books to device metadata listing..." @@ -884,8 +1007,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:309 #: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:114 #: /home/kovid/work/calibre/src/calibre/devices/hanvon/driver.py:125 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:301 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:333 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:328 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:360 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:316 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:334 msgid "Removing books from device..." @@ -893,8 +1016,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:324 #: /home/kovid/work/calibre/src/calibre/devices/bambook/driver.py:329 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:337 -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:344 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:364 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:371 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:341 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:346 msgid "Removing books from device metadata listing..." @@ -1112,12 +1235,12 @@ msgstr "" msgid "The Kobo supports only one collection currently: the \"Im_Reading\" list. Create a tag called \"Im_Reading\" " msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:468 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:498 #: /home/kovid/work/calibre/src/calibre/gui2/actions/add.py:388 msgid "Not Implemented" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:469 +#: /home/kovid/work/calibre/src/calibre/devices/kobo/driver.py:499 msgid "\".kobo\" files do not exist on the device as books instead, they are rows in the sqlite database. Currently they cannot be exported or viewed." msgstr "" @@ -1950,7 +2073,7 @@ msgstr "" msgid "Fix unmanifested files. epub-fix can either add them to the manifest or delete them as specified by the delete unmanifested option." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/unmanifested.py:32 +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/unmanifested.py:36 msgid "Delete unmanifested files instead of adding them to the manifest" msgstr "" @@ -2328,8 +2451,9 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:733 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/manipulate/info.py:45 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:75 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:65 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1028 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/quickview.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1015 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/single_download.py:133 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/metadata_sources.py:152 #: /home/kovid/work/calibre/src/calibre/gui2/store/mobileread/models.py:23 @@ -2340,14 +2464,14 @@ msgid "Title" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:734 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:67 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1029 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:58 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1016 #: /home/kovid/work/calibre/src/calibre/gui2/store/mobileread/models.py:23 msgid "Author(s)" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:735 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:72 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:63 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/metadata_sources.py:149 msgid "Publisher" msgstr "" @@ -2367,7 +2491,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:739 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:170 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:73 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:64 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:70 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/metadata_sources.py:151 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:184 @@ -2377,8 +2501,9 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:741 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/quickview.py:72 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:74 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:65 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:70 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/metadata_sources.py:153 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:123 @@ -2396,7 +2521,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:746 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:167 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:61 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/single_download.py:133 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:288 msgid "Published" @@ -2497,7 +2622,7 @@ msgid "" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:1363 -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1493 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1499 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/single.py:891 #: /home/kovid/work/calibre/src/calibre/gui2/store/search/models.py:36 msgid "Cover" @@ -2629,70 +2754,70 @@ msgstr "" msgid "This is an Amazon Topaz book. It cannot be processed." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1494 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1500 msgid "Title Page" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1495 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1501 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/htmltoc.py:15 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:56 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main_ui.py:199 msgid "Table of Contents" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1496 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1502 msgid "Index" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1497 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1503 msgid "Glossary" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1498 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1504 msgid "Acknowledgements" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1499 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1505 msgid "Bibliography" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1500 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1506 msgid "Colophon" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1501 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1507 msgid "Copyright" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1502 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1508 msgid "Dedication" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1503 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1509 msgid "Epigraph" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1504 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1510 msgid "Foreword" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1505 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1511 msgid "List of Illustrations" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1506 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1512 msgid "List of Tables" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1507 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1513 msgid "Notes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1508 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1514 msgid "Preface" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1509 +#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:1515 msgid "Main Text" msgstr "" @@ -2702,7 +2827,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/cover.py:98 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:176 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:805 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:806 msgid "Book %s of %s" msgstr "" @@ -2711,7 +2836,7 @@ msgid "HTML TOC generation options." msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:169 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:62 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:71 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/metadata_sources.py:150 #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:759 @@ -3373,7 +3498,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/store.py:83 #: /home/kovid/work/calibre/src/calibre/gui2/actions/store.py:102 #: /home/kovid/work/calibre/src/calibre/gui2/actions/store.py:111 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:28 +#: /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 msgid "No book selected" @@ -3396,7 +3521,7 @@ msgid "Add books to your calibre library from the connected device" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:20 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:553 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:591 msgid "Fetch annotations (experimental)" msgstr "" @@ -3421,11 +3546,11 @@ 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:127 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:72 -#: /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:257 +#: /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:91 msgid "No books selected" msgstr "" @@ -3567,14 +3692,6 @@ msgstr "" msgid "Too long" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:236 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/choose_library.py:71 -#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:662 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:127 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:136 -msgid "Path to library too long. Must be less than %d characters." -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:243 msgid "Rename failed" msgstr "" @@ -3589,8 +3706,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/plugin_updater.py:674 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/restore_library.py:78 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:368 -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:459 -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:465 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:463 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:469 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/columns.py:102 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:281 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:242 @@ -3639,9 +3756,9 @@ msgid "Found no errors in your calibre library database. Do you want calibre to msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:336 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:150 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:703 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:965 +#: /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:966 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/restore_library.py:101 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks.py:277 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/tweaks.py:317 @@ -3670,7 +3787,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:419 #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:424 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:167 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:177 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:100 #: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:862 msgid "Not allowed" @@ -3713,44 +3830,44 @@ msgstr "" msgid "Empty output file, probably the conversion process crashed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:83 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:93 msgid "Copy to library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:84 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:94 msgid "Copy selected books to the specified library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:117 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:127 msgid "(delete after copy)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:126 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:136 msgid "Cannot copy" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:131 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:141 msgid "No library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:142 msgid "No library found at %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:135 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:139 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:145 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:149 msgid "Copying" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:150 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:160 msgid "Could not copy books: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:153 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:163 msgid "Copied %d books to %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:168 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:178 msgid "You cannot use other libraries while using the environment variable CALIBRE_OVERRIDE_DATABASE_PATH." msgstr "" @@ -3835,14 +3952,14 @@ msgid "Main memory" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/delete.py:216 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:478 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:487 +#: /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:217 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:480 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:489 +#: /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 "" @@ -3939,133 +4056,133 @@ msgstr "" msgid "Manage the collections on this device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:24 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:25 msgid "E" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:24 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:25 msgid "Edit metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:28 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:29 msgid "Merge book records" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:29 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:30 msgid "M" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:31 +#: /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:34 +#: /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:37 +#: /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:42 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:43 msgid "Merge into first selected book - delete others" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:45 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:46 msgid "Merge into first selected book - keep 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:50 msgid "Merge only formats into first selected book - delete others" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:71 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:72 msgid "Cannot download metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:81 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:82 msgid "Failed to download metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:87 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:88 #: /home/kovid/work/calibre/src/calibre/gui2/dnd.py:84 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/single_download.py:468 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/single_download.py:716 msgid "Download failed" 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 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:91 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:92 msgid "Metadata download completed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:93 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:94 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:100 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:101 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:107 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:108 msgid "Download complete" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:108 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/single_download.py:777 msgid "Download log" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:136 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:137 msgid "Some books changed" 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 "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:155 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:219 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:156 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:220 msgid "Cannot edit metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:256 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:259 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:257 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:260 msgid "Cannot merge books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:261 msgid "At least two books must be selected for merging" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:264 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:271 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:272 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:283 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:284 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:299 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/edit_metadata.py:300 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:456 +#: /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:529 +#: /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:530 +#: /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 "" @@ -4085,10 +4202,6 @@ msgstr "" msgid " fetched." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/help.py:16 -msgid "Browse the calibre User Manual" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/actions/help.py:16 msgid "F1" msgstr "" @@ -4256,6 +4369,22 @@ msgstr "" msgid "No detailed information is available for books on the device." msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/actions/show_quickview.py:16 +msgid "Q" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/show_quickview.py:16 +msgid "Show quickview" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/show_quickview.py:31 +msgid "No quickview available" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/actions/show_quickview.py:32 +msgid "Quickview is not available for books on the device." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/actions/similar_books.py:17 msgid "Similar books..." msgstr "" @@ -4350,25 +4479,25 @@ msgstr "" msgid "About Get Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:15 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:17 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tweak_epub_ui.py:60 msgid "Tweak ePub" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:16 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:18 msgid "Make small changes to ePub format books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:17 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:19 msgid "T" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:27 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:39 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:29 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:41 msgid "Cannot tweak ePub" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:40 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/tweak_epub.py:42 msgid "No ePub available. First convert the book to ePub." msgstr "" @@ -4457,7 +4586,7 @@ msgid "The specified directory could not be processed." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/add.py:274 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:856 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:895 msgid "No books" msgstr "" @@ -4493,7 +4622,11 @@ msgstr "" msgid "Saving..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/add.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:448 +msgid "Collecting data, please wait..." +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/add.py:517 msgid "Saved" msgstr "" @@ -4651,7 +4784,7 @@ msgid "Book %s of %s" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:144 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1032 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1019 msgid "Collections" msgstr "" @@ -4765,7 +4898,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/email_ui.py:65 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/look_feel_ui.py:197 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/metadata_sources_ui.py:115 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc_ui.py:61 +#: /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 @@ -5203,7 +5336,7 @@ msgid "Bulk Convert" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/bulk.py:89 -#: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:185 msgid "Options specific to the output format." msgstr "" @@ -5659,33 +5792,33 @@ msgid "Set the metadata. The output file will contain as much of this metadata a msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:180 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:748 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:749 msgid "Choose cover for " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:187 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:756 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:757 msgid "Cannot read" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:188 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:757 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:758 msgid "You do not have permission to read the file: " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:196 #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:203 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:765 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:766 msgid "Error reading file" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:197 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:766 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:767 msgid "

There was an error reading from file:
" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata.py:204 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:776 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:777 msgid " is not a valid picture" msgstr "" @@ -5738,7 +5871,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/metadata_ui.py:171 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:537 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:931 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:932 msgid "Tags categorize the book. This is particularly useful while searching.

They can be any words or phrases, separated by commas." msgstr "" @@ -5921,7 +6054,7 @@ msgstr "" msgid "Cannot build regex using the GUI builder without a book." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:153 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:158 msgid "Open book" msgstr "" @@ -6019,11 +6152,11 @@ msgstr "" msgid "

Search and replace uses regular expressions. See the regular expressions tutorial to get started with regular expressions. Also clicking the wizard buttons below will allow you to test your regular expression against the current input document." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:173 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:169 msgid "Convert" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:200 +#: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:196 msgid "Options specific to the input format." msgstr "" @@ -6353,14 +6486,14 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:606 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:629 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:680 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:306 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:311 +#: /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 #: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:148 #: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:230 #: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:279 #: /home/kovid/work/calibre/src/calibre/gui2/library/delegates.py:283 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1197 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1198 msgid "Undefined" msgstr "" @@ -6429,177 +6562,177 @@ msgstr "" msgid "No details available." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:177 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:188 msgid "Device no longer connected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:301 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:325 msgid "Get device information" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:315 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:340 msgid "Get list of books on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:325 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:350 msgid "Get annotations from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:337 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:362 msgid "Send metadata to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:342 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:367 msgid "Send collections to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:378 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:413 msgid "Upload %d books to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:393 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:429 msgid "Delete books from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:410 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:447 msgid "Download books from device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:420 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:458 msgid "View book on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:461 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:499 msgid "Set default send to device action" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:467 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:505 msgid "Send to main memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:469 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:507 msgid "Send to storage card A" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:471 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:509 msgid "Send to storage card B" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:476 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:485 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:514 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:523 msgid "Main Memory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:497 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:535 msgid "Send specific format to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:498 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:536 msgid "Send and delete from library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:541 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:579 msgid "Eject device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:622 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:55 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:660 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:63 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:315 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:54 msgid "Error" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:623 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:661 msgid "Error communicating with device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:642 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1181 -#: /home/kovid/work/calibre/src/calibre/gui2/email.py:253 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:680 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1218 +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:254 msgid "No suitable formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:658 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:696 msgid "Select folder to open as device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:709 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:747 msgid "Error talking to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:710 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:748 msgid "There was a temporary error talking to the device. Please unplug and reconnect the device and or reboot." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:753 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:791 msgid "Device: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:755 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:793 msgid " detected." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:857 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:896 msgid "selected to send" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:876 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:915 msgid "%i of %i Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:879 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:918 msgid "0 of %i Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:880 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:919 msgid "Choose format to send to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:888 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:927 msgid "No device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:889 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:928 msgid "Cannot send: No device is connected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:892 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:896 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:931 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:935 msgid "No card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:893 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:897 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:932 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:936 msgid "Cannot send: Device has no storage card" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:958 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1041 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1175 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:997 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1080 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1212 msgid "Auto convert the following books before uploading to the device?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:987 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1026 msgid "Sending catalogs to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1088 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1125 msgid "Sending news to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1142 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1179 msgid "Sending books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1182 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1219 msgid "Could not upload the following books to the device, as no suitable formats were found. Convert the book(s) to a format supported by your device first." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1254 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1292 msgid "No space on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1255 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1293 msgid "

Cannot upload books to device there is no more free space available " msgstr "" @@ -6699,7 +6832,7 @@ msgid "My Books" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/catalog_ui.py:92 -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:314 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:320 msgid "Generate catalog" msgstr "" @@ -7057,8 +7190,8 @@ msgstr "" #: #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/delete_matching_from_device.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:69 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1030 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1017 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:35 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:76 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:338 @@ -7102,14 +7235,14 @@ msgstr "" #: #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:121 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:261 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:262 #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:429 msgid "Upper Case" msgstr "" #: #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:122 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:261 #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:430 msgid "Lower Case" msgstr "" @@ -7122,14 +7255,14 @@ msgstr "" #: #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:124 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:262 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:263 #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:432 msgid "Title Case" msgstr "" #: #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:125 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:264 #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:433 msgid "Capitalize" msgstr "" @@ -7146,13 +7279,13 @@ msgstr "" #: #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:271 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1439 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1449 msgid "Invalid author name" msgstr "" #: #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog.py:272 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1440 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1450 msgid "Author names cannot contain & characters." msgstr "" @@ -7170,7 +7303,7 @@ msgstr "" #: #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/edit_authors_dialog_ui.py:90 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2111 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2130 msgid "F&ind" msgstr "" @@ -7285,109 +7418,109 @@ msgstr "" msgid "Working" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:266 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:267 msgid "Character match" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:267 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:268 msgid "Regular Expression" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:270 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:271 msgid "Replace field" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:271 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:272 msgid "Prepend to field" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:273 msgid "Append to field" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:283 msgid "Editing meta information for %d books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:323 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:324 msgid "Immediately make all changes without closing the dialog. This operation cannot be canceled or undone" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:382 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:383 msgid "Book %d:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:400 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:401 msgid "Enter an identifier type" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:405 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:406 msgid "You can destroy your library using this feature. Changes are permanent. There is no undo function. You are strongly encouraged to back up your library before proceeding.

Search and replace in text fields using character matching or regular expressions. " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:413 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:414 msgid "In character mode, the field is searched for the entered search text. The text is replaced by the specified replacement text everywhere it is found in the specified field. After replacement is finished, the text can be changed to upper-case, lower-case, or title-case. If the case-sensitive check box is checked, the search text must match exactly. If it is unchecked, the search text will match both upper- and lower-case letters" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:424 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:425 msgid "In regular expression mode, the search text is an arbitrary python-compatible regular expression. The replacement text can contain backreferences to parenthesized expressions in the pattern. The search is not anchored, and can match and replace multiple times on the same string. The modification functions (lower-case etc) are applied to the matched text, not to the field as a whole. The destination box specifies the field where the result after matching and replacement is to be assigned. You can replace the text in the field, or prepend or append the matched text. See this reference for more information on python's regular expressions, and in particular the 'sub' function." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:502 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:503 msgid "S/R TEMPLATE ERROR" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:648 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:649 msgid "You must specify a destination when source is a composite field" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:654 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:655 msgid "You must specify a destination identifier type" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:752 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:771 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:898 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:753 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:772 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:899 msgid "Search/replace invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:753 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:754 msgid "Authors cannot be set to the empty string. Book title %s not processed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:772 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:773 msgid "Title cannot be set to the empty string. Book title %s not processed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:899 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:900 msgid "Search pattern is invalid: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:951 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:952 msgid "" "Applying changes to %d books.\n" "Phase {0} {1}%%." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:981 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:982 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:587 msgid "Delete saved search/replace" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:982 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:983 msgid "The selected saved search/replace will be deleted. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:999 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:1007 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:1000 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:1008 msgid "Save search/replace" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:1000 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:1001 msgid "Search/replace name:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:1008 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:1009 msgid "That saved search/replace already exists and will be overwritten. Are you sure?" msgstr "" @@ -7412,13 +7545,13 @@ msgid "Specify how the author(s) of this book should be sorted. For example Char msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:530 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:889 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:890 msgid "&Rating:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:531 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:532 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:890 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:891 msgid "Rating of this book. 0-5 stars" msgstr "" @@ -7488,7 +7621,7 @@ msgid "&Force numbers to start with:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk_ui.py:558 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1181 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1182 msgid "&Date:" msgstr "" @@ -8034,6 +8167,41 @@ msgstr "" msgid "Aborting..." msgstr "" +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/quickview.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/metadata_sources.py:146 +#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:111 +msgid "Authors" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/quickview.py:161 +msgid "Books with selected item: {0}" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/quickview_ui.py:75 +msgid "Quickview" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/quickview_ui.py:76 +msgid "Items" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/quickview_ui.py:77 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:95 +#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:279 +#: /home/kovid/work/calibre/src/calibre/gui2/store/config/chooser/chooser_widget_ui.py:80 +#: /home/kovid/work/calibre/src/calibre/gui2/store/mobileread/store_dialog_ui.py:76 +#: /home/kovid/work/calibre/src/calibre/gui2/store/search/search_ui.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/store/search_ui.py:109 +#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:670 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:280 +msgid "Search" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/quickview_ui.py:78 +msgid "Search in the library view for the selected item" +msgstr "" + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/restore_library.py:23 msgid "Restoring database from backups, do not interrupt, this will happen in three stages" msgstr "" @@ -8460,7 +8628,7 @@ msgid "&Author:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_ui.py:215 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:930 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:931 msgid "Ta&gs:" msgstr "" @@ -8499,12 +8667,6 @@ msgstr "" msgid "Choose formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/metadata_sources.py:146 -#: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:111 -msgid "Authors" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_categories.py:60 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:147 msgid "Publishers" @@ -8645,12 +8807,12 @@ msgid "%s (was %s)" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:85 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1385 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1395 msgid "Item is blank" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:86 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1386 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1396 msgid "An item cannot be set to nothing. Delete it instead." msgstr "" @@ -8724,7 +8886,7 @@ msgid "The template box cannot be empty" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/template_dialog_ui.py:97 -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:244 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:252 msgid "Set the color of the column:" msgstr "" @@ -9034,44 +9196,44 @@ msgstr "" msgid "Attached is the %s periodical downloaded by calibre." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/email.py:192 +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:193 msgid "E-book:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/email.py:200 +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:201 msgid "Attached, you will find the e-book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/email.py:201 +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:202 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:189 msgid "by" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/email.py:202 +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:203 msgid "in the %s format." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/email.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:217 msgid "Sending email to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/email.py:247 +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:248 msgid "Auto convert the following books before sending via email?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/email.py:254 +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:255 msgid "Could not email the following books as no suitable formats were found:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/email.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:261 msgid "Failed to email book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/email.py:263 +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:264 msgid "sent" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/email.py:286 +#: /home/kovid/work/calibre/src/calibre/gui2/email.py:287 msgid "Sent news to" msgstr "" @@ -9139,7 +9301,7 @@ msgid "Regular expression (?P)" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:149 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1086 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1087 msgid "ISBN:" msgstr "" @@ -9273,11 +9435,11 @@ msgstr "" msgid " - Jobs" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:459 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:463 msgid "Do you really want to stop the selected job?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:465 +#: /home/kovid/work/calibre/src/calibre/gui2/jobs.py:469 msgid "Do you really want to stop all non-device jobs?" msgstr "" @@ -9294,7 +9456,7 @@ msgid "Show books in the main memory of the device" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:72 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1055 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1077 msgid "Card A" msgstr "" @@ -9303,7 +9465,7 @@ msgid "Show books in storage card A" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/layout.py:74 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1057 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1079 msgid "Card B" msgstr "" @@ -9347,45 +9509,45 @@ msgstr "" msgid "Y" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:66 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:57 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:268 msgid "On Device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:68 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:59 msgid "Size (MB)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:75 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:66 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:258 msgid "Modified" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:771 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1330 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:797 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:758 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1317 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:806 msgid "The lookup/search name is \"{0}\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:777 -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1332 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:764 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1319 msgid "This book's UUID is \"{0}\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1027 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1014 msgid "In Library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1031 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1018 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:328 msgid "Size" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1312 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1299 msgid "Marked for deletion" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1315 +#: /home/kovid/work/calibre/src/calibre/gui2/library/models.py:1302 msgid "Double click to edit me

" msgstr "" @@ -9737,117 +9899,117 @@ msgstr "" msgid "No format selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:694 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:695 msgid "Could not read metadata" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:695 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:696 msgid "Could not read metadata from %s format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:714 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:715 msgid "&Browse" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:716 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:717 msgid "T&rim" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:718 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:719 msgid "&Remove" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:724 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:725 msgid "Download co&ver" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:725 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:726 msgid "&Generate cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:775 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:776 msgid "Not a valid picture" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:799 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:800 msgid "Specify title and author" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:800 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:801 msgid "You must specify a title and author before generating a cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:818 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:819 msgid "Invalid cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:819 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:820 msgid "Could not change cover as the image is invalid." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:846 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:847 msgid "This book has no cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:848 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:849 msgid "Cover size: %dx%d pixels" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:897 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:898 msgid "stars" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:966 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:967 msgid "Tags changed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:967 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:968 msgid "You have changed the tags. In order to use the tags editor, you must either discard or apply these changes. Apply changes?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:993 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:994 msgid "I&ds:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:994 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:995 msgid "" "Edit the identifiers for this book. For example: \n" "\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1055 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1117 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1056 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1118 msgid "This ISBN number is valid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1058 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1120 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1059 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1121 msgid "This ISBN number is invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1083 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1105 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1084 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1106 msgid "Invalid ISBN" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1084 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1085 msgid "Enter an ISBN" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1106 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1107 msgid "The ISBN you entered is not valid. Try again." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1130 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1131 msgid "&Publisher:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1200 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1201 msgid "Clear date" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1232 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1233 msgid "Publishe&d:" msgstr "" @@ -10347,82 +10509,74 @@ msgid "does not match pattern" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:75 -msgid "If the " -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:81 -msgid " column " -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:87 -msgid " value " -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:202 -msgid "Enter either an identifier type or an identifier type and value of the form identifier:value" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:205 -msgid "Enter a number" +msgid "If the ___ column ___ values" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:210 +msgid "Enter either an identifier type or an identifier type and value of the form identifier:value" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:213 +msgid "Enter a number" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:218 msgid "Enter a date in the format YYYY-MM-DD" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:220 msgid "Enter a string." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:214 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:222 msgid "Enter a regular expression" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:216 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:224 msgid "You can match multiple values by separating them with %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:231 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:239 msgid "Create/edit a column coloring rule" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:236 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:244 msgid "Create a coloring rule by filling in the boxes below" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:250 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:258 msgid "to" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:266 msgid "Only if the following conditions are all satisfied:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:268 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:276 msgid "Add another condition" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:272 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:280 msgid "You can disable a condition by blanking all of its boxes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:344 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:352 msgid "Invalid condition" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:345 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:353 msgid "One of the conditions for this rule is invalid: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:350 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:358 msgid "No conditions" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:351 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:359 msgid "You must specify at least one non-empty condition for this rule" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:439 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:447 msgid "" "\n" "

Advanced Rule for column %s:\n" @@ -10430,7 +10584,7 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:444 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:452 msgid "" "

Set the color of %s to %s if the following\n" " conditions are met:

\n" @@ -10438,43 +10592,43 @@ msgid "" " " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:459 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:467 msgid "
  • If the %s column %s value: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:474 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:482 msgid "You can control the color of columns in the book list by creating \"rules\" that tell calibre what color to use. Click the Add Rule button below to get started.

    You can change an existing rule by double clicking it." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:483 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:491 msgid "Add Rule" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:486 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:494 msgid "Remove Rule" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:503 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:511 msgid "Move the selected rule up" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:508 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:516 msgid "Move the selected rule down" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:516 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:524 msgid "Add Advanced Rule" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:564 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:572 msgid "No rule selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:565 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:573 msgid "No rule selected for %s." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:570 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:578 msgid "removal" msgstr "" @@ -11283,90 +11437,108 @@ msgstr "" #: #: /home/kovid/work/calibre/src/calibre/gui2/preferences/metadata_sources_ui.py:126 -msgid "&Set as default" +msgid "Restore your own subset of checked fields that you define using the 'Set as default' button" msgstr "" #: #: /home/kovid/work/calibre/src/calibre/gui2/preferences/metadata_sources_ui.py:127 -msgid "Convert all downloaded comments to plain &text" +msgid "&Set as default" msgstr "" #: #: /home/kovid/work/calibre/src/calibre/gui2/preferences/metadata_sources_ui.py:128 -msgid "Swap author names from FN LN to LN, FN" +msgid "Store the currently checked fields as a default you can restore using the 'Select default' button" msgstr "" #: #: /home/kovid/work/calibre/src/calibre/gui2/preferences/metadata_sources_ui.py:129 -msgid "Max. number of &tags to download:" +msgid "Convert all downloaded comments to plain &text" msgstr "" #: #: /home/kovid/work/calibre/src/calibre/gui2/preferences/metadata_sources_ui.py:130 -msgid "Max. &time to wait after first match is found:" +msgid "Swap author names from FN LN to LN, FN" msgstr "" #: #: /home/kovid/work/calibre/src/calibre/gui2/preferences/metadata_sources_ui.py:131 +msgid "Max. number of &tags to download:" +msgstr "" + +#: +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/metadata_sources_ui.py:132 +msgid "Max. &time to wait after first match is found:" +msgstr "" + +#: #: /home/kovid/work/calibre/src/calibre/gui2/preferences/metadata_sources_ui.py:133 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/metadata_sources_ui.py:135 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/config_ui.py:199 msgid " secs" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/metadata_sources_ui.py:132 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/metadata_sources_ui.py:134 msgid "Max. time to wait after first &cover is found:" msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/metadata_sources_ui.py:134 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/metadata_sources_ui.py:136 msgid "" "

    Different metadata sources have different sets of tags for the same book. If this option is checked, then calibre will use the smaller tag sets. These tend to be more like genres, while the larger tag sets tend to describe the books content.\n" "

    Note that this option will only make a practical difference if one of the metadata sources has a genre like tag set for the book you are searching for. Most often, they all have large tag sets." msgstr "" #: -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/metadata_sources_ui.py:136 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/metadata_sources_ui.py:138 msgid "Prefer &fewer tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:56 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:38 +msgid "No proxies used" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:42 +msgid "Using proxies:" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:64 msgid "Failed to install command line tools." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:59 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:67 msgid "Command line tools installed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:60 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:68 msgid "Command line tools installed in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:61 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc.py:69 msgid "If you move calibre.app, you have to re-install the command line tools." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc_ui.py:62 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc_ui.py:66 msgid "Max. simultaneous conversion/news download jobs:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc_ui.py:63 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc_ui.py:67 msgid "Limit the max. simultaneous jobs to the available CPU &cores" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc_ui.py:64 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc_ui.py:68 msgid "Debug &device detection" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc_ui.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc_ui.py:69 msgid "Get information to setup the &user defined device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc_ui.py:66 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc_ui.py:70 msgid "Open calibre &configuration directory" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc_ui.py:67 +#: /home/kovid/work/calibre/src/calibre/gui2/preferences/misc_ui.py:71 msgid "&Install command line tools" msgstr "" @@ -12092,17 +12264,6 @@ msgstr "" msgid "Apply any changes you made to this tweak" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:95 -#: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:279 -#: /home/kovid/work/calibre/src/calibre/gui2/store/config/chooser/chooser_widget_ui.py:80 -#: /home/kovid/work/calibre/src/calibre/gui2/store/mobileread/store_dialog_ui.py:76 -#: /home/kovid/work/calibre/src/calibre/gui2/store/search/search_ui.py:134 -#: /home/kovid/work/calibre/src/calibre/gui2/store/search_ui.py:109 -#: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:670 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:280 -msgid "Search" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/gui2/search_box.py:339 msgid "Delete current search" msgstr "" @@ -12678,13 +12839,13 @@ msgid "Manage %s" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:454 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1850 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1869 msgid "Manage Saved Searches" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:462 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:466 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1848 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1867 msgid "Manage User Categories" msgstr "" @@ -12696,108 +12857,108 @@ msgstr "" msgid "Change sub-categorization scheme" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:792 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:801 msgid "The grouped search term name is \"{0}\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1065 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1074 msgid "Changing the authors for several books can take a while. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1070 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1079 msgid "Changing the metadata for that many books can take a while. Are you sure?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1157 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:449 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1166 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:447 msgid "Searches" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1391 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1411 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1420 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1401 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1421 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1430 msgid "Rename user category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1392 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1402 msgid "You cannot use periods in the name when renaming user categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1412 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1421 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1422 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1431 msgid "The name %s is already used" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1444 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1454 msgid "Duplicate search name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1445 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1455 msgid "The saved search name %s is already used." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1840 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1859 msgid "Manage Authors" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1842 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1861 msgid "Manage Series" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1844 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1863 msgid "Manage Publishers" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1846 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1865 msgid "Manage Tags" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1858 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1877 msgid "Invalid search restriction" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1859 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1878 msgid "The current search restriction is invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1875 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1894 msgid "New Category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1926 -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1929 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1945 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1948 msgid "Delete user category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1927 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1946 msgid "%s is not a user category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1930 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1949 msgid "%s contains items. Do you really want to delete it?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1951 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1970 msgid "Remove category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1952 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1971 msgid "User category %s does not exist" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1971 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1990 msgid "Add to user category" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1972 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:1991 msgid "A user category %s does not exist" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2095 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2114 msgid "Find item in tag browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2098 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2117 msgid "" "Search for items. This is a \"contains\" search; items containing the\n" "text anywhere in the name will be found. You can limit the search\n" @@ -12807,93 +12968,93 @@ msgid "" "containing the text \"foo\"" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2107 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2126 msgid "ALT+f" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2112 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2131 msgid "Find the first/next matching item" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2117 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2136 msgid "Collapse all categories" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2141 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2160 msgid "No More Matches.

    Click Find again to go to first match" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2154 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2173 msgid "Sort by name" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2154 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2173 msgid "Sort by popularity" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2155 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2174 msgid "Sort by average rating" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2158 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2177 msgid "Set the sort order for entries in the Tag Browser" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2165 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2184 msgid "Match all" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2165 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2184 msgid "Match any" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2170 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2189 msgid "When selecting multiple entries in the Tag Browser match any or all of them" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2177 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2196 msgid "Manage authors, tags, etc" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2178 +#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:2197 msgid "All of these category_managers are available by right-clicking on items in the tag browser above" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:65 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:68 msgid "Convert book %(num)d of %(total)d (%(title)s)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:93 -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:205 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:211 msgid "Could not convert some books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:94 -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:206 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:212 msgid "Could not convert %d of %d books, because no suitable source format was found." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:125 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:128 msgid "Queueing books for bulk conversion" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:183 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:189 msgid "Queueing " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:184 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:190 msgid "Convert book %d of %d (%s)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:254 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:260 msgid "Fetch news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:327 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:333 msgid "Convert existing" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:328 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:334 msgid "The following books have already been converted to %s format. Do you wish to reconvert them?" msgstr "" @@ -14087,7 +14248,7 @@ msgstr "" msgid "No books available to include in catalog" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/catalog.py:5051 +#: /home/kovid/work/calibre/src/calibre/library/catalog.py:5063 msgid "" "\n" "*** Adding 'By Authors' Section required for MOBI output ***" @@ -14598,19 +14759,19 @@ msgstr "" msgid "%sAverage rating is %3.1f" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1053 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1075 msgid "Main" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:3144 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:3246 msgid "

    Migrating old database to ebook library in %s

    " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:3173 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:3275 msgid "Copying %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:3190 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:3292 msgid "Compacting database" msgstr "" @@ -14630,11 +14791,11 @@ msgstr "" msgid "Title Sort" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/restore.py:126 +#: /home/kovid/work/calibre/src/calibre/library/restore.py:127 msgid "Processed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/restore.py:192 +#: /home/kovid/work/calibre/src/calibre/library/restore.py:193 msgid "creating custom column " msgstr "" @@ -14735,8 +14896,8 @@ msgstr "" msgid "Replace whitespace with underscores." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:372 -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:400 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:379 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:412 msgid "Requested formats not available" msgstr "" diff --git a/src/calibre/utils/date.py b/src/calibre/utils/date.py index b368c0ed9b..c93e69874c 100644 --- a/src/calibre/utils/date.py +++ b/src/calibre/utils/date.py @@ -123,6 +123,14 @@ def isoformat(date_time, assume_utc=False, as_utc=True, sep='T'): date_time = date_time.astimezone(_utc_tz if as_utc else _local_tz) return unicode(date_time.isoformat(sep)) +def as_local_time(date_time, assume_utc=True): + if not hasattr(date_time, 'tzinfo'): + return date_time + if date_time.tzinfo is None: + date_time = date_time.replace(tzinfo=_utc_tz if assume_utc else + _local_tz) + return date_time.astimezone(_local_tz) + def now(): return datetime.now().replace(tzinfo=_local_tz) diff --git a/src/calibre/utils/mem.py b/src/calibre/utils/mem.py index c68badc709..7dad5e4d0d 100644 --- a/src/calibre/utils/mem.py +++ b/src/calibre/utils/mem.py @@ -8,61 +8,157 @@ __docformat__ = 'restructuredtext en' ''' Measure memory usage of the current process. -The key function is memory() which returns the current memory usage in bytes. +The key function is memory() which returns the current memory usage in MB. You can pass a number to memory and it will be subtracted from the returned value. ''' -import gc, os +import gc, os, re from calibre.constants import iswindows, islinux if islinux: - ## {{{ http://code.activestate.com/recipes/286222/ (r1) + # Taken, with thanks, from: + # http://wingolog.org/archives/2007/11/27/reducing-the-footprint-of-python-applications - _proc_status = '/proc/%d/status' % os.getpid() + def permute(args): + ret = [] + if args: + first = args.pop(0) + for y in permute(args): + for x in first: + ret.append(x + y) + else: + ret.append('') + return ret - _scale = {'kB': 1024.0, 'mB': 1024.0*1024.0, - 'KB': 1024.0, 'MB': 1024.0*1024.0} + def parsed_groups(match, *types): + groups = match.groups() + assert len(groups) == len(types) + return tuple([type(group) for group, type in zip(groups, types)]) - def _VmB(VmKey): - '''Private. - ''' - global _proc_status, _scale - # get pseudo file /proc//status - try: - t = open(_proc_status) - v = t.read() - t.close() - except: - return 0.0 # non-Linux? - # get VmKey line e.g. 'VmRSS: 9999 kB\n ...' - i = v.index(VmKey) - v = v[i:].split(None, 3) # whitespace - if len(v) < 3: - return 0.0 # invalid format? - # convert Vm value to bytes - return float(v[1]) * _scale[v[2]] + class VMA(dict): + def __init__(self, *args): + (self.start, self.end, self.perms, self.offset, + self.major, self.minor, self.inode, self.filename) = args + def parse_smaps(pid): + with open('/proc/%s/smaps'%pid, 'r') as maps: + hex = lambda s: int(s, 16) + + ret = [] + header = re.compile(r'^([0-9a-f]+)-([0-9a-f]+) (....) ([0-9a-f]+) ' + r'(..):(..) (\d+) *(.*)$') + detail = re.compile(r'^(.*): +(\d+) kB') + for line in maps: + m = header.match(line) + if m: + vma = VMA(*parsed_groups(m, hex, hex, str, hex, str, str, int, str)) + ret.append(vma) + else: + m = detail.match(line) + if m: + k, v = parsed_groups(m, str, int) + assert k not in vma + vma[k] = v + else: + print 'unparseable line:', line + return ret + + perms = permute(['r-', 'w-', 'x-', 'ps']) + + def make_summary_dicts(vmas): + mapped = {} + anon = {} + for d in mapped, anon: + # per-perm + for k in perms: + d[k] = {} + d[k]['Size'] = 0 + for y in 'Shared', 'Private': + d[k][y] = {} + for z in 'Clean', 'Dirty': + d[k][y][z] = 0 + # totals + for y in 'Shared', 'Private': + d[y] = {} + for z in 'Clean', 'Dirty': + d[y][z] = 0 + + for vma in vmas: + if vma.major == '00' and vma.minor == '00': + d = anon + else: + d = mapped + for y in 'Shared', 'Private': + for z in 'Clean', 'Dirty': + d[vma.perms][y][z] += vma.get(y + '_' + z, 0) + d[y][z] += vma.get(y + '_' + z, 0) + d[vma.perms]['Size'] += vma.get('Size', 0) + return mapped, anon + + def values(d, args): + if args: + ret = () + first = args[0] + for k in first: + ret += values(d[k], args[1:]) + return ret + else: + return (d,) + + def print_summary(dicts_and_titles): + def desc(title, perms): + ret = {('Anonymous', 'rw-p'): 'Data (malloc, mmap)', + ('Anonymous', 'rwxp'): 'Writable code (stack)', + ('Mapped', 'r-xp'): 'Code', + ('Mapped', 'rwxp'): 'Writable code (jump tables)', + ('Mapped', 'r--p'): 'Read-only data', + ('Mapped', 'rw-p'): 'Data'}.get((title, perms), None) + if ret: + return ' -- ' + ret + else: + return '' + + for d, title in dicts_and_titles: + print title, 'memory:' + print ' Shared Private' + print ' Clean Dirty Clean Dirty' + for k in perms: + if d[k]['Size']: + print (' %s %7d %7d %7d %7d%s' + % ((k,) + + values(d[k], (('Shared', 'Private'), + ('Clean', 'Dirty'))) + + (desc(title, k),))) + print (' total %7d %7d %7d %7d' + % values(d, (('Shared', 'Private'), + ('Clean', 'Dirty')))) + + print ' ' + '-' * 40 + print (' total %7d %7d %7d %7d' + % tuple(map(sum, zip(*[values(d, (('Shared', 'Private'), + ('Clean', 'Dirty'))) + for d, title in dicts_and_titles])))) + + def print_stats(pid=None): + if pid is None: + pid = os.getpid() + vmas = parse_smaps(pid) + mapped, anon = make_summary_dicts(vmas) + print_summary(((mapped, "Mapped"), (anon, "Anonymous"))) def linux_memory(since=0.0): - '''Return memory usage in bytes. - ''' - return _VmB('VmSize:') - since + vmas = parse_smaps(os.getpid()) + mapped, anon = make_summary_dicts(vmas) + dicts_and_titles = ((mapped, "Mapped"), (anon, "Anonymous")) + totals = tuple(map(sum, zip(*[values(d, (('Shared', 'Private'), + ('Clean', 'Dirty'))) + for d, title in dicts_and_titles]))) + return (totals[-1]/1024.) - since - - def resident(since=0.0): - '''Return resident memory usage in bytes. - ''' - return _VmB('VmRSS:') - since - - - def stacksize(since=0.0): - '''Return stack size in bytes. - ''' - return _VmB('VmStk:') - since - ## end of http://code.activestate.com/recipes/286222/ }}} memory = linux_memory + elif iswindows: import win32process import win32con @@ -95,7 +191,7 @@ elif iswindows: def win_memory(since=0.0): info = meminfo(get_handle(os.getpid())) - return info['WorkingSetSize'] - since + return (info['WorkingSetSize']/1024.**2) - since memory = win_memory