17 from PyQt5.QtWidgets import QDialog, QMenu |
17 from PyQt5.QtWidgets import QDialog, QMenu |
18 |
18 |
19 from E5Gui import E5MessageBox |
19 from E5Gui import E5MessageBox |
20 from E5Gui.E5Application import e5App |
20 from E5Gui.E5Application import e5App |
21 |
21 |
22 from .ProjectBrowserModel import ProjectBrowserFileItem, \ |
22 from .ProjectBrowserModel import ( |
23 ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem, \ |
23 ProjectBrowserFileItem, ProjectBrowserSimpleDirectoryItem, |
24 ProjectBrowserTranslationType |
24 ProjectBrowserDirectoryItem, ProjectBrowserTranslationType |
|
25 ) |
25 from .ProjectBaseBrowser import ProjectBaseBrowser |
26 from .ProjectBaseBrowser import ProjectBaseBrowser |
26 |
27 |
27 import UI.PixmapCache |
28 import UI.PixmapCache |
28 |
29 |
29 import Preferences |
30 import Preferences |
54 """ |
55 """ |
55 ProjectBaseBrowser.__init__(self, project, |
56 ProjectBaseBrowser.__init__(self, project, |
56 ProjectBrowserTranslationType, parent) |
57 ProjectBrowserTranslationType, parent) |
57 self.isTranslationsBrowser = True |
58 self.isTranslationsBrowser = True |
58 |
59 |
59 self.selectedItemsFilter = \ |
60 self.selectedItemsFilter = [ProjectBrowserFileItem, |
60 [ProjectBrowserFileItem, ProjectBrowserSimpleDirectoryItem] |
61 ProjectBrowserSimpleDirectoryItem] |
61 |
62 |
62 self.setWindowTitle(self.tr('Translations')) |
63 self.setWindowTitle(self.tr('Translations')) |
63 |
64 |
64 self.setWhatsThis(self.tr( |
65 self.setWhatsThis(self.tr( |
65 """<b>Project Translations Browser</b>""" |
66 """<b>Project Translations Browser</b>""" |
98 |
99 |
99 self.tsprocBackMenuActions = [] |
100 self.tsprocBackMenuActions = [] |
100 self.qmprocBackMenuActions = [] |
101 self.qmprocBackMenuActions = [] |
101 |
102 |
102 self.menu = QMenu(self) |
103 self.menu = QMenu(self) |
103 if self.project.getProjectType() in \ |
104 if self.project.getProjectType() in [ |
104 ["Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin", |
105 "Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin", |
105 "PySide", "PySideC", "PySide2", "PySideC2"]: |
106 "PySide", "PySideC", "PySide2", "PySideC2" |
|
107 ]: |
106 act = self.menu.addAction( |
108 act = self.menu.addAction( |
107 self.tr('Generate translation'), self.__generateSelected) |
109 self.tr('Generate translation'), self.__generateSelected) |
108 self.tsMenuActions.append(act) |
110 self.tsMenuActions.append(act) |
109 self.tsprocMenuActions.append(act) |
111 self.tsprocMenuActions.append(act) |
110 act = self.menu.addAction( |
112 act = self.menu.addAction( |
225 self.tr('Copy Path to Clipboard'), self._copyToClipboard) |
227 self.tr('Copy Path to Clipboard'), self._copyToClipboard) |
226 self.menu.addSeparator() |
228 self.menu.addSeparator() |
227 self.menu.addAction(self.tr('Configure...'), self._configure) |
229 self.menu.addAction(self.tr('Configure...'), self._configure) |
228 |
230 |
229 self.backMenu = QMenu(self) |
231 self.backMenu = QMenu(self) |
230 if self.project.getProjectType() in \ |
232 if self.project.getProjectType() in [ |
231 ["Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin", |
233 "Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin", |
232 "PySide", "PySideC", "PySide2", "PySideC2"]: |
234 "PySide", "PySideC", "PySide2", "PySideC2" |
|
235 ]: |
233 act = self.backMenu.addAction( |
236 act = self.backMenu.addAction( |
234 self.tr('Generate all translations'), |
237 self.tr('Generate all translations'), |
235 self.__generateAll) |
238 self.__generateAll) |
236 self.tsprocBackMenuActions.append(act) |
239 self.tsprocBackMenuActions.append(act) |
237 act = self.backMenu.addAction( |
240 act = self.backMenu.addAction( |
286 self.backMenu.addAction(self.tr('Configure...'), self._configure) |
289 self.backMenu.addAction(self.tr('Configure...'), self._configure) |
287 self.backMenu.setEnabled(False) |
290 self.backMenu.setEnabled(False) |
288 |
291 |
289 # create the menu for multiple selected files |
292 # create the menu for multiple selected files |
290 self.multiMenu = QMenu(self) |
293 self.multiMenu = QMenu(self) |
291 if self.project.getProjectType() in \ |
294 if self.project.getProjectType() in [ |
292 ["Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin", |
295 "Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin", |
293 "PySide", "PySideC", "PySide2", "PySideC2"]: |
296 "PySide", "PySideC", "PySide2", "PySideC2" |
|
297 ]: |
294 act = self.multiMenu.addAction( |
298 act = self.multiMenu.addAction( |
295 self.tr('Generate translations'), |
299 self.tr('Generate translations'), |
296 self.__generateSelected) |
300 self.__generateSelected) |
297 self.tsMultiMenuActions.append(act) |
301 self.tsMultiMenuActions.append(act) |
298 self.tsprocMultiMenuActions.append(act) |
302 self.tsprocMultiMenuActions.append(act) |
370 self.multiMenuActions.append(act) |
374 self.multiMenuActions.append(act) |
371 self.multiMenu.addSeparator() |
375 self.multiMenu.addSeparator() |
372 self.multiMenu.addAction(self.tr('Configure...'), self._configure) |
376 self.multiMenu.addAction(self.tr('Configure...'), self._configure) |
373 |
377 |
374 self.dirMenu = QMenu(self) |
378 self.dirMenu = QMenu(self) |
375 if self.project.getProjectType() in \ |
379 if self.project.getProjectType() in [ |
376 ["Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin", |
380 "Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin", |
377 "PySide", "PySideC", "PySide2", "PySideC2"]: |
381 "PySide", "PySideC", "PySide2", "PySideC2" |
|
382 ]: |
378 act = self.dirMenu.addAction( |
383 act = self.dirMenu.addAction( |
379 self.tr('Generate all translations'), |
384 self.tr('Generate all translations'), |
380 self.__generateAll) |
385 self.__generateAll) |
381 self.tsprocDirMenuActions.append(act) |
386 self.tsprocDirMenuActions.append(act) |
382 act = self.dirMenu.addAction( |
387 act = self.dirMenu.addAction( |
488 |
493 |
489 def __showContextMenu(self): |
494 def __showContextMenu(self): |
490 """ |
495 """ |
491 Private slot called by the menu aboutToShow signal. |
496 Private slot called by the menu aboutToShow signal. |
492 """ |
497 """ |
493 if self.project.getProjectType() in \ |
498 if self.project.getProjectType() in [ |
494 ["Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin", |
499 "Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin", |
495 "PySide", "PySideC", "PySide2", "PySideC2"]: |
500 "PySide", "PySideC", "PySide2", "PySideC2" |
|
501 ]: |
496 tsFiles = 0 |
502 tsFiles = 0 |
497 qmFiles = 0 |
503 qmFiles = 0 |
498 itmList = self.getSelectedItems() |
504 itmList = self.getSelectedItems() |
499 for itm in itmList[:]: |
505 for itm in itmList[:]: |
500 if itm.fileName().endswith('.ts'): |
506 if itm.fileName().endswith('.ts'): |
501 tsFiles += 1 |
507 tsFiles += 1 |
502 elif itm.fileName().endswith('.qm'): |
508 elif itm.fileName().endswith('.qm'): |
503 qmFiles += 1 |
509 qmFiles += 1 |
504 if (tsFiles > 0 and qmFiles > 0) or \ |
510 if ( |
505 (tsFiles == 0 and qmFiles == 0): |
511 (tsFiles > 0 and qmFiles > 0) or |
|
512 (tsFiles == 0 and qmFiles == 0) |
|
513 ): |
506 for act in self.tsMenuActions + self.qmMenuActions: |
514 for act in self.tsMenuActions + self.qmMenuActions: |
507 act.setEnabled(False) |
515 act.setEnabled(False) |
508 elif tsFiles > 0: |
516 elif tsFiles > 0: |
509 for act in self.tsMenuActions: |
517 for act in self.tsMenuActions: |
510 act.setEnabled(True) |
518 act.setEnabled(True) |
530 |
538 |
531 def __showContextMenuMulti(self): |
539 def __showContextMenuMulti(self): |
532 """ |
540 """ |
533 Private slot called by the multiMenu aboutToShow signal. |
541 Private slot called by the multiMenu aboutToShow signal. |
534 """ |
542 """ |
535 if self.project.getProjectType() in \ |
543 if self.project.getProjectType() in [ |
536 ["Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin", |
544 "Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin", |
537 "PySide", "PySideC", "PySide2", "PySideC2"]: |
545 "PySide", "PySideC", "PySide2", "PySideC2" |
|
546 ]: |
538 tsFiles = 0 |
547 tsFiles = 0 |
539 qmFiles = 0 |
548 qmFiles = 0 |
540 itmList = self.getSelectedItems() |
549 itmList = self.getSelectedItems() |
541 for itm in itmList[:]: |
550 for itm in itmList[:]: |
542 if itm.fileName().endswith('.ts'): |
551 if itm.fileName().endswith('.ts'): |
543 tsFiles += 1 |
552 tsFiles += 1 |
544 elif itm.fileName().endswith('.qm'): |
553 elif itm.fileName().endswith('.qm'): |
545 qmFiles += 1 |
554 qmFiles += 1 |
546 if (tsFiles > 0 and qmFiles > 0) or \ |
555 if ( |
547 (tsFiles == 0 and qmFiles == 0): |
556 (tsFiles > 0 and qmFiles > 0) or |
|
557 (tsFiles == 0 and qmFiles == 0) |
|
558 ): |
548 for act in self.tsMultiMenuActions + self.qmMultiMenuActions: |
559 for act in self.tsMultiMenuActions + self.qmMultiMenuActions: |
549 act.setEnabled(False) |
560 act.setEnabled(False) |
550 elif tsFiles > 0: |
561 elif tsFiles > 0: |
551 for act in self.tsMultiMenuActions: |
562 for act in self.tsMultiMenuActions: |
552 act.setEnabled(True) |
563 act.setEnabled(True) |
570 |
581 |
571 def __showContextMenuDir(self): |
582 def __showContextMenuDir(self): |
572 """ |
583 """ |
573 Private slot called by the dirMenu aboutToShow signal. |
584 Private slot called by the dirMenu aboutToShow signal. |
574 """ |
585 """ |
575 if self.project.getProjectType() in \ |
586 if self.project.getProjectType() in [ |
576 ["Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin", |
587 "Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin", |
577 "PySide", "PySideC", "PySide2", "PySideC2"]: |
588 "PySide", "PySideC", "PySide2", "PySideC2" |
|
589 ]: |
578 if self.pylupdateProcRunning: |
590 if self.pylupdateProcRunning: |
579 for act in self.tsprocDirMenuActions: |
591 for act in self.tsprocDirMenuActions: |
580 act.setEnabled(False) |
592 act.setEnabled(False) |
581 if self.lreleaseProcRunning: |
593 if self.lreleaseProcRunning: |
582 for act in self.qmprocDirMenuActions: |
594 for act in self.qmprocDirMenuActions: |
590 |
602 |
591 def __showContextMenuBack(self): |
603 def __showContextMenuBack(self): |
592 """ |
604 """ |
593 Private slot called by the backMenu aboutToShow signal. |
605 Private slot called by the backMenu aboutToShow signal. |
594 """ |
606 """ |
595 if self.project.getProjectType() in \ |
607 if self.project.getProjectType() in [ |
596 ["Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin", |
608 "Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin", |
597 "PySide", "PySideC", "PySide2", "PySideC2"]: |
609 "PySide", "PySideC", "PySide2", "PySideC2" |
|
610 ]: |
598 if self.pylupdateProcRunning: |
611 if self.pylupdateProcRunning: |
599 for act in self.tsprocBackMenuActions: |
612 for act in self.tsprocBackMenuActions: |
600 act.setEnabled(False) |
613 act.setEnabled(False) |
601 if self.lreleaseProcRunning: |
614 if self.lreleaseProcRunning: |
602 for act in self.qmprocBackMenuActions: |
615 for act in self.qmprocBackMenuActions: |
611 Private method to add translation files to the project. |
624 Private method to add translation files to the project. |
612 """ |
625 """ |
613 itm = self.model().item(self.currentIndex()) |
626 itm = self.model().item(self.currentIndex()) |
614 if isinstance(itm, ProjectBrowserFileItem): |
627 if isinstance(itm, ProjectBrowserFileItem): |
615 dn = os.path.dirname(itm.fileName()) |
628 dn = os.path.dirname(itm.fileName()) |
616 elif isinstance(itm, ProjectBrowserSimpleDirectoryItem) or \ |
629 elif isinstance( |
617 isinstance(itm, ProjectBrowserDirectoryItem): |
630 itm, |
|
631 (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem) |
|
632 ): |
618 dn = itm.dirName() |
633 dn = itm.dirName() |
619 else: |
634 else: |
620 dn = None |
635 dn = None |
621 self.project.addFiles('translation', dn) |
636 self.project.addFiles('translation', dn) |
622 |
637 |
663 """ |
678 """ |
664 itmList = self.getSelectedItems() |
679 itmList = self.getSelectedItems() |
665 |
680 |
666 translationFiles = [itm.fileName() for itm in itmList] |
681 translationFiles = [itm.fileName() for itm in itmList] |
667 |
682 |
668 from UI.DeleteFilesConfirmationDialog import \ |
683 from UI.DeleteFilesConfirmationDialog import ( |
669 DeleteFilesConfirmationDialog |
684 DeleteFilesConfirmationDialog |
|
685 ) |
670 dlg = DeleteFilesConfirmationDialog( |
686 dlg = DeleteFilesConfirmationDialog( |
671 self.parent(), |
687 self.parent(), |
672 self.tr("Delete translation files"), |
688 self.tr("Delete translation files"), |
673 self.tr("Do you really want to delete these translation files" |
689 self.tr("Do you really want to delete these translation files" |
674 " from the project?"), |
690 " from the project?"), |
761 if langs: |
777 if langs: |
762 langs = [self.project.getRelativePath(lang.fileName()) |
778 langs = [self.project.getRelativePath(lang.fileName()) |
763 for lang in langs if lang.fileName().endswith('.ts')] |
779 for lang in langs if lang.fileName().endswith('.ts')] |
764 else: |
780 else: |
765 try: |
781 try: |
766 pattern = self.project.pdata["TRANSLATIONPATTERN"]\ |
782 pattern = self.project.pdata["TRANSLATIONPATTERN"].replace( |
767 .replace("%language%", "*") |
783 "%language%", "*") |
768 langs = [lang for lang in self.project.pdata["TRANSLATIONS"] |
784 langs = [lang for lang in self.project.pdata["TRANSLATIONS"] |
769 if fnmatch.fnmatch(lang, pattern)] |
785 if fnmatch.fnmatch(lang, pattern)] |
770 except IndexError: |
786 except IndexError: |
771 langs = [] |
787 langs = [] |
772 if not langs: |
788 if not langs: |
1002 self.hooks["generateSelectedWithObsolete"](li) |
1018 self.hooks["generateSelectedWithObsolete"](li) |
1003 return |
1019 return |
1004 |
1020 |
1005 # generate a minimal temporary projectfile suitable for pylupdate |
1021 # generate a minimal temporary projectfile suitable for pylupdate |
1006 self.__tmpProjects = [] |
1022 self.__tmpProjects = [] |
1007 if self.project.getProjectLanguage() in \ |
1023 if self.project.getProjectLanguage() in [ |
1008 ["Python", "Python2", "Python3"]: |
1024 "Python", "Python2", "Python3" |
|
1025 ]: |
1009 ok = self.__writeTempProjectFile(langs, [".py"]) |
1026 ok = self.__writeTempProjectFile(langs, [".py"]) |
1010 else: |
1027 else: |
1011 ok = False |
1028 ok = False |
1012 if not ok: |
1029 if not ok: |
1013 return |
1030 return |
1177 li = [self.project.getRelativePath(lang.fileName()) |
1194 li = [self.project.getRelativePath(lang.fileName()) |
1178 for lang in langs] |
1195 for lang in langs] |
1179 self.hooks["releaseSelected"](li) |
1196 self.hooks["releaseSelected"](li) |
1180 return |
1197 return |
1181 |
1198 |
1182 if self.project.getProjectType() in \ |
1199 if self.project.getProjectType() in [ |
1183 ["Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin", |
1200 "Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin", |
1184 "PySide", "PySideC", "PySide2", "PySideC2"]: |
1201 "PySide", "PySideC", "PySide2", "PySideC2" |
|
1202 ]: |
1185 lrelease = os.path.join( |
1203 lrelease = os.path.join( |
1186 Utilities.getQtBinariesPath(), |
1204 Utilities.getQtBinariesPath(), |
1187 Utilities.generateQtToolName("lrelease")) |
1205 Utilities.generateQtToolName("lrelease")) |
1188 else: |
1206 else: |
1189 return |
1207 return |
1193 if langs: |
1211 if langs: |
1194 langs = [self.project.getRelativePath(lang.fileName()) |
1212 langs = [self.project.getRelativePath(lang.fileName()) |
1195 for lang in langs if lang.fileName().endswith('.ts')] |
1213 for lang in langs if lang.fileName().endswith('.ts')] |
1196 else: |
1214 else: |
1197 try: |
1215 try: |
1198 pattern = self.project.pdata["TRANSLATIONPATTERN"]\ |
1216 pattern = self.project.pdata["TRANSLATIONPATTERN"].replace( |
1199 .replace("%language%", "*") |
1217 "%language%", "*") |
1200 langs = [lang for lang in self.project.pdata["TRANSLATIONS"] |
1218 langs = [lang for lang in self.project.pdata["TRANSLATIONS"] |
1201 if fnmatch.fnmatch(lang, pattern)] |
1219 if fnmatch.fnmatch(lang, pattern)] |
1202 except IndexError: |
1220 except IndexError: |
1203 langs = [] |
1221 langs = [] |
1204 if not langs: |
1222 if not langs: |