700 if f.startswith(transExcept): |
700 if f.startswith(transExcept): |
701 addIt = False |
701 addIt = False |
702 break |
702 break |
703 if addIt: |
703 if addIt: |
704 forms.append(f) |
704 forms.append(f) |
705 sections.append(("FORMS", forms)) |
|
706 |
705 |
707 if langs: |
706 if langs: |
708 l = [self.project.getRelativePath(lang.fileName()) \ |
707 langs = [self.project.getRelativePath(lang.fileName()) \ |
709 for lang in langs if lang.fileName().endswith('.ts')] |
708 for lang in langs if lang.fileName().endswith('.ts')] |
710 else: |
709 else: |
711 try: |
710 try: |
712 pattern = self.project.pdata["TRANSLATIONPATTERN"][0]\ |
711 pattern = self.project.pdata["TRANSLATIONPATTERN"][0]\ |
713 .replace("%language%", "*") |
712 .replace("%language%", "*") |
714 l = [lang for lang in self.project.pdata["TRANSLATIONS"] \ |
713 langs = [lang for lang in self.project.pdata["TRANSLATIONS"] \ |
715 if fnmatch.fnmatch(lang, pattern)] |
714 if fnmatch.fnmatch(lang, pattern)] |
716 except IndexError: |
715 except IndexError: |
717 l = [] |
716 langs = [] |
718 if l: |
717 if not langs: |
719 sections.append(("TRANSLATIONS", l)) |
|
720 else: |
|
721 E5MessageBox.warning(self, |
718 E5MessageBox.warning(self, |
722 self.trUtf8("Write temporary project file"), |
719 self.trUtf8("Write temporary project file"), |
723 self.trUtf8("""No translation files (*.ts) selected.""")) |
720 self.trUtf8("""No translation files (*.ts) selected.""")) |
724 return False |
721 return False |
725 |
722 |
726 try: |
723 # create a prefix relative from the *.ts down to the project path |
727 pf = open(pfile, "w", encoding="utf-8") |
724 langLevel = {} |
728 for key, list in sections: |
725 for lang in langs: |
729 if len(list) > 0: |
726 level = lang.count(os.sep) |
730 pf.write('{0} = '.format(key)) |
727 lst = langLevel.get(level, []) |
731 last = len(list) - 1 |
728 lst.append(lang) |
732 if last > 0: |
729 langLevel[level] = lst |
733 pf.write('{0} \\{1}'.format( |
730 |
734 list[0].replace(os.sep, '/'), "\n")) |
731 for level, langs in langLevel.items(): |
735 for i in range(1, last): |
732 prefix = '../' * level |
736 pf.write('\t{0} \\{1}'.format( |
733 sections = [("SOURCES", |
737 list[i].replace(os.sep, '/'), "\n")) |
734 [prefix + src for src in sources])] |
738 pf.write('\t{0} {1}{2}'.format( |
735 sections.append(("FORMS", |
739 list[last].replace(os.sep, '/'), "\n", "\n")) |
736 [prefix + form for form in forms])) |
740 else: |
737 sections.append(("TRANSLATIONS", |
741 pf.write('{0} {1}{2}'.format( |
738 [prefix + lang for lang in langs])) |
742 list[0].replace(os.sep, '/'), "\n", "\n")) |
739 |
743 |
740 dir, name = os.path.split(pfile) |
744 pf.close() |
741 outFile = os.path.join(dir, os.path.dirname(langs[0]), name) |
745 self.tmpProject = pfile |
742 try: |
746 return True |
743 pf = open(outFile, "w", encoding="utf-8") |
747 except IOError: |
744 for key, list in sections: |
748 E5MessageBox.critical(self, |
745 if len(list) > 0: |
749 self.trUtf8("Write temporary project file"), |
746 pf.write('{0} = '.format(key)) |
750 self.trUtf8("<p>The temporary project file <b>{0}</b> could not" |
747 last = len(list) - 1 |
751 " be written.</p>").format(pfile)) |
748 if last > 0: |
752 self.tmpProject = None |
749 pf.write('{0} \\{1}'.format( |
753 return False |
750 list[0].replace(os.sep, '/'), "\n")) |
|
751 for i in range(1, last): |
|
752 pf.write('\t{0} \\{1}'.format( |
|
753 list[i].replace(os.sep, '/'), "\n")) |
|
754 pf.write('\t{0} {1}{2}'.format( |
|
755 list[last].replace(os.sep, '/'), "\n", "\n")) |
|
756 else: |
|
757 pf.write('{0} {1}{2}'.format( |
|
758 list[0].replace(os.sep, '/'), "\n", "\n")) |
|
759 |
|
760 pf.close() |
|
761 self.tmpProject.append(outFile) |
|
762 except IOError: |
|
763 E5MessageBox.critical(self, |
|
764 self.trUtf8("Write temporary project file"), |
|
765 self.trUtf8("<p>The temporary project file <b>{0}</b> could not" |
|
766 " be written.</p>").format(outFile)) |
|
767 self.tmpProject = [] |
|
768 return False |
|
769 |
|
770 return True |
754 |
771 |
755 def __readStdoutLupdate(self): |
772 def __readStdoutLupdate(self): |
756 """ |
773 """ |
757 Private slot to handle the readyReadStandardOutput signal of the |
774 Private slot to handle the readyReadStandardOutput signal of the |
758 pylupdate process. |
775 pylupdate process. |
912 else: |
923 else: |
913 ok = False |
924 ok = False |
914 if not ok: |
925 if not ok: |
915 return |
926 return |
916 |
927 |
917 self.pylupdateProc = QProcess() |
|
918 args = [] |
|
919 |
|
920 if self.project.getProjectType() in ["Qt4", "Qt4C", "E4Plugin"]: |
928 if self.project.getProjectType() in ["Qt4", "Qt4C", "E4Plugin"]: |
921 self.pylupdate = 'pylupdate4' |
929 self.pylupdate = 'pylupdate4' |
922 if Utilities.isWindowsPlatform(): |
930 if Utilities.isWindowsPlatform(): |
923 self.pylupdate = self.pylupdate + '.exe' |
931 self.pylupdate = self.pylupdate + '.exe' |
924 elif self.project.getProjectType() in ["PySide", "PySideC"]: |
932 elif self.project.getProjectType() in ["PySide", "PySideC"]: |
925 self.pylupdate = Utilities.generatePySideToolPath('pyside-lupdate') |
933 self.pylupdate = Utilities.generatePySideToolPath('pyside-lupdate') |
926 else: |
934 else: |
927 return |
935 return |
928 |
936 |
929 if noobsolete: |
937 for tempProjectFile in self.tmpProject: |
930 args.append('-noobsolete') |
938 self.pylupdateProc = QProcess() |
931 |
939 args = [] |
932 args.append('-verbose') |
940 |
933 args.append(self.tmpProject) |
941 if noobsolete: |
934 self.pylupdateProc.setWorkingDirectory(self.project.ppath) |
942 args.append('-noobsolete') |
935 self.pylupdateProc.finished.connect(self.__generateTSFileDone) |
943 |
936 self.pylupdateProc.readyReadStandardOutput.connect(self.__readStdoutLupdate) |
944 args.append('-verbose') |
937 self.pylupdateProc.readyReadStandardError.connect(self.__readStderrLupdate) |
945 path, filename = os.path.split(tempProjectFile) |
938 |
946 args.append(filename) |
939 self.pylupdateProc.start(self.pylupdate, args) |
947 self.pylupdateProc.setWorkingDirectory(os.path.join(self.project.ppath, path)) |
940 procStarted = self.pylupdateProc.waitForStarted() |
948 self.pylupdateProc.finished.connect(self.__generateTSFileDone) |
941 if procStarted: |
949 self.pylupdateProc.readyReadStandardOutput.connect(self.__readStdoutLupdate) |
942 self.pylupdateProcRunning = True |
950 self.pylupdateProc.readyReadStandardError.connect(self.__readStderrLupdate) |
943 else: |
951 |
944 E5MessageBox.critical(self, |
952 self.pylupdateProc.start(self.pylupdate, args) |
945 self.trUtf8('Process Generation Error'), |
953 procStarted = self.pylupdateProc.waitForStarted() |
946 self.trUtf8( |
954 if procStarted: |
947 'Could not start {0}.<br>' |
955 self.pylupdateProcRunning = True |
948 'Ensure that it is in the search path.' |
956 self.pylupdateProc.waitForFinished(10000) |
949 ).format(self.pylupdate)) |
957 else: |
|
958 E5MessageBox.critical(self, |
|
959 self.trUtf8('Process Generation Error'), |
|
960 self.trUtf8( |
|
961 'Could not start {0}.<br>' |
|
962 'Ensure that it is in the search path.' |
|
963 ).format(self.pylupdate)) |
|
964 # cleanup |
|
965 try: |
|
966 for fn in self.tmpProject: |
|
967 os.remove(fn) |
|
968 except EnvironmentError: |
|
969 pass |
|
970 self.tmpProject = [] |
950 |
971 |
951 def __generateAll(self): |
972 def __generateAll(self): |
952 """ |
973 """ |
953 Private method to generate all translation files (.ts) for Qt Linguist. |
974 Private method to generate all translation files (.ts) for Qt Linguist. |
954 |
975 |