diff -r 0af028b93cb3 -r 7991ea245c20 eric6/Project/ProjectTranslationsBrowser.py --- a/eric6/Project/ProjectTranslationsBrowser.py Mon Dec 21 13:36:24 2020 +0100 +++ b/eric6/Project/ProjectTranslationsBrowser.py Tue Dec 22 19:59:29 2020 +0100 @@ -101,7 +101,8 @@ self.menu = QMenu(self) if self.project.getProjectType() in [ - "PyQt5", "PyQt5C", "E6Plugin", "PySide2", "PySide2C" + "PyQt5", "PyQt5C", "PyQt6", "PyQt6C", "E6Plugin", + "PySide2", "PySide2C" ]: act = self.menu.addAction( self.tr('Generate translation'), self.__generateSelected) @@ -228,7 +229,8 @@ self.backMenu = QMenu(self) if self.project.getProjectType() in [ - "PyQt5", "PyQt5C", "E6Plugin", "PySide2", "PySide2C" + "PyQt5", "PyQt5C", "PyQt6", "PyQt6C", "E6Plugin", + "PySide2", "PySide2C" ]: act = self.backMenu.addAction( self.tr('Generate all translations'), @@ -289,7 +291,8 @@ # create the menu for multiple selected files self.multiMenu = QMenu(self) if self.project.getProjectType() in [ - "PyQt5", "PyQt5C", "E6Plugin", "PySide2", "PySide2C" + "PyQt5", "PyQt5C", "PyQt6", "PyQt6C", "E6Plugin", + "PySide2", "PySide2C" ]: act = self.multiMenu.addAction( self.tr('Generate translations'), @@ -373,7 +376,8 @@ self.dirMenu = QMenu(self) if self.project.getProjectType() in [ - "PyQt5", "PyQt5C", "E6Plugin", "PySide2", "PySide2C" + "PyQt5", "PyQt5C", "PyQt6", "PyQt6C", "E6Plugin", + "PySide2", "PySide2C" ]: act = self.dirMenu.addAction( self.tr('Generate all translations'), @@ -491,7 +495,8 @@ Private slot called by the menu aboutToShow signal. """ if self.project.getProjectType() in [ - "PyQt5", "PyQt5C", "E6Plugin", "PySide2", "PySide2C" + "PyQt5", "PyQt5C", "PyQt6", "PyQt6C", "E6Plugin", + "PySide2", "PySide2C" ]: tsFiles = 0 qmFiles = 0 @@ -535,7 +540,8 @@ Private slot called by the multiMenu aboutToShow signal. """ if self.project.getProjectType() in [ - "PyQt5", "PyQt5C", "E6Plugin", "PySide2", "PySide2C" + "PyQt5", "PyQt5C", "PyQt6", "PyQt6C", "E6Plugin", + "PySide2", "PySide2C" ]: tsFiles = 0 qmFiles = 0 @@ -577,7 +583,8 @@ Private slot called by the dirMenu aboutToShow signal. """ if self.project.getProjectType() in [ - "PyQt5", "PyQt5C", "E6Plugin", "PySide2", "PySide2C" + "PyQt5", "PyQt5C", "PyQt6", "PyQt6C", "E6Plugin", + "PySide2", "PySide2C" ]: if self.pylupdateProcRunning: for act in self.tsprocDirMenuActions: @@ -597,7 +604,8 @@ Private slot called by the backMenu aboutToShow signal. """ if self.project.getProjectType() in [ - "PyQt5", "PyQt5C", "E6Plugin", "PySide2", "PySide2C" + "PyQt5", "PyQt5C", "PyQt6", "PyQt6C", "E6Plugin", + "PySide2", "PySide2C" ]: if self.pylupdateProcRunning: for act in self.tsprocBackMenuActions: @@ -955,14 +963,16 @@ for index in range(len(self.__pylupdateProcesses)): if proc == self.__pylupdateProcesses[index][0]: - try: - self.__tmpProjects.remove( - self.__pylupdateProcesses[index][1]) - os.remove(self.__pylupdateProcesses[index][1]) - except OSError: - pass + tmpProjectFile = self.__pylupdateProcesses[index][1] + if tmpProjectFile: + try: + self.__tmpProjects.remove(tmpProjectFile) + os.remove(tmpProjectFile) + except OSError: + pass del self.__pylupdateProcesses[index] break + if not self.__pylupdateProcesses: # all done self.pylupdateProcRunning = False @@ -1008,19 +1018,22 @@ self.hooks["generateSelectedWithObsolete"](li) return - # generate a minimal temporary projectfile suitable for pylupdate + # generate a minimal temporary project file suitable for pylupdate self.__tmpProjects = [] if self.project.getProjectLanguage() in [ "Python", "Python3" ]: - ok = self.__writeTempProjectFile(langs, [".py"]) + if self.project.getProjectType() not in ["PyQt6", "PyQt6C"]: + ok = self.__writeTempProjectFile(langs, [".py"]) + if not ok: + return else: - ok = False - if not ok: return if self.project.getProjectType() in ["PyQt5", "PyQt5C"]: self.pylupdate = Utilities.generatePyQtToolPath('pylupdate5') + elif self.project.getProjectType() in ["PyQt6", "PyQt6C"]: + self.pylupdate = Utilities.generatePyQtToolPath('pylupdate6') elif self.project.getProjectType() in ["E6Plugin"]: self.pylupdate = Utilities.generatePyQtToolPath('pylupdate5') elif self.project.getProjectType() in ["PySide2", "PySide2C"]: @@ -1030,43 +1043,96 @@ return self.__pylupdateProcesses = [] - for tempProjectFile in self.__tmpProjects[:]: - proc = QProcess() - args = [] + if self.project.getProjectType() in ["PyQt6", "PyQt6C"]: + if langs: + langs = [self.project.getRelativePath(lang.fileName()) + for lang in langs if lang.fileName().endswith('.ts')] + else: + try: + pattern = self.project.pdata["TRANSLATIONPATTERN"].replace( + "%language%", "*") + langs = [ + lang for lang in self.project.pdata["TRANSLATIONS"] + if fnmatch.fnmatch(lang, pattern) + ] + except IndexError: + langs = [] + if not langs: + E5MessageBox.warning( + self, + self.tr("Write temporary project file"), + self.tr("""No translation files (*.ts) selected.""")) + return + for lang in langs: + proc = QProcess() + args = [] - if noobsolete: - args.append('-noobsolete') - - args.append('-verbose') - path, filename = os.path.split(tempProjectFile) - args.append(filename) - proc.setWorkingDirectory(os.path.join(self.project.ppath, path)) - proc.finished.connect( - lambda c, s: self.__generateTSFileDone(c, s, proc)) - proc.readyReadStandardOutput.connect( - lambda: self.__readStdoutLupdate(proc)) - proc.readyReadStandardError.connect( - lambda: self.__readStderrLupdate(proc)) - - proc.start(self.pylupdate, args) - procStarted = proc.waitForStarted() - if procStarted: - self.pylupdateProcRunning = True - self.__pylupdateProcesses.append((proc, tempProjectFile)) - else: - E5MessageBox.critical( - self, - self.tr('Process Generation Error'), - self.tr( - 'Could not start {0}.<br>' - 'Ensure that it is in the search path.' - ).format(self.pylupdate)) - # cleanup - try: - self.__tmpProjects.remove(tempProjectFile) - os.remove(tempProjectFile) - except OSError: - pass + if noobsolete: + args.append('--no-obsolete') + + args += ["--ts", lang] + args.append(".") + + proc.setWorkingDirectory(self.project.ppath) + proc.finished.connect( + lambda c, s: self.__generateTSFileDone(c, s, proc)) + proc.readyReadStandardOutput.connect( + lambda: self.__readStdoutLupdate(proc)) + proc.readyReadStandardError.connect( + lambda: self.__readStderrLupdate(proc)) + + proc.start(self.pylupdate, args) + procStarted = proc.waitForStarted() + if procStarted: + self.pylupdateProcRunning = True + self.__pylupdateProcesses.append((proc, "")) + else: + E5MessageBox.critical( + self, + self.tr('Process Generation Error'), + self.tr( + 'Could not start {0}.<br>' + 'Ensure that it is in the search path.' + ).format(self.pylupdate)) + else: + for tempProjectFile in self.__tmpProjects[:]: + proc = QProcess() + args = [] + + if noobsolete: + args.append('-noobsolete') + + args.append('-verbose') + path, filename = os.path.split(tempProjectFile) + args.append(filename) + proc.setWorkingDirectory( + os.path.join(self.project.ppath, path)) + proc.finished.connect( + lambda c, s: self.__generateTSFileDone(c, s, proc)) + proc.readyReadStandardOutput.connect( + lambda: self.__readStdoutLupdate(proc)) + proc.readyReadStandardError.connect( + lambda: self.__readStderrLupdate(proc)) + + proc.start(self.pylupdate, args) + procStarted = proc.waitForStarted() + if procStarted: + self.pylupdateProcRunning = True + self.__pylupdateProcesses.append((proc, tempProjectFile)) + else: + E5MessageBox.critical( + self, + self.tr('Process Generation Error'), + self.tr( + 'Could not start {0}.<br>' + 'Ensure that it is in the search path.' + ).format(self.pylupdate)) + # cleanup + try: + self.__tmpProjects.remove(tempProjectFile) + os.remove(tempProjectFile) + except OSError: + pass def __generateAll(self): """ @@ -1182,7 +1248,8 @@ return if self.project.getProjectType() in [ - "PyQt5", "PyQt5C", "E6Plugin", "PySide2", "PySide2C" + "PyQt5", "PyQt5C", "PyQt6", "PyQt6C", "E6Plugin", + "PySide2", "PySide2C" ]: lrelease = os.path.join( Utilities.getQtBinariesPath(),