diff --git a/src/calibre/gui2/viewer/bookmarks.py b/src/calibre/gui2/viewer/bookmarks.py index 73e988a359..bc918ada01 100644 --- a/src/calibre/gui2/viewer/bookmarks.py +++ b/src/calibre/gui2/viewer/bookmarks.py @@ -7,7 +7,7 @@ from operator import itemgetter from qt.core import ( QAbstractItemView, QAction, QComboBox, QGridLayout, QHBoxLayout, QIcon, QInputDialog, QItemSelectionModel, QLabel, QListWidget, QListWidgetItem, - QPushButton, Qt, QWidget, pyqtSignal + QPushButton, Qt, QWidget, pyqtSignal, ) from calibre.gui2 import choose_files, choose_save_file @@ -17,6 +17,7 @@ from calibre.gui2.viewer.shortcuts import get_shortcut_for from calibre.gui2.viewer.web_view import vprefs from calibre.utils.date import EPOCH, utcnow from calibre.utils.icu import primary_sort_key +from calibre.utils.localization import _ class BookmarksList(QListWidget): diff --git a/src/calibre/gui2/viewer/highlights.py b/src/calibre/gui2/viewer/highlights.py index e652764857..18ba4a4721 100644 --- a/src/calibre/gui2/viewer/highlights.py +++ b/src/calibre/gui2/viewer/highlights.py @@ -28,7 +28,7 @@ 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.utils.localization import _, ngettext from calibre_extensions.progress_indicator import set_no_activate_on_click decoration_cache = {} diff --git a/src/calibre/gui2/viewer/lookup.py b/src/calibre/gui2/viewer/lookup.py index f1e74c1584..1dff97ae92 100644 --- a/src/calibre/gui2/viewer/lookup.py +++ b/src/calibre/gui2/viewer/lookup.py @@ -18,7 +18,7 @@ from calibre import prints, random_user_agent from calibre.gui2 import error_dialog from calibre.gui2.viewer.web_view import apply_font_settings, vprefs from calibre.gui2.widgets2 import Dialog -from calibre.utils.localization import canonicalize_lang, get_lang, lang_as_iso639_1 +from calibre.utils.localization import _, canonicalize_lang, get_lang, lang_as_iso639_1 from calibre.utils.resources import get_path as P from calibre.utils.webengine import ( create_script, insert_scripts, secure_webengine, setup_profile, diff --git a/src/calibre/gui2/viewer/main.py b/src/calibre/gui2/viewer/main.py index 3a9dcb45f4..3cdd57c850 100644 --- a/src/calibre/gui2/viewer/main.py +++ b/src/calibre/gui2/viewer/main.py @@ -16,6 +16,7 @@ from calibre.gui2.viewer.ui import EbookViewer, is_float from calibre.ptempfile import reset_base_dir from calibre.utils.config import JSONConfig from calibre.utils.ipc import viewer_socket_address +from calibre.utils.localization import _ singleinstance_name = 'calibre_viewer' @@ -168,6 +169,7 @@ def run_gui(app, opts, args, internal_book_data, listener=None): def main(args=sys.argv): from calibre.utils.webengine import setup_fake_protocol + # Ensure viewer can continue to function if GUI is closed os.environ.pop('CALIBRE_WORKER_TEMP_DIR', None) reset_base_dir() diff --git a/src/calibre/gui2/viewer/printing.py b/src/calibre/gui2/viewer/printing.py index 7dfe76f58b..65d3c5860b 100644 --- a/src/calibre/gui2/viewer/printing.py +++ b/src/calibre/gui2/viewer/printing.py @@ -5,18 +5,16 @@ import os import subprocess import sys -from threading import Thread - from qt.core import ( - QCheckBox, QDoubleSpinBox, QFormLayout, QHBoxLayout, QIcon, QLabel, QDialog, - QLineEdit, QPageSize, QProgressDialog, QTimer, QToolButton, QVBoxLayout + QCheckBox, QDialog, QDoubleSpinBox, QFormLayout, QHBoxLayout, QIcon, QLabel, + QLineEdit, QPageSize, QProgressDialog, QTimer, QToolButton, QVBoxLayout, ) +from threading import Thread from calibre import sanitize_file_name from calibre.ebooks.conversion.plugins.pdf_output import PAPER_SIZES from calibre.gui2 import ( - Application, choose_save_file, dynamic, elided_text, error_dialog, - open_local_file + Application, choose_save_file, dynamic, elided_text, error_dialog, open_local_file, ) from calibre.gui2.widgets import PaperSizes from calibre.gui2.widgets2 import Dialog @@ -24,9 +22,9 @@ from calibre.ptempfile import PersistentTemporaryFile from calibre.utils.config import JSONConfig from calibre.utils.filenames import expanduser from calibre.utils.ipc.simple_worker import start_pipe_worker +from calibre.utils.localization import _ from calibre.utils.serialize import msgpack_dumps, msgpack_loads - vprefs = JSONConfig('viewer') diff --git a/src/calibre/gui2/viewer/search.py b/src/calibre/gui2/viewer/search.py index b59118b3ea..ad43b3ec8e 100644 --- a/src/calibre/gui2/viewer/search.py +++ b/src/calibre/gui2/viewer/search.py @@ -19,7 +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 calibre.utils.localization import _, ngettext from polyglot.builtins import iteritems from polyglot.functools import lru_cache from polyglot.queue import Queue diff --git a/src/calibre/gui2/viewer/toc.py b/src/calibre/gui2/viewer/toc.py index a0447c2a6a..e105464e07 100644 --- a/src/calibre/gui2/viewer/toc.py +++ b/src/calibre/gui2/viewer/toc.py @@ -6,14 +6,15 @@ import re from functools import partial from qt.core import ( QAbstractItemView, QApplication, QEvent, QFont, QHBoxLayout, QIcon, QMenu, - QModelIndex, QStandardItem, QStandardItemModel, QStyledItemDelegate, - Qt, QToolButton, QToolTip, QTreeView, QWidget, pyqtSignal + QModelIndex, QStandardItem, QStandardItemModel, QStyledItemDelegate, Qt, + QToolButton, QToolTip, QTreeView, QWidget, pyqtSignal, ) from calibre.gui2 import error_dialog -from calibre.gui2.search_box import SearchBox2 from calibre.gui2.gestures import GestureManager +from calibre.gui2.search_box import SearchBox2 from calibre.utils.icu import primary_contains +from calibre.utils.localization import _ class Delegate(QStyledItemDelegate): diff --git a/src/calibre/gui2/viewer/toolbars.py b/src/calibre/gui2/viewer/toolbars.py index aaa245b756..2d95566cdc 100644 --- a/src/calibre/gui2/viewer/toolbars.py +++ b/src/calibre/gui2/viewer/toolbars.py @@ -19,6 +19,7 @@ from calibre.gui2.viewer.web_view import set_book_path, vprefs from calibre.gui2.widgets2 import Dialog from calibre.startup import connect_lambda from calibre.utils.icu import primary_sort_key +from calibre.utils.localization import _ class Action: diff --git a/src/calibre/gui2/viewer/tts.py b/src/calibre/gui2/viewer/tts.py index 7354b9428f..3e2f77ddb2 100644 --- a/src/calibre/gui2/viewer/tts.py +++ b/src/calibre/gui2/viewer/tts.py @@ -6,6 +6,7 @@ from qt.core import QDialog, QDialogButtonBox, QObject, QVBoxLayout, pyqtSignal from calibre.gui2 import error_dialog from calibre.gui2.viewer.config import get_pref_group, vprefs from calibre.gui2.widgets2 import Dialog +from calibre.utils.localization import _ def set_sync_override(allowed): diff --git a/src/calibre/gui2/viewer/ui.py b/src/calibre/gui2/viewer/ui.py index 2cebb9d851..b9e6813d04 100644 --- a/src/calibre/gui2/viewer/ui.py +++ b/src/calibre/gui2/viewer/ui.py @@ -48,6 +48,7 @@ from calibre.startup import connect_lambda from calibre.utils.date import utcnow from calibre.utils.img import image_from_path from calibre.utils.ipc.simple_worker import WorkerError +from calibre.utils.localization import _ from polyglot.builtins import as_bytes, as_unicode, iteritems, itervalues diff --git a/src/calibre/gui2/viewer/web_view.py b/src/calibre/gui2/viewer/web_view.py index 40470c3ec0..fc077f1ea5 100644 --- a/src/calibre/gui2/viewer/web_view.py +++ b/src/calibre/gui2/viewer/web_view.py @@ -1,7 +1,6 @@ #!/usr/bin/env python # License: GPL v3 Copyright: 2018, Kovid Goyal - import os import shutil import sys @@ -28,7 +27,7 @@ from calibre.gui2.viewer.config import viewer_config_dir, vprefs from calibre.gui2.viewer.tts import TTS from calibre.gui2.webengine import RestartingWebEngineView from calibre.srv.code import get_translations_data -from calibre.utils.localization import localize_user_manual_link +from calibre.utils.localization import _, localize_user_manual_link from calibre.utils.resources import get_path as P from calibre.utils.serialize import json_loads from calibre.utils.shared_file import share_open diff --git a/src/calibre/gui2/viewer/widgets.py b/src/calibre/gui2/viewer/widgets.py index 3c2d71b80b..514fa4e20c 100644 --- a/src/calibre/gui2/viewer/widgets.py +++ b/src/calibre/gui2/viewer/widgets.py @@ -2,13 +2,13 @@ # License: GPL v3 Copyright: 2020, Kovid Goyal import re - from qt.core import ( - QAction, QFont, QFontMetrics, QStyle, QStyledItemDelegate, Qt, pyqtSignal, QPalette + QAction, QFont, QFontMetrics, QPalette, QStyle, QStyledItemDelegate, Qt, pyqtSignal, ) from calibre.gui2 import QT_HIDDEN_CLEAR_ACTION from calibre.gui2.widgets2 import HistoryComboBox +from calibre.utils.localization import _ class ResultsDelegate(QStyledItemDelegate): # {{{ diff --git a/src/calibre/gui2/widgets.py b/src/calibre/gui2/widgets.py index d4766439d0..da290e9832 100644 --- a/src/calibre/gui2/widgets.py +++ b/src/calibre/gui2/widgets.py @@ -25,7 +25,7 @@ from calibre.gui2.filename_pattern_ui import Ui_Form from calibre.gui2.progress_indicator import ProgressIndicator as _ProgressIndicator from calibre.startup import connect_lambda from calibre.utils.config import XMLConfig, prefs -from calibre.utils.localization import localize_user_manual_link +from calibre.utils.localization import _, localize_user_manual_link from polyglot.builtins import native_string_type history = XMLConfig('history') diff --git a/src/calibre/gui2/widgets2.py b/src/calibre/gui2/widgets2.py index 7a57ba31a2..4768b384e7 100644 --- a/src/calibre/gui2/widgets2.py +++ b/src/calibre/gui2/widgets2.py @@ -4,13 +4,13 @@ import weakref from qt.core import ( - QApplication, QBrush, QByteArray, QCalendarWidget, QCheckBox, QColor, - QColorDialog, QComboBox, QDate, QDateTime, QDateTimeEdit, QDialog, - QDialogButtonBox, QFont, QFontInfo, QFontMetrics, QFrame, QIcon, QKeySequence, - QLabel, QLayout, QMenu, QMimeData, QPainter, QPalette, QPixmap, QPoint, - QPushButton, QRect, QScrollArea, QSize, QSizePolicy, QStyle, QStyledItemDelegate, - QStyleOptionToolButton, QStylePainter, Qt, QTabWidget, QTextBrowser, QTextCursor, - QToolButton, QUndoCommand, QUndoStack, QUrl, QWidget, pyqtSignal + QApplication, QBrush, QByteArray, QCalendarWidget, QCheckBox, QColor, QColorDialog, + QComboBox, QDate, QDateTime, QDateTimeEdit, QDialog, QDialogButtonBox, QFont, + QFontInfo, QFontMetrics, QFrame, QIcon, QKeySequence, QLabel, QLayout, QMenu, + QMimeData, QPainter, QPalette, QPixmap, QPoint, QPushButton, QRect, QScrollArea, + QSize, QSizePolicy, QStyle, QStyledItemDelegate, QStyleOptionToolButton, + QStylePainter, Qt, QTabWidget, QTextBrowser, QTextCursor, QToolButton, QUndoCommand, + QUndoStack, QUrl, QWidget, pyqtSignal, ) from calibre.ebooks.metadata import rating_to_stars @@ -19,6 +19,7 @@ from calibre.gui2.complete2 import EditWithComplete, LineEdit from calibre.gui2.widgets import history from calibre.utils.config_base import tweaks from calibre.utils.date import UNDEFINED_DATE +from calibre.utils.localization import _ from polyglot.functools import lru_cache diff --git a/src/calibre/gui2/win_file_dialogs.py b/src/calibre/gui2/win_file_dialogs.py index 20c0da112d..52e0587781 100644 --- a/src/calibre/gui2/win_file_dialogs.py +++ b/src/calibre/gui2/win_file_dialogs.py @@ -6,11 +6,11 @@ import os import struct import subprocess import sys +from contextlib import suppress from threading import Thread from uuid import uuid4 -from contextlib import suppress - +from calibre.utils.localization import _ from polyglot.builtins import string_or_bytes base = sys.extensions_location if hasattr(sys, 'new_app_layout') else os.path.dirname(sys.executable) diff --git a/src/calibre/gui2/wizard/__init__.py b/src/calibre/gui2/wizard/__init__.py index d4a691489e..1e42eabb0e 100644 --- a/src/calibre/gui2/wizard/__init__.py +++ b/src/calibre/gui2/wizard/__init__.py @@ -10,8 +10,8 @@ import re import traceback from contextlib import closing, suppress from qt.core import ( - QAbstractListModel, QDir, QIcon, QItemSelection, QItemSelectionModel, Qt, - QWizard, QWizardPage, pyqtSignal + QAbstractListModel, QDir, QIcon, QItemSelection, QItemSelectionModel, Qt, QWizard, + QWizardPage, pyqtSignal, ) from calibre import __appname__ @@ -24,7 +24,7 @@ from calibre.gui2.wizard.library_ui import Ui_WizardPage as LibraryUI from calibre.gui2.wizard.send_email import smtp_prefs from calibre.gui2.wizard.stanza_ui import Ui_WizardPage as StanzaUI from calibre.utils.config import dynamic, prefs -from calibre.utils.localization import localize_user_manual_link +from calibre.utils.localization import _, localize_user_manual_link from polyglot.builtins import iteritems # Devices {{{ @@ -717,7 +717,7 @@ class LibraryPage(QWizardPage, LibraryUI): self.language.blockSignals(True) self.language.clear() from calibre.utils.localization import ( - available_translations, get_lang, get_language, get_lc_messages_path + available_translations, get_lang, get_language, get_lc_messages_path, ) lang = get_lang() lang = get_lc_messages_path(lang) if lang else lang diff --git a/src/calibre/gui2/wizard/send_email.py b/src/calibre/gui2/wizard/send_email.py index 4701862742..8249790939 100644 --- a/src/calibre/gui2/wizard/send_email.py +++ b/src/calibre/gui2/wizard/send_email.py @@ -7,17 +7,17 @@ __docformat__ = 'restructuredtext en' import sys from functools import partial +from qt.core import ( + QCheckBox, QDialog, QDialogButtonBox, QGridLayout, QHBoxLayout, QIcon, QLabel, + QLineEdit, QPlainTextEdit, QPushButton, Qt, QVBoxLayout, QWidget, pyqtSignal, +) from threading import Thread -from qt.core import ( - QWidget, pyqtSignal, QDialog, Qt, QLabel, QLineEdit, QDialogButtonBox, - QGridLayout, QCheckBox, QIcon, QVBoxLayout, QPushButton, QPlainTextEdit, - QHBoxLayout) - from calibre import prints -from calibre.gui2.wizard.send_email_ui import Ui_Form -from calibre.utils.smtp import config as smtp_prefs from calibre.gui2 import error_dialog, question_dialog +from calibre.gui2.wizard.send_email_ui import Ui_Form +from calibre.utils.localization import _ +from calibre.utils.smtp import config as smtp_prefs from polyglot.binary import as_hex_unicode, from_hex_unicode from polyglot.io import PolyglotStringIO @@ -211,7 +211,7 @@ class SendEmail(QWidget, Ui_Form): def test_email_settings(self, to): opts = smtp_prefs().parse() - from calibre.utils.smtp import sendmail, create_mail + from calibre.utils.smtp import create_mail, sendmail buf = PolyglotStringIO() debug_out = partial(prints, file=buf) oout, oerr = sys.stdout, sys.stderr diff --git a/src/calibre/gui_launch.py b/src/calibre/gui_launch.py index 4e48da22d2..e0bf492d2b 100644 --- a/src/calibre/gui_launch.py +++ b/src/calibre/gui_launch.py @@ -85,6 +85,7 @@ def is_possible_media_pack_error(e): def show_media_pack_error(): import traceback from calibre.gui2 import error_dialog, Application + from calibre.utils.localization import _ app = Application([]) error_dialog(None, _('Required component missing'), '

' + _( 'This computer is missing the Windows MediaPack, which is needed for calibre. Instructions' diff --git a/src/calibre/library/caches.py b/src/calibre/library/caches.py index efc3994a1d..eed672e9f6 100644 --- a/src/calibre/library/caches.py +++ b/src/calibre/library/caches.py @@ -20,7 +20,7 @@ from calibre.ebooks.metadata.opf2 import metadata_to_opf from calibre.utils.config import prefs, tweaks from calibre.utils.date import UNDEFINED_DATE, clean_date_for_sort, now, parse_date from calibre.utils.icu import lower as icu_lower -from calibre.utils.localization import canonicalize_lang, get_udc, lang_map +from calibre.utils.localization import _, canonicalize_lang, get_udc, lang_map from calibre.utils.search_query_parser import ParseException, SearchQueryParser from polyglot.builtins import cmp, iteritems, itervalues, string_or_bytes diff --git a/src/calibre/library/catalogs/bibtex.py b/src/calibre/library/catalogs/bibtex.py index 27feade593..ac2397c290 100644 --- a/src/calibre/library/catalogs/bibtex.py +++ b/src/calibre/library/catalogs/bibtex.py @@ -16,6 +16,7 @@ from calibre.customize import CatalogPlugin from calibre.customize.conversion import DummyReporter from calibre.ebooks.metadata import format_isbn from calibre.library.catalogs import FIELDS, TEMPLATE_ALLOWED_FIELDS +from calibre.utils.localization import _ from polyglot.builtins import string_or_bytes diff --git a/src/calibre/library/catalogs/csv_xml.py b/src/calibre/library/catalogs/csv_xml.py index 21ca37b42e..9e192620de 100644 --- a/src/calibre/library/catalogs/csv_xml.py +++ b/src/calibre/library/catalogs/csv_xml.py @@ -5,12 +5,15 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import re, codecs, os +import codecs +import os +import re from collections import namedtuple from calibre.customize import CatalogPlugin -from calibre.library.catalogs import FIELDS from calibre.customize.conversion import DummyReporter +from calibre.library.catalogs import FIELDS +from calibre.utils.localization import _ class CSV_XML(CatalogPlugin): @@ -50,12 +53,13 @@ class CSV_XML(CatalogPlugin): "Applies to: CSV, XML output formats"))] def run(self, path_to_output, opts, db, notification=DummyReporter()): + from lxml import etree + + from calibre.ebooks.metadata import authors_to_string from calibre.library import current_library_name from calibre.utils.date import isoformat from calibre.utils.html2text import html2text from calibre.utils.logging import default_log as log - from lxml import etree - from calibre.ebooks.metadata import authors_to_string self.fmt = path_to_output.rpartition('.')[2] self.notification = notification diff --git a/src/calibre/library/catalogs/epub_mobi.py b/src/calibre/library/catalogs/epub_mobi.py index 0586bf0345..ae95691c71 100644 --- a/src/calibre/library/catalogs/epub_mobi.py +++ b/src/calibre/library/catalogs/epub_mobi.py @@ -5,16 +5,20 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import datetime, os, time +import datetime +import os +import time from collections import namedtuple from calibre import strftime from calibre.customize import CatalogPlugin -from calibre.customize.conversion import OptionRecommendation, DummyReporter +from calibre.customize.conversion import DummyReporter, OptionRecommendation from calibre.library import current_library_name from calibre.library.catalogs import AuthorSortMismatchException, EmptyCatalogException from calibre.ptempfile import PersistentTemporaryFile -from calibre.utils.localization import calibre_langcode_to_name, canonicalize_lang, get_lang +from calibre.utils.localization import ( + _, calibre_langcode_to_name, canonicalize_lang, get_lang, +) Option = namedtuple('Option', 'option, default, dest, action, help') @@ -190,8 +194,8 @@ class EPUB_MOBI(CatalogPlugin): def run(self, path_to_output, opts, db, notification=DummyReporter()): from calibre.library.catalogs.epub_mobi_builder import CatalogBuilder - from calibre.utils.logging import default_log as log from calibre.utils.config import JSONConfig + from calibre.utils.logging import default_log as log # If preset specified from the cli, insert stored options from JSON file if hasattr(opts, 'preset') and opts.preset: diff --git a/src/calibre/library/catalogs/epub_mobi_builder.py b/src/calibre/library/catalogs/epub_mobi_builder.py index cf6578c5b5..ca67089c38 100644 --- a/src/calibre/library/catalogs/epub_mobi_builder.py +++ b/src/calibre/library/catalogs/epub_mobi_builder.py @@ -38,7 +38,7 @@ from calibre.utils.formatter import TemplateFormatter 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.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/check_library.py b/src/calibre/library/check_library.py index 02926c3f3d..dedbfef5db 100644 --- a/src/calibre/library/check_library.py +++ b/src/calibre/library/check_library.py @@ -5,11 +5,15 @@ __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import re, os, traceback, fnmatch +import fnmatch +import os +import re +import traceback from calibre import isbytestring from calibre.constants import filesystem_encoding from calibre.ebooks import BOOK_EXTENSIONS +from calibre.utils.localization import _ from polyglot.builtins import iteritems EBOOK_EXTENSIONS = frozenset(BOOK_EXTENSIONS) diff --git a/src/calibre/library/coloring.py b/src/calibre/library/coloring.py index 65c2e90888..69caf8548e 100644 --- a/src/calibre/library/coloring.py +++ b/src/calibre/library/coloring.py @@ -6,6 +6,7 @@ import json import re from textwrap import dedent +from calibre.utils.localization import _ from polyglot.binary import as_hex_unicode, from_hex_bytes color_row_key = '*row' diff --git a/src/calibre/library/custom_columns.py b/src/calibre/library/custom_columns.py index 5033b4c40c..7d6fe96593 100644 --- a/src/calibre/library/custom_columns.py +++ b/src/calibre/library/custom_columns.py @@ -5,14 +5,17 @@ __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import json, re, numbers +import json +import numbers +import re from functools import partial -from calibre import prints, force_unicode +from calibre import force_unicode, prints from calibre.constants import preferred_encoding from calibre.library.field_metadata import FieldMetadata -from calibre.utils.date import parse_date from calibre.utils.config import tweaks +from calibre.utils.date import parse_date +from calibre.utils.localization import _ from polyglot.builtins import string_or_bytes @@ -217,7 +220,7 @@ class CustomColumns: if data['display'].get('sort_alpha', False): ans.sort(key=lambda x:x.lower()) if data['datatype'] == 'datetime' and isinstance(ans, string_or_bytes): - from calibre.db.tables import c_parse, UNDEFINED_DATE + from calibre.db.tables import UNDEFINED_DATE, c_parse ans = c_parse(ans) if ans is UNDEFINED_DATE: ans = None @@ -249,7 +252,7 @@ class CustomColumns: if data['display'].get('sort_alpha', False): ans.sort(key=lambda x: x.lower()) if data['datatype'] == 'datetime' and isinstance(ans, string_or_bytes): - from calibre.db.tables import c_parse, UNDEFINED_DATE + from calibre.db.tables import UNDEFINED_DATE, c_parse ans = c_parse(ans) if ans is UNDEFINED_DATE: ans = None diff --git a/src/calibre/library/database.py b/src/calibre/library/database.py index 16757b20ac..7f43fbd8e1 100644 --- a/src/calibre/library/database.py +++ b/src/calibre/library/database.py @@ -5,14 +5,16 @@ __copyright__ = '2008, Kovid Goyal ' Backend that implements storage of ebooks in an sqlite database. ''' +import datetime +import re import sqlite3 as sqlite -import datetime, re, sre_constants +import sre_constants from zlib import compress, decompress -from calibre.ebooks.metadata import MetaInformation -from calibre.ebooks.metadata import string_to_authors -from calibre.utils.serialize import pickle_loads, pickle_dumps from calibre import isbytestring +from calibre.ebooks.metadata import MetaInformation, string_to_authors +from calibre.utils.localization import _ +from calibre.utils.serialize import pickle_dumps, pickle_loads class Concatenate: @@ -980,7 +982,7 @@ ALTER TABLE books ADD COLUMN isbn TEXT DEFAULT "" COLLATE NOCASE; data = self.conn.get('SELECT data FROM covers WHERE book=?', (id,), all=False) if not data: return None - return(decompress(data)) + return decompress(data) def tags(self, index, index_is_id=False): '''tags as a comma separated list or None''' diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 3ea0ecb429..1f63a0a59e 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -60,7 +60,7 @@ from calibre.utils.filenames import ( from calibre.utils.formatter_functions import load_user_template_functions from calibre.utils.icu import lower, lower as icu_lower, sort_key, strcmp from calibre.utils.img import save_cover_data_to -from calibre.utils.localization import calibre_langcode_to_name, canonicalize_lang +from calibre.utils.localization import _, calibre_langcode_to_name, canonicalize_lang from calibre.utils.recycle_bin import delete_file, delete_tree from calibre.utils.resources import get_path as P from calibre.utils.search_query_parser import saved_searches, set_saved_searches diff --git a/src/calibre/library/field_metadata.py b/src/calibre/library/field_metadata.py index 07f27a0935..20dfd10bd5 100644 --- a/src/calibre/library/field_metadata.py +++ b/src/calibre/library/field_metadata.py @@ -9,7 +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 calibre.utils.localization import _, ngettext from polyglot.builtins import iteritems, itervalues category_icon_map = { diff --git a/src/calibre/library/restore.py b/src/calibre/library/restore.py index a071524779..f1e953721a 100644 --- a/src/calibre/library/restore.py +++ b/src/calibre/library/restore.py @@ -5,17 +5,21 @@ __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import re, os, traceback, shutil -from threading import Thread +import os +import re +import shutil +import traceback from operator import itemgetter +from threading import Thread -from calibre.ptempfile import TemporaryDirectory +from calibre import isbytestring +from calibre.constants import filesystem_encoding from calibre.ebooks.metadata.opf2 import OPF from calibre.library.database2 import LibraryDatabase2 from calibre.library.prefs import DBPrefs -from calibre.constants import filesystem_encoding +from calibre.ptempfile import TemporaryDirectory from calibre.utils.date import utcfromtimestamp -from calibre import isbytestring +from calibre.utils.localization import _ from polyglot.builtins import iteritems NON_EBOOK_EXTENSIONS = frozenset([ diff --git a/src/calibre/library/save_to_disk.py b/src/calibre/library/save_to_disk.py index e6d19dca71..eac71e3b75 100644 --- a/src/calibre/library/save_to_disk.py +++ b/src/calibre/library/save_to_disk.py @@ -5,19 +5,21 @@ __license__ = 'GPL v3' __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import os, traceback, re, errno +import errno +import os +import re +import traceback -from calibre.constants import DEBUG +from calibre import prints, sanitize_file_name, strftime +from calibre.constants import DEBUG, preferred_encoding from calibre.db.errors import NoSuchFormat -from calibre.utils.config import Config, StringConfig, tweaks -from calibre.utils.formatter import TemplateFormatter -from calibre.utils.filenames import shorten_components_to, ascii_filename -from calibre.constants import preferred_encoding -from calibre.ebooks.metadata import fmt_sidx -from calibre.ebooks.metadata import title_sort -from calibre.utils.date import as_local_time -from calibre import strftime, prints, sanitize_file_name from calibre.db.lazy import FormatsList +from calibre.ebooks.metadata import fmt_sidx, title_sort +from calibre.utils.config import Config, StringConfig, tweaks +from calibre.utils.date import as_local_time +from calibre.utils.filenames import ascii_filename, shorten_components_to +from calibre.utils.formatter import TemplateFormatter +from calibre.utils.localization import _ plugboard_any_device_value = 'any device' plugboard_any_format_value = 'any format' diff --git a/src/calibre/linux.py b/src/calibre/linux.py index f81de08db5..c201c136ff 100644 --- a/src/calibre/linux.py +++ b/src/calibre/linux.py @@ -15,6 +15,7 @@ from calibre import CurrentDir, __appname__, guess_type, prints from calibre.constants import isbsd, islinux from calibre.customize.ui import all_input_formats from calibre.ptempfile import TemporaryDirectory +from calibre.utils.localization import _ from calibre.utils.resources import get_image_path as I, get_path as P from polyglot.builtins import iteritems diff --git a/src/calibre/spell/dictionary.py b/src/calibre/spell/dictionary.py index 89042bcf63..4194a0ef50 100644 --- a/src/calibre/spell/dictionary.py +++ b/src/calibre/spell/dictionary.py @@ -16,7 +16,7 @@ from calibre.constants import config_dir, filesystem_encoding, iswindows from calibre.spell import parse_lang_code from calibre.utils.config import JSONConfig from calibre.utils.icu import capitalize -from calibre.utils.localization import get_lang, get_system_locale +from calibre.utils.localization import _, get_lang, get_system_locale from calibre.utils.resources import get_path as P from polyglot.builtins import iteritems, itervalues diff --git a/src/calibre/srv/ajax.py b/src/calibre/srv/ajax.py index 49055d2ca5..6fa95acab4 100644 --- a/src/calibre/srv/ajax.py +++ b/src/calibre/srv/ajax.py @@ -5,21 +5,24 @@ __license__ = 'GPL v3' __copyright__ = '2015, Kovid Goyal ' from functools import partial -from polyglot.builtins import iteritems, itervalues, string_or_bytes from itertools import cycle from calibre import force_unicode -from calibre.library.field_metadata import category_icon_map from calibre.db.view import sanitize_sort_field_name from calibre.ebooks.metadata import title_sort from calibre.ebooks.metadata.book.json_codec import JsonCodec -from calibre.srv.errors import HTTPNotFound, BookNotFound -from calibre.srv.routes import endpoint, json +from calibre.library.field_metadata import category_icon_map from calibre.srv.content import get as get_content, icon as get_icon -from calibre.srv.utils import http_date, custom_fields_to_display, encode_name, decode_name, get_db +from calibre.srv.errors import BookNotFound, HTTPNotFound +from calibre.srv.routes import endpoint, json +from calibre.srv.utils import ( + custom_fields_to_display, decode_name, encode_name, get_db, http_date, +) from calibre.utils.config import prefs, tweaks from calibre.utils.date import isoformat, timestampfromdt from calibre.utils.icu import numeric_sort_key as sort_key +from calibre.utils.localization import _ +from polyglot.builtins import iteritems, itervalues, string_or_bytes def ensure_val(x, *allowed): @@ -126,9 +129,10 @@ def book_to_json(ctx, rd, db, book_id, data['_series_sort_'] = series if device_for_template: import posixpath + + from calibre.customize.ui import device_plugins from calibre.devices.utils import create_upload_path from calibre.utils.filenames import ascii_filename as sanitize - from calibre.customize.ui import device_plugins for device_class in device_plugins(): if device_class.__class__.__name__ == device_for_template: diff --git a/src/calibre/srv/books.py b/src/calibre/srv/books.py index 3af369b0d8..f8e939aa08 100644 --- a/src/calibre/srv/books.py +++ b/src/calibre/srv/books.py @@ -21,6 +21,7 @@ from calibre.srv.render_book import RENDER_VERSION from calibre.srv.routes import endpoint, json from calibre.srv.utils import get_db, get_library_data from calibre.utils.filenames import rmtree +from calibre.utils.localization import _ from calibre.utils.resources import get_path as P from calibre.utils.serialize import json_dumps from polyglot.builtins import as_unicode, itervalues diff --git a/src/calibre/srv/code.py b/src/calibre/srv/code.py index 4fa3a4d2ab..41c71dbbba 100644 --- a/src/calibre/srv/code.py +++ b/src/calibre/srv/code.py @@ -27,7 +27,7 @@ from calibre.srv.utils import get_library_data, get_use_roman from calibre.utils.config import prefs, tweaks from calibre.utils.icu import numeric_sort_key, sort_key from calibre.utils.localization import ( - get_lang, lang_code_for_user_manual, lang_map_for_ui, localize_website_link, + _, get_lang, lang_code_for_user_manual, lang_map_for_ui, localize_website_link, ) from calibre.utils.resources import get_path as P from calibre.utils.search_query_parser import ParseException diff --git a/src/calibre/srv/content.py b/src/calibre/srv/content.py index 91274eeb33..af28510b1f 100644 --- a/src/calibre/srv/content.py +++ b/src/calibre/srv/content.py @@ -28,6 +28,7 @@ from calibre.utils.config_base import tweaks from calibre.utils.date import timestampfromdt from calibre.utils.filenames import ascii_filename, atomic_rename from calibre.utils.img import image_from_data, scale_image +from calibre.utils.localization import _ from calibre.utils.resources import get_image_path as I, get_path as P from calibre.utils.shared_file import share_open from polyglot.binary import as_hex_unicode diff --git a/src/calibre/srv/convert.py b/src/calibre/srv/convert.py index cd2df6568e..b6407b3079 100644 --- a/src/calibre/srv/convert.py +++ b/src/calibre/srv/convert.py @@ -13,6 +13,7 @@ from calibre.srv.changes import formats_added from calibre.srv.errors import BookNotFound, HTTPNotFound from calibre.srv.routes import endpoint, json from calibre.srv.utils import get_library_data +from calibre.utils.localization import _ from calibre.utils.monotonic import monotonic from calibre.utils.shared_file import share_open from polyglot.builtins import iteritems @@ -120,9 +121,9 @@ def convert_book(path_to_ebook, opf_path, cover_path, output_fmt, recs): def queue_job(ctx, rd, library_id, db, fmt, book_id, conversion_data): - from calibre.ebooks.metadata.opf2 import metadata_to_opf - from calibre.ebooks.conversion.config import GuiRecommendations, save_specifics from calibre.customize.conversion import OptionRecommendation + from calibre.ebooks.conversion.config import GuiRecommendations, save_specifics + from calibre.ebooks.metadata.opf2 import metadata_to_opf tdir = tempfile.mkdtemp(dir=rd.tdir) with tempfile.NamedTemporaryFile(prefix='', suffix=('.' + fmt.lower()), dir=tdir, delete=False) as src_file: db.copy_format_to(book_id, fmt, src_file) @@ -202,10 +203,12 @@ def conversion_status(ctx, rd, job_id): def get_conversion_options(input_fmt, output_fmt, book_id, db): - from calibre.ebooks.conversion.plumber import create_dummy_plumber - from calibre.ebooks.conversion.config import ( - load_specifics, load_defaults, OPTIONS, options_for_input_fmt, options_for_output_fmt) from calibre.customize.conversion import OptionRecommendation + from calibre.ebooks.conversion.config import ( + OPTIONS, load_defaults, load_specifics, options_for_input_fmt, + options_for_output_fmt, + ) + from calibre.ebooks.conversion.plumber import create_dummy_plumber plumber = create_dummy_plumber(input_fmt, output_fmt) specifics = load_specifics(db, book_id) ans = {'options': {}, 'disabled': set(), 'defaults': {}, 'help': {}} @@ -265,7 +268,8 @@ def profiles(): @endpoint('/conversion/book-data/{book_id}', postprocess=json, types={'book_id': int}) def conversion_data(ctx, rd, book_id): from calibre.ebooks.conversion.config import ( - NoSupportedInputFormats, get_input_format_for_book, get_sorted_output_formats) + NoSupportedInputFormats, get_input_format_for_book, get_sorted_output_formats, + ) db = get_library_data(ctx, rd)[0] if not ctx.has_id(rd, db, book_id): raise BookNotFound(book_id, db) diff --git a/src/calibre/srv/legacy.py b/src/calibre/srv/legacy.py index 055228ebee..fa54504587 100644 --- a/src/calibre/srv/legacy.py +++ b/src/calibre/srv/legacy.py @@ -3,7 +3,6 @@ from functools import partial - from lxml.html import tostring from lxml.html.builder import E as E_ @@ -17,7 +16,8 @@ from calibre.srv.routes import endpoint from calibre.srv.utils import get_library_data, http_date from calibre.utils.cleantext import clean_xml_chars from calibre.utils.date import dt_as_local, is_date_undefined, timestampfromdt -from polyglot.builtins import iteritems, string_or_bytes, as_bytes +from calibre.utils.localization import _ +from polyglot.builtins import as_bytes, iteritems, string_or_bytes from polyglot.urllib import urlencode # /mobile {{{ diff --git a/src/calibre/srv/loop.py b/src/calibre/srv/loop.py index 1a280c912c..c284b8b7a4 100644 --- a/src/calibre/srv/loop.py +++ b/src/calibre/srv/loop.py @@ -11,7 +11,7 @@ import socket import ssl import traceback from contextlib import suppress -from functools import partial, lru_cache +from functools import lru_cache, partial from io import BytesIO from calibre import as_unicode @@ -23,8 +23,9 @@ from calibre.srv.opts import Options from calibre.srv.pool import PluginPool, ThreadPool from calibre.srv.utils import ( DESIRED_SEND_BUFFER_SIZE, HandleInterrupt, create_sock_pair, socket_errors_eintr, - socket_errors_nonblocking, socket_errors_socket_closed, start_cork, stop_cork + socket_errors_nonblocking, socket_errors_socket_closed, start_cork, stop_cork, ) +from calibre.utils.localization import _ from calibre.utils.logging import ThreadSafeLog from calibre.utils.mdns import get_external_ip from calibre.utils.monotonic import monotonic diff --git a/src/calibre/srv/manage_users_cli.py b/src/calibre/srv/manage_users_cli.py index 7544c9901d..87c7803201 100644 --- a/src/calibre/srv/manage_users_cli.py +++ b/src/calibre/srv/manage_users_cli.py @@ -7,7 +7,7 @@ from functools import partial from calibre import prints from calibre.constants import iswindows, preferred_encoding from calibre.utils.config import OptionParser -from calibre.utils.localization import ngettext +from calibre.utils.localization import _, ngettext from polyglot.builtins import iteritems diff --git a/src/calibre/srv/metadata.py b/src/calibre/srv/metadata.py index 8f3dabb16a..89e11ce94d 100644 --- a/src/calibre/srv/metadata.py +++ b/src/calibre/srv/metadata.py @@ -19,7 +19,7 @@ from calibre.utils.date import UNDEFINED_DATE, isoformat, local_tz from calibre.utils.file_type_icons import EXT_MAP from calibre.utils.formatter import EvalFormatter from calibre.utils.icu import collation_order_for_partitioning, upper as icu_upper -from calibre.utils.localization import calibre_langcode_to_name +from calibre.utils.localization import _, calibre_langcode_to_name from polyglot.builtins import iteritems, itervalues from polyglot.urllib import quote diff --git a/src/calibre/srv/opds.py b/src/calibre/srv/opds.py index 2ec3e0d242..0dd6ab8eb3 100644 --- a/src/calibre/srv/opds.py +++ b/src/calibre/srv/opds.py @@ -24,7 +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.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 diff --git a/src/calibre/srv/standalone.py b/src/calibre/srv/standalone.py index 6bed06f780..5ad690e576 100644 --- a/src/calibre/srv/standalone.py +++ b/src/calibre/srv/standalone.py @@ -21,10 +21,10 @@ from calibre.srv.opts import opts_to_parser from calibre.srv.users import connect from calibre.srv.utils import HandleInterrupt, RotatingLog from calibre.utils.config import prefs -from calibre.utils.localization import localize_user_manual_link +from calibre.utils.localization import _, localize_user_manual_link from calibre.utils.lock import singleinstance -from polyglot.builtins import error_message from calibre_extensions import speedup +from polyglot.builtins import error_message def daemonize(): # {{{ diff --git a/src/calibre/srv/tests/ajax.py b/src/calibre/srv/tests/ajax.py index 1b2da59a9d..62f6969522 100644 --- a/src/calibre/srv/tests/ajax.py +++ b/src/calibre/srv/tests/ajax.py @@ -12,6 +12,7 @@ from io import BytesIO from calibre.ebooks.metadata.meta import get_metadata from calibre.srv.tests.base import LibraryBaseTest +from calibre.utils.localization import _ from polyglot.binary import as_base64_bytes from polyglot.http_client import FORBIDDEN, NOT_FOUND, OK from polyglot.urllib import quote, urlencode diff --git a/src/calibre/srv/users.py b/src/calibre/srv/users.py index 2e211f4bb6..3b26d96921 100644 --- a/src/calibre/srv/users.py +++ b/src/calibre/srv/users.py @@ -12,6 +12,7 @@ from threading import RLock from calibre import as_unicode from calibre.constants import config_dir from calibre.utils.config import from_json, to_json +from calibre.utils.localization import _ from polyglot.builtins import iteritems diff --git a/src/calibre/srv/users_api.py b/src/calibre/srv/users_api.py index c7147a1983..2776104d84 100644 --- a/src/calibre/srv/users_api.py +++ b/src/calibre/srv/users_api.py @@ -8,6 +8,7 @@ from calibre import as_unicode from calibre.srv.errors import HTTPBadRequest, HTTPForbidden from calibre.srv.routes import endpoint from calibre.srv.users import validate_password +from calibre.utils.localization import _ @endpoint('/users/change-pw', methods={'POST'}) diff --git a/src/calibre/utils/config.py b/src/calibre/utils/config.py index 91a5482280..dc2ac2e1ba 100644 --- a/src/calibre/utils/config.py +++ b/src/calibre/utils/config.py @@ -11,13 +11,14 @@ import os from copy import deepcopy from calibre.constants import ( - CONFIG_DIR_MODE, __appname__, __author__, config_dir, get_version, iswindows + CONFIG_DIR_MODE, __appname__, __author__, config_dir, get_version, iswindows, ) from calibre.utils.config_base import ( - Config, ConfigInterface, ConfigProxy, Option, OptionSet, OptionValues, - StringConfig, commit_data, from_json, json_dumps, json_loads, make_config_dir, - plugin_dir, prefs, read_data, to_json, tweaks + Config, ConfigInterface, ConfigProxy, Option, OptionSet, OptionValues, StringConfig, + commit_data, from_json, json_dumps, json_loads, make_config_dir, plugin_dir, prefs, + read_data, to_json, tweaks, ) +from calibre.utils.localization import _ from polyglot.builtins import native_string_type, string_or_bytes # optparse uses gettext.gettext instead of _ from builtins, so we diff --git a/src/calibre/utils/config_base.py b/src/calibre/utils/config_base.py index 2caeaea00a..0c8b1759a3 100644 --- a/src/calibre/utils/config_base.py +++ b/src/calibre/utils/config_base.py @@ -17,6 +17,7 @@ from calibre.constants import ( CONFIG_DIR_MODE, config_dir, filesystem_encoding, get_umask, iswindows, preferred_encoding, ) +from calibre.utils.localization import _ from calibre.utils.resources import get_path as P from polyglot.builtins import iteritems diff --git a/src/calibre/utils/exim.py b/src/calibre/utils/exim.py index dfc8865de4..b67fc08f20 100644 --- a/src/calibre/utils/exim.py +++ b/src/calibre/utils/exim.py @@ -2,20 +2,30 @@ # License: GPLv3 Copyright: 2015, Kovid Goyal -import os, json, struct, hashlib, sys, errno, tempfile, time, shutil, uuid +import errno +import hashlib +import json +import os +import shutil +import struct +import sys +import tempfile +import time +import uuid from collections import Counter from calibre import prints -from calibre.constants import config_dir, iswindows, filesystem_encoding -from calibre.utils.config_base import prefs, StringConfig, create_global_prefs +from calibre.constants import config_dir, filesystem_encoding, iswindows from calibre.utils.config import JSONConfig +from calibre.utils.config_base import StringConfig, create_global_prefs, prefs from calibre.utils.filenames import samefile -from polyglot.builtins import iteritems, error_message +from calibre.utils.localization import _ from polyglot.binary import as_hex_unicode - +from polyglot.builtins import error_message, iteritems # Export {{{ + def send_file(from_obj, to_obj, chunksize=1<<20): m = hashlib.sha1() while True: @@ -169,8 +179,8 @@ def all_known_libraries(): def export(destdir, library_paths=None, dbmap=None, progress1=None, progress2=None, abort=None): - from calibre.db.cache import Cache from calibre.db.backend import DB + from calibre.db.cache import Cache if library_paths is None: library_paths = all_known_libraries() dbmap = dbmap or {} diff --git a/src/calibre/utils/filenames.py b/src/calibre/utils/filenames.py index 0e6fd58635..90a6fb9cd8 100644 --- a/src/calibre/utils/filenames.py +++ b/src/calibre/utils/filenames.py @@ -7,14 +7,14 @@ import errno import os import shutil import time +from contextlib import closing, suppress from math import ceil -from contextlib import suppress, closing from calibre import force_unicode, isbytestring, prints, sanitize_file_name from calibre.constants import ( - filesystem_encoding, iswindows, preferred_encoding, ismacos + filesystem_encoding, ismacos, iswindows, preferred_encoding, ) -from calibre.utils.localization import get_udc +from calibre.utils.localization import _, get_udc from polyglot.builtins import iteritems, itervalues @@ -331,6 +331,7 @@ class WindowsAtomicFolderMove: def __init__(self, path): from collections import defaultdict + from calibre_extensions import winutil self.handle_map = {} diff --git a/src/calibre/utils/html2text.py b/src/calibre/utils/html2text.py index 82abab99e8..4ce9e0b1ec 100644 --- a/src/calibre/utils/html2text.py +++ b/src/calibre/utils/html2text.py @@ -2,6 +2,9 @@ # License: GPLv3 Copyright: 2019, Kovid Goyal +from calibre.utils.localization import _ + + def html2text(html, single_line_break=True): from html2text import HTML2Text import re diff --git a/src/calibre/utils/ipc/job.py b/src/calibre/utils/ipc/job.py index 9695235ea3..b1795e12ac 100644 --- a/src/calibre/utils/ipc/job.py +++ b/src/calibre/utils/ipc/job.py @@ -6,14 +6,15 @@ __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import time, io +import io +import time from itertools import count from calibre import prints from calibre.constants import DEBUG -from polyglot.queue import Queue, Empty +from calibre.utils.localization import _ from polyglot.builtins import cmp - +from polyglot.queue import Empty, Queue job_counter = count()