diff -Nru spyder-5.4.2+ds/debian/changelog spyder-5.4.2+ds/debian/changelog --- spyder-5.4.2+ds/debian/changelog 2023-01-22 09:37:20.000000000 +0000 +++ spyder-5.4.2+ds/debian/changelog 2023-02-23 10:59:49.000000000 +0000 @@ -1,3 +1,30 @@ +spyder (5.4.2+ds-5) unstable; urgency=medium + + * Fix translation-loading patch (see discussion at + https://github.com/spyder-ide/spyder/pull/20582) + + -- Julian Gilbey Thu, 23 Feb 2023 10:59:49 +0000 + +spyder (5.4.2+ds-4) unstable; urgency=medium + + * Force pip to install boilerplate package during autopkgtest run + (closes: #1031759) + * Only load translations file once + + -- Julian Gilbey Wed, 22 Feb 2023 10:39:48 +0000 + +spyder (5.4.2+ds-3) unstable; urgency=medium + + * Improve error messages with l10n handling, matching upstream pull request + + -- Julian Gilbey Tue, 21 Feb 2023 10:28:27 +0000 + +spyder (5.4.2+ds-2) unstable; urgency=medium + + * Fix l10n handling with Python 3.11 (closes: #1031266) + + -- Julian Gilbey Sun, 19 Feb 2023 09:27:37 +0000 + spyder (5.4.2+ds-1) unstable; urgency=medium * New upstream version diff -Nru spyder-5.4.2+ds/debian/patches/fix-l10n-3.11-handling.patch spyder-5.4.2+ds/debian/patches/fix-l10n-3.11-handling.patch --- spyder-5.4.2+ds/debian/patches/fix-l10n-3.11-handling.patch 1970-01-01 00:00:00.000000000 +0000 +++ spyder-5.4.2+ds/debian/patches/fix-l10n-3.11-handling.patch 2023-02-23 10:59:49.000000000 +0000 @@ -0,0 +1,50 @@ +Description: Fix l10n handling with Python 3.11 +Forwarded: https://github.com/spyder-ide/spyder/pull/20558 +Author: Julian Gilbey +Last-Update: 2023-02-21 + +--- a/spyder/config/base.py ++++ b/spyder/config/base.py +@@ -490,8 +490,6 @@ + + def translate_dumb(x): + """Dumb function to not use translations.""" +- if not is_unicode(x): +- return to_text_string(x, "utf-8") + return x + + locale_path = get_module_data_path(dirname, relpath="locale", +@@ -511,21 +509,23 @@ + else: + os.environ["LANGUAGE"] = language # Works on Linux + ++ if language == "en": ++ return translate_dumb ++ + import gettext + try: +- _trans = gettext.translation(modname, locale_path, codeset="utf-8") +- lgettext = _trans.lgettext ++ _trans = gettext.translation(modname, locale_path) + + def translate_gettext(x): +- if not PY3 and is_unicode(x): +- x = x.encode("utf-8") +- y = lgettext(x) +- if is_text_string(y) and PY3: +- return y +- else: +- return to_text_string(y, "utf-8") ++ return _trans.gettext(x) + return translate_gettext +- except Exception: ++ except Exception as exc: ++ # logging module is not yet initialised at this point ++ print( ++ f"Could not load translations for {language} due to: " ++ f"{exc.__class__.__name__} - {exc}", ++ file=sys.stderr ++ ) + return translate_dumb + + diff -Nru spyder-5.4.2+ds/debian/patches/make-translations-singleton.patch spyder-5.4.2+ds/debian/patches/make-translations-singleton.patch --- spyder-5.4.2+ds/debian/patches/make-translations-singleton.patch 1970-01-01 00:00:00.000000000 +0000 +++ spyder-5.4.2+ds/debian/patches/make-translations-singleton.patch 2023-02-23 10:59:49.000000000 +0000 @@ -0,0 +1,1734 @@ +Description: Make translations object a singleton + Without this patch, the translations file is loaded into memory up to + about 90 times +Forwarded: https://github.com/spyder-ide/spyder/pull/20582 +Author: Julian Gilbey +Last-Update: 2023-02-22 + +--- a/spyder/api/plugins/new_api.py ++++ b/spyder/api/plugins/new_api.py +@@ -29,7 +29,7 @@ + from spyder.api.config.mixins import SpyderConfigurationObserver + from spyder.api.exceptions import SpyderAPIError + from spyder.api.plugin_registration.mixins import SpyderPluginObserver +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.api.widgets.main_widget import PluginMainWidget + from spyder.api.widgets.mixins import SpyderActionMixin + from spyder.api.widgets.mixins import SpyderWidgetMixin +@@ -44,8 +44,7 @@ + from .old_api import SpyderPluginWidget + + +-# Localization +-_ = get_translation('spyder') ++# Logging + logger = logging.getLogger(__name__) + + +--- a/spyder/api/shellconnect/main_widget.py ++++ b/spyder/api/shellconnect/main_widget.py +@@ -13,14 +13,10 @@ + from qtpy.QtWidgets import QStackedWidget, QVBoxLayout + + # Local imports +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.api.widgets.main_widget import PluginMainWidget + + +-# Localization +-_ = get_translation('spyder') +- +- + class ShellConnectMainWidget(PluginMainWidget): + """ + Main widget to use in a plugin that shows console-specific content. +--- a/spyder/api/translations.py ++++ b/spyder/api/translations.py +@@ -8,4 +8,4 @@ + This module contains the internationalization API. + """ + +-from spyder.config.base import get_translation ++from spyder.config.base import get_translation, _ +--- a/spyder/api/widgets/main_widget.py ++++ b/spyder/api/widgets/main_widget.py +@@ -26,7 +26,7 @@ + + # Local imports + from spyder.api.exceptions import SpyderAPIError +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.api.widgets.auxiliary_widgets import (MainCornerWidget, + SpyderWindowWidget) + from spyder.api.widgets.menus import (MainWidgetMenu, OptionsMenuSections, +@@ -42,8 +42,6 @@ + from spyder.widgets.dock import DockTitleBar, SpyderDockWidget + from spyder.widgets.tabs import Tabs + +-# Localization +-_ = get_translation('spyder') + + # Logging + logger = logging.getLogger(__name__) +--- a/spyder/api/widgets/toolbars.py ++++ b/spyder/api/widgets/toolbars.py +@@ -22,16 +22,13 @@ + + # Local imports + from spyder.api.exceptions import SpyderAPIError +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.utils.icon_manager import ima + from spyder.utils.qthelpers import SpyderAction + from spyder.utils.stylesheet import ( + APP_TOOLBAR_STYLESHEET, PANES_TOOLBAR_STYLESHEET) + + +-# Translations +-_ = get_translation('spyder') +- + # Generic type annotations + ToolbarItem = Union[SpyderAction, QWidget] + ToolbarItemEntry = Tuple[ToolbarItem, Optional[str], Optional[str], +--- a/spyder/app/tests/spyder-boilerplate/spyder_boilerplate/spyder/plugin.py ++++ b/spyder/app/tests/spyder-boilerplate/spyder_boilerplate/spyder/plugin.py +@@ -16,7 +16,6 @@ + from spyder.api.config.decorators import on_conf_change + from spyder.api.plugins import Plugins, SpyderDockablePlugin + from spyder.api.preferences import PluginConfigPage +-from spyder.api.translations import get_translation + from spyder.api.widgets.main_widget import PluginMainWidget + from spyder.plugins.layout.layouts import VerticalSplitLayout2 + +--- a/spyder/plugins/appearance/confpage.py ++++ b/spyder/plugins/appearance/confpage.py +@@ -12,7 +12,7 @@ + QPushButton, QStackedWidget, QVBoxLayout) + + from spyder.api.preferences import PluginConfigPage +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.config.gui import get_font, is_dark_font_color, set_font + from spyder.config.manager import CONF + from spyder.plugins.appearance.widgets import SchemeEditor +@@ -20,9 +20,6 @@ + from spyder.utils.palette import QStylePalette + from spyder.widgets.simplecodeeditor import SimpleCodeEditor + +-# Localization +-_ = get_translation('spyder') +- + + class AppearanceConfigPage(PluginConfigPage): + +--- a/spyder/plugins/appearance/plugin.py ++++ b/spyder/plugins/appearance/plugin.py +@@ -14,12 +14,9 @@ + from spyder.api.plugins import Plugins, SpyderPluginV2 + from spyder.api.plugin_registration.decorators import ( + on_plugin_available, on_plugin_teardown) +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.plugins.appearance.confpage import AppearanceConfigPage + +-# Localization +-_ = get_translation('spyder') +- + + # --- Plugin + # ---------------------------------------------------------------------------- +--- a/spyder/plugins/appearance/widgets.py ++++ b/spyder/plugins/appearance/widgets.py +@@ -10,12 +10,9 @@ + from qtpy.QtWidgets import (QDialog, QDialogButtonBox, QGridLayout, QGroupBox, + QHBoxLayout, QVBoxLayout, QWidget) + +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.utils import syntaxhighlighters + +-# Localization +-_ = get_translation('spyder') +- + + class SchemeEditor(QDialog): + """A color scheme editor dialog.""" +--- a/spyder/plugins/application/container.py ++++ b/spyder/plugins/application/container.py +@@ -24,7 +24,7 @@ + # Local imports + from spyder import __docs_url__, __forum_url__, __trouble_url__, __version__ + from spyder import dependencies +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.api.widgets.main_container import PluginMainContainer + from spyder.utils.installers import InstallerMissingDependencies + from spyder.config.utils import is_anaconda +@@ -39,9 +39,6 @@ + from spyder.widgets.helperwidgets import MessageCheckBox + from spyder.workers.updates import WorkerUpdates + +-# Localization +-_ = get_translation('spyder') +- + + class ApplicationPluginMenus: + DebugLogsMenu = "debug_logs_menu" +--- a/spyder/plugins/application/plugin.py ++++ b/spyder/plugins/application/plugin.py +@@ -20,7 +20,7 @@ + + # Local imports + from spyder.api.plugins import Plugins, SpyderPluginV2 +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.api.plugin_registration.decorators import ( + on_plugin_available, on_plugin_teardown) + from spyder.api.widgets.menus import MENU_SEPARATOR +@@ -34,9 +34,6 @@ + ApplicationMenus, FileMenuSections, HelpMenuSections, ToolsMenuSections) + from spyder.utils.qthelpers import add_actions + +-# Localization +-_ = get_translation('spyder') +- + + class Application(SpyderPluginV2): + NAME = 'application' +--- a/spyder/plugins/application/widgets/install.py ++++ b/spyder/plugins/application/widgets/install.py +@@ -19,7 +19,7 @@ + + # Local imports + from spyder import __version__ +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.config.base import is_pynsist + from spyder.utils.icon_manager import ima + from spyder.workers.updates import WorkerDownloadInstaller +@@ -27,9 +27,6 @@ + # Logger setup + logger = logging.getLogger(__name__) + +-# Localization +-_ = get_translation('spyder') +- + # Update installation process statuses + NO_STATUS = __version__ + DOWNLOADING_INSTALLER = _("Downloading update") +--- a/spyder/plugins/application/widgets/status.py ++++ b/spyder/plugins/application/widgets/status.py +@@ -17,7 +17,7 @@ + from qtpy.QtWidgets import QMenu, QLabel + + # Local imports +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.api.widgets.status import StatusBarWidget + from spyder.config.base import is_pynsist, running_in_mac_app + from spyder.plugins.application.widgets.install import ( +@@ -26,12 +26,10 @@ + from spyder.utils.icon_manager import ima + from spyder.utils.qthelpers import add_actions, create_action + ++ + # Setup logger + logger = logging.getLogger(__name__) + +-# Localization +-_ = get_translation('spyder') +- + + class ApplicationUpdateStatus(StatusBarWidget): + """Status bar widget for application update status.""" +--- a/spyder/plugins/breakpoints/plugin.py ++++ b/spyder/plugins/breakpoints/plugin.py +@@ -20,13 +20,10 @@ + from spyder.api.plugins import Plugins, SpyderDockablePlugin + from spyder.api.plugin_registration.decorators import ( + on_plugin_available, on_plugin_teardown) +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.plugins.breakpoints.widgets.main_widget import BreakpointWidget + from spyder.plugins.mainmenu.api import ApplicationMenus + +-# Localization +-_ = get_translation('spyder') +- + + # --- Constants + # ---------------------------------------------------------------------------- +--- a/spyder/plugins/breakpoints/widgets/main_widget.py ++++ b/spyder/plugins/breakpoints/widgets/main_widget.py +@@ -24,17 +24,13 @@ + from qtpy.QtWidgets import QItemDelegate, QTableView, QVBoxLayout + + # Local imports +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.api.widgets.main_widget import (PluginMainWidgetMenus, + PluginMainWidget) + from spyder.api.widgets.mixins import SpyderWidgetMixin + from spyder.utils.sourcecode import disambiguate_fname + + +-# Localization +-_ = get_translation('spyder') +- +- + # --- Constants + # ---------------------------------------------------------------------------- + COLUMN_COUNT = 4 +--- a/spyder/plugins/completion/widgets/status.py ++++ b/spyder/plugins/completion/widgets/status.py +@@ -15,15 +15,11 @@ + from qtpy.QtWidgets import QMenu + + # Local imports +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.api.widgets.status import StatusBarWidget + from spyder.utils.qthelpers import add_actions, create_action + + +-# Localization +-_ = get_translation('spyder') +- +- + class CompletionStatus(StatusBarWidget): + """Status bar widget for displaying the current conda environment.""" + ID = 'completion_status' +--- a/spyder/plugins/console/plugin.py ++++ b/spyder/plugins/console/plugin.py +@@ -19,14 +19,12 @@ + from spyder.api.plugins import Plugins, SpyderDockablePlugin + from spyder.api.plugin_registration.decorators import ( + on_plugin_available, on_plugin_teardown) +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.config.base import DEV + from spyder.plugins.console.widgets.main_widget import ( + ConsoleWidget, ConsoleWidgetActions) + from spyder.plugins.mainmenu.api import ApplicationMenus, FileMenuSections + +-# Localization +-_ = get_translation('spyder') + + # Logging + logger = logging.getLogger(__name__) +--- a/spyder/plugins/console/widgets/internalshell.py ++++ b/spyder/plugins/console/widgets/internalshell.py +@@ -26,7 +26,7 @@ + + # Local imports + from spyder import get_versions +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.plugins.console.utils.interpreter import Interpreter + from spyder.py3compat import (builtins, to_binary_string, + to_text_string) +@@ -39,8 +39,6 @@ + from spyder.config.base import get_conf_path, get_debug_level + + +-# Localization +-_ = get_translation('spyder') + builtins.oedit = oedit + + +--- a/spyder/plugins/console/widgets/main_widget.py ++++ b/spyder/plugins/console/widgets/main_widget.py +@@ -27,7 +27,7 @@ + # Local imports + from spyder.api.exceptions import SpyderAPIError + from spyder.api.plugin_registration.registry import PLUGIN_REGISTRY +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.api.widgets.main_widget import PluginMainWidget + from spyder.api.config.decorators import on_conf_change + from spyder.utils.installers import InstallerInternalError +@@ -42,8 +42,8 @@ + from spyder.widgets.findreplace import FindReplace + from spyder.widgets.reporterror import SpyderErrorDialog + +-# Localization +-_ = get_translation('spyder') ++ ++# Logging + logger = logging.getLogger(__name__) + + +--- a/spyder/plugins/editor/widgets/gotoline.py ++++ b/spyder/plugins/editor/widgets/gotoline.py +@@ -9,11 +9,7 @@ + from qtpy.QtWidgets import (QDialog, QLabel, QLineEdit, QGridLayout, + QDialogButtonBox, QVBoxLayout, QHBoxLayout) + +-from spyder.api.translations import get_translation +- +- +-# Translations +-_ = get_translation('spyder') ++from spyder.api.translations import _ + + + class GoToLineDialog(QDialog): +--- a/spyder/plugins/editor/widgets/printer.py ++++ b/spyder/plugins/editor/widgets/printer.py +@@ -11,15 +11,11 @@ + from qtpy.QtWidgets import QToolBar + from qtpy.QtPrintSupport import QPrinter, QPrintPreviewDialog + +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.utils.icon_manager import ima + from spyder.utils.stylesheet import PANES_TOOLBAR_STYLESHEET + + +-# Translations +-_ = get_translation('spyder') +- +- + # TODO: Implement header and footer support + class SpyderPrinter(QPrinter): + def __init__(self, mode=QPrinter.ScreenResolution, header_font=None): +--- a/spyder/plugins/editor/widgets/status.py ++++ b/spyder/plugins/editor/widgets/status.py +@@ -11,16 +11,12 @@ + + # Local imports + from spyder.api.widgets.status import StatusBarWidget +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.py3compat import to_text_string + from spyder.utils.workers import WorkerManager + from spyder.utils.vcs import get_git_refs + + +-# Localization +-_ = get_translation("spyder") +- +- + class ReadWriteStatus(StatusBarWidget): + """Status bar widget for current file read/write mode.""" + ID = "read_write_status" +--- a/spyder/plugins/explorer/confpage.py ++++ b/spyder/plugins/explorer/confpage.py +@@ -12,14 +12,11 @@ + + # Local imports + from spyder.api.preferences import PluginConfigPage +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.config.main import NAME_FILTERS + from spyder.plugins.explorer.widgets.fileassociations import ( + FileAssociationsWidget) + +-# Localization +-_ = get_translation("spyder") +- + + class ExplorerConfigPage(PluginConfigPage): + +--- a/spyder/plugins/explorer/plugin.py ++++ b/spyder/plugins/explorer/plugin.py +@@ -18,16 +18,13 @@ + from qtpy.QtCore import Signal + + # Local imports +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.api.plugins import SpyderDockablePlugin, Plugins + from spyder.api.plugin_registration.decorators import ( + on_plugin_available, on_plugin_teardown) + from spyder.plugins.explorer.widgets.main_widget import ExplorerWidget + from spyder.plugins.explorer.confpage import ExplorerConfigPage + +-# Localization +-_ = get_translation('spyder') +- + + class Explorer(SpyderDockablePlugin): + """File and Directories Explorer DockWidget.""" +--- a/spyder/plugins/explorer/widgets/explorer.py ++++ b/spyder/plugins/explorer/widgets/explorer.py +@@ -32,7 +32,7 @@ + + # Local imports + from spyder.api.config.decorators import on_conf_change +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.api.widgets.mixins import SpyderWidgetMixin + from spyder.config.base import get_home_dir + from spyder.config.main import NAME_FILTERS +@@ -51,10 +51,6 @@ + nbexporter = None # analysis:ignore + + +-# Localization +-_ = get_translation('spyder') +- +- + # ---- Constants + # ---------------------------------------------------------------------------- + class DirViewColumns: +--- a/spyder/plugins/explorer/widgets/main_widget.py ++++ b/spyder/plugins/explorer/widgets/main_widget.py +@@ -16,16 +16,13 @@ + from qtpy.QtWidgets import QHBoxLayout, QLabel, QVBoxLayout, QWidget + + # Local imports +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.api.widgets.main_widget import PluginMainWidget + from spyder.plugins.explorer.widgets.explorer import ( + DirViewActions, ExplorerTreeWidget, ExplorerTreeWidgetActions) + from spyder.utils.misc import getcwd_or_home + + +-_ = get_translation('spyder') +- +- + # ---- Constants + class ExplorerWidgetOptionsMenuSections: + Files = 'files_section' +--- a/spyder/plugins/explorer/widgets/utils.py ++++ b/spyder/plugins/explorer/widgets/utils.py +@@ -18,15 +18,12 @@ + from qtpy.QtWidgets import QFileIconProvider, QMessageBox + + # Local imports +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.py3compat import str_lower + from spyder.utils import encoding + from spyder.utils.icon_manager import ima + + +-_ = get_translation('spyder') +- +- + def open_file_in_external_explorer(filename): + if sys.platform == "darwin": + subprocess.call(["open", "-R", filename]) +--- a/spyder/plugins/findinfiles/plugin.py ++++ b/spyder/plugins/findinfiles/plugin.py +@@ -15,14 +15,11 @@ + from spyder.api.plugins import Plugins, SpyderDockablePlugin + from spyder.api.plugin_registration.decorators import ( + on_plugin_available, on_plugin_teardown) +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.plugins.findinfiles.widgets.main_widget import FindInFilesWidget + from spyder.plugins.mainmenu.api import ApplicationMenus + from spyder.utils.misc import getcwd_or_home + +-# Localization +-_ = get_translation('spyder') +- + + # --- Constants + # ---------------------------------------------------------------------------- +--- a/spyder/plugins/findinfiles/widgets/combobox.py ++++ b/spyder/plugins/findinfiles/widgets/combobox.py +@@ -13,14 +13,10 @@ + from qtpy.QtWidgets import QComboBox, QMessageBox, QSizePolicy + + # Local imports +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.utils.encoding import to_unicode_from_fs + + +-# Localization +-_ = get_translation('spyder') +- +- + # ---- Constants + # ---------------------------------------------------------------------------- + CWD = 0 +--- a/spyder/plugins/findinfiles/widgets/main_widget.py ++++ b/spyder/plugins/findinfiles/widgets/main_widget.py +@@ -15,7 +15,7 @@ + + # Local imports + from spyder.api.config.decorators import on_conf_change +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.api.widgets.main_widget import PluginMainWidget + from spyder.plugins.findinfiles.widgets.results_browser import ( + ON, ResultsBrowser) +@@ -27,10 +27,6 @@ + from spyder.widgets.comboboxes import PatternComboBox + + +-# Localization +-_ = get_translation('spyder') +- +- + # ---- Constants + # ----------------------------------------------------------------------------- + MAIN_TEXT_COLOR = QStylePalette.COLOR_TEXT_1 +--- a/spyder/plugins/findinfiles/widgets/results_browser.py ++++ b/spyder/plugins/findinfiles/widgets/results_browser.py +@@ -17,7 +17,7 @@ + QStyleOptionViewItem, QTreeWidgetItem) + + # Local imports +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.config.gui import get_font + from spyder.plugins.findinfiles.widgets.search_thread import ( + ELLIPSIS, MAX_RESULT_LENGTH) +@@ -25,9 +25,6 @@ + from spyder.utils.palette import QStylePalette + from spyder.widgets.onecolumntree import OneColumnTree + +-# Localization +-_ = get_translation('spyder') +- + + # ---- Constants + # ---------------------------------------------------------------------------- +--- a/spyder/plugins/findinfiles/widgets/search_thread.py ++++ b/spyder/plugins/findinfiles/widgets/search_thread.py +@@ -17,15 +17,11 @@ + from qtpy.QtCore import QMutex, QMutexLocker, QThread, Signal + + # Local imports +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.utils.encoding import is_text_file + from spyder.utils.palette import SpyderPalette + + +-# Localization +-_ = get_translation('spyder') +- +- + # ---- Constants + # ---------------------------------------------------------------------------- + ELLIPSIS = '...' +--- a/spyder/plugins/help/plugin.py ++++ b/spyder/plugins/help/plugin.py +@@ -19,15 +19,12 @@ + from spyder.api.plugins import Plugins, SpyderDockablePlugin + from spyder.api.plugin_registration.decorators import ( + on_plugin_available, on_plugin_teardown) +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.config.base import get_conf_path + from spyder.config.fonts import DEFAULT_SMALL_DELTA + from spyder.plugins.help.confpage import HelpConfigPage + from spyder.plugins.help.widgets import HelpWidget + +-# Localization +-_ = get_translation('spyder') +- + + class HelpActions: + # Documentation related +--- a/spyder/plugins/help/widgets.py ++++ b/spyder/plugins/help/widgets.py +@@ -24,7 +24,7 @@ + + # Local imports + from spyder.api.config.decorators import on_conf_change +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.api.widgets.main_widget import PluginMainWidget + from spyder.api.widgets.mixins import SpyderWidgetMixin + from spyder.config.base import get_module_source_path +@@ -42,10 +42,6 @@ + from spyder.widgets.simplecodeeditor import SimpleCodeEditor + + +-# Localization +-_ = get_translation('spyder') +- +- + # --- Constants + # ---------------------------------------------------------------------------- + MAIN_BG_COLOR = QStylePalette.COLOR_BACKGROUND_1 +--- a/spyder/plugins/history/plugin.py ++++ b/spyder/plugins/history/plugin.py +@@ -15,14 +15,11 @@ + from spyder.api.plugins import Plugins, SpyderDockablePlugin + from spyder.api.plugin_registration.decorators import ( + on_plugin_available, on_plugin_teardown) +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.config.base import get_conf_path + from spyder.plugins.history.confpage import HistoryConfigPage + from spyder.plugins.history.widgets import HistoryWidget + +-# Localization +-_ = get_translation('spyder') +- + + class HistoryLog(SpyderDockablePlugin): + """ +--- a/spyder/plugins/history/widgets.py ++++ b/spyder/plugins/history/widgets.py +@@ -17,7 +17,7 @@ + + # Local imports + from spyder.api.config.decorators import on_conf_change +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.api.widgets.main_widget import PluginMainWidget + from spyder.py3compat import is_text_string, to_text_string + from spyder.utils import encoding +@@ -27,9 +27,6 @@ + from spyder.widgets.tabs import Tabs + from spyder.utils.stylesheet import PANES_TABBAR_STYLESHEET + +-# Localization +-_ = get_translation('spyder') +- + + # --- Constants + # ---------------------------------------------------------------------------- +--- a/spyder/plugins/ipythonconsole/confpage.py ++++ b/spyder/plugins/ipythonconsole/confpage.py +@@ -15,14 +15,10 @@ + QTabWidget, QVBoxLayout) + + # Local imports +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.api.preferences import PluginConfigPage + + +-# For translations +-_ = get_translation('spyder') +- +- + class IPythonConsoleConfigPage(PluginConfigPage): + + def setup_page(self): +--- a/spyder/plugins/ipythonconsole/plugin.py ++++ b/spyder/plugins/ipythonconsole/plugin.py +@@ -19,7 +19,7 @@ + from spyder.api.plugins import Plugins, SpyderDockablePlugin + from spyder.api.plugin_registration.decorators import ( + on_plugin_available, on_plugin_teardown) +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.plugins.ipythonconsole.confpage import IPythonConsoleConfigPage + from spyder.plugins.ipythonconsole.widgets.main_widget import ( + IPythonConsoleWidget, IPythonConsoleWidgetOptionsMenus) +@@ -27,9 +27,6 @@ + ApplicationMenus, ConsolesMenuSections, HelpMenuSections) + from spyder.utils.programs import get_temp_dir + +-# Localization +-_ = get_translation('spyder') +- + + class IPythonConsole(SpyderDockablePlugin): + """ +--- a/spyder/plugins/ipythonconsole/widgets/client.py ++++ b/spyder/plugins/ipythonconsole/widgets/client.py +@@ -26,7 +26,7 @@ + from qtpy.QtWidgets import (QMessageBox, QVBoxLayout, QWidget) + + # Local imports +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.api.widgets.mixins import SpyderWidgetMixin + from spyder.config.base import ( + get_home_dir, get_module_source_path, running_under_pytest) +@@ -48,8 +48,7 @@ + from spyder.widgets.mixins import SaveHistoryMixin + + +-# Localization and logging +-_ = get_translation('spyder') ++# Logging + logger = logging.getLogger(__name__) + + # ----------------------------------------------------------------------------- +--- a/spyder/plugins/ipythonconsole/widgets/main_widget.py ++++ b/spyder/plugins/ipythonconsole/widgets/main_widget.py +@@ -31,7 +31,7 @@ + + # Local imports + from spyder.api.config.decorators import on_conf_change +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.api.widgets.main_widget import PluginMainWidget + from spyder.api.widgets.menus import MENU_SEPARATOR + from spyder.config.base import ( +@@ -53,8 +53,7 @@ + from spyder.plugins.ipythonconsole.utils.stdfile import StdFile + + +-# Localization and logging +-_ = get_translation('spyder') ++# Logging + logger = logging.getLogger(__name__) + + +--- a/spyder/plugins/layout/api.py ++++ b/spyder/plugins/layout/api.py +@@ -18,11 +18,7 @@ + # Local imports + from spyder.api.exceptions import SpyderAPIError + from spyder.api.plugin_registration.registry import PLUGIN_REGISTRY +-from spyder.api.translations import get_translation +- +- +-# Localization +-_ = get_translation("spyder") ++from spyder.api.translations import _ + + + class BaseGridLayoutType: +--- a/spyder/plugins/layout/container.py ++++ b/spyder/plugins/layout/container.py +@@ -18,16 +18,13 @@ + + # Local imports + from spyder.api.exceptions import SpyderAPIError +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.api.widgets.main_container import PluginMainContainer + from spyder.plugins.layout.api import BaseGridLayoutType + from spyder.plugins.layout.layouts import DefaultLayouts + from spyder.plugins.layout.widgets.dialog import ( + LayoutSaveDialog, LayoutSettingsDialog) + +-# Localization +-_ = get_translation("spyder") +- + + class LayoutContainerActions: + DefaultLayout = 'default_layout_action' +--- a/spyder/plugins/layout/layouts.py ++++ b/spyder/plugins/layout/layouts.py +@@ -10,14 +10,10 @@ + + # Local imports + from spyder.api.plugins import Plugins +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.plugins.layout.api import BaseGridLayoutType + + +-# Localization +-_ = get_translation("spyder") +- +- + class DefaultLayouts: + SpyderLayout = "Spyder Default Layout" + HorizontalSplitLayout = "Horizontal split" +--- a/spyder/plugins/layout/plugin.py ++++ b/spyder/plugins/layout/plugin.py +@@ -23,7 +23,7 @@ + from spyder.api.plugin_registration.decorators import ( + on_plugin_available, on_plugin_teardown) + from spyder.api.plugin_registration.registry import PLUGIN_REGISTRY +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.api.utils import get_class_values + from spyder.plugins.mainmenu.api import ApplicationMenus, ViewMenuSections + from spyder.plugins.layout.container import ( +@@ -38,9 +38,6 @@ + from spyder.py3compat import qbytearray_to_str # FIXME: + + +-# Localization +-_ = get_translation("spyder") +- + # For logging + logger = logging.getLogger(__name__) + +--- a/spyder/plugins/maininterpreter/confpage.py ++++ b/spyder/plugins/maininterpreter/confpage.py +@@ -16,7 +16,7 @@ + QLineEdit, QMessageBox, QPushButton, QVBoxLayout) + + # Local imports +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.api.preferences import PluginConfigPage + from spyder.py3compat import PY2, to_text_string + from spyder.utils import programs +@@ -24,9 +24,6 @@ + from spyder.utils.misc import get_python_executable + from spyder.utils.pyenv import get_list_pyenv_envs_cache + +-# Localization +-_ = get_translation('spyder') +- + + class MainInterpreterConfigPage(PluginConfigPage): + +--- a/spyder/plugins/maininterpreter/plugin.py ++++ b/spyder/plugins/maininterpreter/plugin.py +@@ -19,14 +19,11 @@ + from spyder.api.plugins import Plugins, SpyderPluginV2 + from spyder.api.plugin_registration.decorators import ( + on_plugin_available, on_plugin_teardown) +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.plugins.maininterpreter.confpage import MainInterpreterConfigPage + from spyder.plugins.maininterpreter.container import MainInterpreterContainer + from spyder.utils.misc import get_python_executable + +-# Localization +-_ = get_translation('spyder') +- + + class MainInterpreter(SpyderPluginV2): + """ +--- a/spyder/plugins/maininterpreter/widgets/status.py ++++ b/spyder/plugins/maininterpreter/widgets/status.py +@@ -16,7 +16,7 @@ + from qtpy.QtCore import QTimer, Signal + + # Local imports +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.api.widgets.status import BaseTimerStatus + from spyder.config.base import is_pynsist, running_in_mac_app + from spyder.utils.conda import get_list_conda_envs +@@ -25,10 +25,6 @@ + from spyder.utils.workers import WorkerManager + + +-# Localization +-_ = get_translation('spyder') +- +- + class InterpreterStatus(BaseTimerStatus): + """Status bar widget for displaying the current conda environment.""" + ID = 'interpreter_status' +--- a/spyder/plugins/mainmenu/plugin.py ++++ b/spyder/plugins/mainmenu/plugin.py +@@ -20,13 +20,11 @@ + from spyder.api.exceptions import SpyderAPIError + from spyder.api.plugin_registration.registry import PLUGIN_REGISTRY + from spyder.api.plugins import SpyderPluginV2, SpyderDockablePlugin, Plugins +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.api.widgets.menus import MENU_SEPARATOR, SpyderMenu + from spyder.plugins.mainmenu.api import ApplicationMenu, ApplicationMenus + from spyder.utils.qthelpers import set_menu_icons, SpyderAction + +-# Localization +-_ = get_translation('spyder') + + # Extended typing definitions + ItemType = Union[SpyderAction, SpyderMenu] +--- a/spyder/plugins/onlinehelp/plugin.py ++++ b/spyder/plugins/onlinehelp/plugin.py +@@ -14,13 +14,10 @@ + + # Local imports + from spyder.api.plugins import Plugins, SpyderDockablePlugin +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.config.base import get_conf_path + from spyder.plugins.onlinehelp.widgets import PydocBrowser + +-# Localization +-_ = get_translation('spyder') +- + + # --- Plugin + # ---------------------------------------------------------------------------- +--- a/spyder/plugins/onlinehelp/widgets.py ++++ b/spyder/plugins/onlinehelp/widgets.py +@@ -20,7 +20,7 @@ + from qtpy.QtWidgets import QApplication, QLabel, QVBoxLayout + + # Local imports +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.api.widgets.main_widget import PluginMainWidget + from spyder.plugins.onlinehelp.pydoc_patch import _start_server, _url_handler + from spyder.widgets.browser import FrameWebView, WebViewActions +@@ -28,10 +28,6 @@ + from spyder.widgets.findreplace import FindReplace + + +-# Localization +-_ = get_translation('spyder') +- +- + # --- Constants + # ---------------------------------------------------------------------------- + PORT = 30128 +--- a/spyder/plugins/outlineexplorer/main_widget.py ++++ b/spyder/plugins/outlineexplorer/main_widget.py +@@ -10,11 +10,9 @@ + from qtpy.QtWidgets import QHBoxLayout + + from spyder.api.widgets.main_widget import PluginMainWidget +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.plugins.outlineexplorer.widgets import OutlineExplorerTreeWidget + +-_ = get_translation('spyder') +- + + # ---- Enums + # ----------------------------------------------------------------------------- +--- a/spyder/plugins/outlineexplorer/plugin.py ++++ b/spyder/plugins/outlineexplorer/plugin.py +@@ -12,13 +12,10 @@ + # Local imports + from spyder.api.plugin_registration.decorators import ( + on_plugin_available, on_plugin_teardown) +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.api.plugins import SpyderDockablePlugin, Plugins + from spyder.plugins.outlineexplorer.main_widget import OutlineExplorerWidget + +-# Localization +-_ = get_translation('spyder') +- + + class OutlineExplorer(SpyderDockablePlugin): + NAME = 'outline_explorer' +--- a/spyder/plugins/plots/plugin.py ++++ b/spyder/plugins/plots/plugin.py +@@ -11,12 +11,9 @@ + # Local imports + from spyder.api.plugins import Plugins, SpyderDockablePlugin + from spyder.api.shellconnect.mixins import ShellConnectMixin +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.plugins.plots.widgets.main_widget import PlotsWidget + +-# Localization +-_ = get_translation('spyder') +- + + class Plots(SpyderDockablePlugin, ShellConnectMixin): + """ +@@ -75,4 +72,4 @@ + # We only give raise to the plugin once per session, to let users + # know that plots are displayed in this plugin. + # Fixes spyder-ide/spyder#15705 +- self.get_widget().sig_figure_loaded.disconnect(self._on_first_plot) +\ No newline at end of file ++ self.get_widget().sig_figure_loaded.disconnect(self._on_first_plot) +--- a/spyder/plugins/plots/widgets/figurebrowser.py ++++ b/spyder/plugins/plots/widgets/figurebrowser.py +@@ -26,7 +26,7 @@ + QVBoxLayout, QWidget) + + # Local library imports +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.api.widgets.mixins import SpyderWidgetMixin + from spyder.utils.misc import getcwd_or_home + from spyder.utils.palette import QStylePalette +@@ -36,10 +36,6 @@ + # - [ ] Generalize style updates, handle dark_interface with widget option + + +-# Localization +-_ = get_translation('spyder') +- +- + def save_figure_tofile(fig, fmt, fname): + """Save fig to fname in the format specified by fmt.""" + root, ext = osp.splitext(fname) +--- a/spyder/plugins/plots/widgets/main_widget.py ++++ b/spyder/plugins/plots/widgets/main_widget.py +@@ -14,16 +14,13 @@ + + # Local imports + from spyder.api.config.decorators import on_conf_change +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.api.widgets.main_widget import PluginMainWidgetMenus + from spyder.api.shellconnect.main_widget import ShellConnectMainWidget + from spyder.plugins.plots.widgets.figurebrowser import FigureBrowser + from spyder.utils.misc import getcwd_or_home + from spyder.utils.palette import QStylePalette + +-# Localization +-_ = get_translation('spyder') +- + + MAIN_BG_COLOR = QStylePalette.COLOR_BACKGROUND_1 + +--- a/spyder/plugins/preferences/widgets/container.py ++++ b/spyder/plugins/preferences/widgets/container.py +@@ -9,15 +9,11 @@ + from qtpy.QtWidgets import QAction + + # Local imports +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.api.widgets.main_container import PluginMainContainer + from spyder.plugins.preferences.widgets.configdialog import ConfigDialog + + +-# Localization +-_ = get_translation('spyder') +- +- + class PreferencesActions: + Show = 'show_action' + Reset = 'reset_action' +--- a/spyder/plugins/profiler/plugin.py ++++ b/spyder/plugins/profiler/plugin.py +@@ -15,16 +15,13 @@ + from spyder.api.plugins import Plugins, SpyderDockablePlugin + from spyder.api.plugin_registration.decorators import ( + on_plugin_available, on_plugin_teardown) +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.plugins.mainmenu.api import ApplicationMenus + from spyder.plugins.profiler.confpage import ProfilerConfigPage + from spyder.plugins.profiler.widgets.main_widget import (ProfilerWidget, + is_profiler_installed) + from spyder.plugins.run.widgets import get_run_configuration + +-# Localization +-_ = get_translation('spyder') +- + + # --- Constants + # ---------------------------------------------------------------------------- +--- a/spyder/plugins/profiler/widgets/main_widget.py ++++ b/spyder/plugins/profiler/widgets/main_widget.py +@@ -32,7 +32,7 @@ + + # Local imports + from spyder.api.config.decorators import on_conf_change +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.api.widgets.main_widget import PluginMainWidget + from spyder.api.widgets.mixins import SpyderWidgetMixin + from spyder.config.base import get_conf_path, running_in_mac_app +@@ -44,8 +44,6 @@ + from spyder.utils.qthelpers import get_item_user_text, set_item_user_text + from spyder.widgets.comboboxes import PythonModulesComboBox + +-# Localization +-_ = get_translation('spyder') + + # Logging + logger = logging.getLogger(__name__) +--- a/spyder/plugins/projects/api.py ++++ b/spyder/plugins/projects/api.py +@@ -15,7 +15,7 @@ + import shutil + + # Local imports +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.config.base import get_project_config_folder + from spyder.plugins.projects.utils.config import (ProjectMultiConfig, + PROJECT_NAME_MAP, +@@ -23,9 +23,6 @@ + PROJECT_CONF_VERSION, + WORKSPACE) + +-# Localization +-_ = get_translation("spyder") +- + + class BaseProjectType: + """ +--- a/spyder/plugins/projects/plugin.py ++++ b/spyder/plugins/projects/plugin.py +@@ -28,7 +28,7 @@ + from spyder.api.exceptions import SpyderAPIError + from spyder.api.plugin_registration.decorators import ( + on_plugin_available, on_plugin_teardown) +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.api.plugins import Plugins, SpyderDockablePlugin + from spyder.config.base import (get_home_dir, get_project_config_folder, + running_in_mac_app, running_under_pytest) +@@ -47,8 +47,8 @@ + from spyder.plugins.completion.decorators import ( + request, handles, class_register) + +-# Localization and logging +-_ = get_translation("spyder") ++ ++# Logging + logger = logging.getLogger(__name__) + + +--- a/spyder/plugins/projects/widgets/main_widget.py ++++ b/spyder/plugins/projects/widgets/main_widget.py +@@ -19,15 +19,12 @@ + + # Local imports + from spyder.api.widgets.main_widget import PluginMainWidget +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.plugins.explorer.api import DirViewActions + from spyder.plugins.projects.widgets.projectexplorer import ( + ProjectExplorerTreeWidget) + + +-_ = get_translation('spyder') +- +- + class ProjectExplorerOptionsMenuSections: + Main = 'main' + +--- a/spyder/plugins/projects/widgets/projectexplorer.py ++++ b/spyder/plugins/projects/widgets/projectexplorer.py +@@ -20,13 +20,11 @@ + from qtpy.QtWidgets import QAbstractItemView, QHeaderView, QMessageBox + + # Local imports +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.py3compat import to_text_string + from spyder.utils import misc + from spyder.plugins.explorer.widgets.explorer import DirView + +-_ = get_translation('spyder') +- + + class ProxyModel(QSortFilterProxyModel): + """Proxy model to filter tree view.""" +--- a/spyder/plugins/pylint/confpage.py ++++ b/spyder/plugins/pylint/confpage.py +@@ -12,14 +12,11 @@ + + # Local imports + from spyder.api.preferences import PluginConfigPage +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.plugins.pylint.main_widget import (MAX_HISTORY_ENTRIES, + MIN_HISTORY_ENTRIES, + PylintWidget) + +-# Localization +-_ = get_translation("spyder") +- + + class PylintConfigPage(PluginConfigPage): + +--- a/spyder/plugins/pylint/main_widget.py ++++ b/spyder/plugins/pylint/main_widget.py +@@ -29,7 +29,7 @@ + + # Local imports + from spyder.api.config.decorators import on_conf_change +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.api.widgets.main_widget import PluginMainWidget + from spyder.config.base import get_conf_path, is_pynsist, running_in_mac_app + from spyder.config.utils import is_anaconda +@@ -43,9 +43,6 @@ + is_module_or_package) + from spyder.widgets.onecolumntree import OneColumnTree, OneColumnTreeActions + +-# Localization +-_ = get_translation("spyder") +- + + # --- Constants + # ---------------------------------------------------------------------------- +--- a/spyder/plugins/pylint/plugin.py ++++ b/spyder/plugins/pylint/plugin.py +@@ -16,17 +16,13 @@ + from spyder.api.plugins import Plugins, SpyderDockablePlugin + from spyder.api.plugin_registration.decorators import ( + on_plugin_available, on_plugin_teardown) +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.utils.programs import is_module_installed + from spyder.plugins.mainmenu.api import ApplicationMenus + from spyder.plugins.pylint.confpage import PylintConfigPage + from spyder.plugins.pylint.main_widget import PylintWidget + + +-# Localization +-_ = get_translation("spyder") +- +- + class PylintActions: + AnalyzeCurrentFile = 'run analysis' + +--- a/spyder/plugins/pythonpath/container.py ++++ b/spyder/plugins/pythonpath/container.py +@@ -13,7 +13,7 @@ + + from qtpy.QtCore import Signal + +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.api.widgets.main_container import PluginMainContainer + from spyder.config.base import get_conf_path + from spyder.plugins.pythonpath.utils import get_system_pythonpath +@@ -21,8 +21,7 @@ + from spyder.utils import encoding + + +-# Localization and logging +-_ = get_translation('spyder') ++# Logging + logger = logging.getLogger(__name__) + + +--- a/spyder/plugins/pythonpath/plugin.py ++++ b/spyder/plugins/pythonpath/plugin.py +@@ -14,16 +14,13 @@ + from spyder.api.plugins import Plugins, SpyderPluginV2 + from spyder.api.plugin_registration.decorators import ( + on_plugin_available, on_plugin_teardown) +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.plugins.application.api import ApplicationActions + from spyder.plugins.mainmenu.api import ApplicationMenus, ToolsMenuSections + from spyder.plugins.toolbar.api import ApplicationToolbars, MainToolbarSections + from spyder.plugins.pythonpath.container import ( + PythonpathActions, PythonpathContainer) + +-# Localization +-_ = get_translation('spyder') +- + + class PythonpathManager(SpyderPluginV2): + """ +--- a/spyder/plugins/run/confpage.py ++++ b/spyder/plugins/run/confpage.py +@@ -12,7 +12,7 @@ + + # Local imports + from spyder.api.preferences import PluginConfigPage +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.plugins.run.widgets import (ALWAYS_OPEN_FIRST_RUN, + ALWAYS_OPEN_FIRST_RUN_OPTION, + CLEAR_ALL_VARIABLES, +@@ -30,9 +30,6 @@ + WDIR_USE_SCRIPT_DIR_OPTION) + from spyder.utils.misc import getcwd_or_home + +-# Localization +-_ = get_translation("spyder") +- + + class RunConfigPage(PluginConfigPage): + """Default Run Settings configuration page.""" +--- a/spyder/plugins/run/plugin.py ++++ b/spyder/plugins/run/plugin.py +@@ -14,12 +14,9 @@ + from spyder.api.plugins import Plugins, SpyderPluginV2 + from spyder.api.plugin_registration.decorators import ( + on_plugin_available, on_plugin_teardown) +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.plugins.run.confpage import RunConfigPage + +-# Localization +-_ = get_translation('spyder') +- + + # --- Plugin + # ---------------------------------------------------------------------------- +--- a/spyder/plugins/run/widgets.py ++++ b/spyder/plugins/run/widgets.py +@@ -19,14 +19,12 @@ + QStackedWidget, QVBoxLayout, QWidget) + + # Local imports +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.config.manager import CONF + from spyder.utils.icon_manager import ima + from spyder.utils.misc import getcwd_or_home + from spyder.utils.qthelpers import create_toolbutton + +-# Localization +-_ = get_translation("spyder") + + RUN_DEFAULT_CONFIG = _("Run file with default configuration") + RUN_CUSTOM_CONFIG = _("Run file with custom configuration") +--- a/spyder/plugins/shortcuts/confpage.py ++++ b/spyder/plugins/shortcuts/confpage.py +@@ -16,14 +16,11 @@ + + # Local imports + from spyder.api.preferences import PluginConfigPage +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.plugins.shortcuts.widgets.table import (ShortcutFinder, + ShortcutsTable) + from spyder.utils.icon_manager import ima + +-# Localization +-_ = get_translation('spyder') +- + + class ShortcutsConfigPage(PluginConfigPage): + APPLY_CONF_PAGE_SETTINGS = True +--- a/spyder/plugins/shortcuts/plugin.py ++++ b/spyder/plugins/shortcuts/plugin.py +@@ -23,15 +23,12 @@ + from spyder.api.plugins import Plugins, SpyderPluginV2 + from spyder.api.plugin_registration.decorators import ( + on_plugin_available, on_plugin_teardown) +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.plugins.mainmenu.api import ApplicationMenus, HelpMenuSections + from spyder.plugins.shortcuts.confpage import ShortcutsConfigPage + from spyder.plugins.shortcuts.widgets.summary import ShortcutsSummaryDialog + from spyder.utils.qthelpers import add_shortcut_to_tooltip, SpyderAction + +-# Localization +-_ = get_translation('spyder') +- + + class ShortcutActions: + ShortcutSummaryAction = "show_shortcut_summary_action" +--- a/spyder/plugins/shortcuts/widgets/table.py ++++ b/spyder/plugins/shortcuts/widgets/table.py +@@ -20,7 +20,7 @@ + QSpacerItem, QTableView, QVBoxLayout) + + # Local imports +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.config.manager import CONF + from spyder.utils.icon_manager import ima + from spyder.utils.qthelpers import create_toolbutton +@@ -30,9 +30,6 @@ + FinderLineEdit, HelperToolButton, + HTMLDelegate) + +-# Localization +-_ = get_translation('spyder') +- + + # Valid shortcut keys + SINGLE_KEYS = ["F{}".format(_i) for _i in range(1, 36)] + ["Del", "Esc"] +--- a/spyder/plugins/statusbar/confpage.py ++++ b/spyder/plugins/statusbar/confpage.py +@@ -10,13 +10,10 @@ + + from qtpy.QtWidgets import QGridLayout, QGroupBox, QVBoxLayout + +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.api.preferences import PluginConfigPage + + +-_ = get_translation('spyder') +- +- + class StatusBarConfigPage(PluginConfigPage): + + def setup_page(self): +--- a/spyder/plugins/statusbar/plugin.py ++++ b/spyder/plugins/statusbar/plugin.py +@@ -16,17 +16,13 @@ + from spyder.api.plugins import Plugins, SpyderPluginV2 + from spyder.api.plugin_registration.decorators import ( + on_plugin_available, on_plugin_teardown) +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.api.widgets.status import StatusBarWidget + from spyder.config.base import running_under_pytest + from spyder.plugins.statusbar.confpage import StatusBarConfigPage + from spyder.plugins.statusbar.container import StatusBarContainer + + +-# Localization +-_ = get_translation('spyder') +- +- + class StatusBarWidgetPosition: + Left = 0 + Right = -1 +--- a/spyder/plugins/statusbar/widgets/status.py ++++ b/spyder/plugins/statusbar/widgets/status.py +@@ -11,15 +11,11 @@ + import psutil + + # Local imports +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.api.widgets.status import BaseTimerStatus + from spyder.utils.system import memory_usage + + +-# Localization +-_ = get_translation('spyder') +- +- + class MemoryStatus(BaseTimerStatus): + """Status bar widget for system memory usage.""" + ID = 'memory_status' +--- a/spyder/plugins/toolbar/container.py ++++ b/spyder/plugins/toolbar/container.py +@@ -20,7 +20,7 @@ + + # Local imports + from spyder.api.exceptions import SpyderAPIError +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.api.widgets.main_container import PluginMainContainer + from spyder.api.utils import get_class_values + from spyder.api.widgets.toolbars import ApplicationToolbar +@@ -28,9 +28,6 @@ + from spyder.utils.registries import TOOLBAR_REGISTRY + + +-# Localization +-_ = get_translation('spyder') +- + # Type annotations + ToolbarItem = Union[SpyderAction, QWidget] + ItemInfo = Tuple[ToolbarItem, Optional[str], Optional[str], Optional[str]] +--- a/spyder/plugins/toolbar/plugin.py ++++ b/spyder/plugins/toolbar/plugin.py +@@ -16,7 +16,7 @@ + from spyder.api.plugins import SpyderPluginV2, Plugins + from spyder.api.plugin_registration.decorators import ( + on_plugin_available, on_plugin_teardown) +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.plugins.mainmenu.api import ApplicationMenus, ViewMenuSections + from spyder.plugins.toolbar.api import ApplicationToolbars + from spyder.plugins.toolbar.container import ( +@@ -25,9 +25,6 @@ + # Third-party imports + from qtpy.QtWidgets import QWidget + +-# Localization +-_ = get_translation('spyder') +- + + class Toolbar(SpyderPluginV2): + """ +--- a/spyder/plugins/tours/container.py ++++ b/spyder/plugins/tours/container.py +@@ -14,13 +14,11 @@ + + # Local imports + from spyder.api.exceptions import SpyderAPIError +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.api.widgets.main_container import PluginMainContainer + from spyder.plugins.tours.tours import TourIdentifiers + from spyder.plugins.tours.widgets import AnimatedTour, OpenTourDialog + +-# Localization +-_ = get_translation('spyder') + + # Set the index for the default tour + DEFAULT_TOUR = TourIdentifiers.IntroductionTour +--- a/spyder/plugins/tours/plugin.py ++++ b/spyder/plugins/tours/plugin.py +@@ -14,16 +14,13 @@ + from spyder.api.plugins import Plugins, SpyderPluginV2 + from spyder.api.plugin_registration.decorators import ( + on_plugin_available, on_plugin_teardown) +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.config.base import get_safe_mode, running_under_pytest + from spyder.plugins.application.api import ApplicationActions + from spyder.plugins.tours.container import TourActions, ToursContainer + from spyder.plugins.tours.tours import INTRO_TOUR, TourIdentifiers + from spyder.plugins.mainmenu.api import ApplicationMenus, HelpMenuSections + +-# Localization +-_ = get_translation('spyder') +- + + # --- Plugin + # ---------------------------------------------------------------------------- +--- a/spyder/plugins/tours/tours.py ++++ b/spyder/plugins/tours/tours.py +@@ -10,12 +10,10 @@ + import sys + + # Local imports +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.plugins.tours.api import SpyderWidgets as sw + from spyder import __docs_url__ + +-# Localization +-_ = get_translation('spyder') + + # Constants + QTCONSOLE_LINK = "https://qtconsole.readthedocs.io/en/stable/index.html" +--- a/spyder/plugins/tours/widgets.py ++++ b/spyder/plugins/tours/widgets.py +@@ -29,7 +29,7 @@ + # Local imports + from spyder import __docs_url__ + from spyder.api.panel import Panel +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.config.base import _ + from spyder.plugins.layout.layouts import DefaultLayouts + from spyder.py3compat import to_binary_string +@@ -39,10 +39,8 @@ + from spyder.utils.qthelpers import add_actions, create_action + from spyder.utils.stylesheet import DialogStyle + +-MAIN_TOP_COLOR = MAIN_BG_COLOR = QColor(QStylePalette.COLOR_BACKGROUND_1) + +-# Localization +-_ = get_translation('spyder') ++MAIN_TOP_COLOR = MAIN_BG_COLOR = QColor(QStylePalette.COLOR_BACKGROUND_1) + + MAC = sys.platform == 'darwin' + +--- a/spyder/plugins/variableexplorer/plugin.py ++++ b/spyder/plugins/variableexplorer/plugin.py +@@ -13,17 +13,13 @@ + from spyder.api.plugin_registration.decorators import ( + on_plugin_available, on_plugin_teardown) + from spyder.api.shellconnect.mixins import ShellConnectMixin +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.plugins.variableexplorer.confpage import ( + VariableExplorerConfigPage) + from spyder.plugins.variableexplorer.widgets.main_widget import ( + VariableExplorerWidget) + + +-# Localization +-_ = get_translation('spyder') +- +- + class VariableExplorer(SpyderDockablePlugin, ShellConnectMixin): + """ + Variable explorer plugin. +--- a/spyder/plugins/variableexplorer/widgets/main_widget.py ++++ b/spyder/plugins/variableexplorer/widgets/main_widget.py +@@ -14,15 +14,12 @@ + + # Local imports + from spyder.api.config.decorators import on_conf_change +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.api.shellconnect.main_widget import ShellConnectMainWidget + from spyder.plugins.variableexplorer.widgets.namespacebrowser import ( + NamespaceBrowser, NamespacesBrowserFinder, VALID_VARIABLE_CHARS) + from spyder.utils.programs import is_module_installed + +-# Localization +-_ = get_translation('spyder') +- + + # ============================================================================= + # ---- Constants +--- a/spyder/plugins/variableexplorer/widgets/namespacebrowser.py ++++ b/spyder/plugins/variableexplorer/widgets/namespacebrowser.py +@@ -26,7 +26,7 @@ + from spyder_kernels.utils.nsview import REMOTE_SETTINGS + + # Local imports +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.api.widgets.mixins import SpyderWidgetMixin + from spyder.widgets.collectionseditor import RemoteCollectionsEditorTableView + from spyder.plugins.variableexplorer.widgets.importwizard import ImportWizard +@@ -35,9 +35,6 @@ + from spyder.widgets.helperwidgets import FinderLineEdit + + +-# Localization +-_ = get_translation('spyder') +- + # Constants + VALID_VARIABLE_CHARS = r"[^\w+*=¡!¿?'\"#$%&()/<>\-\[\]{}^`´;,|¬]*\w" + +--- a/spyder/plugins/workingdirectory/container.py ++++ b/spyder/plugins/workingdirectory/container.py +@@ -20,7 +20,7 @@ + + # Local imports + from spyder.api.config.decorators import on_conf_change +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.api.widgets.main_container import PluginMainContainer + from spyder.api.widgets.toolbars import ApplicationToolbar + from spyder.config.base import get_home_dir +@@ -29,8 +29,7 @@ + from spyder.widgets.comboboxes import PathComboBox + + +-# Localization and logging +-_ = get_translation('spyder') ++# Logging + logger = logging.getLogger(__name__) + + +--- a/spyder/plugins/workingdirectory/plugin.py ++++ b/spyder/plugins/workingdirectory/plugin.py +@@ -18,7 +18,7 @@ + from spyder.api.plugins import SpyderPluginV2, Plugins + from spyder.api.plugin_registration.decorators import ( + on_plugin_available, on_plugin_teardown) +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.config.base import get_conf_path + from spyder.plugins.workingdirectory.confpage import WorkingDirectoryConfigPage + from spyder.plugins.workingdirectory.container import ( +@@ -26,9 +26,6 @@ + from spyder.plugins.toolbar.api import ApplicationToolbars + from spyder.utils import encoding + +-# Localization +-_ = get_translation('spyder') +- + + class WorkingDirectory(SpyderPluginV2): + """ +--- a/spyder/widgets/browser.py ++++ b/spyder/widgets/browser.py +@@ -21,7 +21,7 @@ + from qtpy.QtWidgets import QFrame, QHBoxLayout, QLabel, QProgressBar, QWidget + + # Local imports +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.api.widgets.mixins import SpyderWidgetMixin + from spyder.config.base import DEV + from spyder.config.gui import OLD_PYQT +@@ -34,10 +34,6 @@ + from spyder.widgets.findreplace import FindReplace + + +-# Localization +-_ = get_translation('spyder') +- +- + # --- Constants + # ---------------------------------------------------------------------------- + class WebViewActions: +--- a/spyder/widgets/dock.py ++++ b/spyder/widgets/dock.py +@@ -13,16 +13,12 @@ + QToolButton, QWidget) + import qstylizer.style + +-from spyder.api.translations import get_translation ++from spyder.api.translations import _ + from spyder.utils.icon_manager import ima + from spyder.utils.palette import QStylePalette + from spyder.utils.stylesheet import PanesToolbarStyleSheet + + +-# For translations +-_ = get_translation('spyder') +- +- + # ============================================================================= + # Tab filter + # ============================================================================= diff -Nru spyder-5.4.2+ds/debian/patches/series spyder-5.4.2+ds/debian/patches/series --- spyder-5.4.2+ds/debian/patches/series 2023-01-22 09:37:20.000000000 +0000 +++ spyder-5.4.2+ds/debian/patches/series 2023-02-23 10:59:49.000000000 +0000 @@ -4,3 +4,5 @@ skip-failing-yapf-test.patch Allow-qdarkstyle-3.2.patch test-fixes-3.11.patch +fix-l10n-3.11-handling.patch +make-translations-singleton.patch diff -Nru spyder-5.4.2+ds/debian/tests/pytest-base spyder-5.4.2+ds/debian/tests/pytest-base --- spyder-5.4.2+ds/debian/tests/pytest-base 2023-01-22 09:37:20.000000000 +0000 +++ spyder-5.4.2+ds/debian/tests/pytest-base 2023-02-23 10:59:49.000000000 +0000 @@ -51,7 +51,7 @@ # We need to install the test plugin. # See https://github.com/spyder-ide/spyder/issues/17104 ( cd spyder/app/tests/spyder-boilerplate && \ - $py -m pip install --no-deps -q -e . ) + $py -m pip install --break-system-packages --no-deps -q -e . ) export CI=true export QTCONSOLE_TESTING=true