diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index ed6b15e1e0..a7afd67f46 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -16,6 +16,7 @@ from calibre.ebooks.metadata.book import ( ) from calibre.library.field_metadata import FieldMetadata from calibre.utils.icu import lower as icu_lower, sort_key +from calibre.utils.localization import ngettext from polyglot.builtins import iteritems, string_or_bytes # Special sets used to optimize the performance of getting and setting diff --git a/src/calibre/ebooks/oeb/base.py b/src/calibre/ebooks/oeb/base.py index 746f7133ef..a0ef201374 100644 --- a/src/calibre/ebooks/oeb/base.py +++ b/src/calibre/ebooks/oeb/base.py @@ -6,25 +6,32 @@ __license__ = 'GPL v3' __copyright__ = '2008, Marshall T. Vandegrift ' __docformat__ = 'restructuredtext en' -import os, re, logging, sys, numbers +import logging +import numbers +import os +import re +import sys from collections import defaultdict from itertools import count +from lxml import etree, html from operator import attrgetter -from lxml import etree, html -from calibre import force_unicode -from calibre.constants import filesystem_encoding, __version__ -from calibre.translations.dynamic import translate -from calibre.utils.xml_parse import safe_xml_fromstring +from calibre import as_unicode, force_unicode, get_types_map, isbytestring +from calibre.constants import __version__, filesystem_encoding from calibre.ebooks.chardet import xml_to_unicode from calibre.ebooks.conversion.preprocess import CSSPreProcessor -from calibre import (isbytestring, as_unicode, get_types_map) -from calibre.ebooks.oeb.parse_utils import barename, XHTML_NS, namespace, XHTML, parse_html, NotHTML +from calibre.ebooks.oeb.parse_utils import ( + XHTML, XHTML_NS, NotHTML, barename, namespace, parse_html, +) +from calibre.translations.dynamic import translate from calibre.utils.cleantext import clean_xml_chars +from calibre.utils.icu import numeric_sort_key, title_case as icu_title from calibre.utils.short_uuid import uuid4 -from polyglot.builtins import iteritems, string_or_bytes, itervalues, codepoint_to_chr -from polyglot.urllib import unquote as urlunquote, urldefrag, urljoin, urlparse, urlunparse -from calibre.utils.icu import numeric_sort_key +from calibre.utils.xml_parse import safe_xml_fromstring +from polyglot.builtins import codepoint_to_chr, iteritems, itervalues, string_or_bytes +from polyglot.urllib import ( + unquote as urlunquote, urldefrag, urljoin, urlparse, urlunparse, +) XML_NS = 'http://www.w3.org/XML/1998/namespace' OEB_DOC_NS = 'http://openebook.org/namespaces/oeb-document/1.0/' @@ -249,7 +256,7 @@ def rewrite_links(root, link_repl_func, resolve_base_href=False): If the ``link_repl_func`` returns None, the attribute or tag text will be removed completely. ''' - from css_parser import replaceUrls, log, CSSParser + from css_parser import CSSParser, log, replaceUrls log.setLevel(logging.WARN) log.raiseExceptions = False diff --git a/src/calibre/ebooks/oeb/polish/css.py b/src/calibre/ebooks/oeb/polish/css.py index 8155eaeee5..37db8222f5 100644 --- a/src/calibre/ebooks/oeb/polish/css.py +++ b/src/calibre/ebooks/oeb/polish/css.py @@ -17,6 +17,7 @@ from calibre.ebooks.oeb.polish.pretty import ( pretty_script_or_style, pretty_xml_tree, serialize, ) from calibre.utils.icu import lower as icu_lower, numeric_sort_key +from calibre.utils.localization import ngettext from css_selectors import Select, SelectorError, SelectorSyntaxError, parse from polyglot.builtins import iteritems, itervalues from polyglot.functools import lru_cache diff --git a/src/calibre/ebooks/oeb/transforms/jacket.py b/src/calibre/ebooks/oeb/transforms/jacket.py index 9b1b0fb27a..0add5bfb72 100644 --- a/src/calibre/ebooks/oeb/transforms/jacket.py +++ b/src/calibre/ebooks/oeb/transforms/jacket.py @@ -24,6 +24,7 @@ from calibre.library.comments import comments_to_html, markdown from calibre.utils.config import tweaks from calibre.utils.date import as_local_time, format_date, is_date_undefined from calibre.utils.icu import sort_key +from calibre.utils.localization import ngettext from calibre.utils.resources import get_path as P JACKET_XPATH = '//h:meta[@name="calibre-content" and @content="jacket"]' diff --git a/src/calibre/ebooks/oeb/transforms/manglecase.py b/src/calibre/ebooks/oeb/transforms/manglecase.py index 835c1939d3..c2f76239d2 100644 --- a/src/calibre/ebooks/oeb/transforms/manglecase.py +++ b/src/calibre/ebooks/oeb/transforms/manglecase.py @@ -9,7 +9,9 @@ from lxml import etree from calibre.ebooks.oeb.base import CSS_MIME, XHTML, XHTML_NS, namespace from calibre.ebooks.oeb.stylizer import Stylizer -from calibre.utils.icu import lower as icu_lower, upper as icu_upper +from calibre.utils.icu import ( + lower as icu_lower, title_case as icu_title, upper as icu_upper, +) from polyglot.builtins import string_or_bytes CASE_MANGLER_CSS = """ diff --git a/src/calibre/gui2/actions/add.py b/src/calibre/gui2/actions/add.py index e9b0b55fbc..d2bc9bcd53 100644 --- a/src/calibre/gui2/actions/add.py +++ b/src/calibre/gui2/actions/add.py @@ -15,8 +15,8 @@ from calibre.constants import iswindows from calibre.ebooks import BOOK_EXTENSIONS from calibre.ebooks.metadata import MetaInformation, normalize_isbn from calibre.gui2 import ( - choose_dir, choose_files, choose_files_and_remember_all_files, error_dialog, - gprefs, info_dialog, question_dialog, warning_dialog + choose_dir, choose_files, choose_files_and_remember_all_files, error_dialog, gprefs, + info_dialog, question_dialog, warning_dialog, ) from calibre.gui2.actions import InterfaceAction from calibre.gui2.dialogs.add_empty_book import AddEmptyBookDialog @@ -26,6 +26,7 @@ from calibre.ptempfile import PersistentTemporaryFile from calibre.utils.config_base import tweaks from calibre.utils.filenames import ascii_filename, make_long_path_useable from calibre.utils.icu import sort_key +from calibre.utils.localization import ngettext from polyglot.builtins import iteritems, string_or_bytes diff --git a/src/calibre/gui2/actions/author_mapper.py b/src/calibre/gui2/actions/author_mapper.py index efa842b4a8..abc25fcb06 100644 --- a/src/calibre/gui2/actions/author_mapper.py +++ b/src/calibre/gui2/actions/author_mapper.py @@ -3,8 +3,10 @@ from qt.core import QDialog + from calibre.gui2 import gprefs from calibre.gui2.actions import InterfaceAction +from calibre.utils.localization import ngettext from polyglot.builtins import iteritems @@ -27,7 +29,7 @@ class AuthorMapAction(InterfaceAction): self.do_map(ids, selected) def do_map(self, book_ids, selected): - from calibre.ebooks.metadata.author_mapper import map_authors, compile_rules + from calibre.ebooks.metadata.author_mapper import compile_rules, map_authors from calibre.gui2.author_mapper import RulesDialog from calibre.gui2.widgets import BusyCursor d = RulesDialog(self.gui) diff --git a/src/calibre/gui2/actions/choose_library.py b/src/calibre/gui2/actions/choose_library.py index a1e08f687e..e68fe447f9 100644 --- a/src/calibre/gui2/actions/choose_library.py +++ b/src/calibre/gui2/actions/choose_library.py @@ -9,25 +9,26 @@ import posixpath import sys import weakref from contextlib import suppress -from functools import partial, lru_cache +from functools import lru_cache, partial from qt.core import ( QAction, QCoreApplication, QDialog, QDialogButtonBox, QGridLayout, QIcon, - QInputDialog, QLabel, QLineEdit, QMenu, QSize, Qt, QTimer, QToolButton, - QVBoxLayout, pyqtSignal + QInputDialog, QLabel, QLineEdit, QMenu, QSize, Qt, QTimer, QToolButton, QVBoxLayout, + pyqtSignal, ) from calibre import isbytestring, sanitize_file_name from calibre.constants import ( - config_dir, filesystem_encoding, get_portable_base, isportable, iswindows + config_dir, filesystem_encoding, get_portable_base, isportable, iswindows, ) from calibre.gui2 import ( Dispatcher, choose_dir, choose_images, error_dialog, gprefs, info_dialog, - open_local_file, pixmap_to_data, question_dialog, warning_dialog + open_local_file, pixmap_to_data, question_dialog, warning_dialog, ) from calibre.gui2.actions import InterfaceAction from calibre.library import current_library_name from calibre.utils.config import prefs, tweaks from calibre.utils.icu import sort_key +from calibre.utils.localization import ngettext def db_class(): diff --git a/src/calibre/gui2/actions/convert.py b/src/calibre/gui2/actions/convert.py index bf52e9aa7d..0cfd8c39b1 100644 --- a/src/calibre/gui2/actions/convert.py +++ b/src/calibre/gui2/actions/convert.py @@ -7,14 +7,14 @@ __docformat__ = 'restructuredtext en' import os from functools import partial - from qt.core import QModelIndex, QTimer -from calibre.gui2 import error_dialog, Dispatcher, gprefs -from calibre.gui2.tools import convert_single_ebook, convert_bulk_ebook -from calibre.utils.config import prefs, tweaks -from calibre.gui2.actions import InterfaceAction from calibre.customize.ui import plugin_for_input_format +from calibre.gui2 import Dispatcher, error_dialog, gprefs +from calibre.gui2.actions import InterfaceAction +from calibre.gui2.tools import convert_bulk_ebook, convert_single_ebook +from calibre.utils.config import prefs, tweaks +from calibre.utils.localization import ngettext class ConvertAction(InterfaceAction): diff --git a/src/calibre/gui2/actions/copy_to_library.py b/src/calibre/gui2/actions/copy_to_library.py index 02929721d6..fbbbf92ad8 100644 --- a/src/calibre/gui2/actions/copy_to_library.py +++ b/src/calibre/gui2/actions/copy_to_library.py @@ -10,9 +10,9 @@ from collections import defaultdict from contextlib import closing from functools import partial from qt.core import ( - QAbstractItemView, QApplication, QCheckBox, QDialog, QDialogButtonBox, - QFormLayout, QGridLayout, QHBoxLayout, QIcon, QLabel, QLineEdit, QListWidget, - QListWidgetItem, QScrollArea, QSize, Qt, QToolButton, QVBoxLayout, QWidget + QAbstractItemView, QApplication, QCheckBox, QDialog, QDialogButtonBox, QFormLayout, + QGridLayout, QHBoxLayout, QIcon, QLabel, QLineEdit, QListWidget, QListWidgetItem, + QScrollArea, QSize, Qt, QToolButton, QVBoxLayout, QWidget, ) from threading import Thread @@ -20,7 +20,7 @@ from calibre import as_unicode from calibre.constants import ismacos from calibre.db.copy_to_library import copy_one_book from calibre.gui2 import ( - Dispatcher, choose_dir, error_dialog, gprefs, info_dialog, warning_dialog + Dispatcher, choose_dir, error_dialog, gprefs, info_dialog, warning_dialog, ) from calibre.gui2.actions import InterfaceAction from calibre.gui2.actions.choose_library import library_qicon @@ -28,6 +28,7 @@ from calibre.gui2.dialogs.progress import ProgressDialog from calibre.gui2.widgets2 import Dialog from calibre.utils.config import prefs from calibre.utils.icu import numeric_sort_key, sort_key +from calibre.utils.localization import ngettext from polyglot.builtins import iteritems, itervalues diff --git a/src/calibre/gui2/actions/delete.py b/src/calibre/gui2/actions/delete.py index c5783742fe..0f996c3f70 100644 --- a/src/calibre/gui2/actions/delete.py +++ b/src/calibre/gui2/actions/delete.py @@ -17,8 +17,9 @@ from calibre.gui2.actions import InterfaceAction from calibre.gui2.dialogs.confirm_delete import confirm from calibre.gui2.dialogs.confirm_delete_location import confirm_location from calibre.gui2.dialogs.delete_matching_from_device import ( - DeleteMatchingFromDeviceDialog + DeleteMatchingFromDeviceDialog, ) +from calibre.utils.localization import ngettext from calibre.utils.recycle_bin import can_recycle single_shot = partial(QTimer.singleShot, 10) diff --git a/src/calibre/gui2/actions/edit_metadata.py b/src/calibre/gui2/actions/edit_metadata.py index e0216c909b..a2bdd1fa69 100644 --- a/src/calibre/gui2/actions/edit_metadata.py +++ b/src/calibre/gui2/actions/edit_metadata.py @@ -8,12 +8,11 @@ __docformat__ = 'restructuredtext en' import copy import os import shutil -from functools import partial from contextlib import contextmanager +from functools import partial from io import BytesIO from qt.core import ( - QAction, QApplication, QDialog, QIcon, QMenu, QMimeData, QModelIndex, QTimer, - QUrl + QAction, QApplication, QDialog, QIcon, QMenu, QMimeData, QModelIndex, QTimer, QUrl, ) from calibre.db.errors import NoSuchFormat @@ -31,6 +30,7 @@ from calibre.library.comments import merge_comments from calibre.utils.config import tweaks from calibre.utils.date import is_date_undefined from calibre.utils.icu import sort_key +from calibre.utils.localization import ngettext from polyglot.builtins import iteritems diff --git a/src/calibre/gui2/actions/embed.py b/src/calibre/gui2/actions/embed.py index c06e1a43d6..83beb2569c 100644 --- a/src/calibre/gui2/actions/embed.py +++ b/src/calibre/gui2/actions/embed.py @@ -5,12 +5,12 @@ __license__ = 'GPL v3' __copyright__ = '2014, Kovid Goyal ' from functools import partial - -from qt.core import QTimer, QProgressDialog, Qt +from qt.core import QProgressDialog, Qt, QTimer from calibre import force_unicode from calibre.gui2 import gprefs from calibre.gui2.actions import InterfaceAction +from calibre.utils.localization import ngettext class EmbedAction(InterfaceAction): diff --git a/src/calibre/gui2/actions/polish.py b/src/calibre/gui2/actions/polish.py index c79c17a321..944978339f 100644 --- a/src/calibre/gui2/actions/polish.py +++ b/src/calibre/gui2/actions/polish.py @@ -5,22 +5,26 @@ __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import os, weakref, shutil, textwrap +import os +import shutil +import textwrap +import weakref from collections import OrderedDict from functools import partial -from polyglot.builtins import iteritems, itervalues +from qt.core import ( + QApplication, QCheckBox, QDialog, QDialogButtonBox, QFrame, QGridLayout, QIcon, + QInputDialog, QLabel, QMenu, QModelIndex, QSize, QSizePolicy, QSpacerItem, Qt, + QTextEdit, QTimer, +) -from qt.core import (QDialog, QGridLayout, QIcon, QCheckBox, QLabel, QFrame, - QApplication, QDialogButtonBox, Qt, QSize, QSpacerItem, - QSizePolicy, QTimer, QModelIndex, QTextEdit, - QInputDialog, QMenu) - -from calibre.gui2 import error_dialog, Dispatcher, gprefs, question_dialog +from calibre.gui2 import Dispatcher, error_dialog, gprefs, question_dialog from calibre.gui2.actions import InterfaceAction from calibre.gui2.convert.metadata import create_opf_file from calibre.gui2.dialogs.progress import ProgressDialog from calibre.ptempfile import PersistentTemporaryDirectory from calibre.utils.config_base import tweaks +from calibre.utils.localization import ngettext +from polyglot.builtins import iteritems, itervalues class Polish(QDialog): # {{{ diff --git a/src/calibre/gui2/actions/tag_mapper.py b/src/calibre/gui2/actions/tag_mapper.py index 83c9ccc402..4ad0b5bb90 100644 --- a/src/calibre/gui2/actions/tag_mapper.py +++ b/src/calibre/gui2/actions/tag_mapper.py @@ -1,12 +1,12 @@ #!/usr/bin/env python # License: GPLv3 Copyright: 2015, Kovid Goyal - from qt.core import QDialog -from polyglot.builtins import iteritems from calibre.gui2 import gprefs from calibre.gui2.actions import InterfaceAction +from calibre.utils.localization import ngettext +from polyglot.builtins import iteritems class TagMapAction(InterfaceAction): diff --git a/src/calibre/gui2/add.py b/src/calibre/gui2/add.py index b91351c02b..dcac357d41 100644 --- a/src/calibre/gui2/add.py +++ b/src/calibre/gui2/add.py @@ -33,6 +33,7 @@ from calibre.utils.config import prefs from calibre.utils.filenames import make_long_path_useable from calibre.utils.icu import lower as icu_lower from calibre.utils.ipc.pool import Failure, Pool +from calibre.utils.localization import ngettext from polyglot.builtins import iteritems, string_or_bytes from polyglot.queue import Empty diff --git a/src/calibre/gui2/convert/bulk.py b/src/calibre/gui2/convert/bulk.py index ab187c8805..cfd2c97405 100644 --- a/src/calibre/gui2/convert/bulk.py +++ b/src/calibre/gui2/convert/bulk.py @@ -3,20 +3,22 @@ __copyright__ = '2009, John Schember ' __docformat__ = 'restructuredtext en' import shutil +from qt.core import QDialog, QDialogButtonBox, QModelIndex -from qt.core import QModelIndex, QDialog, QDialogButtonBox - -from calibre.gui2.convert.single import Config, GroupModel, gprefs -from calibre.gui2.convert.look_and_feel import LookAndFeelWidget +from calibre.ebooks.conversion.config import ( + get_output_formats, sort_formats_by_preference, +) +from calibre.ebooks.conversion.plumber import Plumber +from calibre.gui2.convert import GuiRecommendations from calibre.gui2.convert.heuristics import HeuristicsWidget -from calibre.gui2.convert.search_and_replace import SearchAndReplaceWidget +from calibre.gui2.convert.look_and_feel import LookAndFeelWidget from calibre.gui2.convert.page_setup import PageSetupWidget +from calibre.gui2.convert.search_and_replace import SearchAndReplaceWidget +from calibre.gui2.convert.single import Config, GroupModel, gprefs from calibre.gui2.convert.structure_detection import StructureDetectionWidget from calibre.gui2.convert.toc import TOCWidget -from calibre.gui2.convert import GuiRecommendations -from calibre.ebooks.conversion.plumber import Plumber -from calibre.ebooks.conversion.config import sort_formats_by_preference, get_output_formats from calibre.utils.config import prefs +from calibre.utils.localization import ngettext from calibre.utils.logging import Log diff --git a/src/calibre/gui2/device.py b/src/calibre/gui2/device.py index 09e7cce924..a9da487129 100644 --- a/src/calibre/gui2/device.py +++ b/src/calibre/gui2/device.py @@ -1,41 +1,56 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' +import io + # Imports {{{ -import os, traceback, time, io, re, sys, weakref -from threading import Thread, Event - +import os +import re +import sys +import time +import traceback +import weakref from qt.core import ( - QMenu, QAction, QActionGroup, QIcon, pyqtSignal, QDialog, - QObject, QVBoxLayout, QDialogButtonBox, QCoreApplication, - QEventLoop, QTimer) + QAction, QActionGroup, QCoreApplication, QDialog, QDialogButtonBox, QEventLoop, + QIcon, QMenu, QObject, QTimer, QVBoxLayout, pyqtSignal, +) +from threading import Event, Thread -from calibre.customize.ui import (available_input_formats, available_output_formats, - device_plugins, disabled_device_plugins) -from calibre.devices.interface import DevicePlugin, currently_connected_device -from calibre.devices.errors import (UserFeedback, OpenFeedback, OpenFailed, OpenActionNeeded, - InitialConnectionError) -from calibre.ebooks.covers import cprefs, override_prefs, scale_cover, generate_cover -from calibre.gui2.dialogs.choose_format_device import ChooseFormatDeviceDialog -from calibre.utils.ipc.job import BaseJob -from calibre.devices.scanner import DeviceScanner -from calibre.gui2 import (config, error_dialog, Dispatcher, dynamic, - warning_dialog, info_dialog, choose_dir, FunctionDispatcher, - show_restart_warning, gprefs, question_dialog) -from calibre.gui2.widgets import BusyCursor -from calibre.ebooks.metadata import authors_to_string -from calibre import preferred_encoding, prints, force_unicode, as_unicode, sanitize_file_name -from calibre.utils.filenames import ascii_filename -from calibre.devices.errors import (FreeSpaceError, WrongDestinationError, - BlacklistedDevice) -from calibre.devices.folder_device.driver import FOLDER_DEVICE +from calibre import ( + as_unicode, force_unicode, preferred_encoding, prints, sanitize_file_name, +) from calibre.constants import DEBUG -from calibre.utils.config import tweaks, device_prefs -from calibre.utils.img import scale_image +from calibre.customize.ui import ( + available_input_formats, available_output_formats, device_plugins, + disabled_device_plugins, +) +from calibre.devices.errors import ( + BlacklistedDevice, FreeSpaceError, InitialConnectionError, OpenActionNeeded, + OpenFailed, OpenFeedback, UserFeedback, WrongDestinationError, +) +from calibre.devices.folder_device.driver import FOLDER_DEVICE +from calibre.devices.interface import DevicePlugin, currently_connected_device +from calibre.devices.scanner import DeviceScanner +from calibre.ebooks.covers import cprefs, generate_cover, override_prefs, scale_cover +from calibre.ebooks.metadata import authors_to_string +from calibre.gui2 import ( + Dispatcher, FunctionDispatcher, choose_dir, config, dynamic, error_dialog, gprefs, + info_dialog, question_dialog, show_restart_warning, warning_dialog, +) +from calibre.gui2.dialogs.choose_format_device import ChooseFormatDeviceDialog +from calibre.gui2.widgets import BusyCursor from calibre.library.save_to_disk import find_plugboard -from calibre.ptempfile import PersistentTemporaryFile, force_unicode as filename_to_unicode -from polyglot.builtins import string_or_unicode +from calibre.ptempfile import ( + PersistentTemporaryFile, force_unicode as filename_to_unicode, +) +from calibre.utils.config import device_prefs, tweaks +from calibre.utils.filenames import ascii_filename +from calibre.utils.img import scale_image +from calibre.utils.ipc.job import BaseJob +from calibre.utils.localization import ngettext from polyglot import queue +from polyglot.builtins import string_or_unicode + # }}} diff --git a/src/calibre/gui2/dialogs/duplicates.py b/src/calibre/gui2/dialogs/duplicates.py index b7f460574c..74815ea069 100644 --- a/src/calibre/gui2/dialogs/duplicates.py +++ b/src/calibre/gui2/dialogs/duplicates.py @@ -6,14 +6,15 @@ __copyright__ = '2013, Kovid Goyal ' __docformat__ = 'restructuredtext en' import os.path - from qt.core import ( - QDialog, QGridLayout, QIcon, QLabel, QTreeWidget, QTreeWidgetItem, Qt, - QFont, QDialogButtonBox, QApplication) + QApplication, QDialog, QDialogButtonBox, QFont, QGridLayout, QIcon, QLabel, Qt, + QTreeWidget, QTreeWidgetItem, +) -from calibre.gui2 import gprefs from calibre.ebooks.metadata import authors_to_string +from calibre.gui2 import gprefs from calibre.utils.icu import primary_sort_key +from calibre.utils.localization import ngettext class DuplicatesQuestion(QDialog): diff --git a/src/calibre/gui2/dialogs/match_books.py b/src/calibre/gui2/dialogs/match_books.py index 7412b1f600..790bf50a15 100644 --- a/src/calibre/gui2/dialogs/match_books.py +++ b/src/calibre/gui2/dialogs/match_books.py @@ -6,12 +6,14 @@ __copyright__ = '2013, Kovid Goyal kovid@kovidgoyal.net' __docformat__ = 'restructuredtext en' -from qt.core import (Qt, QDialog, QAbstractItemView, QTableWidgetItem, - QApplication, QCursor, QTimer) +from qt.core import ( + QAbstractItemView, QApplication, QCursor, QDialog, Qt, QTableWidgetItem, QTimer, +) -from calibre.gui2 import gprefs, error_dialog +from calibre.gui2 import error_dialog, gprefs from calibre.gui2.dialogs.match_books_ui import Ui_MatchBooks from calibre.utils.icu import sort_key +from calibre.utils.localization import ngettext class TableItem(QTableWidgetItem): diff --git a/src/calibre/gui2/dialogs/message_box.py b/src/calibre/gui2/dialogs/message_box.py index 0e7b1b7560..f286e257a7 100644 --- a/src/calibre/gui2/dialogs/message_box.py +++ b/src/calibre/gui2/dialogs/message_box.py @@ -9,11 +9,12 @@ import sys from qt.core import ( QAction, QApplication, QCheckBox, QDialog, QDialogButtonBox, QGridLayout, QIcon, QKeySequence, QLabel, QPainter, QPlainTextEdit, QSize, QSizePolicy, Qt, - QTextBrowser, QTextDocument, QVBoxLayout, QWidget, pyqtSignal + QTextBrowser, QTextDocument, QVBoxLayout, QWidget, pyqtSignal, ) from calibre.constants import __version__, isfrozen from calibre.gui2 import gprefs +from calibre.utils.localization import ngettext class Icon(QWidget): @@ -491,8 +492,8 @@ class JobError(QDialog): # {{{ if __name__ == '__main__': - from calibre.gui2 import Application, question_dialog from calibre import prepare_string_for_xml + from calibre.gui2 import Application, question_dialog app = Application([]) merged = {'Kovid Goyal': ['Waterloo', 'Doomed'], 'Someone Else': ['Some other book ' * 1000]} lines = [] diff --git a/src/calibre/gui2/dialogs/metadata_bulk.py b/src/calibre/gui2/dialogs/metadata_bulk.py index 1ff57fbd65..a5c975db55 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.py +++ b/src/calibre/gui2/dialogs/metadata_bulk.py @@ -33,6 +33,7 @@ from calibre.utils.date import internal_iso_format_string, qt_to_dt from calibre.utils.icu import ( capitalize, lower as icu_lower, sort_key, upper as icu_upper, ) +from calibre.utils.localization import ngettext from calibre.utils.titlecase import titlecase from polyglot.builtins import error_message, iteritems, itervalues, native_string_type diff --git a/src/calibre/gui2/dialogs/template_dialog.py b/src/calibre/gui2/dialogs/template_dialog.py index 96e73e0be6..e8bd1851c7 100644 --- a/src/calibre/gui2/dialogs/template_dialog.py +++ b/src/calibre/gui2/dialogs/template_dialog.py @@ -15,7 +15,7 @@ from qt.core import ( QAbstractItemView, QApplication, QColor, QComboBox, QCursor, QDialog, QDialogButtonBox, QFont, QFontDatabase, QFontInfo, QFontMetrics, QIcon, QLineEdit, QPalette, QSize, QSyntaxHighlighter, Qt, QTableWidget, QTableWidgetItem, - QTextCharFormat, QTextOption, QVBoxLayout, pyqtSignal + QTextCharFormat, QTextOption, QVBoxLayout, pyqtSignal, ) from calibre import sanitize_file_name @@ -33,7 +33,7 @@ from calibre.utils.date import DEFAULT_DATE from calibre.utils.formatter import PythonTemplateContext, StopException from calibre.utils.formatter_functions import StoredObjectType, formatter_functions from calibre.utils.icu import lower as icu_lower, sort_key -from calibre.utils.localization import localize_user_manual_link +from calibre.utils.localization import localize_user_manual_link, ngettext from calibre.utils.resources import get_path as P @@ -339,7 +339,7 @@ class TemplateDialog(QDialog, Ui_TemplateDialog): QDialog.__init__(self, parent, flags=Qt.WindowType.Dialog) else: QDialog.__init__(self, None, flags=Qt.WindowType.Window) - self.raise_() # Not needed on windows but here just in case + self.raise_() # Not needed on windows but here just in case Ui_TemplateDialog.__init__(self) self.setupUi(self) self.setWindowIcon(self.windowIcon()) diff --git a/src/calibre/gui2/fts/search.py b/src/calibre/gui2/fts/search.py index 5b5160a3b6..88cc891a50 100644 --- a/src/calibre/gui2/fts/search.py +++ b/src/calibre/gui2/fts/search.py @@ -11,10 +11,9 @@ from contextlib import suppress from functools import partial from itertools import count from qt.core import ( - QAbstractItemModel, QAbstractItemView, QCheckBox, QDialog, QDialogButtonBox, - QFont, QHBoxLayout, QIcon, QLabel, QMenu, QModelIndex, QPixmap, QPushButton, - QRect, QSize, QSplitter, QStackedWidget, Qt, QTreeView, QVBoxLayout, QWidget, - pyqtSignal + QAbstractItemModel, QAbstractItemView, QCheckBox, QDialog, QDialogButtonBox, QFont, + QHBoxLayout, QIcon, QLabel, QMenu, QModelIndex, QPixmap, QPushButton, QRect, QSize, + QSplitter, QStackedWidget, Qt, QTreeView, QVBoxLayout, QWidget, pyqtSignal, ) from threading import Event, Thread @@ -22,7 +21,7 @@ from calibre import fit_image, prepare_string_for_xml from calibre.db import FTSQueryError from calibre.ebooks.metadata import authors_to_string, fmt_sidx from calibre.gui2 import ( - config, error_dialog, gprefs, info_dialog, question_dialog, safe_open_url + config, error_dialog, gprefs, info_dialog, question_dialog, safe_open_url, ) from calibre.gui2.fts.utils import get_db from calibre.gui2.library.models import render_pin @@ -31,6 +30,7 @@ from calibre.gui2.ui import get_gui from calibre.gui2.viewer.widgets import ResultsDelegate, SearchBox from calibre.gui2.widgets import BusyCursor from calibre.gui2.widgets2 import HTMLDisplay +from calibre.utils.localization import ngettext ROOT = QModelIndex() sanitize_text_pat = re.compile(r'\s+') diff --git a/src/calibre/gui2/init.py b/src/calibre/gui2/init.py index c1b8484f80..5b31623aea 100644 --- a/src/calibre/gui2/init.py +++ b/src/calibre/gui2/init.py @@ -7,15 +7,15 @@ __docformat__ = 'restructuredtext en' import functools from qt.core import ( - QAction, QApplication, QDialog, QEvent, QIcon, QLabel, QMenu, QPixmap, QUrl, - QSizePolicy, QStackedWidget, QStatusBar, QStyle, QStyleOption, QSplitter, - QStylePainter, Qt, QTabBar, QTimer, QToolButton, QVBoxLayout, QWidget + QAction, QApplication, QDialog, QEvent, QIcon, QLabel, QMenu, QPixmap, QSizePolicy, + QSplitter, QStackedWidget, QStatusBar, QStyle, QStyleOption, QStylePainter, Qt, + QTabBar, QTimer, QToolButton, QUrl, QVBoxLayout, QWidget, ) from calibre.constants import get_appname_for_display, get_version, ismacos from calibre.customize.ui import find_plugin from calibre.gui2 import ( - config, error_dialog, gprefs, is_widescreen, open_local_file, open_url + config, error_dialog, gprefs, is_widescreen, open_local_file, open_url, ) from calibre.gui2.book_details import BookDetails from calibre.gui2.layout_menu import LayoutMenu @@ -26,7 +26,7 @@ from calibre.gui2.tag_browser.ui import TagBrowserWidget from calibre.gui2.widgets import LayoutButton, Splitter from calibre.utils.config import prefs from calibre.utils.icu import sort_key -from calibre.utils.localization import localize_website_link +from calibre.utils.localization import localize_website_link, ngettext _keep_refs = [] diff --git a/src/calibre/gui2/jobs.py b/src/calibre/gui2/jobs.py index 52e1321632..700f24475c 100644 --- a/src/calibre/gui2/jobs.py +++ b/src/calibre/gui2/jobs.py @@ -10,28 +10,28 @@ Job management. ''' import time +from qt.core import ( + QAbstractItemDelegate, QAbstractTableModel, QAction, QApplication, QByteArray, + QCoreApplication, QDialog, QDialogButtonBox, QEvent, QHBoxLayout, QIcon, + QItemSelectionModel, QLabel, QModelIndex, QPlainTextEdit, QSize, QSizePolicy, + QSortFilterProxyModel, QStyle, QStyleOption, QStyleOptionProgressBar, QStylePainter, + Qt, QTextBrowser, QTimer, QToolTip, QVBoxLayout, QWidget, pyqtSignal, +) -from qt.core import (QAbstractTableModel, QModelIndex, Qt, QStylePainter, - QTimer, pyqtSignal, QIcon, QDialog, QAbstractItemDelegate, QApplication, QEvent, - QSize, QStyleOptionProgressBar, QStyle, QToolTip, QWidget, QStyleOption, - QHBoxLayout, QVBoxLayout, QSizePolicy, QLabel, QCoreApplication, QAction, QItemSelectionModel, - QByteArray, QSortFilterProxyModel, QTextBrowser, QPlainTextEdit, QDialogButtonBox) - -from calibre import strftime -from calibre.constants import islinux, isbsd -from calibre.utils.ipc.server import Server -from calibre.utils.ipc.job import ParallelJob -from calibre.gui2 import (Dispatcher, error_dialog, question_dialog, - config, gprefs) +from calibre import __appname__, as_unicode, strftime +from calibre.constants import isbsd, islinux +from calibre.db.utils import human_readable_interval +from calibre.gui2 import Dispatcher, config, error_dialog, gprefs, question_dialog from calibre.gui2.device import DeviceJob from calibre.gui2.dialogs.jobs_ui import Ui_JobsDialog -from calibre import __appname__, as_unicode from calibre.gui2.progress_indicator import ProgressIndicator -from calibre.gui2.threaded_jobs import ThreadedJobServer, ThreadedJob +from calibre.gui2.threaded_jobs import ThreadedJob, ThreadedJobServer from calibre.gui2.widgets2 import Dialog -from calibre.utils.search_query_parser import SearchQueryParser, ParseException -from calibre.db.utils import human_readable_interval from calibre.utils.icu import lower +from calibre.utils.ipc.job import ParallelJob +from calibre.utils.ipc.server import Server +from calibre.utils.localization import ngettext +from calibre.utils.search_query_parser import ParseException, SearchQueryParser from polyglot.queue import Empty, Queue diff --git a/src/calibre/gui2/library/annotations.py b/src/calibre/gui2/library/annotations.py index 17a2b7b776..60c36ab53d 100644 --- a/src/calibre/gui2/library/annotations.py +++ b/src/calibre/gui2/library/annotations.py @@ -7,28 +7,29 @@ import os import re from functools import lru_cache, partial from qt.core import ( - QAbstractItemView, QApplication, QCheckBox, QComboBox, QDateTime, - QDialog, QDialogButtonBox, QFont, QFormLayout, QFrame, QHBoxLayout, QIcon, - QKeySequence, QLabel, QLocale, QMenu, QPalette, QPlainTextEdit, QSize, QSplitter, - Qt, QTextBrowser, QTimer, QToolButton, QTreeWidget, QTreeWidgetItem, QVBoxLayout, - QWidget, pyqtSignal + QAbstractItemView, QApplication, QCheckBox, QComboBox, QDateTime, QDialog, + QDialogButtonBox, QFont, QFormLayout, QFrame, QHBoxLayout, QIcon, QKeySequence, + QLabel, QLocale, QMenu, QPalette, QPlainTextEdit, QSize, QSplitter, Qt, + QTextBrowser, QTimer, QToolButton, QTreeWidget, QTreeWidgetItem, QVBoxLayout, + QWidget, pyqtSignal, ) from urllib.parse import quote from calibre import prepare_string_for_xml from calibre.constants import ( - builtin_colors_dark, builtin_colors_light, builtin_decorations + builtin_colors_dark, builtin_colors_light, builtin_decorations, ) from calibre.db.backend import FTSQueryError from calibre.ebooks.metadata import authors_to_string, fmt_sidx from calibre.gui2 import ( Application, choose_save_file, config, error_dialog, gprefs, is_dark_theme, - safe_open_url + safe_open_url, ) from calibre.gui2.dialogs.confirm_delete import confirm from calibre.gui2.viewer.widgets import ResultsDelegate, SearchBox from calibre.gui2.widgets import BusyCursor from calibre.gui2.widgets2 import Dialog, RightClickButton +from calibre.utils.localization import ngettext def render_timestamp(ts): diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index 30e9c1755b..96772474fc 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -38,7 +38,7 @@ from calibre.utils.date import ( UNDEFINED_DATE, as_local_time, dt_factory, is_date_undefined, qt_to_dt, ) from calibre.utils.icu import sort_key -from calibre.utils.localization import calibre_langcode_to_name +from calibre.utils.localization import calibre_langcode_to_name, ngettext from calibre.utils.resources import get_path as P from calibre.utils.search_query_parser import ParseException, SearchQueryParser from polyglot.builtins import iteritems, itervalues, string_or_bytes diff --git a/src/calibre/gui2/metadata/basic_widgets.py b/src/calibre/gui2/metadata/basic_widgets.py index 16ba3210b6..8e83ee72ad 100644 --- a/src/calibre/gui2/metadata/basic_widgets.py +++ b/src/calibre/gui2/metadata/basic_widgets.py @@ -12,10 +12,11 @@ import textwrap import weakref from datetime import date, datetime from qt.core import ( - QAction, QApplication, QDateTime, QDialog, QDialogButtonBox, QDoubleSpinBox, QAbstractItemView, - QGridLayout, QIcon, QKeySequence, QLabel, QLineEdit, QListWidgetItem, QMenu, - QMessageBox, QPixmap, QPlainTextEdit, QSize, QSizePolicy, Qt, QToolButton, QComboBox, - QUndoCommand, QUndoStack, QUrl, QVBoxLayout, QWidget, pyqtSignal + QAbstractItemView, QAction, QApplication, QComboBox, QDateTime, QDialog, + QDialogButtonBox, QDoubleSpinBox, QGridLayout, QIcon, QKeySequence, QLabel, + QLineEdit, QListWidgetItem, QMenu, QMessageBox, QPixmap, QPlainTextEdit, QSize, + QSizePolicy, Qt, QToolButton, QUndoCommand, QUndoStack, QUrl, QVBoxLayout, QWidget, + pyqtSignal, ) from calibre import strftime @@ -24,12 +25,13 @@ from calibre.customize.ui import run_plugins_on_import from calibre.db import SPOOL_SIZE from calibre.ebooks import BOOK_EXTENSIONS from calibre.ebooks.metadata import ( - authors_to_sort_string, check_isbn, string_to_authors, title_sort + authors_to_sort_string, check_isbn, string_to_authors, title_sort, ) from calibre.ebooks.metadata.meta import get_metadata from calibre.ebooks.oeb.polish.main import SUPPORTED as EDIT_SUPPORTED from calibre.gui2 import ( - choose_files_and_remember_all_files, choose_images, error_dialog, file_icon_provider, gprefs + choose_files_and_remember_all_files, choose_images, error_dialog, + file_icon_provider, gprefs, ) from calibre.gui2.comments_editor import Editor from calibre.gui2.complete2 import EditWithComplete @@ -38,17 +40,18 @@ from calibre.gui2.languages import LanguagesEdit as LE from calibre.gui2.widgets import EnLineEdit, FormatList as _FormatList, ImageView from calibre.gui2.widgets2 import ( DateTimeEdit, Dialog, RatingEditor, RightClickButton, access_key, - populate_standard_spinbox_context_menu + populate_standard_spinbox_context_menu, ) from calibre.library.comments import comments_to_html from calibre.ptempfile import PersistentTemporaryFile, SpooledTemporaryFile from calibre.utils.config import prefs, tweaks from calibre.utils.date import ( UNDEFINED_DATE, as_local_time, internal_iso_format_string, is_date_undefined, - local_tz, parse_only_date, qt_to_dt, utcfromtimestamp + local_tz, parse_only_date, qt_to_dt, utcfromtimestamp, ) from calibre.utils.filenames import make_long_path_useable from calibre.utils.icu import sort_key, strcmp +from calibre.utils.localization import ngettext from polyglot.builtins import iteritems @@ -1221,7 +1224,7 @@ class Cover(ImageView): # {{{ if not cdata: return from calibre.utils.img import ( - image_from_data, image_to_data, remove_borders_from_image + image_from_data, image_to_data, remove_borders_from_image, ) img = image_from_data(cdata) nimg = remove_borders_from_image(img) diff --git a/src/calibre/gui2/metadata/bulk_download.py b/src/calibre/gui2/metadata/bulk_download.py index 95296cb58a..03cbeed404 100644 --- a/src/calibre/gui2/metadata/bulk_download.py +++ b/src/calibre/gui2/metadata/bulk_download.py @@ -5,17 +5,17 @@ __license__ = 'GPL v3' __copyright__ = '2011, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import os, time, shutil +import os +import shutil +import time +from qt.core import QDialog, QDialogButtonBox, QGridLayout, QIcon, QLabel, Qt from threading import Thread -from qt.core import (QIcon, QDialog, - QDialogButtonBox, QLabel, QGridLayout, Qt) - -from calibre.gui2.threaded_jobs import ThreadedJob from calibre.ebooks.metadata.opf2 import metadata_to_opf -from calibre.utils.ipc.simple_worker import fork_job, WorkerError -from calibre.ptempfile import (PersistentTemporaryDirectory, - PersistentTemporaryFile) +from calibre.gui2.threaded_jobs import ThreadedJob +from calibre.ptempfile import PersistentTemporaryDirectory, PersistentTemporaryFile +from calibre.utils.ipc.simple_worker import WorkerError, fork_job +from calibre.utils.localization import ngettext from polyglot.builtins import iteritems # Start download {{{ diff --git a/src/calibre/gui2/metadata/diff.py b/src/calibre/gui2/metadata/diff.py index e12e283b5e..4266ba1239 100644 --- a/src/calibre/gui2/metadata/diff.py +++ b/src/calibre/gui2/metadata/diff.py @@ -27,6 +27,7 @@ from calibre.gui2.widgets2 import RightClickButton from calibre.ptempfile import PersistentTemporaryFile from calibre.utils.date import UNDEFINED_DATE from calibre.utils.icu import lower as icu_lower +from calibre.utils.localization import ngettext from polyglot.builtins import iteritems, itervalues Widgets = namedtuple('Widgets', 'new old label button') diff --git a/src/calibre/gui2/metadata/single.py b/src/calibre/gui2/metadata/single.py index 2dffa514f0..d8cb7334c6 100644 --- a/src/calibre/gui2/metadata/single.py +++ b/src/calibre/gui2/metadata/single.py @@ -32,7 +32,7 @@ from calibre.gui2.metadata.single_download import FullFetch from calibre.gui2.widgets2 import CenteredToolButton from calibre.library.comments import merge_comments as merge_two_comments from calibre.utils.date import local_tz -from calibre.utils.localization import canonicalize_lang +from calibre.utils.localization import canonicalize_lang, ngettext from polyglot.builtins import iteritems BASE_TITLE = _('Edit metadata') diff --git a/src/calibre/gui2/preferences/coloring.py b/src/calibre/gui2/preferences/coloring.py index a1df13c6c0..76544c7a35 100644 --- a/src/calibre/gui2/preferences/coloring.py +++ b/src/calibre/gui2/preferences/coloring.py @@ -10,30 +10,29 @@ import os import textwrap from functools import partial from qt.core import ( - QAbstractItemView, QAbstractListModel, QApplication, QCheckBox, QComboBox, - QDialog, QDialogButtonBox, QDoubleValidator, QFrame, QGridLayout, QIcon, - QIntValidator, QItemSelectionModel, QLabel, QLineEdit, QListView, - QPalette, QPushButton, QScrollArea, QSize, QSizePolicy, QSpacerItem, - QStandardItem, QStandardItemModel, Qt, QToolButton, QVBoxLayout, QWidget, - QItemSelection, QListWidget, QListWidgetItem, pyqtSignal + QAbstractItemView, QAbstractListModel, QApplication, QCheckBox, QComboBox, QDialog, + QDialogButtonBox, QDoubleValidator, QFrame, QGridLayout, QIcon, QIntValidator, + QItemSelection, QItemSelectionModel, QLabel, QLineEdit, QListView, QListWidget, + QListWidgetItem, QPalette, QPushButton, QScrollArea, QSize, QSizePolicy, + QSpacerItem, QStandardItem, QStandardItemModel, Qt, QToolButton, QVBoxLayout, + QWidget, pyqtSignal, ) from calibre import as_unicode, prepare_string_for_xml, sanitize_file_name from calibre.constants import config_dir from calibre.gui2 import ( choose_files, choose_save_file, error_dialog, gprefs, open_local_file, - pixmap_to_data, question_dialog + pixmap_to_data, question_dialog, ) from calibre.gui2.dialogs.template_dialog import TemplateDialog from calibre.gui2.metadata.single_download import RichTextDelegate from calibre.gui2.preferences import ListViewWithMoveByKeyPress from calibre.gui2.widgets2 import ColorButton, FlowLayout, Separator from calibre.library.coloring import ( - Rule, color_row_key, conditionable_columns, displayable_columns, - rule_from_template + Rule, color_row_key, conditionable_columns, displayable_columns, rule_from_template, ) from calibre.utils.icu import lower, sort_key -from calibre.utils.localization import lang_map +from calibre.utils.localization import lang_map, ngettext from polyglot.builtins import iteritems all_columns_string = _('All columns') diff --git a/src/calibre/gui2/preferences/create_custom_column.py b/src/calibre/gui2/preferences/create_custom_column.py index 9f6e4c6602..aa3a83ea50 100644 --- a/src/calibre/gui2/preferences/create_custom_column.py +++ b/src/calibre/gui2/preferences/create_custom_column.py @@ -6,19 +6,20 @@ __copyright__ = '2010, Kovid Goyal ' '''Dialog to create a new custom column''' -import copy, re +import copy +import re from enum import Enum from functools import partial - from qt.core import ( - QDialog, Qt, QColor, QIcon, QVBoxLayout, QLabel, QGridLayout, - QDialogButtonBox, QWidget, QLineEdit, QHBoxLayout, QComboBox, - QCheckBox, QSpinBox, QRadioButton, QGroupBox + QCheckBox, QColor, QComboBox, QDialog, QDialogButtonBox, QGridLayout, QGroupBox, + QHBoxLayout, QIcon, QLabel, QLineEdit, QRadioButton, QSpinBox, Qt, QVBoxLayout, + QWidget, ) from calibre.gui2 import error_dialog from calibre.gui2.dialogs.template_line_editor import TemplateLineEditor -from calibre.utils.date import parse_date, UNDEFINED_DATE +from calibre.utils.date import UNDEFINED_DATE, parse_date +from calibre.utils.localization import ngettext from polyglot.builtins import iteritems diff --git a/src/calibre/gui2/preferences/metadata_sources.py b/src/calibre/gui2/preferences/metadata_sources.py index 4bba974884..63f0354843 100644 --- a/src/calibre/gui2/preferences/metadata_sources.py +++ b/src/calibre/gui2/preferences/metadata_sources.py @@ -7,18 +7,19 @@ __docformat__ = 'restructuredtext en' from operator import attrgetter from qt.core import ( - QAbstractListModel, QAbstractTableModel, QDialogButtonBox, QFrame, QIcon, QLabel, - QScrollArea, Qt, QVBoxLayout, QWidget, pyqtSignal, QDialog, QMenu, QCursor + QAbstractListModel, QAbstractTableModel, QCursor, QDialog, QDialogButtonBox, QFrame, + QIcon, QLabel, QMenu, QScrollArea, Qt, QVBoxLayout, QWidget, pyqtSignal, ) from calibre.customize.ui import ( all_metadata_plugins, default_disabled_plugins, disable_plugin, enable_plugin, - is_disabled + is_disabled, ) from calibre.ebooks.metadata.sources.prefs import msprefs from calibre.gui2 import error_dialog, question_dialog from calibre.gui2.preferences import ConfigWidgetBase, test_widget from calibre.gui2.preferences.metadata_sources_ui import Ui_Form +from calibre.utils.localization import ngettext from polyglot.builtins import iteritems diff --git a/src/calibre/gui2/preferences/server.py b/src/calibre/gui2/preferences/server.py index a49a9848fc..e7c10a8883 100644 --- a/src/calibre/gui2/preferences/server.py +++ b/src/calibre/gui2/preferences/server.py @@ -12,14 +12,14 @@ from qt.core import ( QApplication, QCheckBox, QComboBox, QDialog, QDialogButtonBox, QDoubleSpinBox, QFormLayout, QFrame, QHBoxLayout, QIcon, QLabel, QLayout, QLineEdit, QListWidget, QPlainTextEdit, QPushButton, QScrollArea, QSize, QSizePolicy, QSpinBox, Qt, - QTabWidget, QTimer, QToolButton, QUrl, QVBoxLayout, QWidget, pyqtSignal, sip + QTabWidget, QTimer, QToolButton, QUrl, QVBoxLayout, QWidget, pyqtSignal, sip, ) from calibre import as_unicode from calibre.constants import isportable, iswindows from calibre.gui2 import ( - choose_files, choose_save_file, config, error_dialog, gprefs, info_dialog, - open_url, warning_dialog + choose_files, choose_save_file, config, error_dialog, gprefs, info_dialog, open_url, + warning_dialog, ) from calibre.gui2.preferences import AbortCommit, ConfigWidgetBase, test_widget from calibre.gui2.widgets import HistoryLineEdit @@ -29,9 +29,10 @@ from calibre.srv.library_broker import load_gui_libraries from calibre.srv.loop import parse_trusted_ips from calibre.srv.opts import change_settings, options, server_config from calibre.srv.users import ( - UserManager, create_user_data, validate_password, validate_username + UserManager, create_user_data, validate_password, validate_username, ) from calibre.utils.icu import primary_sort_key +from calibre.utils.localization import ngettext from calibre.utils.shared_file import share_open from polyglot.builtins import as_bytes diff --git a/src/calibre/gui2/search_restriction_mixin.py b/src/calibre/gui2/search_restriction_mixin.py index f738601677..96f9f9eae7 100644 --- a/src/calibre/gui2/search_restriction_mixin.py +++ b/src/calibre/gui2/search_restriction_mixin.py @@ -8,14 +8,14 @@ from functools import partial from qt.core import ( QAbstractItemView, QAction, QComboBox, QDialog, QDialogButtonBox, QFrame, QGridLayout, QIcon, QLabel, QLineEdit, QListView, QMenu, QRadioButton, QSize, - QStringListModel, Qt, QTextBrowser, QVBoxLayout, QSortFilterProxyModel + QSortFilterProxyModel, QStringListModel, Qt, QTextBrowser, QVBoxLayout, ) from calibre.gui2 import error_dialog, gprefs, question_dialog from calibre.gui2.dialogs.confirm_delete import confirm from calibre.gui2.widgets import ComboBoxWithHelp from calibre.utils.icu import sort_key -from calibre.utils.localization import localize_user_manual_link, pgettext +from calibre.utils.localization import localize_user_manual_link, ngettext, pgettext from calibre.utils.search_query_parser import ParseException diff --git a/src/calibre/gui2/tag_browser/ui.py b/src/calibre/gui2/tag_browser/ui.py index bd7f07b26e..d4c67d2997 100644 --- a/src/calibre/gui2/tag_browser/ui.py +++ b/src/calibre/gui2/tag_browser/ui.py @@ -5,22 +5,25 @@ __license__ = 'GPL v3' __copyright__ = '2011, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import copy, textwrap +import copy +import textwrap from functools import partial - from qt.core import ( - Qt, QIcon, QWidget, QHBoxLayout, QVBoxLayout, QToolButton, QLabel, QFrame, QDialog, QComboBox, QLineEdit, - QTimer, QMenu, QActionGroup, QAction, QSizePolicy, pyqtSignal) + QAction, QActionGroup, QComboBox, QDialog, QFrame, QHBoxLayout, QIcon, QLabel, + QLineEdit, QMenu, QSizePolicy, Qt, QTimer, QToolButton, QVBoxLayout, QWidget, + pyqtSignal, +) -from calibre.gui2 import error_dialog, question_dialog, gprefs, config +from calibre.ebooks.metadata import title_sort +from calibre.gui2 import config, error_dialog, gprefs, question_dialog +from calibre.gui2.dialogs.edit_authors_dialog import EditAuthorsDialog +from calibre.gui2.dialogs.tag_categories import TagCategories +from calibre.gui2.dialogs.tag_list_editor import TagListEditor +from calibre.gui2.tag_browser.view import TagsView from calibre.gui2.widgets import HistoryLineEdit from calibre.library.field_metadata import category_icon_map from calibre.utils.icu import sort_key -from calibre.gui2.tag_browser.view import TagsView -from calibre.ebooks.metadata import title_sort -from calibre.gui2.dialogs.tag_categories import TagCategories -from calibre.gui2.dialogs.tag_list_editor import TagListEditor -from calibre.gui2.dialogs.edit_authors_dialog import EditAuthorsDialog +from calibre.utils.localization import ngettext from polyglot.builtins import iteritems diff --git a/src/calibre/gui2/tweak_book/boss.py b/src/calibre/gui2/tweak_book/boss.py index 3785c83ec3..7958bef8eb 100644 --- a/src/calibre/gui2/tweak_book/boss.py +++ b/src/calibre/gui2/tweak_book/boss.py @@ -1,7 +1,6 @@ #!/usr/bin/env python # License: GPLv3 Copyright: 2013, Kovid Goyal - import errno import os import shutil @@ -11,39 +10,37 @@ from functools import partial, wraps from qt.core import ( QApplication, QCheckBox, QDialog, QDialogButtonBox, QGridLayout, QIcon, QInputDialog, QLabel, QMimeData, QObject, QSize, Qt, QTimer, QUrl, QVBoxLayout, - pyqtSignal + pyqtSignal, ) from calibre import isbytestring, prints from calibre.constants import cache_dir, iswindows from calibre.ebooks.oeb.base import urlnormalize from calibre.ebooks.oeb.polish.container import ( - OEB_DOCS, OEB_STYLES, clone_container, get_container as _gc, guess_type -) -from calibre.ebooks.oeb.polish.cover import ( - mark_as_cover, mark_as_titlepage, set_cover + OEB_DOCS, OEB_STYLES, clone_container, get_container as _gc, guess_type, ) +from calibre.ebooks.oeb.polish.cover import mark_as_cover, mark_as_titlepage, set_cover from calibre.ebooks.oeb.polish.css import filter_css, rename_class from calibre.ebooks.oeb.polish.main import SUPPORTED, tweak_polish from calibre.ebooks.oeb.polish.pretty import fix_all_html, pretty_all from calibre.ebooks.oeb.polish.replace import ( - get_recommended_folders, rationalize_folders, rename_files, replace_file + get_recommended_folders, rationalize_folders, rename_files, replace_file, ) from calibre.ebooks.oeb.polish.split import AbortError, merge, multisplit, split from calibre.ebooks.oeb.polish.toc import ( - create_inline_toc, mark_as_nav, remove_names_from_toc + create_inline_toc, mark_as_nav, remove_names_from_toc, ) from calibre.ebooks.oeb.polish.utils import ( - link_stylesheets, setup_css_parser_serialization as scs + link_stylesheets, setup_css_parser_serialization as scs, ) from calibre.gui2 import ( - add_to_recent_docs, choose_dir, choose_files, choose_save_file, error_dialog, warning_dialog, - info_dialog, open_url, question_dialog + add_to_recent_docs, choose_dir, choose_files, choose_save_file, error_dialog, + info_dialog, open_url, question_dialog, warning_dialog, ) from calibre.gui2.dialogs.confirm_delete import confirm from calibre.gui2.tweak_book import ( actions, current_container, dictionaries, editor_name, editors, set_book_locale, - set_current_container, tprefs + set_current_container, tprefs, ) from calibre.gui2.tweak_book.completion.worker import completion_worker from calibre.gui2.tweak_book.editor import editor_from_syntax, syntax_from_mime @@ -52,23 +49,22 @@ from calibre.gui2.tweak_book.file_list import FILE_COPY_MIME, NewFileDialog from calibre.gui2.tweak_book.preferences import Preferences from calibre.gui2.tweak_book.preview import parse_worker from calibre.gui2.tweak_book.save import ( - SaveManager, find_first_existing_ancestor, save_container + SaveManager, find_first_existing_ancestor, save_container, ) from calibre.gui2.tweak_book.search import run_search, validate_search_request -from calibre.gui2.tweak_book.spell import ( - find_next as find_next_word, find_next_error -) +from calibre.gui2.tweak_book.spell import find_next as find_next_word, find_next_error from calibre.gui2.tweak_book.toc import TOCEditor from calibre.gui2.tweak_book.undo import GlobalUndoHistory from calibre.gui2.tweak_book.widgets import ( AddCover, FilterCSS, ImportForeign, InsertLink, InsertSemantics, InsertTag, - MultiSplit, QuickOpen, RationalizeFolders + MultiSplit, QuickOpen, RationalizeFolders, ) from calibre.gui2.widgets import BusyCursor from calibre.ptempfile import PersistentTemporaryDirectory, TemporaryDirectory from calibre.utils.config import JSONConfig from calibre.utils.icu import numeric_sort_key from calibre.utils.imghdr import identify +from calibre.utils.localization import ngettext from calibre.utils.tdir_in_cache import tdir_in_cache from polyglot.builtins import as_bytes, iteritems, itervalues, string_or_bytes from polyglot.urllib import urlparse @@ -216,7 +212,7 @@ class Boss(QObject): ed.apply_settings(dictionaries_changed=p.dictionaries_changed) if orig_spell != tprefs['inline_spell_check']: from calibre.gui2.tweak_book.editor.syntax.html import ( - refresh_spell_check_status + refresh_spell_check_status, ) refresh_spell_check_status() for ed in itervalues(editors): @@ -502,7 +498,7 @@ class Boss(QObject): added_name = self.do_add_file(d.file_name, d.file_data, using_template=d.using_template, edit_file=True) if d.file_name.rpartition('.')[2].lower() in ('ttf', 'otf', 'woff'): from calibre.gui2.tweak_book.manage_fonts import ( - show_font_face_rule_for_font_file + show_font_face_rule_for_font_file, ) show_font_face_rule_for_font_file(d.file_data, added_name, self.gui) @@ -567,7 +563,7 @@ class Boss(QObject): completion_worker().clear_caches('names') if added_fonts: from calibre.gui2.tweak_book.manage_fonts import ( - show_font_face_rule_for_font_files + show_font_face_rule_for_font_files, ) show_font_face_rule_for_font_files(c, added_fonts, self.gui) @@ -1219,7 +1215,7 @@ class Boss(QObject): def editor_class_clicked(self, class_data): from calibre.gui2.tweak_book.jump_to_class import ( - NoMatchingRuleFound, NoMatchingTagFound, find_first_matching_rule + NoMatchingRuleFound, NoMatchingTagFound, find_first_matching_rule, ) ed = self.gui.central.current_editor name = editor_name(ed) @@ -1617,7 +1613,7 @@ class Boss(QObject): if not self.ensure_book(_('You must first open a book in order to compress images.')): return from calibre.gui2.tweak_book.polish import ( - CompressImages, CompressImagesProgress, show_report + CompressImages, CompressImagesProgress, show_report, ) d = CompressImages(self.gui) if d.exec() == QDialog.DialogCode.Accepted: diff --git a/src/calibre/gui2/tweak_book/check_links.py b/src/calibre/gui2/tweak_book/check_links.py index 09e08d4bc3..02dca7da12 100644 --- a/src/calibre/gui2/tweak_book/check_links.py +++ b/src/calibre/gui2/tweak_book/check_links.py @@ -1,19 +1,20 @@ #!/usr/bin/env python # License: GPLv3 Copyright: 2015, Kovid Goyal - from collections import defaultdict +from qt.core import ( + QCheckBox, QDialogButtonBox, QHBoxLayout, QIcon, QInputDialog, QLabel, QProgressBar, + QSizePolicy, QStackedWidget, Qt, QTextBrowser, QVBoxLayout, QWidget, pyqtSignal, +) from threading import Thread -from qt.core import ( - QCheckBox, QHBoxLayout, QIcon, QInputDialog, QLabel, QProgressBar, QSizePolicy, - QStackedWidget, Qt, QTextBrowser, QVBoxLayout, QWidget, pyqtSignal, QDialogButtonBox -) - from calibre.gui2 import error_dialog -from calibre.gui2.tweak_book import current_container, editors, set_current_container, tprefs +from calibre.gui2.tweak_book import ( + current_container, editors, set_current_container, tprefs, +) from calibre.gui2.tweak_book.boss import get_boss from calibre.gui2.tweak_book.widgets import Dialog +from calibre.utils.localization import ngettext from polyglot.builtins import iteritems @@ -168,6 +169,7 @@ class CheckExternalLinks(Dialog): if __name__ == '__main__': import sys + from calibre.gui2 import Application from calibre.gui2.tweak_book.boss import get_container app = Application([]) diff --git a/src/calibre/gui2/tweak_book/download.py b/src/calibre/gui2/tweak_book/download.py index 46de1d060f..246c5b46c1 100644 --- a/src/calibre/gui2/tweak_book/download.py +++ b/src/calibre/gui2/tweak_book/download.py @@ -2,17 +2,20 @@ # License: GPLv3 Copyright: 2016, Kovid Goyal +from qt.core import ( + QDialogButtonBox, QGridLayout, QIcon, QLabel, QListWidget, QListWidgetItem, + QProgressBar, QScrollArea, QSize, Qt, QVBoxLayout, QWidget, pyqtSignal, +) from threading import Thread -from qt.core import ( - pyqtSignal, QWidget, QListWidget, QListWidgetItem, QLabel, Qt, - QVBoxLayout, QScrollArea, QProgressBar, QGridLayout, QSize, QIcon, QDialogButtonBox) - +from calibre.ebooks.oeb.polish.download import ( + download_external_resources, get_external_resources, replace_resources, +) from calibre.gui2 import error_dialog, info_dialog, warning_dialog +from calibre.gui2.progress_indicator import WaitStack from calibre.gui2.tweak_book import current_container from calibre.gui2.tweak_book.widgets import Dialog -from calibre.gui2.progress_indicator import WaitStack -from calibre.ebooks.oeb.polish.download import get_external_resources, download_external_resources, replace_resources +from calibre.utils.localization import ngettext from polyglot.builtins import iteritems @@ -258,8 +261,9 @@ class DownloadResources(Dialog): if __name__ == '__main__': - from calibre.gui2 import Application import sys + + from calibre.gui2 import Application app = Application([]) from calibre.gui2.tweak_book import set_current_container from calibre.gui2.tweak_book.boss import get_container diff --git a/src/calibre/gui2/tweak_book/file_list.py b/src/calibre/gui2/tweak_book/file_list.py index 437058eb76..1eb9dfef9f 100644 --- a/src/calibre/gui2/tweak_book/file_list.py +++ b/src/calibre/gui2/tweak_book/file_list.py @@ -13,31 +13,31 @@ from qt.core import ( QFormLayout, QGridLayout, QIcon, QInputDialog, QItemSelectionModel, QLabel, QLineEdit, QListWidget, QListWidgetItem, QMenu, QPainter, QPixmap, QRadioButton, QScrollArea, QSize, QSpinBox, QStyle, QStyledItemDelegate, Qt, QTimer, QTreeView, - QTreeWidget, QTreeWidgetItem, QVBoxLayout, QWidget, pyqtSignal, sip + QTreeWidget, QTreeWidgetItem, QVBoxLayout, QWidget, pyqtSignal, sip, ) from calibre import human_readable, sanitize_file_name from calibre.ebooks.oeb.base import OEB_DOCS, OEB_STYLES from calibre.ebooks.oeb.polish.cover import ( - get_cover_page_name, get_raster_cover_name, is_raster_image + get_cover_page_name, get_raster_cover_name, is_raster_image, ) from calibre.ebooks.oeb.polish.css import add_stylesheet_links from calibre.ebooks.oeb.polish.replace import ( - get_recommended_folders, get_spine_order_for_all_files + get_recommended_folders, get_spine_order_for_all_files, ) from calibre.ebooks.oeb.polish.utils import OEB_FONTS, guess_type from calibre.gui2 import ( choose_dir, choose_files, choose_save_file, elided_text, error_dialog, - make_view_use_window_background, question_dialog + make_view_use_window_background, question_dialog, ) from calibre.gui2.tweak_book import ( - CONTAINER_DND_MIMETYPE, current_container, editors, tprefs + CONTAINER_DND_MIMETYPE, current_container, editors, tprefs, ) from calibre.gui2.tweak_book.editor import syntax_from_mime from calibre.gui2.tweak_book.templates import template_for from calibre.utils.fonts.utils import get_font_names -from calibre.utils.localization import pgettext from calibre.utils.icu import numeric_sort_key +from calibre.utils.localization import ngettext, pgettext from calibre_extensions.progress_indicator import set_no_activate_on_click from polyglot.binary import as_hex_unicode from polyglot.builtins import iteritems diff --git a/src/calibre/gui2/tweak_book/manage_fonts.py b/src/calibre/gui2/tweak_book/manage_fonts.py index 14cfaaa032..8e28d8b8e6 100644 --- a/src/calibre/gui2/tweak_book/manage_fonts.py +++ b/src/calibre/gui2/tweak_book/manage_fonts.py @@ -22,6 +22,7 @@ from calibre.gui2.widgets import BusyCursor from calibre.utils.fonts.metadata import FontMetadata, UnsupportedFont from calibre.utils.fonts.scanner import NoFonts, font_scanner from calibre.utils.icu import lower as icu_lower, primary_sort_key as sort_key +from calibre.utils.localization import ngettext from polyglot.builtins import iteritems diff --git a/src/calibre/gui2/tweak_book/preferences.py b/src/calibre/gui2/tweak_book/preferences.py index 5b4bcf5a0c..506d316538 100644 --- a/src/calibre/gui2/tweak_book/preferences.py +++ b/src/calibre/gui2/tweak_book/preferences.py @@ -5,30 +5,34 @@ __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' import numbers -from operator import attrgetter, methodcaller -from functools import partial from collections import namedtuple -from polyglot.builtins import iteritems, itervalues -from itertools import product from copy import copy, deepcopy - +from functools import partial +from itertools import product +from operator import attrgetter, methodcaller from qt.core import ( - QDialog, QGridLayout, QStackedWidget, QDialogButtonBox, QListWidget, - QListWidgetItem, QIcon, QWidget, QSize, QFormLayout, Qt, QSpinBox, QListView, - QCheckBox, pyqtSignal, QDoubleSpinBox, QComboBox, QLabel, QFont, - QFontComboBox, QPushButton, QSizePolicy, QHBoxLayout, QGroupBox, QAbstractItemView, - QToolButton, QVBoxLayout, QSpacerItem, QTimer, QRadioButton) + QAbstractItemView, QCheckBox, QComboBox, QDialog, QDialogButtonBox, QDoubleSpinBox, + QFont, QFontComboBox, QFormLayout, QGridLayout, QGroupBox, QHBoxLayout, QIcon, + QLabel, QListView, QListWidget, QListWidgetItem, QPushButton, QRadioButton, QSize, + QSizePolicy, QSpacerItem, QSpinBox, QStackedWidget, Qt, QTimer, QToolButton, + QVBoxLayout, QWidget, pyqtSignal, +) from calibre import prepare_string_for_xml -from calibre.utils.localization import get_lang from calibre.gui2 import info_dialog -from calibre.gui2.keyboard import ShortcutConfig -from calibre.gui2.tweak_book import tprefs, toolbar_actions, editor_toolbar_actions, actions -from calibre.gui2.tweak_book.editor.themes import default_theme, all_theme_names, ThemeEditor -from calibre.gui2.tweak_book.spell import ManageDictionaries from calibre.gui2.font_family_chooser import FontFamilyChooser +from calibre.gui2.keyboard import ShortcutConfig +from calibre.gui2.tweak_book import ( + actions, editor_toolbar_actions, toolbar_actions, tprefs, +) +from calibre.gui2.tweak_book.editor.themes import ( + ThemeEditor, all_theme_names, default_theme, +) +from calibre.gui2.tweak_book.spell import ManageDictionaries from calibre.gui2.tweak_book.widgets import Dialog from calibre.gui2.widgets2 import ColorButton +from calibre.utils.localization import get_lang, ngettext +from polyglot.builtins import iteritems, itervalues class BasicSettings(QWidget): # {{{ @@ -348,7 +352,7 @@ class PreviewSettings(BasicSettings): # {{{ def default_font(which): if not self.default_font_settings: - from qt.webengine import QWebEngineSettings, QWebEnginePage + from qt.webengine import QWebEnginePage, QWebEngineSettings page = QWebEnginePage() s = page.settings() self.default_font_settings = { @@ -672,8 +676,9 @@ class TemplatesDialog(Dialog): # {{{ Dialog.__init__(self, _('Customize templates'), 'customize-templates', parent=parent) def setup_ui(self): - from calibre.gui2.tweak_book.templates import DEFAULT_TEMPLATES from calibre.gui2.tweak_book.editor.text import TextEdit + from calibre.gui2.tweak_book.templates import DEFAULT_TEMPLATES + # Cannot use QFormLayout as it does not play nice with TextEdit on windows self.l = l = QVBoxLayout(self) diff --git a/src/calibre/gui2/update.py b/src/calibre/gui2/update.py index 25770d7c17..237f363734 100644 --- a/src/calibre/gui2/update.py +++ b/src/calibre/gui2/update.py @@ -4,20 +4,20 @@ __copyright__ = '2008, Kovid Goyal ' import re import ssl from qt.core import ( - QCheckBox, QDialog, QDialogButtonBox, QGridLayout, QIcon, QLabel, QObject, Qt, - QUrl, pyqtSignal + QCheckBox, QDialog, QDialogButtonBox, QGridLayout, QIcon, QLabel, QObject, Qt, QUrl, + pyqtSignal, ) from threading import Event, Thread from calibre import as_unicode, prints from calibre.constants import ( - __appname__, __version__, ismacos, isportable, iswindows, numeric_version + __appname__, __version__, ismacos, isportable, iswindows, numeric_version, ) from calibre.gui2 import config, dynamic, icon_resource_manager, open_url from calibre.gui2.dialogs.plugin_updater import get_plugin_updates_available from calibre.utils.config import prefs from calibre.utils.https import get_https_resource_securely -from calibre.utils.localization import localize_website_link +from calibre.utils.localization import localize_website_link, ngettext from calibre.utils.serialize import msgpack_dumps, msgpack_loads from polyglot.binary import as_hex_unicode, from_hex_bytes @@ -168,7 +168,7 @@ class UpdateNotification(QDialog): def get_plugins(self): from calibre.gui2.dialogs.plugin_updater import ( - FILTER_UPDATE_AVAILABLE, PluginUpdaterDialog + FILTER_UPDATE_AVAILABLE, PluginUpdaterDialog, ) d = PluginUpdaterDialog(self.parent(), initial_filter=FILTER_UPDATE_AVAILABLE) @@ -238,7 +238,7 @@ class UpdateMixin: elif has_plugin_updates: if force: from calibre.gui2.dialogs.plugin_updater import ( - FILTER_UPDATE_AVAILABLE, PluginUpdaterDialog + FILTER_UPDATE_AVAILABLE, PluginUpdaterDialog, ) d = PluginUpdaterDialog(self, initial_filter=FILTER_UPDATE_AVAILABLE) diff --git a/src/calibre/gui2/viewer/highlights.py b/src/calibre/gui2/viewer/highlights.py index 3776885efa..e652764857 100644 --- a/src/calibre/gui2/viewer/highlights.py +++ b/src/calibre/gui2/viewer/highlights.py @@ -8,26 +8,27 @@ from functools import lru_cache from itertools import chain from qt.core import ( QAbstractItemView, QColor, QDialog, QFont, QHBoxLayout, QIcon, QImage, - QItemSelectionModel, QKeySequence, QLabel, QMenu, QPainter, QPainterPath, - QPalette, QPixmap, QPushButton, QRect, QSizePolicy, QStyle, Qt, QTextCursor, - QTextEdit, QTreeWidget, QTreeWidgetItem, QVBoxLayout, QWidget, pyqtSignal + QItemSelectionModel, QKeySequence, QLabel, QMenu, QPainter, QPainterPath, QPalette, + QPixmap, QPushButton, QRect, QSizePolicy, QStyle, Qt, QTextCursor, QTextEdit, + QTreeWidget, QTreeWidgetItem, QVBoxLayout, QWidget, pyqtSignal, ) from calibre.constants import ( - builtin_colors_dark, builtin_colors_light, builtin_decorations + builtin_colors_dark, builtin_colors_light, builtin_decorations, ) from calibre.ebooks.epub.cfi.parse import cfi_sort_key from calibre.gui2 import error_dialog, is_dark_theme, safe_open_url from calibre.gui2.dialogs.confirm_delete import confirm from calibre.gui2.gestures import GestureManager from calibre.gui2.library.annotations import ( - Details, Export as ExportBase, render_highlight_as_text, render_notes + Details, Export as ExportBase, render_highlight_as_text, render_notes, ) from calibre.gui2.viewer import link_prefix_for_location_links from calibre.gui2.viewer.config import vprefs from calibre.gui2.viewer.search import SearchInput from calibre.gui2.viewer.shortcuts import get_shortcut_for, index_to_key_sequence from calibre.gui2.widgets2 import Dialog +from calibre.utils.localization import ngettext from calibre_extensions.progress_indicator import set_no_activate_on_click decoration_cache = {} diff --git a/src/calibre/gui2/viewer/search.py b/src/calibre/gui2/viewer/search.py index 112d381118..b59118b3ea 100644 --- a/src/calibre/gui2/viewer/search.py +++ b/src/calibre/gui2/viewer/search.py @@ -7,7 +7,7 @@ from collections import Counter, OrderedDict from html import escape from qt.core import ( QAbstractItemView, QCheckBox, QComboBox, QFont, QHBoxLayout, QIcon, QLabel, Qt, - QToolButton, QTreeWidget, QTreeWidgetItem, QVBoxLayout, QWidget, pyqtSignal + QToolButton, QTreeWidget, QTreeWidgetItem, QVBoxLayout, QWidget, pyqtSignal, ) from threading import Thread @@ -19,6 +19,7 @@ from calibre.gui2.viewer.config import vprefs from calibre.gui2.viewer.web_view import get_data, get_manifest from calibre.gui2.viewer.widgets import ResultsDelegate, SearchBox from calibre.utils.icu import primary_collator_without_punctuation +from calibre.utils.localization import ngettext from polyglot.builtins import iteritems from polyglot.functools import lru_cache from polyglot.queue import Queue @@ -363,6 +364,7 @@ def search_in_name(name, search_query, ctx_size=75): else: spans = [] + def miter(): return spans if raw: diff --git a/src/calibre/library/catalogs/epub_mobi_builder.py b/src/calibre/library/catalogs/epub_mobi_builder.py index 79a6964821..cf6578c5b5 100644 --- a/src/calibre/library/catalogs/epub_mobi_builder.py +++ b/src/calibre/library/catalogs/epub_mobi_builder.py @@ -35,8 +35,10 @@ from calibre.utils.date import ( ) from calibre.utils.filenames import ascii_text, shorten_components_to from calibre.utils.formatter import TemplateFormatter -from calibre.utils.icu import capitalize, collation_order, sort_key, upper as icu_upper -from calibre.utils.localization import get_lang, lang_as_iso639_1 +from calibre.utils.icu import ( + capitalize, collation_order, sort_key, title_case as icu_title, upper as icu_upper, +) +from calibre.utils.localization import get_lang, lang_as_iso639_1, ngettext from calibre.utils.resources import get_image_path as I, get_path as P from calibre.utils.xml_parse import safe_xml_fromstring from calibre.utils.zipfile import ZipFile diff --git a/src/calibre/library/field_metadata.py b/src/calibre/library/field_metadata.py index f1efea9a9f..07f27a0935 100644 --- a/src/calibre/library/field_metadata.py +++ b/src/calibre/library/field_metadata.py @@ -9,6 +9,7 @@ from collections import OrderedDict from calibre.utils.config_base import tweaks from calibre.utils.icu import lower as icu_lower +from calibre.utils.localization import ngettext from polyglot.builtins import iteritems, itervalues category_icon_map = { diff --git a/src/calibre/srv/manage_users_cli.py b/src/calibre/srv/manage_users_cli.py index f3082752b0..7544c9901d 100644 --- a/src/calibre/srv/manage_users_cli.py +++ b/src/calibre/srv/manage_users_cli.py @@ -5,8 +5,9 @@ import sys from functools import partial from calibre import prints -from calibre.constants import preferred_encoding, iswindows +from calibre.constants import iswindows, preferred_encoding from calibre.utils.config import OptionParser +from calibre.utils.localization import ngettext from polyglot.builtins import iteritems diff --git a/src/calibre/srv/opds.py b/src/calibre/srv/opds.py index 8e19a7b561..2ec3e0d242 100644 --- a/src/calibre/srv/opds.py +++ b/src/calibre/srv/opds.py @@ -24,6 +24,7 @@ from calibre.srv.utils import Offsets, get_library_data, http_date from calibre.utils.config import prefs from calibre.utils.date import as_utc, is_date_undefined, timestampfromdt from calibre.utils.icu import sort_key +from calibre.utils.localization import ngettext from calibre.utils.search_query_parser import ParseException from calibre.utils.xml_parse import safe_xml_fromstring from polyglot.binary import as_hex_unicode, from_hex_unicode