ProjectFlask/FlaskBabelExtension/PyBabelProjectExtension.py

branch
eric7
changeset 70
22e1d0f69668
parent 66
0d3168d0e310
child 72
4557829a4acf
--- a/ProjectFlask/FlaskBabelExtension/PyBabelProjectExtension.py	Thu Dec 30 12:13:22 2021 +0100
+++ b/ProjectFlask/FlaskBabelExtension/PyBabelProjectExtension.py	Wed Sep 21 16:30:15 2022 +0200
@@ -27,10 +27,11 @@
     """
     Class implementing the flask-babel project support.
     """
+
     def __init__(self, plugin, project, parent=None):
         """
         Constructor
-        
+
         @param plugin reference to the plugin object
         @type ProjectFlaskPlugin
         @param project reference to the project object
@@ -39,85 +40,101 @@
         @type QObject
         """
         super().__init__(parent)
-        
+
         self.__plugin = plugin
         self.__project = project
-        
+
         self.__ericProject = ericApp().getObject("Project")
-        
+
         self.__hooksInstalled = False
-    
+
     def initActions(self):
         """
         Public method to define the flask-babel actions.
         """
         self.actions = []
-        
+
         self.pybabelConfigAct = EricAction(
-            self.tr('Configure flask-babel'),
-            self.tr('&Configure flask-babel'),
-            0, 0,
-            self, 'flask_config_pybabel')
-        self.pybabelConfigAct.setStatusTip(self.tr(
-            'Shows a dialog to edit the configuration for flask-babel'))
-        self.pybabelConfigAct.setWhatsThis(self.tr(
-            """<b>Configure flask-babel</b>"""
-            """<p>Shows a dialog to edit the configuration for """
-            """flask-babel.</p>"""
-        ))
-        self.pybabelConfigAct.triggered.connect(
-            self.__configurePyBabel)
+            self.tr("Configure flask-babel"),
+            self.tr("&Configure flask-babel"),
+            0,
+            0,
+            self,
+            "flask_config_pybabel",
+        )
+        self.pybabelConfigAct.setStatusTip(
+            self.tr("Shows a dialog to edit the configuration for flask-babel")
+        )
+        self.pybabelConfigAct.setWhatsThis(
+            self.tr(
+                """<b>Configure flask-babel</b>"""
+                """<p>Shows a dialog to edit the configuration for """
+                """flask-babel.</p>"""
+            )
+        )
+        self.pybabelConfigAct.triggered.connect(self.__configurePyBabel)
         self.actions.append(self.pybabelConfigAct)
-        
+
         self.pybabelInstallAct = EricAction(
-            self.tr('Install flask-babel'),
-            self.tr('&Install flask-babel'),
-            0, 0,
-            self, 'flask_install_pybabel')
-        self.pybabelInstallAct.setStatusTip(self.tr(
-            'Installs the flask-babel extension into the configured'
-            ' environment'))
-        self.pybabelInstallAct.setWhatsThis(self.tr(
-            """<b>Install flask-babel</b>"""
-            """<p>Installs the flask-babel extension into the configured"""
-            """ environment using the pip interface.</p>"""
-        ))
-        self.pybabelInstallAct.triggered.connect(
-            self.__installFlaskBabel)
+            self.tr("Install flask-babel"),
+            self.tr("&Install flask-babel"),
+            0,
+            0,
+            self,
+            "flask_install_pybabel",
+        )
+        self.pybabelInstallAct.setStatusTip(
+            self.tr(
+                "Installs the flask-babel extension into the configured" " environment"
+            )
+        )
+        self.pybabelInstallAct.setWhatsThis(
+            self.tr(
+                """<b>Install flask-babel</b>"""
+                """<p>Installs the flask-babel extension into the configured"""
+                """ environment using the pip interface.</p>"""
+            )
+        )
+        self.pybabelInstallAct.triggered.connect(self.__installFlaskBabel)
         self.actions.append(self.pybabelInstallAct)
