From c62dc327397f4e217f5f0b5ecbd934e263e93bf9 Mon Sep 17 00:00:00 2001 From: Chris Hennes Date: Thu, 27 Jan 2022 23:11:31 -0600 Subject: [PATCH] Addon Manager: Translation cleanup pylupdate does not extract translations when f-strings are used for the translated text, so all f-strings are migrated to calls to format(). Several other minor translation issues are also addressed. NOTE: This code has been run through the Black reformatter, which adds trailing commas in many places that the stock Qt 5.x pylupdate does not recognize. This code must be processed with the corrected pylupdate to generate the correct translations. --- src/Mod/AddonManager/AddonManager.py | 67 +++++----- src/Mod/AddonManager/NetworkManager.py | 21 ++-- src/Mod/AddonManager/addonmanager_macro.py | 16 +-- .../AddonManager/addonmanager_utilities.py | 25 +--- src/Mod/AddonManager/addonmanager_workers.py | 119 +++++++++++------- src/Mod/AddonManager/package_details.py | 12 +- src/Mod/AddonManager/package_list.py | 37 +++--- 7 files changed, 153 insertions(+), 144 deletions(-) diff --git a/src/Mod/AddonManager/AddonManager.py b/src/Mod/AddonManager/AddonManager.py index 892d3de245..56deafdbf7 100644 --- a/src/Mod/AddonManager/AddonManager.py +++ b/src/Mod/AddonManager/AddonManager.py @@ -34,7 +34,6 @@ from typing import Dict from PySide2 import QtGui, QtCore, QtWidgets import FreeCADGui -from addonmanager_utilities import translate # this needs to be as is for pylupdate from addonmanager_workers import * import addonmanager_utilities as utils import AddonManager_rc @@ -44,6 +43,8 @@ from AddonManagerRepo import AddonManagerRepo from NetworkManager import HAVE_QTNETWORK, InitializeNetworkManager +translate = FreeCAD.Qt.translate + __title__ = "FreeCAD Addon Manager Module" __author__ = "Yorik van Havre", "Jonathan Wiedemann", "Kurt Kremitzki", "Chris Hennes" __url__ = "http://www.freecad.org" @@ -238,9 +239,12 @@ class CommandAddonManager: ) else: QtWidgets.QMessageBox.critical( - None, - translate("AddonsInstaller", "Missing dependency"), - translate("AddonsInstaller", "Could not import QtNetwork -- see Report View for details. Addon Manager unavailable."), + None, + translate("AddonsInstaller", "Missing dependency"), + translate( + "AddonsInstaller", + "Could not import QtNetwork -- see Report View for details. Addon Manager unavailable.", + ), ) def launch(self) -> None: @@ -424,8 +428,8 @@ class CommandAddonManager: FreeCAD.Console.PrintWarning( translate( "AddonsInstaller", - f"Worker process {worker} is taking a long time to stop...\n", - ) + "Worker process {} is taking a long time to stop...\n", + ).format(worker) ) def wait_on_other_workers(self) -> None: @@ -763,13 +767,10 @@ class CommandAddonManager: """enables the update button""" if number_of_updates: - self.dialog.buttonUpdateAll.setText( - translate("AddonsInstaller", "Apply") - + " " - + str(number_of_updates) - + " " - + translate("AddonsInstaller", "update(s)") + s = translate( + "AddonsInstaller", "Apply {} update(s)", "", number_of_updates ) + self.dialog.buttonUpdateAll.setText(s.format(number_of_updates)) self.dialog.buttonUpdateAll.setEnabled(True) else: self.dialog.buttonUpdateAll.setText( @@ -784,9 +785,9 @@ class CommandAddonManager: addon_repo.icon = self.get_icon(addon_repo) for repo in self.item_model.repos: if repo.name == addon_repo.name: - FreeCAD.Console.PrintLog( - f"Possible duplicate addon: ignoring second addition of {addon_repo.name}\n" - ) + # FreeCAD.Console.PrintLog( + # f"Possible duplicate addon: ignoring second addition of {addon_repo.name}\n" + # ) return self.item_model.append_item(addon_repo) @@ -907,8 +908,8 @@ class CommandAddonManager: if bad_packages: message = translate( "AddonsInstaller", - "The Addon {repo.name} requires Python packages that are not installed, and cannot be installed automatically. To use this workbench you must install the following Python packages manually:", - ) + "The Addon {} requires Python packages that are not installed, and cannot be installed automatically. To use this workbench you must install the following Python packages manually:", + ).format(repo.name) if len(bad_packages) < 15: for dep in bad_packages: message += f"\n * {dep}" @@ -951,13 +952,13 @@ class CommandAddonManager: name = missing_wbs[0] message = translate( "AddonsInstaller", - f"Installing {addon} requires '{name}', which is not installed in your copy of FreeCAD.", - ) + "Installing {} requires '{}', which is not installed in your copy of FreeCAD.", + ).format(addon, name) else: message = translate( "AddonsInstaller", - f"Installing {addon} requires the following workbenches, which are not installed in your copy of FreeCAD:\n", - ) + "Installing {} requires the following workbenches, which are not installed in your copy of FreeCAD:\n", + ).format(addon) for wb in missing_wbs: message += " - " + wb + "\n" QtWidgets.QMessageBox.critical( @@ -1068,8 +1069,8 @@ class CommandAddonManager: + "\n\n" + translate( "AddonsInstaller", - f"Dependencies could not be installed. Continue with installation of {repo.name} anyway?", - ), + "Dependencies could not be installed. Continue with installation of {} anyway?", + ).format(repo.name), QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No, ) if result == QtWidgets.QMessageBox.Yes: @@ -1088,8 +1089,8 @@ class CommandAddonManager: + f"\n\n{command}\n\n" + translate( "AddonsInstaller", - f"Continue with installation of {repo.name} anyway?", - ), + "Continue with installation of {} anyway?", + ).format(repo.name), QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No, ) if result == QtWidgets.QMessageBox.Yes: @@ -1273,8 +1274,10 @@ class CommandAddonManager: result = "".join([repo.name + "\n" for repo in repos]) else: result = translate( - "AddonsInstaller", f"{num_updates} total, see Report view for list" - ) + "AddonsInstaller", + "{} total, see Report view for list", + "Describes the number of updates that were completed ('{}' is replaced by the number of updates)", + ).format(num_updates) for repo in repos: FreeCAD.Console.PrintMessage(f"{message}: {repo.name}\n") return result @@ -1360,9 +1363,9 @@ class CommandAddonManager: """Update the progress bar, showing it if it's hidden""" if current_value < 0: - FreeCAD.Console.PrintWarning( - f"Addon Manager: Internal error, current progress value is negative in region {self.current_progress_region}" - ) + current_value = 0 + elif current_value > max_value: + current_value = max_value self.show_progress_widgets() region_size = 100.0 / self.number_of_progress_regions @@ -1496,8 +1499,8 @@ class CommandAddonManager: FreeCAD.Console.PrintMessage( translate( "AddonsInstaller", - f"Macro {macro_filename} has local changes in the macros directory, so is not being removed by this uninstall process.\n", - ) + "Macro {} has local changes in the macros directory, so is not being removed by this uninstall process.\n", + ).format(macro_filename) ) if os.path.exists(clonedir): diff --git a/src/Mod/AddonManager/NetworkManager.py b/src/Mod/AddonManager/NetworkManager.py index 53db3fe9fc..d15404ff82 100644 --- a/src/Mod/AddonManager/NetworkManager.py +++ b/src/Mod/AddonManager/NetworkManager.py @@ -109,9 +109,9 @@ if HAVE_QTNETWORK: self.track_progress = track_progress class NetworkManager(QtCore.QObject): - """A single global instance of NetworkManager is instantiated and stored as - AM_NETWORK_MANAGER. Outside threads should send GET requests to this class by - calling the submit_unmonitored_request() or submit_monitored_request() function, + """A single global instance of NetworkManager is instantiated and stored as + AM_NETWORK_MANAGER. Outside threads should send GET requests to this class by + calling the submit_unmonitored_request() or submit_monitored_request() function, as needed. See the documentation of those functions for details.""" # Connect to complete for requests with no progress monitoring (e.g. small amounts of data) @@ -154,8 +154,10 @@ if HAVE_QTNETWORK: self.QNAM.proxyAuthenticationRequired.connect(self.__authenticate_proxy) self.QNAM.authenticationRequired.connect(self.__authenticate_resource) - qnam_cache = QtCore.QStandardPaths.writableLocation(QtCore.QStandardPaths.CacheLocation); - os.makedirs(qnam_cache,exist_ok=True) + qnam_cache = QtCore.QStandardPaths.writableLocation( + QtCore.QStandardPaths.CacheLocation + ) + os.makedirs(qnam_cache, exist_ok=True) self.diskCache = QtNetwork.QNetworkDiskCache() self.diskCache.setCacheDirectory(qnam_cache) self.QNAM.setCache(self.diskCache) @@ -239,9 +241,7 @@ if HAVE_QTNETWORK: lambda i=item.index: self.__data_incoming(i) ) reply.downloadProgress.connect( - lambda a, b, i=item.index: self.progress_made.emit( - i, a, b - ) + lambda a, b, i=item.index: self.progress_made.emit(i, a, b) ) self.replies[item.index] = reply except queue.Empty: @@ -462,8 +462,8 @@ else: # HAVE_QTNETWORK is false: def submit_monitored_request(self, _) -> int: current_index = next(itertools.count()) self.monitored_queue.put(current_index) - return current_index - + return current_index + def blocking_get(self, _: str) -> QtCore.QByteArray: return None @@ -481,6 +481,7 @@ def InitializeNetworkManager(): if AM_NETWORK_MANAGER is None: AM_NETWORK_MANAGER = NetworkManager() + if __name__ == "__main__": app = QtCore.QCoreApplication() diff --git a/src/Mod/AddonManager/addonmanager_macro.py b/src/Mod/AddonManager/addonmanager_macro.py index 84e774459e..0d7861bc87 100644 --- a/src/Mod/AddonManager/addonmanager_macro.py +++ b/src/Mod/AddonManager/addonmanager_macro.py @@ -171,8 +171,8 @@ class Macro(object): FreeCAD.Console.PrintWarning( translate( "AddonsInstaller", - f"Unable to open macro wiki page at {url}", - ) + "Unable to open macro wiki page at {}", + ).format(url) + "\n" ) return @@ -188,8 +188,8 @@ class Macro(object): FreeCAD.Console.PrintWarning( translate( "AddonsInstaller", - f"Unable to open macro code URL {rawcodeurl}", - ) + "Unable to open macro code URL {rawcodeurl}", + ).format(rawcodeurl) + "\n" ) return @@ -221,8 +221,8 @@ class Macro(object): FreeCAD.Console.PrintWarning( translate( "AddonsInstaller", - f"Unable to retrieve a description from the wiki for macro {self.name}", - ) + "Unable to retrieve a description from the wiki for macro {}", + ).format(self.name) + "\n" ) desc = "No description available" @@ -322,8 +322,8 @@ class Macro(object): FreeCAD.Console.PrintWarning( translate( "AddonsInstaller", - f"Failed to remove macro file '{dst_file}': it might not exist, or its permissions changed", - ) + "Failed to remove macro file '{}': it might not exist, or its permissions changed", + ).format(dst_file) + "\n" ) return True diff --git a/src/Mod/AddonManager/addonmanager_utilities.py b/src/Mod/AddonManager/addonmanager_utilities.py index 50b441d4f6..395618e718 100644 --- a/src/Mod/AddonManager/addonmanager_utilities.py +++ b/src/Mod/AddonManager/addonmanager_utilities.py @@ -24,7 +24,6 @@ import os import re import ctypes -import ssl from typing import Union, Optional import urllib @@ -38,20 +37,6 @@ from PySide2 import QtCore, QtWidgets import FreeCAD import FreeCADGui -# check for SSL support - -ssl_ctx = None -try: - import ssl -except ImportError: - pass -else: - try: - # ssl_ctx = ssl.create_default_context(cafile=certifi.where()) - # ssl_ctx = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) - ssl_ctx = ssl.create_default_context(ssl.Purpose.SERVER_AUTH) - except AttributeError: - pass # @package AddonManager_utilities # \ingroup ADDONMANAGER @@ -59,15 +44,7 @@ else: # @{ -def translate(context, text, disambig=None): - "Main translation function" - - try: - _encoding = QtWidgets.QApplication.UnicodeUTF8 - except AttributeError: - return QtWidgets.QApplication.translate(context, text, disambig) - else: - return QtWidgets.QApplication.translate(context, text, disambig, _encoding) +translate = FreeCAD.Qt.translate def symlink(source, link_name): diff --git a/src/Mod/AddonManager/addonmanager_workers.py b/src/Mod/AddonManager/addonmanager_workers.py index a10314a05b..901ba3be49 100644 --- a/src/Mod/AddonManager/addonmanager_workers.py +++ b/src/Mod/AddonManager/addonmanager_workers.py @@ -65,7 +65,7 @@ try: have_git = hasattr(git, "Repo") if not have_git: FreeCAD.Console.PrintMessage( - "'import git' gave strange results (no Repo attribute)..." + "'import git' gave strange results (no Repo attribute)... do you have GitPython installed?" ) except ImportError: pass @@ -115,9 +115,7 @@ class ConnectionChecker(QtCore.QThread): QtCore.QThread.__init__(self) def run(self): - FreeCAD.Console.PrintLog( - translate("AddonsInstaller", "Checking network connection...\n") - ) + FreeCAD.Console.PrintLog("Checking network connection...\n") url = "https://api.github.com/zen" result = NetworkManager.AM_NETWORK_MANAGER.blocking_get(url) if QtCore.QThread.currentThread().isInterruptionRequested(): @@ -425,7 +423,9 @@ class CheckWorkbenchesForUpdatesWorker(QtCore.QThread): self.update_status.emit(wb) except Exception: FreeCAD.Console.PrintWarning( - translate("AddonsInstaller", "git fetch failed for {}").format(wb.name) + translate("AddonsInstaller", "git fetch failed for {}").format( + wb.name + ) ) def check_package(self, package: AddonManagerRepo) -> None: @@ -460,8 +460,8 @@ class CheckWorkbenchesForUpdatesWorker(QtCore.QThread): FreeCAD.Console.PrintWarning( translate( "AddonsInstaller", - f"Failed to read metadata from {installed_metadata_file}", - ) + "Failed to read metadata from {name}", + ).format(name=installed_metadata_file) + "\n" ) @@ -482,8 +482,8 @@ class CheckWorkbenchesForUpdatesWorker(QtCore.QThread): FreeCAD.Console.PrintWarning( translate( "AddonsInstaller", - f"Failed to fetch code for macro '{macro_wrapper.macro.name}'", - ) + "Failed to fetch code for macro '{name}'", + ).format(name=macro_wrapper.macro.name) + "\n" ) return @@ -540,7 +540,7 @@ class FillMacroListWorker(QtCore.QThread): if not self.current_thread.isInterruptionRequested(): self.status_message_signal.emit( translate( - "AddonInstaller", + "AddonsInstaller", "Retrieving macros from FreeCAD/FreeCAD-Macros Git repository", ) ) @@ -549,7 +549,7 @@ class FillMacroListWorker(QtCore.QThread): if not self.current_thread.isInterruptionRequested(): self.status_message_signal.emit( translate( - "AddonInstaller", + "AddonsInstaller", "Retrieving macros from FreeCAD wiki", ) ) @@ -627,7 +627,9 @@ class FillMacroListWorker(QtCore.QThread): Reads only the page https://wiki.freecad.org/Macros_recipes """ - p = NetworkManager.AM_NETWORK_MANAGER.blocking_get("https://wiki.freecad.org/Macros_recipes") + p = NetworkManager.AM_NETWORK_MANAGER.blocking_get( + "https://wiki.freecad.org/Macros_recipes" + ) if not p: FreeCAD.Console.PrintWarning( translate( @@ -701,7 +703,11 @@ class CacheMacroCode(QtCore.QThread): worker.requestInterruption() if not worker.wait(100): FreeCAD.Console.PrintWarning( - f"Addon Manager: a worker process failed to halt ({worker.macro.name})" + translate( + "AddonsInstaller", + "Addon Manager: a worker process failed to halt ({name})", + ).format(name=worker.macro.name) + + "\n" ) return # Ensure our signals propagate out by running an internal thread-local event loop @@ -716,7 +722,11 @@ class CacheMacroCode(QtCore.QThread): worker.wait(50) if not worker.isFinished(): FreeCAD.Console.PrintError( - f"Addon Manager: a worker process failed to complete while fetching {worker.macro.name}\n" + translate( + "AddonsInstaller", + "Addon Manager: a worker process failed to complete while fetching {name}", + ).format(name=worker.macro.name) + + "\n" ) self.repo_queue.join() @@ -729,8 +739,8 @@ class CacheMacroCode(QtCore.QThread): FreeCAD.Console.PrintWarning( translate( "AddonsInstaller", - f"Out of {num_macros} macros, {num_failed} timed out while processing", - ) + "Out of {num_macros} macros, {num_failed} timed out while processing", + ).format(num_macros=num_macros, num_failed=num_failed) ) def update_and_advance(self, repo: AddonManagerRepo) -> None: @@ -760,8 +770,8 @@ class CacheMacroCode(QtCore.QThread): self.status_message.emit( translate( "AddonsInstaller", - f"Getting metadata from macro {next_repo.macro.name}", - ) + "Getting metadata from macro {}", + ).format(next_repo.macro.name) ) worker.start() except queue.Empty: @@ -773,8 +783,8 @@ class CacheMacroCode(QtCore.QThread): FreeCAD.Console.PrintWarning( translate( "AddonsInstaller", - f"Timeout while fetching metadata for macro {macro_name}", - ) + "Timeout while fetching metadata for macro {}", + ).format(macro_name) + "\n" ) worker.blockSignals(True) @@ -782,7 +792,10 @@ class CacheMacroCode(QtCore.QThread): worker.wait(100) if worker.isRunning(): FreeCAD.Console.PrintError( - f"Failed to kill process for macro {macro_name}!\n" + translate( + "AddonsInstaller", + "Failed to kill process for macro {}!\n", + ).format(macro_name) ) with self.lock: self.failed.append(macro_name) @@ -808,7 +821,7 @@ class ShowWorker(QtCore.QThread): u = None url = self.repo.url self.status_message.emit( - translate("AddonsInstaller", "Retrieving info from") + " " + str(url) + translate("AddonsInstaller", "Retrieving info from {}").format(str(url)) ) desc = "" regex = utils.get_readme_regex(self.repo) @@ -942,7 +955,9 @@ class ShowWorker(QtCore.QThread): storename = os.path.join(store, wbName + name[-remainChars:]) if not os.path.exists(storename): try: - imagedata = NetworkManager.AM_NETWORK_MANAGER.blocking_get(path) + imagedata = NetworkManager.AM_NETWORK_MANAGER.blocking_get( + path + ) if not imagedata: raise Exception except Exception: @@ -1227,12 +1242,14 @@ class InstallWorkbenchWorker(QtCore.QThread): NetworkManager.AM_NETWORK_MANAGER.progress_made.connect(self.update_zip_status) NetworkManager.AM_NETWORK_MANAGER.progress_complete.connect(self.finish_zip) - self.zip_download_index = NetworkManager.AM_NETWORK_MANAGER.submit_monitored_get(zipurl) + self.zip_download_index = ( + NetworkManager.AM_NETWORK_MANAGER.submit_monitored_get(zipurl) + ) def update_zip_status(self, index: int, bytes_read: int, data_size: int): if index == self.zip_download_index: locale = QtCore.QLocale() - if data_size > 10 * 1024 * 1024: # To avoid overflows, show MB instead + if data_size > 10 * 1024 * 1024: # To avoid overflows, show MB instead MB_read = bytes_read / 1024 / 1024 MB_total = data_size / 1024 / 1024 self.progress_made.emit(MB_read, MB_total) @@ -1242,7 +1259,11 @@ class InstallWorkbenchWorker(QtCore.QThread): self.status_message.emit( translate( "AddonsInstaller", - f"Downloading: {mbytes_str}MB of {mbytes_total_str}MB ({percent}%)", + "Downloading: {mbytes_str}MB of {mbytes_total_str}MB ({percent}%)", + ).format( + mbytes_str=mbytes_str, + mbytes_total_str=mbytes_total_str, + percent=percent, ) ) elif data_size > 0: @@ -1253,7 +1274,11 @@ class InstallWorkbenchWorker(QtCore.QThread): self.status_message.emit( translate( "AddonsInstaller", - f"Downloading: {bytes_str} of {bytes_total_str} bytes ({percent}%)", + "Downloading: {bytes_str} of {bytes_total_str} bytes ({percent}%)", + ).format( + bytes_str=bytes_str, + bytes_total_str=bytes_total_str, + percent=percent, ) ) else: @@ -1262,8 +1287,8 @@ class InstallWorkbenchWorker(QtCore.QThread): self.status_message.emit( translate( "AddonsInstaller", - f"Downloading: {bytes_str}MB of unknown total", - ) + "Downloading: {bytes_str}MB of unknown total", + ).format(bytes_str=bytes_str) ) def finish_zip(self, index: int, response_code: int, filename: os.PathLike): @@ -1273,8 +1298,8 @@ class InstallWorkbenchWorker(QtCore.QThread): self.repo, translate( "AddonsInstaller", - f"Error: Error while downloading ZIP file for {self.repo.display_name}", - ), + "Error: Error while downloading ZIP file for {}", + ).format(self.repo.display_name), ) return @@ -1298,8 +1323,8 @@ class InstallWorkbenchWorker(QtCore.QThread): self.repo, translate( "AddonsInstaller", - f"Successfully installed {self.repo.display_name} from ZIP file", - ), + "Successfully installed {} from ZIP file", + ).format(self.repo.display_name), ) def update_metadata(self): @@ -1412,8 +1437,8 @@ class DependencyInstallationWorker(QtCore.QThread): self.emit.failure( translate( "AddonsInstaller", - f"Installation of Python package {pymod} failed", - ), + "Installation of Python package {} failed", + ).format(pymod), proc.stderr, ) return @@ -1431,8 +1456,8 @@ class DependencyInstallationWorker(QtCore.QThread): self.emit.failure( translate( "AddonsInstaller", - f"Installation of Python package {pymod} failed", - ), + "Installation of Python package {} failed", + ).format(pymod), proc.stderr, ) return @@ -1537,7 +1562,9 @@ class UpdateMetadataCacheWorker(QtCore.QThread): while self.requests: if current_thread.isInterruptionRequested(): - NetworkManager.AM_NETWORK_MANAGER.completed.disconnect(self.download_completed) + NetworkManager.AM_NETWORK_MANAGER.completed.disconnect( + self.download_completed + ) for request in self.requests.keys(): NetworkManager.AM_NETWORK_MANAGER.abort(request) return @@ -1581,7 +1608,9 @@ class UpdateMetadataCacheWorker(QtCore.QThread): metadata = FreeCAD.Metadata(new_xml_file) repo.metadata = metadata self.status_message.emit( - translate("AddonsInstaller", f"Downloaded package.xml for {repo.name}") + translate("AddonsInstaller", "Downloaded package.xml for {}").format( + repo.name + ) ) # Grab a new copy of the icon as well: we couldn't enqueue this earlier because @@ -1609,8 +1638,8 @@ class UpdateMetadataCacheWorker(QtCore.QThread): def process_metadata_txt(self, repo: AddonManagerRepo, data: QtCore.QByteArray): self.status_message.emit( - translate( - "AddonsInstaller", f"Downloaded metadata.txt for {repo.display_name}" + translate("AddonsInstaller", "Downloaded metadata.txt for {}").format( + repo.display_name ) ) f = io.StringIO(data.data().decode("utf8")) @@ -1659,8 +1688,8 @@ class UpdateMetadataCacheWorker(QtCore.QThread): self.status_message.emit( translate( "AddonsInstaller", - f"Downloaded requirements.txt for {repo.display_name}", - ) + "Downloaded requirements.txt for {}", + ).format(repo.display_name) ) f = io.StringIO(data.data().decode("utf8")) lines = f.readlines() @@ -1683,7 +1712,9 @@ class UpdateMetadataCacheWorker(QtCore.QThread): def process_icon(self, repo: AddonManagerRepo, data: QtCore.QByteArray): self.status_message.emit( - translate("AddonsInstaller", f"Downloaded icon for {repo.display_name}") + translate("AddonsInstaller", "Downloaded icon for {}").format( + repo.display_name + ) ) cache_file = repo.get_cached_icon_filename() with open(cache_file, "wb") as icon_file: diff --git a/src/Mod/AddonManager/package_details.py b/src/Mod/AddonManager/package_details.py index 508073d7d4..e2b315e297 100644 --- a/src/Mod/AddonManager/package_details.py +++ b/src/Mod/AddonManager/package_details.py @@ -108,18 +108,18 @@ class PackageDetails(QWidget): if version and date: installed_version_string += ( translate( - "AddonsInstaller", f"Version {version} installed on {date}" - ) + "AddonsInstaller", "Version {version} installed on {date}" + ).format(version=version, date=date) + ". " ) elif version: installed_version_string += ( - translate("AddonsInstaller", f"Version {version} installed") + ". " - ) + translate("AddonsInstaller", "Version {version} installed") + ". " + ).format(version=version) elif date: installed_version_string += ( - translate("AddonsInstaller", f"Installed on {date}") + ". " - ) + translate("AddonsInstaller", "Installed on {date}") + ". " + ).format(date=date) else: installed_version_string += ( translate("AddonsInstaller", "Installed") + ". " diff --git a/src/Mod/AddonManager/package_list.py b/src/Mod/AddonManager/package_list.py index 24040873e8..ce34d80ce5 100644 --- a/src/Mod/AddonManager/package_list.py +++ b/src/Mod/AddonManager/package_list.py @@ -31,12 +31,13 @@ from PySide2.QtWidgets import * from enum import IntEnum import threading -from addonmanager_utilities import translate # this needs to be as is for pylupdate from AddonManagerRepo import AddonManagerRepo from compact_view import Ui_CompactView from expanded_view import Ui_ExpandedView +translate = FreeCAD.Qt.translate + class ListDisplayStyle(IntEnum): COMPACT = 0 @@ -201,20 +202,17 @@ class PackageListItemModel(QAbstractListModel): if role == Qt.ToolTipRole: tooltip = "" if self.repos[row].repo_type == AddonManagerRepo.RepoType.PACKAGE: - tooltip = ( - translate("AddonsInstaller", "Click for details about package") - + f" '{self.repos[row].display_name}'" - ) + tooltip = translate( + "AddonsInstaller", "Click for details about package {}" + ).format(self.repos[row].display_name) elif self.repos[row].repo_type == AddonManagerRepo.RepoType.WORKBENCH: - tooltip = ( - translate("AddonsInstaller", "Click for details about workbench") - + f" '{self.repos[row].display_name}'" - ) + tooltip = translate( + "AddonsInstaller", "Click for details about workbench {}" + ).format(self.repos[row].display_name) elif self.repos[row].repo_type == AddonManagerRepo.RepoType.MACRO: - tooltip = ( - translate("AddonsInstaller", "Click for details about macro") - + f" '{self.repos[row].display_name}'" - ) + tooltip = translate( + "AddonsInstaller", "Click for details about macro {}" + ).format(self.repos[row].display_name) return tooltip elif role == PackageListItemModel.DataAccessRole: return self.repos[row] @@ -345,19 +343,18 @@ class PackageListItemDelegate(QStyledItemDelegate): self.widget.ui.labelVersion.setText(f"v{repo.metadata.Version}") if self.displayStyle == ListDisplayStyle.EXPANDED: maintainers = repo.metadata.Maintainer - maintainers_string = "" + string = "" if len(maintainers) == 1: - maintainers_string = ( + string = ( translate("AddonsInstaller", "Maintainer") + f": {maintainers[0]['name']} <{maintainers[0]['email']}>" ) elif len(maintainers) > 1: - maintainers_string = translate("AddonsInstaller", "Maintainers:") + n = len(maintainers) + string = translate("AddonsInstaller", "Maintainers:", "", n) for maintainer in maintainers: - maintainers_string += ( - f"\n{maintainer['name']} <{maintainer['email']}>" - ) - self.widget.ui.labelMaintainer.setText(maintainers_string) + string += f"\n{maintainer['name']} <{maintainer['email']}>" + self.widget.ui.labelMaintainer.setText(string) elif repo.macro and repo.macro.parsed: self.widget.ui.labelDescription.setText(repo.macro.comment) self.widget.ui.labelVersion.setText(repo.macro.version)