diff --git a/src/calibre/devices/apple/driver.py b/src/calibre/devices/apple/driver.py index 3dc71f1292..645b2fb606 100644 --- a/src/calibre/devices/apple/driver.py +++ b/src/calibre/devices/apple/driver.py @@ -446,7 +446,8 @@ class ITUNES(DriverBase): } if self.report_progress is not None: - self.report_progress((i+1)/book_count, _('%d of %d') % (i+1, book_count)) + self.report_progress((i+1)/book_count, + _('%(num)d of %(tot)d') % dict(num=i+1, tot=book_count)) self._purge_orphans(library_books, cached_books) elif iswindows: @@ -485,7 +486,8 @@ class ITUNES(DriverBase): if self.report_progress is not None: self.report_progress((i+1)/book_count, - _('%d of %d') % (i+1, book_count)) + _('%(num)d of %(tot)d') % dict(num=i+1, + tot=book_count)) self._purge_orphans(library_books, cached_books) finally: @@ -1075,7 +1077,8 @@ class ITUNES(DriverBase): # Report progress if self.report_progress is not None: - self.report_progress((i+1)/file_count, _('%d of %d') % (i+1, file_count)) + self.report_progress((i+1)/file_count, + _('%(num)d of %(tot)d') % dict(num=i+1, tot=file_count)) elif iswindows: try: @@ -1118,7 +1121,8 @@ class ITUNES(DriverBase): # Report progress if self.report_progress is not None: - self.report_progress((i+1)/file_count, _('%d of %d') % (i+1, file_count)) + self.report_progress((i+1)/file_count, + _('%(num)d of %(tot)d') % dict(num=i+1, tot=file_count)) finally: pythoncom.CoUninitialize() @@ -3107,7 +3111,8 @@ class ITUNES_ASYNC(ITUNES): } if self.report_progress is not None: - self.report_progress((i+1)/book_count, _('%d of %d') % (i+1, book_count)) + self.report_progress((i+1)/book_count, + _('%(num)d of %(tot)d') % dict(num=i+1, tot=book_count)) elif iswindows: try: @@ -3147,7 +3152,8 @@ class ITUNES_ASYNC(ITUNES): if self.report_progress is not None: self.report_progress((i+1)/book_count, - _('%d of %d') % (i+1, book_count)) + _('%(num)d of %(tot)d') % dict(num=i+1, + tot=book_count)) finally: pythoncom.CoUninitialize() diff --git a/src/calibre/devices/prs505/driver.py b/src/calibre/devices/prs505/driver.py index 5898c80baf..402ca65658 100644 --- a/src/calibre/devices/prs505/driver.py +++ b/src/calibre/devices/prs505/driver.py @@ -67,10 +67,10 @@ class PRS505(USBMS): _('Comma separated list of metadata fields ' 'to turn into collections on the device. Possibilities include: ')+\ 'series, tags, authors' +\ - _('. Two special collections are available: %s:%s and %s:%s. Add ' + _('. Two special collections are available: %(abt)s:%(abtv)s and %(aba)s:%(abav)s. Add ' 'these values to the list to enable them. The collections will be ' - 'given the name provided after the ":" character.')%( - 'abt', ALL_BY_TITLE, 'aba', ALL_BY_AUTHOR), + 'given the name provided after the ":" character.')%dict( + abt='abt', abtv=ALL_BY_TITLE, aba='aba', abav=ALL_BY_AUTHOR), _('Upload separate cover thumbnails for books (newer readers)') + ':::'+_('Normally, the SONY readers get the cover image from the' ' ebook file itself. With this option, calibre will send a ' diff --git a/src/calibre/ebooks/conversion/cli.py b/src/calibre/ebooks/conversion/cli.py index 6527dfb855..1c01f49635 100644 --- a/src/calibre/ebooks/conversion/cli.py +++ b/src/calibre/ebooks/conversion/cli.py @@ -144,9 +144,9 @@ def add_pipeline_options(parser, plumber): 'HEURISTIC PROCESSING' : ( _('Modify the document text and structure using common' - ' patterns. Disabled by default. Use %s to enable. ' - ' Individual actions can be disabled with the %s options.') - % ('--enable-heuristics', '--disable-*'), + ' patterns. Disabled by default. Use %(en)s to enable. ' + ' Individual actions can be disabled with the %(dis)s options.') + % dict(en='--enable-heuristics', dis='--disable-*'), ['enable_heuristics'] + HEURISTIC_OPTIONS ), diff --git a/src/calibre/ebooks/epub/fix/__init__.py b/src/calibre/ebooks/epub/fix/__init__.py index 3eae56484e..f1d396148c 100644 --- a/src/calibre/ebooks/epub/fix/__init__.py +++ b/src/calibre/ebooks/epub/fix/__init__.py @@ -17,7 +17,8 @@ class ParseError(ValueError): self.name = name self.desc = desc ValueError.__init__(self, - _('Failed to parse: %s with error: %s')%(name, desc)) + _('Failed to parse: %(name)s with error: %(err)s')%dict( + name=name, err=desc)) class ePubFixer(Plugin): diff --git a/src/calibre/ebooks/lrf/html/convert_from.py b/src/calibre/ebooks/lrf/html/convert_from.py index 4ee1538e3f..fa122f1e25 100644 --- a/src/calibre/ebooks/lrf/html/convert_from.py +++ b/src/calibre/ebooks/lrf/html/convert_from.py @@ -561,7 +561,9 @@ class HTMLConverter(object): para = children[i] break if para is None: - raise ConversionError(_('Failed to parse link %s %s')%(tag, children)) + raise ConversionError( + _('Failed to parse link %(tag)s %(children)s')%dict( + tag=tag, children=children)) text = self.get_text(tag, 1000) if not text: text = 'Link' @@ -954,7 +956,9 @@ class HTMLConverter(object): self.scaled_images[path] = pt return pt.name except (IOError, SystemError) as err: # PIL chokes on interlaced PNG images as well a some GIF images - self.log.warning(_('Unable to process image %s. Error: %s')%(path, err)) + self.log.warning( + _('Unable to process image %(path)s. Error: %(err)s')%dict( + path=path, err=err)) if width == None or height == None: width, height = im.size @@ -1014,7 +1018,7 @@ class HTMLConverter(object): try: self.images[path] = ImageStream(path, encoding=encoding) except LrsError as err: - self.log.warning(_('Could not process image: %s\n%s')%( + self.log.warning(('Could not process image: %s\n%s')%( original_path, err)) return diff --git a/src/calibre/ebooks/metadata/cli.py b/src/calibre/ebooks/metadata/cli.py index a0be187512..9ffe5007f5 100644 --- a/src/calibre/ebooks/metadata/cli.py +++ b/src/calibre/ebooks/metadata/cli.py @@ -21,9 +21,9 @@ USAGE='%%prog ebook_file [' + _('options') + ']\n' + \ _(''' Read/Write metadata from/to ebook files. -Supported formats for reading metadata: %s +Supported formats for reading metadata: %(read)s -Supported formats for writing metadata: %s +Supported formats for writing metadata: %(write)s Different file types support different kinds of metadata. If you try to set some metadata on a file type that does not support it, the metadata will be @@ -99,7 +99,7 @@ def option_parser(): for w in metadata_writers(): writers = writers.union(set(w.file_types)) ft, w = ', '.join(sorted(filetypes())), ', '.join(sorted(writers)) - return config().option_parser(USAGE%(ft, w)) + return config().option_parser(USAGE%dict(read=ft, write=w)) def do_set_metadata(opts, mi, stream, stream_type): mi = MetaInformation(mi) diff --git a/src/calibre/ebooks/oeb/transforms/cover.py b/src/calibre/ebooks/oeb/transforms/cover.py index 013d17c321..a93309f5e9 100644 --- a/src/calibre/ebooks/oeb/transforms/cover.py +++ b/src/calibre/ebooks/oeb/transforms/cover.py @@ -95,9 +95,9 @@ class CoverManager(object): authors = [unicode(x) for x in m.creator if x.role == 'aut'] series_string = None if m.series and m.series_index: - series_string = _('Book %s of %s')%( - fmt_sidx(m.series_index[0], use_roman=True), - unicode(m.series[0])) + series_string = _('Book %(sidx)s of %(series)s')%dict( + sidx=fmt_sidx(m.series_index[0], use_roman=True), + series=unicode(m.series[0])) try: from calibre.ebooks import calibre_cover diff --git a/src/calibre/ebooks/oeb/transforms/split.py b/src/calibre/ebooks/oeb/transforms/split.py index 0c9b492855..1ebf9aee90 100644 --- a/src/calibre/ebooks/oeb/transforms/split.py +++ b/src/calibre/ebooks/oeb/transforms/split.py @@ -32,8 +32,8 @@ class SplitError(ValueError): size = len(tostring(root))/1024. ValueError.__init__(self, _('Could not find reasonable point at which to split: ' - '%s Sub-tree size: %d KB')% - (path, size)) + '%(path)s Sub-tree size: %(size)d KB')%dict( + path=path, size=size)) class Split(object): diff --git a/src/calibre/ebooks/unihandecode/jadecoder.py b/src/calibre/ebooks/unihandecode/jadecoder.py index 51be7c1b21..93b28da550 100644 --- a/src/calibre/ebooks/unihandecode/jadecoder.py +++ b/src/calibre/ebooks/unihandecode/jadecoder.py @@ -1,4 +1,4 @@ -# coding:utf8 +# coding:utf-8 __license__ = 'GPL 3' __copyright__ = '2010, Hiroshi Miura ' __docformat__ = 'restructuredtext en' diff --git a/src/calibre/gui2/actions/annotate.py b/src/calibre/gui2/actions/annotate.py index f934a4a53c..044ee88d6e 100644 --- a/src/calibre/gui2/actions/annotate.py +++ b/src/calibre/gui2/actions/annotate.py @@ -120,16 +120,16 @@ class FetchAnnotationsAction(InterfaceAction): spanTag['style'] = 'font-weight:bold' if bookmark.book_format == 'pdf': spanTag.insert(0,NavigableString( - _("%s
Last Page Read: %d (%d%%)") % \ - (strftime(u'%x', timestamp.timetuple()), - last_read_location, - percent_read))) + _("%(time)s
Last Page Read: %(loc)d (%(pr)d%%)") % \ + dict(time=strftime(u'%x', timestamp.timetuple()), + loc=last_read_location, + pr=percent_read))) else: spanTag.insert(0,NavigableString( - _("%s
Last Page Read: Location %d (%d%%)") % \ - (strftime(u'%x', timestamp.timetuple()), - last_read_location, - percent_read))) + _("%(time)s
Last Page Read: Location %(loc)d (%(pr)d%%)") % \ + dict(time=strftime(u'%x', timestamp.timetuple()), + loc=last_read_location, + pr=percent_read))) divTag.insert(dtc, spanTag) dtc += 1 @@ -145,23 +145,23 @@ class FetchAnnotationsAction(InterfaceAction): for location in sorted(user_notes): if user_notes[location]['text']: annotations.append( - _('Location %d • %s
%s
') % \ - (user_notes[location]['displayed_location'], - user_notes[location]['type'], - user_notes[location]['text'] if \ + _('Location %(dl)d • %(typ)s
%(text)s
') % \ + dict(dl=user_notes[location]['displayed_location'], + typ=user_notes[location]['type'], + text=(user_notes[location]['text'] if \ user_notes[location]['type'] == 'Note' else \ - '%s' % user_notes[location]['text'])) + '%s' % user_notes[location]['text']))) else: if bookmark.book_format == 'pdf': annotations.append( - _('Page %d • %s
') % \ - (user_notes[location]['displayed_location'], - user_notes[location]['type'])) + _('Page %(dl)d • %(typ)s
') % \ + dict(dl=user_notes[location]['displayed_location'], + typ=user_notes[location]['type'])) else: annotations.append( - _('Location %d • %s
') % \ - (user_notes[location]['displayed_location'], - user_notes[location]['type'])) + _('Location %(dl)d • %(typ)s
') % \ + dict(dl=user_notes[location]['displayed_location'], + typ=user_notes[location]['type'])) for annotation in annotations: divTag.insert(dtc, annotation) diff --git a/src/calibre/gui2/actions/catalog.py b/src/calibre/gui2/actions/catalog.py index 45544d8246..e57ce06742 100644 --- a/src/calibre/gui2/actions/catalog.py +++ b/src/calibre/gui2/actions/catalog.py @@ -82,7 +82,8 @@ class GenerateCatalogAction(InterfaceAction): self.gui.sync_catalogs() if job.fmt not in ['EPUB','MOBI']: export_dir = choose_dir(self.gui, _('Export Catalog Directory'), - _('Select destination for %s.%s') % (job.catalog_title, job.fmt.lower())) + _('Select destination for %(title)s.%(fmt)s') % dict( + title=job.catalog_title, fmt=job.fmt.lower())) if export_dir: destination = os.path.join(export_dir, '%s.%s' % (job.catalog_title, job.fmt.lower())) shutil.copyfile(job.catalog_file_path, destination) diff --git a/src/calibre/gui2/actions/copy_to_library.py b/src/calibre/gui2/actions/copy_to_library.py index 97880faaa1..c3f5eecd0e 100644 --- a/src/calibre/gui2/actions/copy_to_library.py +++ b/src/calibre/gui2/actions/copy_to_library.py @@ -160,8 +160,9 @@ class CopyToLibraryAction(InterfaceAction): error_dialog(self.gui, _('Failed'), _('Could not copy books: ') + e, det_msg=tb, show=True) else: - self.gui.status_bar.show_message(_('Copied %d books to %s') % - (len(ids), loc), 2000) + self.gui.status_bar.show_message( + _('Copied %(num)d books to %(loc)s') % + dict(num=len(ids), loc=loc), 2000) if delete_after and self.worker.processed: v = self.gui.library_view ci = v.currentIndex() diff --git a/src/calibre/gui2/book_details.py b/src/calibre/gui2/book_details.py index 51f0a8d701..07a963c81b 100644 --- a/src/calibre/gui2/book_details.py +++ b/src/calibre/gui2/book_details.py @@ -159,9 +159,9 @@ def render_data(mi, use_roman_numbers=True, all_fields=False): sidx = mi.get(field+'_index') if sidx is None: sidx = 1.0 - val = _('Book %s of %s')%(fmt_sidx(sidx, - use_roman=use_roman_numbers), - prepare_string_for_xml(getattr(mi, field))) + val = _('Book %(sidx)s of %(series)s')%dict( + sidx=fmt_sidx(sidx, use_roman=use_roman_numbers), + series=prepare_string_for_xml(getattr(mi, field))) ans.append((field, u'%s%s'%(name, val))) @@ -541,7 +541,8 @@ class BookDetails(QWidget): # {{{ self.setToolTip( '