-        
+
         self.pybabelAvailabilityAct = EricAction(
-            self.tr('Check flask-babel Availability'),
-            self.tr('Check flask-babel &Availability'),
-            0, 0,
-            self, 'flask_check_pybabel')
-        self.pybabelAvailabilityAct.setStatusTip(self.tr(
-            'Check the availability of the flask-babel extension'))
-        self.pybabelAvailabilityAct.setWhatsThis(self.tr(
-            """<b>Check flask-babel Availability</b>"""
-            """<p>Check the availability of the flask-babel extension.</p>"""
-        ))
-        self.pybabelAvailabilityAct.triggered.connect(
-            self.__checkAvailability)
+            self.tr("Check flask-babel Availability"),
+            self.tr("Check flask-babel &Availability"),
+            0,
+            0,
+            self,
+            "flask_check_pybabel",
+        )
+        self.pybabelAvailabilityAct.setStatusTip(
+            self.tr("Check the availability of the flask-babel extension")
+        )
+        self.pybabelAvailabilityAct.setWhatsThis(
+            self.tr(
+                """<b>Check flask-babel Availability</b>"""
+                """<p>Check the availability of the flask-babel extension.</p>"""
+            )
+        )
+        self.pybabelAvailabilityAct.triggered.connect(self.__checkAvailability)
         self.actions.append(self.pybabelAvailabilityAct)
-    
+
     def initMenu(self):
         """
         Public method to initialize the flask-babel menu.
-        
+
         @return the menu generated
         @rtype QMenu
         """
         menu = QMenu(self.tr("Translations"))
         menu.setTearOffEnabled(True)
-        
+
         menu.addAction(self.pybabelConfigAct)
         menu.addSeparator()
         menu.addAction(self.pybabelAvailabilityAct)
         menu.addAction(self.pybabelInstallAct)
-        
+
         return menu
