eric6/Project/ProjectTranslationsBrowser.py

changeset 7907
7991ea245c20
parent 7836
2f0d208b8137
child 7911
4621c9082a43
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(),

eric ide

mercurial