'+_('Double-click to open Book Details window') + '

' + _('Path') + ': ' + self.current_path + - '

' + _('Cover size: %dx%d')%(sz.width(), sz.height()) + '

' + _('Cover size: %(width)d x %(height)d')%dict( + width=sz.width(), height=sz.height()) ) def reset_info(self): diff --git a/src/calibre/gui2/device.py b/src/calibre/gui2/device.py index d5805a8e09..0a9dbaecdd 100644 --- a/src/calibre/gui2/device.py +++ b/src/calibre/gui2/device.py @@ -912,8 +912,9 @@ class DeviceMixin(object): # {{{ format_count[f] = 1 for f in self.device_manager.device.settings().format_map: if f in format_count.keys(): - formats.append((f, _('%i of %i Books') % (format_count[f], - len(rows)), True if f in aval_out_formats else False)) + formats.append((f, _('%(num)i of %(total)i Books') % dict( + num=format_count[f], total=len(rows)), + True if f in aval_out_formats else False)) elif f in aval_out_formats: formats.append((f, _('0 of %i Books') % len(rows), True)) d = ChooseFormatDeviceDialog(self, _('Choose format to send to device'), formats) diff --git a/src/calibre/gui2/dialogs/book_info.py b/src/calibre/gui2/dialogs/book_info.py index 4036e71a38..b3ff2e03fd 100644 --- a/src/calibre/gui2/dialogs/book_info.py +++ b/src/calibre/gui2/dialogs/book_info.py @@ -106,7 +106,8 @@ class BookInfo(QDialog, Ui_BookInfo): Qt.KeepAspectRatio, Qt.SmoothTransformation) self.cover.set_pixmap(pixmap) sz = pixmap.size() - self.cover.setToolTip(_('Cover size: %dx%d')%(sz.width(), sz.height())) + self.cover.setToolTip(_('Cover size: %(width)d x %(height)d')%dict( + width=sz.width(), height=sz.height())) def refresh(self, row): if isinstance(row, QModelIndex): diff --git a/src/calibre/gui2/dialogs/metadata_bulk.py b/src/calibre/gui2/dialogs/metadata_bulk.py index 22dfb98956..0d713a225b 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.py +++ b/src/calibre/gui2/dialogs/metadata_bulk.py @@ -173,10 +173,10 @@ class MyBlockingBusy(QDialog): # {{{ mi = self.db.get_metadata(id, index_is_id=True) series_string = None if mi.series: - series_string = _('Book %s of %s')%( - fmt_sidx(mi.series_index, + series_string = _('Book %(sidx)s of %(series)s')%dict( + sidx=fmt_sidx(mi.series_index, use_roman=config['use_roman_numerals_for_series_number']), - mi.series) + series=mi.series) cdata = calibre_cover(mi.title, mi.format_field('authors')[-1], series_string=series_string) diff --git a/src/calibre/gui2/dialogs/plugin_updater.py b/src/calibre/gui2/dialogs/plugin_updater.py index e7d641b43e..2c88df9152 100644 --- a/src/calibre/gui2/dialogs/plugin_updater.py +++ b/src/calibre/gui2/dialogs/plugin_updater.py @@ -701,7 +701,9 @@ class PluginUpdaterDialog(SizePersistedDialog): if DEBUG: prints('Locating zip file for %s: %s'% (display_plugin.name, display_plugin.forum_link)) - self.gui.status_bar.showMessage(_('Locating zip file for %s: %s') % (display_plugin.name, display_plugin.forum_link)) + self.gui.status_bar.showMessage( + _('Locating zip file for %(name)s: %(link)s') % dict( + name=display_plugin.name, link=display_plugin.forum_link)) plugin_zip_url = self._read_zip_attachment_url(display_plugin.forum_link) if not plugin_zip_url: return error_dialog(self.gui, _('Install Plugin Failed'), diff --git a/src/calibre/gui2/dialogs/scheduler.py b/src/calibre/gui2/dialogs/scheduler.py index 7531d3f6bb..e45148c405 100644 --- a/src/calibre/gui2/dialogs/scheduler.py +++ b/src/calibre/gui2/dialogs/scheduler.py @@ -381,7 +381,9 @@ class SchedulerDialog(QDialog, Ui_Dialog): d = utcnow() - last_downloaded def hm(x): return (x-x%3600)//3600, (x%3600 - (x%3600)%60)//60 hours, minutes = hm(d.seconds) - tm = _('%d days, %d hours and %d minutes ago')%(d.days, hours, minutes) + tm = _('%(days)d days, %(hours)d hours' + ' and %(mins)d minutes ago')%dict( + days=d.days, hours=hours, mins=minutes) if d < timedelta(days=366): ld_text = tm else: diff --git a/src/calibre/gui2/dialogs/tag_list_editor.py b/src/calibre/gui2/dialogs/tag_list_editor.py index cee9eb42b9..22aad5ff61 100644 --- a/src/calibre/gui2/dialogs/tag_list_editor.py +++ b/src/calibre/gui2/dialogs/tag_list_editor.py @@ -18,7 +18,8 @@ class ListWidgetItem(QListWidgetItem): def data(self, role): if role == Qt.DisplayRole: if self.initial_value != self.current_value: - return _('%s (was %s)')%(self.current_value, self.initial_value) + return _('%(curr)s (was %(initial)s)')%dict( + curr=self.current_value, initial=self.initial_value) else: return self.current_value elif role == Qt.EditRole: diff --git a/src/calibre/gui2/dialogs/user_profiles.py b/src/calibre/gui2/dialogs/user_profiles.py index d66d02d211..92d20a6f03 100644 --- a/src/calibre/gui2/dialogs/user_profiles.py +++ b/src/calibre/gui2/dialogs/user_profiles.py @@ -143,7 +143,9 @@ class UserProfiles(ResizableDialog, Ui_Dialog): pt = PersistentTemporaryFile(suffix='.recipe') pt.write(src.encode('utf-8')) pt.close() - body = _('The attached file: %s is a recipe to download %s.')%(os.path.basename(pt.name), title) + body = _('The attached file: %(fname)s is a ' + 'recipe to download %(title)s.')%dict( + fname=os.path.basename(pt.name), title=title) subject = _('Recipe for ')+title url = QUrl('mailto:') url.addQueryItem('subject', subject) diff --git a/src/calibre/gui2/dnd.py b/src/calibre/gui2/dnd.py index b602e4112a..90b7e1e0ca 100644 --- a/src/calibre/gui2/dnd.py +++ b/src/calibre/gui2/dnd.py @@ -51,8 +51,8 @@ class DownloadDialog(QDialog): # {{{ self.setWindowTitle(_('Download %s')%fname) self.l = QVBoxLayout(self) self.purl = urlparse(url) - self.msg = QLabel(_('Downloading %s from %s')%(fname, - self.purl.netloc)) + self.msg = QLabel(_('Downloading %(fname)s from %(url)s')%dict( + fname=fname, url=self.purl.netloc)) self.msg.setWordWrap(True) self.l.addWidget(self.msg) self.pb = QProgressBar(self) @@ -82,9 +82,9 @@ class DownloadDialog(QDialog): # {{{ self.exec_() if self.worker.err is not None: error_dialog(self.parent(), _('Download failed'), - _('Failed to download from %r with error: %s')%( - self.worker.url, self.worker.err), - det_msg=self.worker.tb, show=True) + _('Failed to download from %(url)r with error: %(err)s')%dict( + url=self.worker.url, err=self.worker.err), + det_msg=self.worker.tb, show=True) def update(self): if self.rejected: diff --git a/src/calibre/gui2/email.py b/src/calibre/gui2/email.py index b9c760abff..0879823574 100644 --- a/src/calibre/gui2/email.py +++ b/src/calibre/gui2/email.py @@ -120,7 +120,7 @@ def send_mails(jobnames, callback, attachments, to_s, subjects, texts, attachment_names, job_manager): for name, attachment, to, subject, text, aname in zip(jobnames, attachments, to_s, subjects, texts, attachment_names): - description = _('Email %s to %s') % (name, to) + description = _('Email %(name)s to %(to)s') % dict(name=name, to=to) job = ThreadedJob('email', description, gui_sendmail, (attachment, aname, to, subject, text), {}, callback) job_manager.run_threaded_job(job) diff --git a/src/calibre/gui2/metadata/basic_widgets.py b/src/calibre/gui2/metadata/basic_widgets.py index 227a2257bc..d5e8824862 100644 --- a/src/calibre/gui2/metadata/basic_widgets.py +++ b/src/calibre/gui2/metadata/basic_widgets.py @@ -878,9 +878,10 @@ class Cover(ImageView): # {{{ series = self.dialog.series.current_val series_string = None if series: - series_string = _('Book %s of %s')%( - fmt_sidx(self.dialog.series_index.current_val, - use_roman=config['use_roman_numerals_for_series_number']), series) + series_string = _('Book %(sidx)s of %(series)s')%dict( + sidx=fmt_sidx(self.dialog.series_index.current_val, + use_roman=config['use_roman_numerals_for_series_number']), + series=series) self.current_val = calibre_cover(title, author, series_string=series_string) @@ -921,8 +922,8 @@ class Cover(ImageView): # {{{ self.setPixmap(pm) tt = _('This book has no cover') if self._cdata: - tt = _('Cover size: %dx%d pixels') % \ - (pm.width(), pm.height()) + tt = _('Cover size: %(width)d x %(height)d pixels') % \ + dict(width=pm.width(), height=pm.height()) self.setToolTip(tt) return property(fget=fget, fset=fset) diff --git a/src/calibre/gui2/metadata/bulk_download.py b/src/calibre/gui2/metadata/bulk_download.py index 3461da8666..f8c07924f4 100644 --- a/src/calibre/gui2/metadata/bulk_download.py +++ b/src/calibre/gui2/metadata/bulk_download.py @@ -196,7 +196,7 @@ def download(ids, db, do_identify, covers, ans[i] = mi count += 1 notifications.put((count/len(ids), - _('Downloaded %d of %d')%(count, len(ids)))) + _('Downloaded %(num)d of %(tot)d')%dict(num=count, tot=len(ids)))) log('Download complete, with %d failures'%len(failed_ids)) return (ans, failed_ids, failed_covers, title_map, all_failed) diff --git a/src/calibre/gui2/metadata/single_download.py b/src/calibre/gui2/metadata/single_download.py index 2dcf767a38..3ede8f4b61 100644 --- a/src/calibre/gui2/metadata/single_download.py +++ b/src/calibre/gui2/metadata/single_download.py @@ -726,8 +726,8 @@ class CoversWidget(QWidget): # {{{ if num < 2: txt = _('Could not find any covers for %s')%self.book.title else: - txt = _('Found %d covers of %s. Pick the one you like' - ' best.')%(num-1, self.title) + txt = _('Found %(num)d covers of %(title)s. Pick the one you like' + ' best.')%dict(num=num-1, title=self.title) self.msg.setText(txt) self.finished.emit() diff --git a/src/calibre/gui2/preferences/coloring.py b/src/calibre/gui2/preferences/coloring.py index ad636bd600..22bd94c595 100644 --- a/src/calibre/gui2/preferences/coloring.py +++ b/src/calibre/gui2/preferences/coloring.py @@ -445,15 +445,15 @@ class RulesModel(QAbstractListModel): # {{{ def rule_to_html(self, col, rule): if not isinstance(rule, Rule): return _(''' -