-    
+
     def registerOpenHook(self):
         """
         Public method to register the open hook to open a translations file
@@ -127,156 +144,161 @@
             editor = self.__plugin.getPreferences("TranslationsEditor")
             if editor:
                 self.__translationsBrowser.addHookMethodAndMenuEntry(
-                    "open", self.openPOEditor,
-                    self.tr("Open with {0}").format(
-                        os.path.basename(editor)))
+                    "open",
+                    self.openPOEditor,
+                    self.tr("Open with {0}").format(os.path.basename(editor)),
+                )
             else:
                 self.__translationsBrowser.removeHookMethod("open")
-    
+
     def projectOpenedHooks(self):
         """
         Public method to add our hook methods.
         """
         if self.__project.hasCapability("flask-babel"):
             self.__ericProject.projectLanguageAddedByCode.connect(
-                self.__projectLanguageAdded)
+                self.__projectLanguageAdded
+            )
             self.__translationsBrowser = (
-                ericApp().getObject("ProjectBrowser")
-                .getProjectBrowser("translations"))
+                ericApp().getObject("ProjectBrowser").getProjectBrowser("translations")
+            )
             self.__translationsBrowser.addHookMethodAndMenuEntry(
-                "extractMessages", self.extractMessages,
-                self.tr("Extract Messages"))
+                "extractMessages", self.extractMessages, self.tr("Extract Messages")
+            )
             self.__translationsBrowser.addHookMethodAndMenuEntry(
-                "releaseAll", self.compileCatalogs,
-                self.tr("Compile All Catalogs"))
+                "releaseAll", self.compileCatalogs, self.tr("Compile All Catalogs")
+            )
             self.__translationsBrowser.addHookMethodAndMenuEntry(
-                "releaseSelected", self.compileSelectedCatalogs,
-                self.tr("Compile Selected Catalogs"))
+                "releaseSelected",
+                self.compileSelectedCatalogs,
+                self.tr("Compile Selected Catalogs"),
+            )
             self.__translationsBrowser.addHookMethodAndMenuEntry(
-                "generateAll", self.updateCatalogs,
-                self.tr("Update All Catalogs"))
+                "generateAll", self.updateCatalogs, self.tr("Update All Catalogs")
+            )
             self.__translationsBrowser.addHookMethodAndMenuEntry(
-                "generateAllWithObsolete", self.updateCatalogsObsolete,
-                self.tr("Update All Catalogs (with obsolete)"))
+                "generateAllWithObsolete",
+                self.updateCatalogsObsolete,
+                self.tr("Update All Catalogs (with obsolete)"),
+            )
             self.__translationsBrowser.addHookMethodAndMenuEntry(
-                "generateSelected", self.updateSelectedCatalogs,
-                self.tr("Update Selected Catalogs"))
+                "generateSelected",
+                self.updateSelectedCatalogs,
+                self.tr("Update Selected Catalogs"),
+            )
             self.__translationsBrowser.addHookMethodAndMenuEntry(
                 "generateSelectedWithObsolete",
                 self.updateSelectedCatalogsObsolete,
-                self.tr("Update Selected Catalogs (with obsolete)"))
-            
+                self.tr("Update Selected Catalogs (with obsolete)"),
+            )
+
             self.__hooksInstalled = True
-        
+
             self.registerOpenHook()
-    
+
     def projectClosedHooks(self):
         """
         Public method to remove our hook methods.
         """
         if self.__hooksInstalled:
             self.__ericProject.projectLanguageAddedByCode.disconnect(
-                self.__projectLanguageAdded)
-            self.__translationsBrowser.removeHookMethod(
-                "extractMessages")
-            self.__translationsBrowser.removeHookMethod(
-                "releaseAll")
-            self.__translationsBrowser.removeHookMethod(
-                "releaseSelected")
-            self.__translationsBrowser.removeHookMethod(
-                "generateAll")
-            self.__translationsBrowser.removeHookMethod(
-                "generateAllWithObsolete")
-            self.__translationsBrowser.removeHookMethod(
-                "generateSelected")
-            self.__translationsBrowser.removeHookMethod(
-                "generateSelectedWithObsolete")
-            self.__translationsBrowser.removeHookMethod(
-                "open")
+                self.__projectLanguageAdded
+            )
+            self.__translationsBrowser.removeHookMethod("extractMessages")
+            self.__translationsBrowser.removeHookMethod("releaseAll")
+            self.__translationsBrowser.removeHookMethod("releaseSelected")
+            self.__translationsBrowser.removeHookMethod("generateAll")
+            self.__translationsBrowser.removeHookMethod("generateAllWithObsolete")
+            self.__translationsBrowser.removeHookMethod("generateSelected")
+            self.__translationsBrowser.removeHookMethod("generateSelectedWithObsolete")
+            self.__translationsBrowser.removeHookMethod("open")
             self.__translationsBrowser = None
-        
+
         self.__hooksInstalled = False
-    
+
     def determineCapability(self):
         """
         Public method to determine the availability of flask-babel.
         """
         available = (
             self.__project.getData("flask", "flask_babel_available")
-            if self.__project.getData("flask", "flask_babel_override") else
-            self.__flaskBabelAvailable()
+            if self.__project.getData("flask", "flask_babel_override")
+            else self.__flaskBabelAvailable()
         )
         self.__project.setCapability("flask-babel", available)
-        
+
         self.pybabelConfigAct.setEnabled(available)
         self.pybabelInstallAct.setEnabled(not available)
-    
+
     ##################################################################
     ## slots and methods below implement general functionality
     ##################################################################
-    
+
     def getBabelCommand(self):
         """
         Public method to build the Babel command.
-        
+
         @return full pybabel command
         @rtype str
         """
         return self.__project.getFullCommand("pybabel")
-    
+
     ##################################################################
     ## slots and methods below implement i18n and l10n support
     ##################################################################
-    
+
     def __flaskBabelAvailable(self):
         """
         Private method to check, if the 'flask-babel' package is available.
