Project/ProjectTranslationsBrowser.py

branch
Py2 comp.
changeset 2789
6593aab36403
parent 2677
3d4277929fb3
child 2791
a9577f248f04
equal deleted inserted replaced
2717:34ef4eccdf6c 2789:6593aab36403
79 79
80 self.lreleaseProc = None 80 self.lreleaseProc = None
81 self.lreleaseProcRunning = False 81 self.lreleaseProcRunning = False
82 self.pylupdateProc = None 82 self.pylupdateProc = None
83 self.pylupdateProcRunning = False 83 self.pylupdateProcRunning = False
84 self.tmpProject = []
84 85
85 def _createPopupMenus(self): 86 def _createPopupMenus(self):
86 """ 87 """
87 Protected overloaded method to generate the popup menu. 88 Protected overloaded method to generate the popup menu.
88 """ 89 """
688 if s.startswith(transExcept): 689 if s.startswith(transExcept):
689 addIt = False 690 addIt = False
690 break 691 break
691 if addIt: 692 if addIt:
692 sources.append(s) 693 sources.append(s)
693 sections = [("SOURCES", sources)]
694 694
695 _forms = [f for f in self.project.pdata["FORMS"] if f.endswith('.ui')] 695 _forms = [f for f in self.project.pdata["FORMS"] if f.endswith('.ui')]
696 forms = [] 696 forms = []
697 for f in _forms: 697 for f in _forms:
698 addIt = True 698 addIt = True
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.
858 else: 875 else:
859 E5MessageBox.critical(self, 876 E5MessageBox.critical(self,
860 self.trUtf8("Translation file generation"), 877 self.trUtf8("Translation file generation"),
861 self.trUtf8("The generation of the translation files (*.ts) has failed.")) 878 self.trUtf8("The generation of the translation files (*.ts) has failed."))
862 self.pylupdateProc = None 879 self.pylupdateProc = None
863 self.pylupdate = ""
864 try:
865 os.remove(self.tmpProject)
866 except EnvironmentError:
867 pass
868 self.tmpProject = None
869 880
870 def __generateTSFile(self, noobsolete=False, generateAll=True): 881 def __generateTSFile(self, noobsolete=False, generateAll=True):
871 """ 882 """
872 Private method used to run pylupdate/pylupdate4 to generate the .ts files. 883 Private method used to run pylupdate/pylupdate4 to generate the .ts files.
873 884
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

eric ide

mercurial