diff -r 506c78268b18 -r da6ef8ab8268 ProjectFlask/Project.py --- a/ProjectFlask/Project.py Sun Nov 15 17:35:48 2020 +0100 +++ b/ProjectFlask/Project.py Sun Nov 15 19:53:56 2020 +0100 @@ -53,6 +53,7 @@ self.__virtualEnvManager = e5App().getObject("VirtualEnvManager") self.__menus = {} # dictionary with references to menus + self.__hooksInstalled = False self.__serverDialog = None self.__routesDialog = None @@ -264,6 +265,78 @@ """ return list(self.__menus.keys()) + def registerOpenHook(self): + """ + Public method to register the open hook to open a translations file + in a translations editor. + """ + if self.__hooksInstalled: + editor = self.__plugin.getPreferences("TranslationsEditor") + if editor: + self.__translationsBrowser.addHookMethodAndMenuEntry( + "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.__e5project.getProjectType() == "Flask": +## self.__formsBrowser = ( +## e5App().getObject("ProjectBrowser") +## .getProjectBrowser("forms")) +## self.__formsBrowser.addHookMethodAndMenuEntry( +## "newForm", self.newForm, self.tr("New template...")) +## + if self.flaskBabelAvailable(): + self.__e5project.projectLanguageAddedByCode.connect( + self.__projectLanguageAdded) + self.__translationsBrowser = ( + e5App().getObject("ProjectBrowser") + .getProjectBrowser("translations")) + self.__translationsBrowser.addHookMethodAndMenuEntry( + "extractMessages", self.extractMessages, + self.tr("Extract Messages")) + self.__translationsBrowser.addHookMethodAndMenuEntry( + "releaseAll", self.compileCatalogs, + self.tr("Compile All Catalogs")) + self.__translationsBrowser.addHookMethodAndMenuEntry( + "releaseSelected", self.compileSelectedCatalogs, + self.tr("Compile Selected Catalogs")) + self.__translationsBrowser.addHookMethodAndMenuEntry( + "generateAll", self.updateCatalogs, + self.tr("Update All Catalogs")) + self.__translationsBrowser.addHookMethodAndMenuEntry( + "generateSelected", self.updateSelectedCatalogs, + self.tr("Update Selected Catalogs")) + + self.__hooksInstalled = True + + self.registerOpenHook() + + def projectClosedHooks(self): + """ + Public method to remove our hook methods. + """ + if self.__hooksInstalled: +## self.__formsBrowser.removeHookMethod("newForm") +## self.__formsBrowser = None +## + self.__e5project.projectLanguageAddedByCode.disconnect( + self.__projectLanguageAdded) + self.__translationsBrowser.removeHookMethod("extractMessages") + self.__translationsBrowser.removeHookMethod("releaseAll") + self.__translationsBrowser.removeHookMethod("releaseSelected") + self.__translationsBrowser.removeHookMethod("generateAll") + self.__translationsBrowser.removeHookMethod("generateSelected") + self.__translationsBrowser.removeHookMethod("open") + self.__translationsBrowser = None + + self.__hooksInstalled = False + ################################################################## ## slots below implement general functionality ################################################################## @@ -275,8 +348,6 @@ for dlg in (self.__serverDialog, self.__routesDialog): if dlg is not None: dlg.close() -## if self.__serverProc is not None: -## self.__serverProcFinished() def supportedPythonVariants(self): """ @@ -583,3 +654,57 @@ dlg = FlaskCommandDialog(self) if dlg.startCommand("init-db"): dlg.exec() + + ################################################################## + ## slots and methods below implement i18n and l10n support + ################################################################## + + def flaskBabelAvailable(self): + """ + Public method to check, if the 'flask-babel' package is available. + + @return flag indicating the availability of 'flask-babel' + @rtype bool + """ + venvName = self.__plugin.getPreferences("VirtualEnvironmentNamePy3") + interpreter = self.__virtualEnvManager.getVirtualenvInterpreter( + venvName) + if interpreter and Utilities.isinpath(interpreter): + detector = os.path.join( + os.path.dirname(__file__), "FlaskBabelDetector.py") + proc = QProcess() + proc.setProcessChannelMode(QProcess.MergedChannels) + proc.start(interpreter, [detector]) + finished = proc.waitForFinished(30000) + if finished and proc.exitCode() == 0: + return True + + return False + + def __projectLanguageAdded(self, code): + # TODO: implement this with pybabel ... + pass + + def openPOEditor(self): + # TODO: implement this with pybabel ... + pass + + def extractMessages(self): + # TODO: implement this with pybabel ... + pass + + def compileCatalogs(self): + # TODO: implement this with pybabel ... + pass + + def compileSelectedCatalogs(self): + # TODO: implement this with pybabel ... + pass + + def updateCatalogs(self): + # TODO: implement this with pybabel ... + pass + + def updateSelectedCatalogs(self): + # TODO: implement this with pybabel ... + pass