-        
+
         @return flag indicating the availability of 'flask-babel'
         @rtype bool
         """
         interpreter = self.__project.getVirtualenvInterpreter()
         if interpreter and Utilities.isinpath(interpreter):
-            detector = os.path.join(
-                os.path.dirname(__file__), "FlaskBabelDetector.py")
+            detector = os.path.join(os.path.dirname(__file__), "FlaskBabelDetector.py")
             proc = QProcess()
-            proc.setProcessChannelMode(
-                QProcess.ProcessChannelMode.MergedChannels)
+            proc.setProcessChannelMode(QProcess.ProcessChannelMode.MergedChannels)
             proc.start(interpreter, [detector])
             finished = proc.waitForFinished(30000)
             if finished and proc.exitCode() == 0:
                 return True
-        
+
         return False
-    
+
     @pyqtSlot()
     def __configurePyBabel(self):
         """
         Private slot to show a dialog to edit the pybabel configuration.
         """
         from .PyBabelConfigDialog import PyBabelConfigDialog
-        
+
         config = self.__project.getData("flask-babel", "")
         dlg = PyBabelConfigDialog(config)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             config = dlg.getConfiguration()
             self.__project.setData("flask-babel", "", config)
-            
-            self.__ericProject.setTranslationPattern(os.path.join(
-                config["translationsDirectory"], "%language%", "LC_MESSAGES",
-                "{0}.po".format(config["domain"])
-            ))
+
+            self.__ericProject.setTranslationPattern(
+                os.path.join(
+                    config["translationsDirectory"],
+                    "%language%",
+                    "LC_MESSAGES",
+                    "{0}.po".format(config["domain"]),
+                )
+            )
             self.__ericProject.setDirty(True)
-            
+
             cfgFileName = self.__ericProject.getAbsoluteUniversalPath(
-                config["configFile"])
+                config["configFile"]
+            )
             if not os.path.exists(cfgFileName):
                 self.__createBabelCfg(cfgFileName)
-    
+
     def __ensurePybabelConfigured(self):
         """
         Private method to ensure, that PyBabel has been configured.
-        
+
         @return flag indicating successful configuration
         @rtype bool
         """
@@ -284,22 +306,21 @@
         if not config:
             self.__configurePybabel()
             return True
-        
+
         configFileName = self.__project.getData("flask-babel", "configFile")
         if configFileName:
-            cfgFileName = self.__ericProject.getAbsoluteUniversalPath(
-                configFileName)
+            cfgFileName = self.__ericProject.getAbsoluteUniversalPath(configFileName)
             if os.path.exists(cfgFileName):
                 return True
             else:
                 return self.__createBabelCfg(cfgFileName)
-        
+
         return False
-    
+
     def __createBabelCfg(self, configFile):
         """
         Private method to create a template pybabel configuration file.
-        
+
         @param configFile name of the configuration file to be created
         @type str
         @return flag indicating successful configuration file creation
@@ -307,13 +328,17 @@
         """
         _, app = self.__project.getApplication()
         template = (
-            ("[python: {0}]\n"
-             "[jinja2: templates/**.html]\n"
-             "extensions=jinja2.ext.autoescape,jinja2.ext.with_\n")
-            if app.endswith(".py") else
-            ("[python: {0}/**.py]\n"
-             "[jinja2: {0}/templates/**.html]\n"
-             "extensions=jinja2.ext.autoescape,jinja2.ext.with_\n")
+            (
+                "[python: {0}]\n"
+                "[jinja2: templates/**.html]\n"
+                "extensions=jinja2.ext.autoescape,jinja2.ext.with_\n"
+            )
+            if app.endswith(".py")
+            else (
+                "[python: {0}/**.py]\n"
+                "[jinja2: {0}/templates/**.html]\n"
+                "extensions=jinja2.ext.autoescape,jinja2.ext.with_\n"
+            )
         )
         try:
             with open(configFile, "w") as f:
@@ -322,21 +347,24 @@
             EricMessageBox.information(
                 None,
                 self.tr("Generate PyBabel Configuration File"),
-                self.tr("""The PyBabel configuration file was created."""
-                        """ Please edit it to adjust the entries as"""
-                        """ required.""")
+                self.tr(
+                    """The PyBabel configuration file was created."""
+                    """ Please edit it to adjust the entries as"""
+                    """ required."""
+                ),
             )
             return True
         except OSError as err:
             EricMessageBox.warning(
                 None,
                 self.tr("Generate PyBabel Configuration File"),
-                self.tr("""<p>The PyBabel Configuration File could not be"""
-                        """ generated.</p><p>Reason: {0}</p>""")
-                .format(str(err))
+                self.tr(
+                    """<p>The PyBabel Configuration File could not be"""
+                    """ generated.</p><p>Reason: {0}</p>"""
+                ).format(str(err)),
             )
             return False
-    
+
     @pyqtSlot()
     def __installFlaskBabel(self):
         """