Advanced Rule for column %s: -

%s
- ''')%(col, prepare_string_for_xml(rule)) +

Advanced Rule for column %(col)s: +

%(rule)s
+ ''')%dict(col=col, rule=prepare_string_for_xml(rule)) conditions = [self.condition_to_html(c) for c in rule.conditions] return _('''\ -

Set the color of %s to %s if the following +

Set the color of %(col)s to %(color)s if the following conditions are met:

- - ''') % (col, rule.color, ''.join(conditions)) + + ''') % dict(col=col, color=rule.color, rule=''.join(conditions)) def condition_to_html(self, condition): c, a, v = condition @@ -464,8 +464,8 @@ class RulesModel(QAbstractListModel): # {{{ action_name = trans return ( - _('
  • If the %s column %s value: %s') % - (c, action_name, prepare_string_for_xml(v))) + _('
  • If the %(col)s column %(action)s value: %(val)s') % + dict(col=c, action=action_name, val=prepare_string_for_xml(v))) # }}} diff --git a/src/calibre/gui2/preferences/metadata_sources.py b/src/calibre/gui2/preferences/metadata_sources.py index 6c9122abf7..d9dd64af6c 100644 --- a/src/calibre/gui2/preferences/metadata_sources.py +++ b/src/calibre/gui2/preferences/metadata_sources.py @@ -262,8 +262,8 @@ class PluginConfig(QWidget): # {{{ self.l = l = QVBoxLayout() self.setLayout(l) - self.c = c = QLabel(_('Configure %s
    %s') % (plugin.name, - plugin.description)) + self.c = c = QLabel(_('Configure %(name)s
    %(desc)s') % dict( + name=plugin.name, desc=plugin.description)) c.setAlignment(Qt.AlignHCenter) l.addWidget(c) diff --git a/src/calibre/gui2/store/stores/mobileread/cache_update_thread.py b/src/calibre/gui2/store/stores/mobileread/cache_update_thread.py index f81e7951d4..44a3c002db 100644 --- a/src/calibre/gui2/store/stores/mobileread/cache_update_thread.py +++ b/src/calibre/gui2/store/stores/mobileread/cache_update_thread.py @@ -18,11 +18,11 @@ from calibre import browser from calibre.gui2.store.search_result import SearchResult class CacheUpdateThread(Thread, QObject): - + total_changed = pyqtSignal(int) update_progress = pyqtSignal(int) update_details = pyqtSignal(unicode) - + def __init__(self, config, seralize_books_function, timeout): Thread.__init__(self) QObject.__init__(self) @@ -32,19 +32,19 @@ class CacheUpdateThread(Thread, QObject): self.seralize_books = seralize_books_function self.timeout = timeout self._run = True - + def abort(self): self._run = False - + def run(self): url = 'http://www.mobileread.com/forums/ebooks.php?do=getlist&type=html' - + self.update_details.emit(_('Checking last download date.')) last_download = self.config.get('last_download', None) # Don't update the book list if our cache is less than one week old. if last_download and (time.time() - last_download) < 604800: return - + self.update_details.emit(_('Downloading book list from MobileRead.')) # Download the book list HTML file from MobileRead. br = browser() @@ -54,10 +54,10 @@ class CacheUpdateThread(Thread, QObject): raw_data = f.read() except: return - + if not raw_data or not self._run: return - + self.update_details.emit(_('Processing books.')) # Turn books listed in the HTML file into SearchResults's. books = [] @@ -65,21 +65,23 @@ class CacheUpdateThread(Thread, QObject): data = html.fromstring(raw_data) raw_books = data.xpath('//ul/li') self.total_changed.emit(len(raw_books)) - + for i, book_data in enumerate(raw_books): - self.update_details.emit(_('%s of %s books processed.') % (i, len(raw_books))) + self.update_details.emit( + _('%(num)s of %(tot)s books processed.') % dict( + num=i, tot=len(raw_books))) book = SearchResult() book.detail_item = ''.join(book_data.xpath('.//a/@href')) book.formats = ''.join(book_data.xpath('.//i/text()')) book.formats = book.formats.strip() - + text = ''.join(book_data.xpath('.//a/text()')) if ':' in text: book.author, q, text = text.partition(':') book.author = book.author.strip() book.title = text.strip() books.append(book) - + if not self._run: books = [] break diff --git a/src/calibre/gui2/tag_browser/view.py b/src/calibre/gui2/tag_browser/view.py index 295ef6f452..4559eedc0d 100644 --- a/src/calibre/gui2/tag_browser/view.py +++ b/src/calibre/gui2/tag_browser/view.py @@ -384,8 +384,8 @@ class TagsView(QTreeView): # {{{ action='delete_search', key=tag.name)) if key.startswith('@') and not item.is_gst: self.context_menu.addAction(self.user_category_icon, - _('Remove %s from category %s')% - (display_name(tag), item.py_name), + _('Remove %(item)s from category %(cat)s')% + dict(item=display_name(tag), cat=item.py_name), partial(self.context_menu_handler, action='delete_item_from_user_category', key = key, index = tag_item)) diff --git a/src/calibre/gui2/tools.py b/src/calibre/gui2/tools.py index 03b32ca2fb..1726c791f0 100644 --- a/src/calibre/gui2/tools.py +++ b/src/calibre/gui2/tools.py @@ -94,8 +94,8 @@ def convert_single_ebook(parent, db, book_ids, auto_conversion=False, # {{{ msg = '%s' % '\n'.join(res) warning_dialog(parent, _('Could not convert some books'), - _('Could not convert %d of %d books, because no suitable source' - ' format was found.') % (len(res), total), + _('Could not convert %(num)d of %(tot)d books, because no suitable source' + ' format was found.') % dict(num=len(res), tot=total), msg).exec_() return jobs, changed, bad @@ -187,7 +187,8 @@ class QueueBulk(QProgressDialog): except: dtitle = repr(mi.title) self.setLabelText(_('Queueing ')+dtitle) - desc = _('Convert book %d of %d (%s)') % (self.i, len(self.book_ids), dtitle) + desc = _('Convert book %(num)d of %(tot)d (%(title)s)') % dict( + num=self.i, tot=len(self.book_ids), title=dtitle) args = [in_file.name, out_file.name, lrecs] temp_files.append(out_file) @@ -209,8 +210,8 @@ class QueueBulk(QProgressDialog): msg = '%s' % '\n'.join(res) warning_dialog(self.parent, _('Could not convert some books'), - _('Could not convert %d of %d books, because no suitable ' - 'source format was found.') % (len(res), len(self.book_ids)), + _('Could not convert %(num)d of %(tot)d books, because no suitable ' + 'source format was found.') % dict(num=len(res), tot=len(self.book_ids)), msg).exec_() self.parent = None self.jobs.reverse() diff --git a/src/calibre/gui2/update.py b/src/calibre/gui2/update.py index 9d4d4def75..f76d4b8e65 100644 --- a/src/calibre/gui2/update.py +++ b/src/calibre/gui2/update.py @@ -70,10 +70,10 @@ class UpdateNotification(QDialog): self.logo.setPixmap(QPixmap(I('lt.png')).scaled(100, 100, Qt.IgnoreAspectRatio, Qt.SmoothTransformation)) self.label = QLabel(('

    '+ - _('%s has been updated to version %s. ' + _('%(app)s has been updated to version %(ver)s. ' 'See the new features.'))%( - __appname__, calibre_version)) + '">new features.'))%dict( + app=__appname__, ver=calibre_version)) self.label.setOpenExternalLinks(True) self.label.setWordWrap(True) self.setWindowTitle(_('Update available!')) diff --git a/src/calibre/gui2/viewer/main.py b/src/calibre/gui2/viewer/main.py index 963b16dde5..35b25b262e 100644 --- a/src/calibre/gui2/viewer/main.py +++ b/src/calibre/gui2/viewer/main.py @@ -492,11 +492,11 @@ class EbookViewer(MainWindow, Ui_EbookViewer): self.set_page_number(frac) def magnification_changed(self, val): - tt = _('Make font size %s\nCurrent magnification: %.1f') + tt = _('Make font size %(which)s\nCurrent magnification: %(mag).1f') self.action_font_size_larger.setToolTip( - tt %(_('larger'), val)) + tt %dict(which=_('larger'), mag=val)) self.action_font_size_smaller.setToolTip( - tt %(_('smaller'), val)) + tt %dict(which=_('smaller'), mag=val)) def find(self, text, repeat=False, backwards=False): if not text: diff --git a/src/calibre/gui2/wizard/__init__.py b/src/calibre/gui2/wizard/__init__.py index a98c4aaa16..0399ee400a 100644 --- a/src/calibre/gui2/wizard/__init__.py +++ b/src/calibre/gui2/wizard/__init__.py @@ -569,9 +569,9 @@ def move_library(oldloc, newloc, parent, callback_on_complete): det = traceback.format_exc() error_dialog(parent, _('Invalid database'), _('

    An invalid library already exists at ' - '%s, delete it before trying to move the ' - 'existing library.
    Error: %s')%(newloc, - str(err)), det, show=True) + '%(loc)s, delete it before trying to move the ' + 'existing library.
    Error: %(err)s')%dict(loc=newloc, + err=str(err)), det, show=True) callback(None) return else: diff --git a/src/calibre/gui2/wizard/send_email.py b/src/calibre/gui2/wizard/send_email.py index 4337e558eb..0dc6861116 100644 --- a/src/calibre/gui2/wizard/send_email.py +++ b/src/calibre/gui2/wizard/send_email.py @@ -31,9 +31,9 @@ class TestEmail(QDialog, TE_Dialog): if pa: self.to.setText(pa) if opts.relay_host: - self.label.setText(_('Using: %s:%s@%s:%s and %s encryption')% - (opts.relay_username, unhexlify(opts.relay_password), - opts.relay_host, opts.relay_port, opts.encryption)) + self.label.setText(_('Using: %(un)s:%(pw)s@%(host)s:%(port)s and %(enc)s encryption')% + dict(un=opts.relay_username, pw=unhexlify(opts.relay_password), + host=opts.relay_host, port=opts.relay_port, enc=opts.encryption)) def test(self, *args): self.log.setPlainText(_('Sending...')) diff --git a/src/calibre/library/catalog.py b/src/calibre/library/catalog.py index 1b8bb365ab..3bbbd54926 100644 --- a/src/calibre/library/catalog.py +++ b/src/calibre/library/catalog.py @@ -54,12 +54,12 @@ class CSV_XML(CatalogPlugin): # {{{ action = None, help = _('The fields to output when cataloging books in the ' 'database. Should be a comma-separated list of fields.\n' - 'Available fields: %s,\n' + 'Available fields: %(fields)s,\n' 'plus user-created custom fields.\n' - 'Example: %s=title,authors,tags\n' + 'Example: %(opt)s=title,authors,tags\n' "Default: '%%default'\n" - "Applies to: CSV, XML output formats")%(', '.join(FIELDS), - '--fields')), + "Applies to: CSV, XML output formats")%dict( + fields=', '.join(FIELDS), opt='--fields')), Option('--sort-by', default = 'id', @@ -250,12 +250,12 @@ class BIBTEX(CatalogPlugin): # {{{ action = None, help = _('The fields to output when cataloging books in the ' 'database. Should be a comma-separated list of fields.\n' - 'Available fields: %s.\n' + 'Available fields: %(fields)s.\n' 'plus user-created custom fields.\n' - 'Example: %s=title,authors,tags\n' + 'Example: %(opt)s=title,authors,tags\n' "Default: '%%default'\n" - "Applies to: BIBTEX output format")%(', '.join(FIELDS), - '--fields')), + "Applies to: BIBTEX output format")%dict( + fields=', '.join(FIELDS), opt='--fields')), Option('--sort-by', default = 'id', diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 8ee6af31fc..ea4ca373c4 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -62,7 +62,8 @@ class Tag(object): if self.avg_rating > 0: if tooltip: tooltip = tooltip + ': ' - tooltip = _('%sAverage rating is %3.1f')%(tooltip, self.avg_rating) + tooltip = _('%(tt)sAverage rating is %(rating)3.1f')%dict( + tt=tooltip, rating=self.avg_rating) self.tooltip = tooltip self.icon = icon self.category = category diff --git a/src/calibre/library/save_to_disk.py b/src/calibre/library/save_to_disk.py index b5c4e2faf3..67bb0911f4 100644 --- a/src/calibre/library/save_to_disk.py +++ b/src/calibre/library/save_to_disk.py @@ -92,16 +92,17 @@ def config(defaults=None): ' By default all available formats are saved.')) x('template', default=DEFAULT_TEMPLATE, help=_('The template to control the filename and directory structure of the saved files. ' - 'Default is "%s" which will save books into a per-author ' + 'Default is "%(templ)s" which will save books into a per-author ' 'subdirectory with filenames containing title and author. ' - 'Available controls are: {%s}')%(DEFAULT_TEMPLATE, ', '.join(FORMAT_ARGS))) + 'Available controls are: {%(controls)s}')%dict( + templ=DEFAULT_TEMPLATE, controls=', '.join(FORMAT_ARGS))) x('send_template', default=DEFAULT_SEND_TEMPLATE, help=_('The template to control the filename and directory structure of files ' 'sent to the device. ' - 'Default is "%s" which will save books into a per-author ' + 'Default is "%(templ)s" which will save books into a per-author ' 'directory with filenames containing title and author. ' - 'Available controls are: {%s}')%(DEFAULT_SEND_TEMPLATE, ', '.join(FORMAT_ARGS))) - + 'Available controls are: {%(controls)s}')%dict( + templ=DEFAULT_SEND_TEMPLATE, controls=', '.join(FORMAT_ARGS))) x('asciiize', default=True, help=_('Normally, calibre will convert all non English characters into English equivalents ' 'for the file names. ' diff --git a/src/calibre/library/server/browse.py b/src/calibre/library/server/browse.py index 79c714d2ab..3329093e8e 100644 --- a/src/calibre/library/server/browse.py +++ b/src/calibre/library/server/browse.py @@ -124,7 +124,8 @@ def render_rating(rating, url_prefix, container='span', prefix=None): # {{{ added = 0 if prefix is None: prefix = _('Average rating') - rstring = xml(_('%s: %.1f stars')% (prefix, rating if rating else 0.0), + rstring = xml(_('%(prefix)s: %(rating).1f stars')%dict( + prefix=prefix, rating=rating if rating else 0.0), True) ans = ['<%s class="rating">' % (container)] for i in range(5): diff --git a/src/calibre/library/server/opds.py b/src/calibre/library/server/opds.py index 54d2424430..8d1c555f3f 100644 --- a/src/calibre/library/server/opds.py +++ b/src/calibre/library/server/opds.py @@ -171,9 +171,9 @@ def ACQUISITION_ENTRY(item, version, db, updated, CFM, CKEYS, prefix): no_tag_count=True))) series = item[FM['series']] if series: - extra.append(_('SERIES: %s [%s]
    ')%\ - (xml(series), - fmt_sidx(float(item[FM['series_index']])))) + extra.append(_('SERIES: %(series)s [%(sidx)s]
    ')%\ + dict(series=xml(series), + sidx=fmt_sidx(float(item[FM['series_index']])))) for key in CKEYS: mi = db.get_metadata(item[CFM['id']['rec_index']], index_is_id=True) name, val = mi.format_field(key) diff --git a/src/calibre/translations/calibre.pot b/src/calibre/translations/calibre.pot index f121d4cfbc..69d1dcc04a 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.9\n" -"POT-Creation-Date: 2011-07-10 11:39+MDT\n" -"PO-Revision-Date: 2011-07-10 11:39+MDT\n" +"POT-Creation-Date: 2011-07-10 13:08+MDT\n" +"PO-Revision-Date: 2011-07-10 13:08+MDT\n" "Last-Translator: Automatically generated\n" "Language-Team: LANGUAGE\n" "MIME-Version: 1.0\n" @@ -41,8 +41,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:102 #: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:332 #: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:335 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1894 -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1896 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1898 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1900 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:24 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:253 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:34 @@ -133,16 +133,16 @@ msgstr "" #: /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:548 +#: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:549 #: /home/kovid/work/calibre/src/calibre/gui2/convert/__init__.py:42 #: /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:1168 -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1171 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1169 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1172 #: /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/book_info.py:128 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:47 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:371 #: /home/kovid/work/calibre/src/calibre/gui2/email.py:185 @@ -165,14 +165,14 @@ 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:1985 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2132 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:3146 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:3148 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:3281 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:535 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:543 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:554 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1986 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2133 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:3147 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:3149 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:3282 #: /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 @@ -813,8 +813,8 @@ 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:129 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:138 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:130 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:139 #, python-format msgid "Path to library too long. Must be less than %d characters." msgstr "" @@ -893,37 +893,37 @@ msgstr "" msgid "Updating device metadata listing..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:449 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:488 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:1078 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:1121 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:3110 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:3150 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:450 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:489 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:1081 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:1125 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:3115 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:3155 #, python-format -msgid "%d of %d" +msgid "%(num)d of %(tot)d" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:495 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:1126 -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:3156 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:497 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:1130 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:3162 #: /home/kovid/work/calibre/src/calibre/gui2/ebook_download.py:106 msgid "finished" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:680 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:682 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:1042 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:1044 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:2680 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2684 #: /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 @@ -931,25 +931,25 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:1079 #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:1109 #: /home/kovid/work/calibre/src/calibre/gui2/actions/fetch_news.py:73 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:450 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:452 #: /home/kovid/work/calibre/src/calibre/gui2/tag_browser/model.py:1139 #: /home/kovid/work/calibre/src/calibre/gui2/tag_browser/model.py:1141 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:329 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:342 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:3010 +#: /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:3011 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:171 msgid "News" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2681 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:2685 #: /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:2970 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:2988 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2971 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:2989 msgid "Catalog" msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:3012 +#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:3016 msgid "Communicate with iTunes." msgstr "" @@ -1360,7 +1360,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:70 #, python-format -msgid ". Two special collections are available: %s:%s and %s:%s. Add these values to the list to enable them. The collections will be given the name provided after the \":\" character." +msgid ". Two special collections are available: %(abt)s:%(abtv)s and %(aba)s:%(abav)s. Add these values to the list to enable them. The collections will be given the name provided after the \":\" character." msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:74 @@ -1723,7 +1723,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:146 #, python-format -msgid "Modify the document text and structure using common patterns. Disabled by default. Use %s to enable. Individual actions can be disabled with the %s options." +msgid "Modify the document text and structure using common patterns. Disabled by default. Use %(en)s to enable. Individual actions can be disabled with the %(dis)s options." msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:154 @@ -2086,10 +2086,10 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/__init__.py:20 #, python-format -msgid "Failed to parse: %s with error: %s" +msgid "Failed to parse: %(name)s with error: %(err)s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/__init__.py:26 +#: /home/kovid/work/calibre/src/calibre/ebooks/epub/fix/__init__.py:27 msgid "ePub Fixer" msgstr "" @@ -2281,60 +2281,53 @@ msgstr "" msgid "%s is an empty file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:564 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:565 #, python-format -msgid "Failed to parse link %s %s" +msgid "Failed to parse link %(tag)s %(children)s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:608 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:610 #, python-format msgid "Cannot add link %s to TOC" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:957 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:960 #, python-format -msgid "Unable to process image %s. Error: %s" +msgid "Unable to process image %(path)s. Error: %(err)s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1002 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1006 #, python-format msgid "Unable to process interlaced PNG %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1017 -#, python-format -msgid "" -"Could not process image: %s\n" -"%s" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1772 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1776 #, python-format msgid "An error occurred while processing a table: %s. Ignoring table markup." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1774 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1778 #, python-format msgid "" "Bad table:\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1796 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1800 msgid "Table has cell that is too large" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1862 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1866 #, python-format msgid "Could not read cover image: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1865 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1869 #, python-format msgid "Cannot read from: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1994 +#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/html/convert_from.py:1998 msgid "Failed to process opf file" msgstr "" @@ -2528,7 +2521,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:636 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:66 #: /home/kovid/work/calibre/src/calibre/gui2/custom_column_widgets.py:564 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:971 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:972 #: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:754 #: /home/kovid/work/calibre/src/calibre/utils/formatter_functions.py:766 msgid "Yes" @@ -2581,7 +2574,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/create_custom_column.py:70 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/metadata_sources.py:161 #: /home/kovid/work/calibre/src/calibre/library/field_metadata.py:185 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:761 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:762 msgid "Tags" msgstr "" @@ -2627,9 +2620,9 @@ msgid "" "\n" "Read/Write metadata from/to ebook files.\n" "\n" -"Supported formats for reading metadata: %s\n" +"Supported formats for reading metadata: %(read)s\n" "\n" -"Supported formats for writing metadata: %s\n" +"Supported formats for writing metadata: %(write)s\n" "\n" "Different file types support different kinds of metadata. If you try to set\n" "some metadata on a file type that does not support it, the metadata will be\n" @@ -2912,7 +2905,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_bulk.py:176 #: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:881 #, python-format -msgid "Book %s of %s" +msgid "Book %(sidx)s of %(series)s" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/htmltoc.py:54 @@ -2923,13 +2916,13 @@ msgstr "" #: /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:160 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:759 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:760 msgid "Rating" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/split.py:34 #, python-format -msgid "Could not find reasonable point at which to split: %s Sub-tree size: %d KB" +msgid "Could not find reasonable point at which to split: %(path)s Sub-tree size: %(size)d KB" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/writer.py:32 @@ -3661,27 +3654,27 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:123 #, python-format -msgid "%s
    Last Page Read: %d (%d%%)" +msgid "%(time)s
    Last Page Read: %(loc)d (%(pr)d%%)" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:129 #, python-format -msgid "%s
    Last Page Read: Location %d (%d%%)" +msgid "%(time)s
    Last Page Read: Location %(loc)d (%(pr)d%%)" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:148 #, python-format -msgid "Location %d • %s
    %s
    " +msgid "Location %(dl)d • %(typ)s
    %(text)s
    " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:157 #, python-format -msgid "Page %d • %s
    " +msgid "Page %(dl)d • %(typ)s
    " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/annotate.py:162 #, python-format -msgid "Location %d • %s
    " +msgid "Location %(dl)d • %(typ)s
    " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:20 @@ -3708,12 +3701,12 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/catalog.py:85 #, python-format -msgid "Select destination for %s.%s" +msgid "Select destination for %(title)s.%(fmt)s" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:82 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/toolbar.py:57 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:170 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:171 #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:125 #, python-format msgid "%d books" @@ -3779,8 +3772,8 @@ msgid "Note that the actual library folder will be renamed." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:230 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/plugin_updater.py:724 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:199 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/plugin_updater.py:726 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:201 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:291 msgid "Already exists" msgstr "" @@ -3842,7 +3835,7 @@ msgid "Path to library too long. Must be less than %d characters. Move your libr msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:325 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/plugin_updater.py:731 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/plugin_updater.py:733 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/restore_library.py:106 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/restore_library.py:111 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:297 @@ -3887,7 +3880,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:414 #: /home/kovid/work/calibre/src/calibre/gui2/actions/choose_library.py:419 -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:177 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:178 #: /home/kovid/work/calibre/src/calibre/gui2/actions/save_to_disk.py:100 #: /home/kovid/work/calibre/src/calibre/gui2/library/views.py:883 msgid "Not allowed" @@ -3965,12 +3958,12 @@ msgstr "" msgid "Could not copy books: " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:163 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:164 #, python-format -msgid "Copied %d books to %s" +msgid "Copied %(num)d books to %(loc)s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:178 +#: /home/kovid/work/calibre/src/calibre/gui2/actions/copy_to_library.py:179 msgid "You cannot use other libraries while using the environment variable CALIBRE_OVERRIDE_DATABASE_PATH." msgstr "" @@ -3978,7 +3971,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/confirm_delete_ui.py:53 #: /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/dialogs/user_profiles.py:370 #: /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 @@ -4479,7 +4472,7 @@ msgid "Click the show details button to see which ones." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/actions/show_book_details.py:16 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:766 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:767 msgid "Show book details" msgstr "" @@ -4910,7 +4903,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:162 #, python-format -msgid "Book %s of %s" +msgid "Book %(sidx)s of %(series)s" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:173 @@ -4941,7 +4934,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/book_details.py:544 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:109 #, python-format -msgid "Cover size: %dx%d" +msgid "Cover size: %(width)d x %(height)d" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/catalog/catalog_bibtex.py:16 @@ -5964,7 +5957,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:1014 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1015 msgid "Tags categorize the book. This is particularly useful while searching.

    They can be any words or phrases, separated by commas." msgstr "" @@ -6582,7 +6575,7 @@ msgstr "" #: /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:1281 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1282 msgid "Undefined" msgstr "" @@ -6739,7 +6732,7 @@ msgid "Error communicating with device" msgstr "" #: /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/device.py:1219 #: /home/kovid/work/calibre/src/calibre/gui2/email.py:254 msgid "No suitable formats" msgstr "" @@ -6770,63 +6763,63 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/device.py:915 #, python-format -msgid "%i of %i Books" +msgid "%(num)i of %(total)i Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:918 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:919 #, python-format msgid "0 of %i Books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:919 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:920 msgid "Choose format to send to device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:927 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:928 msgid "No device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:928 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:929 msgid "Cannot send: No device is connected" msgstr "" -#: /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:932 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:936 +msgid "No card" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:933 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:937 msgid "Cannot send: Device has no storage card" msgstr "" -#: /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 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:998 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1081 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1213 msgid "Auto convert the following books before uploading to the device?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1026 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1027 msgid "Sending catalogs to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1125 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1126 msgid "Sending news to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1179 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1180 msgid "Sending books to device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1219 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1220 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:1292 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1293 msgid "No space on device" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1293 +#: /home/kovid/work/calibre/src/calibre/gui2/device.py:1294 msgid "

    Cannot upload books to device there is no more free space available " msgstr "" @@ -6919,7 +6912,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:320 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:321 msgid "Generate catalog" msgstr "" @@ -7063,7 +7056,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/check_library.py:337 #: /home/kovid/work/calibre/src/calibre/gui2/store/config/chooser/models.py:21 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/bookmarkmanager.py:89 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:256 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:257 msgid "Name" msgstr "" @@ -7614,13 +7607,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:972 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:973 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:973 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:974 msgid "Rating of this book. 0-5 stars" msgstr "" @@ -7690,7 +7683,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:1265 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1266 msgid "&Date:" msgstr "" @@ -8165,82 +8158,82 @@ msgstr "" msgid "Installing plugins is a security risk. Plugins can contain a virus/malware. Only install it if you got it from a trusted source. Are you sure you want to proceed?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/plugin_updater.py:704 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/plugin_updater.py:705 #, python-format -msgid "Locating zip file for %s: %s" +msgid "Locating zip file for %(name)s: %(link)s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/plugin_updater.py:707 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/plugin_updater.py:744 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/plugin_updater.py:709 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/plugin_updater.py:746 msgid "Install Plugin Failed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/plugin_updater.py:708 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/plugin_updater.py:710 #, python-format msgid "Unable to locate a plugin zip file for %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/plugin_updater.py:713 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/plugin_updater.py:715 #, python-format msgid "Downloading plugin zip attachment: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/plugin_updater.py:718 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/plugin_updater.py:720 #, python-format msgid "Installing plugin: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/plugin_updater.py:730 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/plugin_updater.py:732 #, python-format msgid "Plugin installed: %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/plugin_updater.py:732 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/plugin_updater.py:734 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:298 msgid "Plugin {0} successfully installed under {1} plugins. You may have to restart calibre for the plugin to take effect." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/plugin_updater.py:745 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/plugin_updater.py:747 msgid "A problem occurred while installing this plugin. This plugin will now be uninstalled. Please post the error message in details below into the forum thread for this plugin and restart Calibre." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/plugin_updater.py:770 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/plugin_updater.py:772 msgid "Version history missing" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/plugin_updater.py:771 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/plugin_updater.py:773 #, python-format msgid "Unable to find the version history for %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/plugin_updater.py:778 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/plugin_updater.py:780 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:333 msgid "Plugin not customizable" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/plugin_updater.py:779 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/plugin_updater.py:781 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:334 #, python-format msgid "Plugin: %s does not need customization" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/plugin_updater.py:783 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/plugin_updater.py:785 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:340 msgid "Must restart" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/plugin_updater.py:784 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/plugin_updater.py:786 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:341 #, python-format msgid "You must restart calibre before you can configure the %s plugin" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/plugin_updater.py:792 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/plugin_updater.py:794 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:322 msgid "Plugin cannot be disabled" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/plugin_updater.py:793 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/plugin_updater.py:795 #: /home/kovid/work/calibre/src/calibre/gui2/preferences/plugins.py:323 #, python-format msgid "The plugin: %s cannot be disabled" @@ -8289,7 +8282,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/store/search_ui.py:109 #: /home/kovid/work/calibre/src/calibre/gui2/store/stores/mobileread/store_dialog_ui.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/widgets.py:670 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:280 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:281 msgid "Search" msgstr "" @@ -8468,31 +8461,31 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:384 #, python-format -msgid "%d days, %d hours and %d minutes ago" +msgid "%(days)d days, %(hours)d hours and %(mins)d minutes ago" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:398 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:400 msgid "Last downloaded:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:426 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:428 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler_ui.py:206 msgid "Schedule news download" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:429 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:431 msgid "Add a custom news source" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:434 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:436 msgid "Download all scheduled new sources" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:539 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:541 msgid "No internet connection" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:540 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:542 msgid "Cannot download news as no internet connection is active" msgstr "" @@ -8718,7 +8711,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:1013 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1014 msgid "Ta&gs:" msgstr "" @@ -8848,7 +8841,7 @@ msgid "Unapply (remove) tag from current tag category" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_editor.py:70 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:111 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:112 msgid "Are your sure?" msgstr "" @@ -8894,36 +8887,36 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:21 #, python-format -msgid "%s (was %s)" +msgid "%(curr)s (was %(initial)s)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:85 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:86 #: /home/kovid/work/calibre/src/calibre/gui2/tag_browser/model.py:882 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/dialogs/tag_list_editor.py:87 #: /home/kovid/work/calibre/src/calibre/gui2/tag_browser/model.py:883 msgid "An item cannot be set to nothing. Delete it instead." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:99 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:100 msgid "No item selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:100 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:101 msgid "You must select one item from the list of Available items." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:107 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:108 msgid "No items selected" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:108 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:109 msgid "You must select at least one items from the list." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:112 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/tag_list_editor.py:113 msgid "Are you certain you want to delete the following items?" msgstr "" @@ -9071,84 +9064,84 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:146 #, python-format -msgid "The attached file: %s is a recipe to download %s." +msgid "The attached file: %(fname)s is a recipe to download %(title)s." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:147 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:149 msgid "Recipe for " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:164 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:175 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:166 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:177 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles_ui.py:265 msgid "Switch to Advanced mode" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:170 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:178 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:172 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:180 msgid "Switch to Basic mode" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:188 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:190 msgid "Feed must have a title" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:189 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:191 msgid "The feed must have a title" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:193 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:195 msgid "Feed must have a URL" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:194 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:196 #, python-format msgid "The feed %s must have a URL" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:200 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:202 msgid "This feed has already been added to the recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:241 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:250 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:337 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:243 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:252 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:339 msgid "Invalid input" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:242 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:251 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:338 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:244 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:253 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:340 #, python-format msgid "

    Could not create recipe. Error:
    %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:255 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:314 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:341 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:257 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:316 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:343 msgid "Replace recipe?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:256 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:315 -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:342 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:258 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:317 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:344 #, python-format msgid "A custom recipe named %s already exists. Do you want to replace it?" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:282 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:284 msgid "Choose builtin recipe" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:328 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:330 msgid "Choose a recipe file" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:329 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:331 msgid "Recipes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:369 +#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/user_profiles.py:371 msgid "You will lose any unsaved changes. To save your changes, click the Add/Update recipe button. Continue?" msgstr "" @@ -9252,12 +9245,12 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dnd.py:54 #, python-format -msgid "Downloading %s from %s" +msgid "Downloading %(fname)s from %(url)s" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dnd.py:85 #, python-format -msgid "Failed to download from %r with error: %s" +msgid "Failed to download from %(url)r with error: %(err)s" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/ebook_download.py:41 @@ -9283,7 +9276,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/email.py:123 #, python-format -msgid "Email %s to %s" +msgid "Email %(name)s to %(to)s" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/email.py:142 @@ -9401,7 +9394,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:1170 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1171 msgid "ISBN:" msgstr "" @@ -9558,7 +9551,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:1087 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1088 msgid "Card A" msgstr "" @@ -9567,7 +9560,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:1089 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1090 msgid "Card B" msgstr "" @@ -10061,40 +10054,40 @@ msgstr "" msgid "You must specify a title and author before generating a cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:894 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:895 msgid "Invalid cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:895 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:896 msgid "Could not change cover as the image is invalid." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:922 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:923 msgid "This book has no cover" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:924 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:925 #, python-format -msgid "Cover size: %dx%d pixels" +msgid "Cover size: %(width)d x %(height)d pixels" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:980 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:981 msgid "stars" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1049 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1050 msgid "Tags changed" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1050 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1051 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:1076 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1077 msgid "I&ds:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1077 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1078 #, python-format msgid "" "Edit the identifiers for this book. For example: \n" @@ -10102,38 +10095,38 @@ msgid "" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1139 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1201 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1140 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1202 msgid "This ISBN number is valid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1142 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1204 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1143 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1205 msgid "This ISBN number is invalid" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1167 -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1189 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1168 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1190 msgid "Invalid ISBN" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1168 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1169 msgid "Enter an ISBN" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1190 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1191 msgid "The ISBN you entered is not valid. Try again." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1214 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1215 msgid "&Publisher:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1284 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1285 msgid "Clear date" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1317 +#: /home/kovid/work/calibre/src/calibre/gui2/metadata/basic_widgets.py:1318 msgid "Publishe&d:" msgstr "" @@ -10189,7 +10182,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/metadata/bulk_download.py:199 #, python-format -msgid "Downloaded %d of %d" +msgid "Downloaded %(num)d of %(tot)d" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/metadata/config.py:61 @@ -10378,7 +10371,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/metadata/single_download.py:729 #, python-format -msgid "Found %d covers of %s. Pick the one you like best." +msgid "Found %(num)d covers of %(title)s. Pick the one you like best." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/metadata/single_download.py:817 @@ -10715,23 +10708,23 @@ msgstr "" #, python-format msgid "" "\n" -"

    Advanced Rule for column %s:\n" -"

    %s
    \n" +"

    Advanced Rule for column %(col)s:\n" +"

    %(rule)s
    \n" " " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:452 #, python-format msgid "" -"

    Set the color of %s to %s if the following\n" +"

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

    \n" -" \n" +" \n" " " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:467 #, python-format -msgid "
  • If the %s column %s value: %s" +msgid "
  • If the %(col)s column %(action)s value: %(val)s" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/coloring.py:483 @@ -11466,7 +11459,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/metadata_sources.py:265 #, python-format -msgid "Configure %s
    %s" +msgid "Configure %(name)s
    %(desc)s" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/preferences/metadata_sources.py:322 @@ -12779,9 +12772,9 @@ msgstr "" msgid "Processing books." msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/store/stores/mobileread/cache_update_thread.py:70 +#: /home/kovid/work/calibre/src/calibre/gui2/store/stores/mobileread/cache_update_thread.py:71 #, python-format -msgid "%s of %s books processed." +msgid "%(num)s of %(tot)s books processed." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/store/stores/mobileread/mobileread_plugin.py:62 @@ -12825,7 +12818,7 @@ msgid "Changing the metadata for that many books can take a while. Are you sure? msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/tag_browser/model.py:823 -#: /home/kovid/work/calibre/src/calibre/library/database2.py:448 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:449 msgid "Searches" msgstr "" @@ -13026,7 +13019,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/tag_browser/view.py:387 #, python-format -msgid "Remove %s from category %s" +msgid "Remove %(item)s from category %(cat)s" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/tag_browser/view.py:394 @@ -13092,14 +13085,14 @@ msgid "Convert book %(num)d of %(total)d (%(title)s)" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/tools.py:96 -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:211 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:212 msgid "Could not convert some books" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/tools.py:97 -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:212 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:213 #, python-format -msgid "Could not convert %d of %d books, because no suitable source format was found." +msgid "Could not convert %(num)d of %(tot)d books, because no suitable source format was found." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/tools.py:128 @@ -13112,18 +13105,18 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/tools.py:190 #, python-format -msgid "Convert book %d of %d (%s)" +msgid "Convert book %(num)d of %(tot)d (%(title)s)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:260 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:261 msgid "Fetch news from " msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:333 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:334 msgid "Convert existing" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:334 +#: /home/kovid/work/calibre/src/calibre/gui2/tools.py:335 #, python-format msgid "The following books have already been converted to %s format. Do you wish to reconvert them?" msgstr "" @@ -13182,7 +13175,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/update.py:73 #, python-format -msgid "%s has been updated to version %s. See the new features." +msgid "%(app)s has been updated to version %(ver)s. See the new features." msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/update.py:79 @@ -13589,8 +13582,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:495 #, python-format msgid "" -"Make font size %s\n" -"Current magnification: %.1f" +"Make font size %(which)s\n" +"Current magnification: %(mag).1f" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:497 @@ -13763,7 +13756,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:571 #, python-format -msgid "

    An invalid library already exists at %s, delete it before trying to move the existing library.
    Error: %s" +msgid "

    An invalid library already exists at %(loc)s, delete it before trying to move the existing library.
    Error: %(err)s" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:582 @@ -13847,7 +13840,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:34 #, python-format -msgid "Using: %s:%s@%s:%s and %s encryption" +msgid "Using: %(un)s:%(pw)s@%(host)s:%(port)s and %(enc)s encryption" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:39 @@ -14040,7 +14033,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/library/caches.py:568 #: /home/kovid/work/calibre/src/calibre/library/caches.py:582 #: /home/kovid/work/calibre/src/calibre/library/caches.py:592 -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:216 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:217 msgid "yes" msgstr "" @@ -14048,7 +14041,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/library/caches.py:567 #: /home/kovid/work/calibre/src/calibre/library/caches.py:579 #: /home/kovid/work/calibre/src/calibre/library/caches.py:589 -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:216 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:217 msgid "no" msgstr "" @@ -14094,9 +14087,9 @@ msgstr "" #, python-format msgid "" "The fields to output when cataloging books in the database. Should be a comma-separated list of fields.\n" -"Available fields: %s,\n" +"Available fields: %(fields)s,\n" "plus user-created custom fields.\n" -"Example: %s=title,authors,tags\n" +"Example: %(opt)s=title,authors,tags\n" "Default: '%%default'\n" "Applies to: CSV, XML output formats" msgstr "" @@ -14114,9 +14107,9 @@ msgstr "" #, python-format msgid "" "The fields to output when cataloging books in the database. Should be a comma-separated list of fields.\n" -"Available fields: %s.\n" +"Available fields: %(fields)s.\n" "plus user-created custom fields.\n" -"Example: %s=title,authors,tags\n" +"Example: %(opt)s=title,authors,tags\n" "Default: '%%default'\n" "Applies to: BIBTEX output format" msgstr "" @@ -14875,24 +14868,24 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/library/database2.py:65 #, python-format -msgid "%sAverage rating is %3.1f" +msgid "%(tt)sAverage rating is %(rating)3.1f" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:1085 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:1086 msgid "Main" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:3307 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:3308 #, python-format msgid "

    Migrating old database to ebook library in %s

    " msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:3336 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:3337 #, python-format msgid "Copying %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/database2.py:3353 +#: /home/kovid/work/calibre/src/calibre/library/database2.py:3354 msgid "Compacting database" msgstr "" @@ -14994,33 +14987,33 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:94 #, python-format -msgid "The template to control the filename and directory structure of the saved files. Default is \"%s\" which will save books into a per-author subdirectory with filenames containing title and author. Available controls are: {%s}" +msgid "The template to control the filename and directory structure of the saved files. Default is \"%(templ)s\" which will save books into a per-author subdirectory with filenames containing title and author. Available controls are: {%(controls)s}" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:99 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:100 #, python-format -msgid "The template to control the filename and directory structure of files sent to the device. Default is \"%s\" which will save books into a per-author directory with filenames containing title and author. Available controls are: {%s}" +msgid "The template to control the filename and directory structure of files sent to the device. Default is \"%(templ)s\" which will save books into a per-author directory with filenames containing title and author. Available controls are: {%(controls)s}" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:106 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:107 msgid "Normally, calibre will convert all non English characters into English equivalents for the file names. WARNING: If you turn this off, you may experience errors when saving, depending on how well the filesystem you are saving to supports unicode." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:112 -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:115 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:113 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:116 msgid "The format in which to display dates. %d - day, %b - month, %Y - year. Default is: %b, %Y" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:118 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:119 msgid "Convert paths to lowercase." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:120 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:121 msgid "Replace whitespace with underscores." msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:379 -#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:412 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:380 +#: /home/kovid/work/calibre/src/calibre/library/save_to_disk.py:413 msgid "Requested formats not available" msgstr "" @@ -15071,7 +15064,7 @@ msgid "Prefix to prepend to all URLs. Useful for reverseproxying to this server msgstr "" #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:64 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:498 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:499 msgid "Loading, please wait" msgstr "" @@ -15094,106 +15087,106 @@ msgid "Browsing %d books" msgstr "" #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:126 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:255 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:256 msgid "Average rating" msgstr "" #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:127 #, python-format -msgid "%s: %.1f stars" +msgid "%(prefix)s: %(rating).1f stars" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:163 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:164 #, python-format msgid "%d stars" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:256 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:257 msgid "Popularity" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:275 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:276 msgid "Sort by" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:278 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:279 msgid "library" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:279 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:280 msgid "home" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:340 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:612 -#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:577 -msgid "Newest" -msgstr "" - #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:341 #: /home/kovid/work/calibre/src/calibre/library/server/browse.py:613 +#: /home/kovid/work/calibre/src/calibre/library/server/opds.py:577 +msgid "Newest" +msgstr "" + +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:342 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:614 msgid "All books" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:386 -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:451 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:387 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:452 msgid "Browse books by" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:391 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:392 msgid "Choose a category to browse by:" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:521 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:522 msgid "Browsing by" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:522 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:523 msgid "Up" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:648 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:649 msgid "in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:651 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:652 msgid "Books in" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:740 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:741 msgid "Other formats" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:747 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:748 #, python-format msgid "Read %(title)s in the %(fmt)s format" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:752 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:753 msgid "Get" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:765 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:766 msgid "Details" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:767 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:768 msgid "Permalink" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:768 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:769 msgid "A permanent link to this book" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:780 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:781 msgid "This book has been deleted" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:868 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:869 msgid "in search" msgstr "" -#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:870 +#: /home/kovid/work/calibre/src/calibre/library/server/browse.py:871 msgid "Matching books" msgstr "" @@ -15248,7 +15241,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:174 #, python-format -msgid "SERIES: %s [%s]
    " +msgid "SERIES: %(series)s [%(sidx)s]
    " msgstr "" #: /home/kovid/work/calibre/src/calibre/library/server/opds.py:271 @@ -15264,8 +15257,7 @@ msgid "Books sorted by " msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/config.py:34 -#, python-format -msgid "%sUsage%s: %s\n" +msgid "Usage" msgstr "" #: /home/kovid/work/calibre/src/calibre/utils/config.py:85 diff --git a/src/calibre/utils/config.py b/src/calibre/utils/config.py index dc39c1f89d..b5b8b566ba 100644 --- a/src/calibre/utils/config.py +++ b/src/calibre/utils/config.py @@ -31,7 +31,7 @@ class CustomHelpFormatter(IndentedHelpFormatter): def format_usage(self, usage): tc = terminal_controller() - return _("%sUsage%s: %s\n") % (tc.BLUE, tc.NORMAL, usage) + return "%s%s%s: %s\n" % (tc.BLUE, _('Usage'), tc.NORMAL, usage) def format_heading(self, heading): tc = terminal_controller()