@@ -353,10 +381,13 @@
             EricMessageBox.critical(
                 None,
                 self.tr("Install flask-babel"),
-                self.tr("The 'flask-babel' extension could not be installed"
-                        " because no virtual environment has been"
-                        " configured."))
-    
+                self.tr(
+                    "The 'flask-babel' extension could not be installed"
+                    " because no virtual environment has been"
+                    " configured."
+                ),
+            )
+
     @pyqtSlot()
     def __checkAvailability(self):
         """
@@ -365,18 +396,15 @@
         self.determineCapability()
         msg = (
             self.tr("The 'flask-babel' extension is installed.")
-            if self.__project.hasCapability("flask-babel") else
-            self.tr("The 'flask-babel' extension is not installed.")
+            if self.__project.hasCapability("flask-babel")
+            else self.tr("The 'flask-babel' extension is not installed.")
         )
-        EricMessageBox.information(
-            None,
-            self.tr("flask-babel Availability"),
-            msg)
-    
+        EricMessageBox.information(None, self.tr("flask-babel Availability"), msg)
+
     def __getLocale(self, filename):
         """
         Private method to extract the locale out of a file name.
-        
+
         @param filename name of the file used for extraction
         @type str
         @return extracted locale
@@ -384,24 +412,24 @@
         """
         if self.__ericProject.getTranslationPattern():
             filename = os.path.splitext(filename)[0] + ".po"
-            
+
             # On Windows, path typically contains backslashes. This leads
             # to an invalid search pattern '...\(' because the opening bracket
             # will be escaped.
             pattern = self.__ericProject.getTranslationPattern()
             pattern = os.path.normpath(pattern)
             pattern = pattern.replace("%language%", "(.*?)")
-            pattern = pattern.replace('\\', '\\\\')
+            pattern = pattern.replace("\\", "\\\\")
             match = re.search(pattern, filename)
             if match is not None:
                 return match.group(1)
-        
+
         return None
-    
+
     def openPOEditor(self, poFile):
         """
         Public method to edit the given file in an external .po editor.
-        
+
         @param poFile name of the .po file
         @type str
         """
@@ -412,11 +440,12 @@
             if not started:
                 EricMessageBox.critical(
                     None,
-                    self.tr('Process Generation Error'),
-                    self.tr('The translations editor process ({0}) could'
-                            ' not be started.').format(
-                        os.path.basename(editor)))
-    
+                    self.tr("Process Generation Error"),
+                    self.tr(
+                        "The translations editor process ({0}) could" " not be started."
+                    ).format(os.path.basename(editor)),
+                )
+
     def extractMessages(self):
         """
         Public method to extract the messages catalog template file.
@@ -425,280 +454,272 @@
         if self.__ensurePybabelConfigured():
             workdir = self.__project.getApplication()[0]
             potFile = self.__ericProject.getAbsoluteUniversalPath(
-                self.__project.getData("flask-babel", "catalogFile"))
-            
+                self.__project.getData("flask-babel", "catalogFile")
+            )
+
             with contextlib.suppress(OSError):
                 potFilePath = os.path.dirname(potFile)
                 os.makedirs(potFilePath)
-            
+
             args = [
                 "-F",
                 os.path.relpath(
                     self.__ericProject.getAbsoluteUniversalPath(
-                        self.__project.getData("flask-babel", "configFile")),
-                    workdir
-                )
+                        self.__project.getData("flask-babel", "configFile")
+                    ),
+                    workdir,
+                ),
             ]
             if self.__project.getData("flask-babel", "markersList"):
-                for marker in self.__project.getData("flask-babel",
-                                                     "markersList"):
+                for marker in self.__project.getData("flask-babel", "markersList"):
                     args += ["-k", marker]
-            args += [
-                "-o",
-                os.path.relpath(potFile, workdir),
-                "."
-            ]
-            
+            args += ["-o", os.path.relpath(potFile, workdir), "."]
+
             dlg = PyBabelCommandDialog(
-                self, title,
-                msgSuccess=self.tr("\nMessages extracted successfully.")
+                self, title, msgSuccess=self.tr("\nMessages extracted successfully.")
             )
             res = dlg.startCommand("extract", args, workdir)
             if res:
                 dlg.exec()
                 self.__ericProject.appendFile(potFile)
-    
+
     def __projectLanguageAdded(self, code):
         """
         Private slot handling the addition of a new language.
-        
+
         @param code language code of the new language
         @type str
         """
-        title = self.tr(
-            "Initializing message catalog for '{0}'").format(code)
-        
+        title = self.tr("Initializing message catalog for '{0}'").format(code)
+
         if self.__ensurePybabelConfigured():
             workdir = self.__project.getApplication()[0]
             langFile = self.__ericProject.getAbsoluteUniversalPath(
-                self.__ericProject.getTranslationPattern().replace(
-                    "%language%", code))
+                self.__ericProject.getTranslationPattern().replace("%language%", code)
+            )
             potFile = self.__ericProject.getAbsoluteUniversalPath(
-                self.__project.getData("flask-babel", "catalogFile"))
-            
+                self.__project.getData("flask-babel", "catalogFile")
+            )
+
             args = [
-                "--domain={0}".format(
-                    self.__project.getData("flask-babel", "domain")),
+                "--domain={0}".format(self.__project.getData("flask-babel", "domain")),
                 "--input-file={0}".format(os.path.relpath(potFile, workdir)),
                 "--output-file={0}".format(os.path.relpath(langFile, workdir)),
                 "--locale={0}".format(code),
             ]
-            
+
             dlg = PyBabelCommandDialog(
-                self, title,
-                msgSuccess=self.tr(
-                    "\nMessage catalog initialized successfully.")
+                self,
+                title,
+                msgSuccess=self.tr("\nMessage catalog initialized successfully."),
             )
             res = dlg.startCommand("init", args, workdir)
             if res:
                 dlg.exec()
-                
+
                 self.__ericProject.appendFile(langFile)
-    
+
     def compileCatalogs(self, filenames):
         """
         Public method to compile the message catalogs.
-        
+
         @param filenames list of filenames (not used)
         @type list of str
         """
         title = self.tr("Compiling message catalogs")
-        
+
         if self.__ensurePybabelConfigured():
             workdir = self.__project.getApplication()[0]
-            translationsDirectory = (
-                self.__ericProject.getAbsoluteUniversalPath(
-                    self.__project.getData(
-                        "flask-babel", "translationsDirectory")
-                )
+            translationsDirectory = self.__ericProject.getAbsoluteUniversalPath(
+                self.__project.getData("flask-babel", "translationsDirectory")
             )
-            
+
             args = [
-                "--domain={0}".format(
-                    self.__project.getData("flask-babel", "domain")),
+                "--domain={0}".format(self.__project.getData("flask-babel", "domain")),
                 "--directory={0}".format(
-                    os.path.relpath(translationsDirectory, workdir)),
+                    os.path.relpath(translationsDirectory, workdir)
+                ),
                 "--use-fuzzy",
                 "--statistics",
             ]
-            
+
             dlg = PyBabelCommandDialog(
-                self, title,
-                msgSuccess=self.tr("\nMessage catalogs compiled successfully.")
+                self,
+                title,
+                msgSuccess=self.tr("\nMessage catalogs compiled successfully."),
             )
             res = dlg.startCommand("compile", args, workdir)
             if res:
                 dlg.exec()
-                
+
                 for entry in os.walk(translationsDirectory):
                     for fileName in entry[2]:
                         fullName = os.path.join(entry[0], fileName)
-                        if fullName.endswith('.mo'):
+                        if fullName.endswith(".mo"):
                             self.__ericProject.appendFile(fullName)
-    
+
     def compileSelectedCatalogs(self, filenames):
         """
         Public method to update the message catalogs.
-        
+
         @param filenames list of file names
         @type list of str
         """
         title = self.tr("Compiling message catalogs")
-        
+
         locales = {self.__getLocale(f) for f in filenames}
-        
+
         if len(locales) == 0:
             EricMessageBox.warning(
-                self.__ui,
-                title,
-                self.tr('No locales detected. Aborting...'))
+                self.__ui, title, self.tr("No locales detected. Aborting...")
+            )
             return
-        
+
         if self.__ensurePybabelConfigured():
             workdir = self.__project.getApplication()[0]
-            translationsDirectory = (
-                self.__ericProject.getAbsoluteUniversalPath(
-                    self.__project.getData(
-                        "flask-babel", "translationsDirectory")
-                )
+            translationsDirectory = self.__ericProject.getAbsoluteUniversalPath(
+                self.__project.getData("flask-babel", "translationsDirectory")
             )
-            
+
             argsList = []
             for loc in locales:
-                argsList.append([
-                    "compile",
-                    "--domain={0}".format(
-                        self.__project.getData("flask-babel", "domain")),
-                    "--directory={0}".format(
-                        os.path.relpath(translationsDirectory, workdir)),
-                    "--use-fuzzy",
-                    "--statistics",
-                    "--locale={0}".format(loc),
-                ])
-            
+                argsList.append(
+                    [
+                        "compile",
+                        "--domain={0}".format(
+                            self.__project.getData("flask-babel", "domain")
+                        ),
+                        "--directory={0}".format(
+                            os.path.relpath(translationsDirectory, workdir)
+                        ),
+                        "--use-fuzzy",
+                        "--statistics",
+                        "--locale={0}".format(loc),
+                    ]
+                )
+
             dlg = PyBabelCommandDialog(
-                self, title=title,
-                msgSuccess=self.tr("\nMessage catalogs compiled successfully.")
+                self,
+                title=title,
+                msgSuccess=self.tr("\nMessage catalogs compiled successfully."),
             )
             res = dlg.startBatchCommand(argsList, workdir)
             if res:
                 dlg.exec()
-            
+
                 for entry in os.walk(translationsDirectory):
                     for fileName in entry[2]:
                         fullName = os.path.join(entry[0], fileName)
-                        if fullName.endswith('.mo'):
+                        if fullName.endswith(".mo"):
                             self.__ericProject.appendFile(fullName)
-    
+
     def updateCatalogs(self, filenames, withObsolete=False):
         """
         Public method to update the message catalogs.
-        
+
         @param filenames list of filenames (not used)
         @type list of str
         @param withObsolete flag indicating to keep obsolete translations
         @type bool
         """
         title = self.tr("Updating message catalogs")
-        
+
         if self.__ensurePybabelConfigured():
             workdir = self.__project.getApplication()[0]
-            translationsDirectory = (
-                self.__ericProject.getAbsoluteUniversalPath(
-                    self.__project.getData(
-                        "flask-babel", "translationsDirectory")
-                )
+            translationsDirectory = self.__ericProject.getAbsoluteUniversalPath(
+                self.__project.getData("flask-babel", "translationsDirectory")
             )
             potFile = self.__ericProject.getAbsoluteUniversalPath(
-                self.__project.getData("flask-babel", "catalogFile"))
-            
+                self.__project.getData("flask-babel", "catalogFile")
+            )
+
             args = [
-                "--domain={0}".format(
-                    self.__project.getData("flask-babel", "domain")),
+                "--domain={0}".format(self.__project.getData("flask-babel", "domain")),
                 "--input-file={0}".format(os.path.relpath(potFile, workdir)),
                 "--output-dir={0}".format(
-                    os.path.relpath(translationsDirectory, workdir)),
+                    os.path.relpath(translationsDirectory, workdir)
+                ),
             ]
             if not withObsolete:
                 args.append("--ignore-obsolete")
-            
+
             dlg = PyBabelCommandDialog(
-                self, title,
-                msgSuccess=self.tr("\nMessage catalogs updated successfully.")
+                self,
+                title,
+                msgSuccess=self.tr("\nMessage catalogs updated successfully."),
             )
             res = dlg.startCommand("update", args, workdir)
             if res:
                 dlg.exec()
-    
+
     def updateCatalogsObsolete(self, filenames):
         """
         Public method to update the message catalogs keeping obsolete
         translations.
-        
+
         @param filenames list of filenames (not used)
         @type list of str
         """
         self.updateCatalogs(filenames, withObsolete=True)
-    
+
     def updateSelectedCatalogs(self, filenames, withObsolete=False):
         """
         Public method to update the selected message catalogs.
-        
+
         @param filenames list of filenames
         @type list of str
         @param withObsolete flag indicating to keep obsolete translations
         @type bool
         """
         title = self.tr("Updating message catalogs")
-        
+
         locales = {self.__getLocale(f) for f in filenames}
-        
+
         if len(locales) == 0:
             EricMessageBox.warning(
-                self.__ui,
-                title,
-                self.tr('No locales detected. Aborting...'))
+                self.__ui, title, self.tr("No locales detected. Aborting...")
+            )
             return
-        
+
         if self.__ensurePybabelConfigured():
             workdir = self.__project.getApplication()[0]
-            translationsDirectory = (
-                self.__ericProject.getAbsoluteUniversalPath(
-                    self.__project.getData(
-                        "flask-babel", "translationsDirectory")
-                )
+            translationsDirectory = self.__ericProject.getAbsoluteUniversalPath(
+                self.__project.getData("flask-babel", "translationsDirectory")
             )
             potFile = self.__ericProject.getAbsoluteUniversalPath(
-                self.__project.getData("flask-babel", "catalogFile"))
+                self.__project.getData("flask-babel", "catalogFile")
+            )
             argsList = []
             for loc in locales:
                 args = [
                     "update",
                     "--domain={0}".format(
-                        self.__project.getData("flask-babel", "domain")),
-                    "--input-file={0}".format(
-                        os.path.relpath(potFile, workdir)),
+                        self.__project.getData("flask-babel", "domain")
+                    ),
+                    "--input-file={0}".format(os.path.relpath(potFile, workdir)),
                     "--output-dir={0}".format(
-                        os.path.relpath(translationsDirectory, workdir)),
+                        os.path.relpath(translationsDirectory, workdir)
+                    ),
                     "--locale={0}".format(loc),
                 ]
                 if not withObsolete:
                     args.append("--ignore-obsolete")
                 argsList.append(args)
-            
+
             dlg = PyBabelCommandDialog(
-                self, title=title,
-                msgSuccess=self.tr("\nMessage catalogs updated successfully.")
+                self,
+                title=title,
+                msgSuccess=self.tr("\nMessage catalogs updated successfully."),
             )
             res = dlg.startBatchCommand(argsList, workdir)
             if res:
                 dlg.exec()
-    
+
     def updateSelectedCatalogsObsolete(self, filenames):
         """
         Public method to update the message catalogs keeping obsolete
         translations.
-        
+
         @param filenames list of filenames (not used)
         @type list of str
         """

eric ide

mercurial