Project/ProjectTranslationsBrowser.py

changeset 2995
63d874899b8b
parent 2965
d133c7edd88a
child 3010
befeff46ec0f
equal deleted inserted replaced
2994:5ae1349b8fb4 2995:63d874899b8b
2 2
3 # Copyright (c) 2002 - 2013 Detlev Offenbach <detlev@die-offenbachs.de> 3 # Copyright (c) 2002 - 2013 Detlev Offenbach <detlev@die-offenbachs.de>
4 # 4 #
5 5
6 """ 6 """
7 Module implementing a class used to display the translations part of the project. 7 Module implementing a class used to display the translations part of the
8 project.
8 """ 9 """
9 10
10 import os 11 import os
11 import shutil 12 import shutil
12 import fnmatch 13 import fnmatch
31 class ProjectTranslationsBrowser(ProjectBaseBrowser): 32 class ProjectTranslationsBrowser(ProjectBaseBrowser):
32 """ 33 """
33 A class used to display the translations part of the project. 34 A class used to display the translations part of the project.
34 35
35 @signal linguistFile(str) emitted to open a translation file with 36 @signal linguistFile(str) emitted to open a translation file with
36 Qt-Linguist 37 Qt-Linguist
37 @signal appendStdout(str) emitted after something was received from 38 @signal appendStdout(str) emitted after something was received from
38 a QProcess on stdout 39 a QProcess on stdout
39 @signal appendStderr(str) emitted after something was received from 40 @signal appendStderr(str) emitted after something was received from
40 a QProcess on stderr 41 a QProcess on stderr
41 @signal sourceFile(str) emitted to open a translation file in an editor 42 @signal sourceFile(str) emitted to open a translation file in an editor
42 @signal closeSourceWindow(str) emitted after a file has been removed/deleted 43 @signal closeSourceWindow(str) emitted after a file has been
43 from the project 44 removed/deleted from the project
44 @signal trpreview(list of str, bool = False) emitted to preview translations in the 45 @signal trpreview(list of str, bool = False) emitted to preview
45 translations previewer 46 translations in the translations previewer
46 @signal showMenu(str, QMenu) emitted when a menu is about to be shown. The name 47 @signal showMenu(str, QMenu) emitted when a menu is about to be shown.
47 of the menu and a reference to the menu are given. 48 The name of the menu and a reference to the menu are given.
48 """ 49 """
49 appendStdout = pyqtSignal(str) 50 appendStdout = pyqtSignal(str)
50 appendStderr = pyqtSignal(str) 51 appendStderr = pyqtSignal(str)
51 showMenu = pyqtSignal(str, QMenu) 52 showMenu = pyqtSignal(str, QMenu)
52 53
55 Constructor 56 Constructor
56 57
57 @param project reference to the project object 58 @param project reference to the project object
58 @param parent parent widget of this browser (QWidget) 59 @param parent parent widget of this browser (QWidget)
59 """ 60 """
60 ProjectBaseBrowser.__init__(self, project, ProjectBrowserTranslationType, parent) 61 ProjectBaseBrowser.__init__(self, project,
62 ProjectBrowserTranslationType, parent)
61 self.isTranslationsBrowser = True 63 self.isTranslationsBrowser = True
62 64
63 self.selectedItemsFilter = \ 65 self.selectedItemsFilter = \
64 [ProjectBrowserFileItem, ProjectBrowserSimpleDirectoryItem] 66 [ProjectBrowserFileItem, ProjectBrowserSimpleDirectoryItem]
65 67
66 self.setWindowTitle(self.trUtf8('Translations')) 68 self.setWindowTitle(self.trUtf8('Translations'))
67 69
68 self.setWhatsThis(self.trUtf8( 70 self.setWhatsThis(self.trUtf8(
69 """<b>Project Translations Browser</b>""" 71 """<b>Project Translations Browser</b>"""
70 """<p>This allows to easily see all translations contained in the current""" 72 """<p>This allows to easily see all translations contained in"""
71 """ project. Several actions can be executed via the context menu.</p>""" 73 """ the current project. Several actions can be executed via"""
74 """ the context menu.</p>"""
72 )) 75 ))
73 76
74 self.__lreleaseProcesses = [] 77 self.__lreleaseProcesses = []
75 self.__pylupdateProcesses = [] 78 self.__pylupdateProcesses = []
76 self.lreleaseProcRunning = False 79 self.lreleaseProcRunning = False
102 self.tsprocBackMenuActions = [] 105 self.tsprocBackMenuActions = []
103 self.qmprocBackMenuActions = [] 106 self.qmprocBackMenuActions = []
104 107
105 self.menu = QMenu(self) 108 self.menu = QMenu(self)
106 if self.project.getProjectType() in \ 109 if self.project.getProjectType() in \
107 ["Qt4", "Qt4C", "PyQt5", "PyQt5C", "E4Plugin", "PySide", "PySideC"]: 110 ["Qt4", "Qt4C", "PyQt5", "PyQt5C", "E4Plugin",
111 "PySide", "PySideC"]:
108 act = self.menu.addAction(self.trUtf8('Generate translation'), 112 act = self.menu.addAction(self.trUtf8('Generate translation'),
109 self.__generateSelected) 113 self.__generateSelected)
110 self.tsMenuActions.append(act) 114 self.tsMenuActions.append(act)
111 self.tsprocMenuActions.append(act) 115 self.tsprocMenuActions.append(act)
112 act = self.menu.addAction( 116 act = self.menu.addAction(
172 self.__generateAll) 176 self.__generateAll)
173 self.tsprocMenuActions.append(act) 177 self.tsprocMenuActions.append(act)
174 if self.hooks["generateAllWithObsolete"] is not None: 178 if self.hooks["generateAllWithObsolete"] is not None:
175 act = self.menu.addAction( 179 act = self.menu.addAction(
176 self.hooksMenuEntries.get("generateAllWithObsolete", 180 self.hooksMenuEntries.get("generateAllWithObsolete",
177 self.trUtf8('Generate all translations (with obsolete)')), 181 self.trUtf8(
182 'Generate all translations (with obsolete)')),
178 self.__generateObsoleteAll) 183 self.__generateObsoleteAll)
179 self.tsprocMenuActions.append(act) 184 self.tsprocMenuActions.append(act)
180 self.menu.addSeparator() 185 self.menu.addSeparator()
181 if self.hooks["open"] is not None: 186 if self.hooks["open"] is not None:
182 act = self.menu.addAction( 187 act = self.menu.addAction(
203 self.qmprocMenuActions.append(act) 208 self.qmprocMenuActions.append(act)
204 self.menu.addSeparator() 209 self.menu.addSeparator()
205 act = self.menu.addAction(self.trUtf8('Remove from project'), 210 act = self.menu.addAction(self.trUtf8('Remove from project'),
206 self.__removeLanguageFile) 211 self.__removeLanguageFile)
207 self.menuActions.append(act) 212 self.menuActions.append(act)
208 act = self.menu.addAction(self.trUtf8('Delete'), self.__deleteLanguageFile) 213 act = self.menu.addAction(
214 self.trUtf8('Delete'), self.__deleteLanguageFile)
209 self.menuActions.append(act) 215 self.menuActions.append(act)
210 self.menu.addSeparator() 216 self.menu.addSeparator()
211 self.__addTranslationAct = self.menu.addAction( 217 self.__addTranslationAct = self.menu.addAction(
212 self.trUtf8('Add translation...'), self.project.addLanguage) 218 self.trUtf8('Add translation...'), self.project.addLanguage)
213 self.menu.addAction(self.trUtf8('Add translation files...'), 219 self.menu.addAction(self.trUtf8('Add translation files...'),
218 self.menu.addSeparator() 224 self.menu.addSeparator()
219 self.menu.addAction(self.trUtf8('Configure...'), self._configure) 225 self.menu.addAction(self.trUtf8('Configure...'), self._configure)
220 226
221 self.backMenu = QMenu(self) 227 self.backMenu = QMenu(self)
222 if self.project.getProjectType() in \ 228 if self.project.getProjectType() in \
223 ["Qt4", "Qt4C", "PyQt5", "PyQt5C", "E4Plugin", "PySide", "PySideC"]: 229 ["Qt4", "Qt4C", "PyQt5", "PyQt5C", "E4Plugin",
224 act = self.backMenu.addAction(self.trUtf8('Generate all translations'), 230 "PySide", "PySideC"]:
231 act = self.backMenu.addAction(
232 self.trUtf8('Generate all translations'),
225 self.__generateAll) 233 self.__generateAll)
226 self.tsprocBackMenuActions.append(act) 234 self.tsprocBackMenuActions.append(act)
227 act = self.backMenu.addAction( 235 act = self.backMenu.addAction(
228 self.trUtf8('Generate all translations (with obsolete)'), 236 self.trUtf8('Generate all translations (with obsolete)'),
229 self.__generateObsoleteAll) 237 self.__generateObsoleteAll)
230 self.tsprocBackMenuActions.append(act) 238 self.tsprocBackMenuActions.append(act)
231 act = self.backMenu.addAction(self.trUtf8('Release all translations'), 239 act = self.backMenu.addAction(
240 self.trUtf8('Release all translations'),
232 self.__releaseAll) 241 self.__releaseAll)
233 self.qmprocBackMenuActions.append(act) 242 self.qmprocBackMenuActions.append(act)
234 self.backMenu.addSeparator() 243 self.backMenu.addSeparator()
235 act = self.backMenu.addAction(self.trUtf8('Preview all translations'), 244 act = self.backMenu.addAction(
245 self.trUtf8('Preview all translations'),
236 self.__TRPreview) 246 self.__TRPreview)
237 else: 247 else:
238 if self.hooks["extractMessages"] is not None: 248 if self.hooks["extractMessages"] is not None:
239 act = self.backMenu.addAction( 249 act = self.backMenu.addAction(
240 self.hooksMenuEntries.get("extractMessages", 250 self.hooksMenuEntries.get("extractMessages",
248 self.__generateAll) 258 self.__generateAll)
249 self.tsprocBackMenuActions.append(act) 259 self.tsprocBackMenuActions.append(act)
250 if self.hooks["generateAllWithObsolete"] is not None: 260 if self.hooks["generateAllWithObsolete"] is not None:
251 act = self.backMenu.addAction( 261 act = self.backMenu.addAction(
252 self.hooksMenuEntries.get("generateAllWithObsolete", 262 self.hooksMenuEntries.get("generateAllWithObsolete",
253 self.trUtf8('Generate all translations (with obsolete)')), 263 self.trUtf8(
264 'Generate all translations (with obsolete)')),
254 self.__generateObsoleteAll) 265 self.__generateObsoleteAll)
255 self.tsprocBackMenuActions.append(act) 266 self.tsprocBackMenuActions.append(act)
256 if self.hooks["releaseAll"] is not None: 267 if self.hooks["releaseAll"] is not None:
257 act = self.backMenu.addAction( 268 act = self.backMenu.addAction(
258 self.hooksMenuEntries.get("releaseAll", 269 self.hooksMenuEntries.get("releaseAll",
269 self.backMenu.setEnabled(False) 280 self.backMenu.setEnabled(False)
270 281
271 # create the menu for multiple selected files 282 # create the menu for multiple selected files
272 self.multiMenu = QMenu(self) 283 self.multiMenu = QMenu(self)
273 if self.project.getProjectType() in \ 284 if self.project.getProjectType() in \
274 ["Qt4", "Qt4C", "PyQt5", "PyQt5C", "E4Plugin", "PySide", "PySideC"]: 285 ["Qt4", "Qt4C", "PyQt5", "PyQt5C", "E4Plugin",
275 act = self.multiMenu.addAction(self.trUtf8('Generate translations'), 286 "PySide", "PySideC"]:
287 act = self.multiMenu.addAction(
288 self.trUtf8('Generate translations'),
276 self.__generateSelected) 289 self.__generateSelected)
277 self.tsMultiMenuActions.append(act) 290 self.tsMultiMenuActions.append(act)
278 self.tsprocMultiMenuActions.append(act) 291 self.tsprocMultiMenuActions.append(act)
279 act = self.multiMenu.addAction( 292 act = self.multiMenu.addAction(
280 self.trUtf8('Generate translations (with obsolete)'), 293 self.trUtf8('Generate translations (with obsolete)'),
339 self.qmprocMultiMenuActions.append(act) 352 self.qmprocMultiMenuActions.append(act)
340 self.multiMenu.addSeparator() 353 self.multiMenu.addSeparator()
341 act = self.multiMenu.addAction(self.trUtf8('Remove from project'), 354 act = self.multiMenu.addAction(self.trUtf8('Remove from project'),
342 self.__removeLanguageFile) 355 self.__removeLanguageFile)
343 self.multiMenuActions.append(act) 356 self.multiMenuActions.append(act)
344 act = self.multiMenu.addAction(self.trUtf8('Delete'), self.__deleteLanguageFile) 357 act = self.multiMenu.addAction(
358 self.trUtf8('Delete'), self.__deleteLanguageFile)
345 self.multiMenuActions.append(act) 359 self.multiMenuActions.append(act)
346 self.multiMenu.addSeparator() 360 self.multiMenu.addSeparator()
347 self.multiMenu.addAction(self.trUtf8('Configure...'), self._configure) 361 self.multiMenu.addAction(self.trUtf8('Configure...'), self._configure)
348 362
349 self.dirMenu = QMenu(self) 363 self.dirMenu = QMenu(self)
350 if self.project.getProjectType() in \ 364 if self.project.getProjectType() in \
351 ["Qt4", "Qt4C", "PyQt5", "PyQt5C", "E4Plugin", "PySide", "PySideC"]: 365 ["Qt4", "Qt4C", "PyQt5", "PyQt5C", "E4Plugin",
352 act = self.dirMenu.addAction(self.trUtf8('Generate all translations'), 366 "PySide", "PySideC"]:
367 act = self.dirMenu.addAction(
368 self.trUtf8('Generate all translations'),
353 self.__generateAll) 369 self.__generateAll)
354 self.tsprocDirMenuActions.append(act) 370 self.tsprocDirMenuActions.append(act)
355 act = self.dirMenu.addAction( 371 act = self.dirMenu.addAction(
356 self.trUtf8('Generate all translations (with obsolete)'), 372 self.trUtf8('Generate all translations (with obsolete)'),
357 self.__generateObsoleteAll) 373 self.__generateObsoleteAll)
358 self.tsprocDirMenuActions.append(act) 374 self.tsprocDirMenuActions.append(act)
359 act = self.dirMenu.addAction(self.trUtf8('Release all translations'), 375 act = self.dirMenu.addAction(
376 self.trUtf8('Release all translations'),
360 self.__releaseAll) 377 self.__releaseAll)
361 self.qmprocDirMenuActions.append(act) 378 self.qmprocDirMenuActions.append(act)
362 self.dirMenu.addSeparator() 379 self.dirMenu.addSeparator()
363 act = self.dirMenu.addAction(self.trUtf8('Preview all translations'), 380 act = self.dirMenu.addAction(
381 self.trUtf8('Preview all translations'),
364 self.__TRPreview) 382 self.__TRPreview)
365 else: 383 else:
366 if self.hooks["extractMessages"] is not None: 384 if self.hooks["extractMessages"] is not None:
367 act = self.dirMenu.addAction( 385 act = self.dirMenu.addAction(
368 self.hooksMenuEntries.get("extractMessages", 386 self.hooksMenuEntries.get("extractMessages",
377 self.__generateAll) 395 self.__generateAll)
378 self.tsprocDirMenuActions.append(act) 396 self.tsprocDirMenuActions.append(act)
379 if self.hooks["generateAllWithObsolete"] is not None: 397 if self.hooks["generateAllWithObsolete"] is not None:
380 act = self.dirMenu.addAction( 398 act = self.dirMenu.addAction(
381 self.hooksMenuEntries.get("generateAllWithObsolete", 399 self.hooksMenuEntries.get("generateAllWithObsolete",
382 self.trUtf8('Generate all translations (with obsolete)')), 400 self.trUtf8(
401 'Generate all translations (with obsolete)')),
383 self.__generateObsoleteAll) 402 self.__generateObsoleteAll)
384 self.tsprocDirMenuActions.append(act) 403 self.tsprocDirMenuActions.append(act)
385 if self.hooks["releaseAll"] is not None: 404 if self.hooks["releaseAll"] is not None:
386 act = self.dirMenu.addAction( 405 act = self.dirMenu.addAction(
387 self.hooksMenuEntries.get("releaseAll", 406 self.hooksMenuEntries.get("releaseAll",
388 self.trUtf8('Release all translations')), 407 self.trUtf8('Release all translations')),
389 self.__releaseAll) 408 self.__releaseAll)
390 self.qmprocDirMenuActions.append(act) 409 self.qmprocDirMenuActions.append(act)
391 self.dirMenu.addSeparator() 410 self.dirMenu.addSeparator()
392 act = self.dirMenu.addAction(self.trUtf8('Delete'), self._deleteDirectory) 411 act = self.dirMenu.addAction(
412 self.trUtf8('Delete'), self._deleteDirectory)
393 self.dirMenuActions.append(act) 413 self.dirMenuActions.append(act)
394 self.dirMenu.addSeparator() 414 self.dirMenu.addSeparator()
395 self.__addTranslationDirAct = self.dirMenu.addAction( 415 self.__addTranslationDirAct = self.dirMenu.addAction(
396 self.trUtf8('Add translation...'), self.project.addLanguage) 416 self.trUtf8('Add translation...'), self.project.addLanguage)
397 self.dirMenu.addAction(self.trUtf8('Add translation files...'), 417 self.dirMenu.addAction(self.trUtf8('Add translation files...'),
426 if cnt <= 1: 446 if cnt <= 1:
427 index = self.indexAt(coord) 447 index = self.indexAt(coord)
428 if index.isValid(): 448 if index.isValid():
429 self._selectSingleItem(index) 449 self._selectSingleItem(index)
430 categories = self.getSelectedItemsCountCategorized( 450 categories = self.getSelectedItemsCountCategorized(
431 [ProjectBrowserFileItem, ProjectBrowserSimpleDirectoryItem]) 451 [ProjectBrowserFileItem,
452 ProjectBrowserSimpleDirectoryItem])
432 cnt = categories["sum"] 453 cnt = categories["sum"]
433 454
434 bfcnt = categories[str(ProjectBrowserFileItem)] 455 bfcnt = categories[str(ProjectBrowserFileItem)]
435 sdcnt = categories[str(ProjectBrowserSimpleDirectoryItem)] 456 sdcnt = categories[str(ProjectBrowserSimpleDirectoryItem)]
436 if cnt > 1 and cnt == bfcnt: 457 if cnt > 1 and cnt == bfcnt:
452 def __showContextMenu(self): 473 def __showContextMenu(self):
453 """ 474 """
454 Private slot called by the menu aboutToShow signal. 475 Private slot called by the menu aboutToShow signal.
455 """ 476 """
456 if self.project.getProjectType() in \ 477 if self.project.getProjectType() in \
457 ["Qt4", "Qt4C", "PyQt5", "PyQt5C", "E4Plugin", "PySide", "PySideC"]: 478 ["Qt4", "Qt4C", "PyQt5", "PyQt5C", "E4Plugin",
479 "PySide", "PySideC"]:
458 tsFiles = 0 480 tsFiles = 0
459 qmFiles = 0 481 qmFiles = 0
460 itmList = self.getSelectedItems() 482 itmList = self.getSelectedItems()
461 for itm in itmList[:]: 483 for itm in itmList[:]:
462 if itm.fileName().endswith('.ts'): 484 if itm.fileName().endswith('.ts'):
481 for act in self.tsprocMenuActions: 503 for act in self.tsprocMenuActions:
482 act.setEnabled(False) 504 act.setEnabled(False)
483 if self.lreleaseProcRunning: 505 if self.lreleaseProcRunning:
484 for act in self.qmprocMenuActions: 506 for act in self.qmprocMenuActions:
485 act.setEnabled(True) 507 act.setEnabled(True)
486 self.__addTranslationAct.setEnabled(self.project.getTranslationPattern() != "") 508 self.__addTranslationAct.setEnabled(
509 self.project.getTranslationPattern() != "")
487 510
488 ProjectBaseBrowser._showContextMenu(self, self.menu) 511 ProjectBaseBrowser._showContextMenu(self, self.menu)
489 512
490 self.showMenu.emit("Main", self.menu) 513 self.showMenu.emit("Main", self.menu)
491 514
492 def __showContextMenuMulti(self): 515 def __showContextMenuMulti(self):
493 """ 516 """
494 Private slot called by the multiMenu aboutToShow signal. 517 Private slot called by the multiMenu aboutToShow signal.
495 """ 518 """
496 if self.project.getProjectType() in \ 519 if self.project.getProjectType() in \
497 ["Qt4", "Qt4C", "PyQt5", "PyQt5C", "E4Plugin", "PySide", "PySideC"]: 520 ["Qt4", "Qt4C", "PyQt5", "PyQt5C", "E4Plugin",
521 "PySide", "PySideC"]:
498 tsFiles = 0 522 tsFiles = 0
499 qmFiles = 0 523 qmFiles = 0
500 itmList = self.getSelectedItems() 524 itmList = self.getSelectedItems()
501 for itm in itmList[:]: 525 for itm in itmList[:]:
502 if itm.fileName().endswith('.ts'): 526 if itm.fileName().endswith('.ts'):
531 def __showContextMenuDir(self): 555 def __showContextMenuDir(self):
532 """ 556 """
533 Private slot called by the dirMenu aboutToShow signal. 557 Private slot called by the dirMenu aboutToShow signal.
534 """ 558 """
535 if self.project.getProjectType() in \ 559 if self.project.getProjectType() in \
536 ["Qt4", "Qt4C", "PyQt5", "PyQt5C", "E4Plugin", "PySide", "PySideC"]: 560 ["Qt4", "Qt4C", "PyQt5", "PyQt5C", "E4Plugin",
561 "PySide", "PySideC"]:
537 if self.pylupdateProcRunning: 562 if self.pylupdateProcRunning:
538 for act in self.tsprocDirMenuActions: 563 for act in self.tsprocDirMenuActions:
539 act.setEnabled(False) 564 act.setEnabled(False)
540 if self.lreleaseProcRunning: 565 if self.lreleaseProcRunning:
541 for act in self.qmprocDirMenuActions: 566 for act in self.qmprocDirMenuActions:
542 act.setEnabled(True) 567 act.setEnabled(True)
543 self.__addTranslationDirAct.setEnabled(self.project.getTranslationPattern() != "") 568 self.__addTranslationDirAct.setEnabled(
569 self.project.getTranslationPattern() != "")
544 570
545 ProjectBaseBrowser._showContextMenuDir(self, self.dirMenu) 571 ProjectBaseBrowser._showContextMenuDir(self, self.dirMenu)
546 572
547 self.showMenu.emit("MainDir", self.dirMenu) 573 self.showMenu.emit("MainDir", self.dirMenu)
548 574
549 def __showContextMenuBack(self): 575 def __showContextMenuBack(self):
550 """ 576 """
551 Private slot called by the backMenu aboutToShow signal. 577 Private slot called by the backMenu aboutToShow signal.
552 """ 578 """
553 if self.project.getProjectType() in \ 579 if self.project.getProjectType() in \
554 ["Qt4", "Qt4C", "PyQt5", "PyQt5C", "E4Plugin", "PySide", "PySideC"]: 580 ["Qt4", "Qt4C", "PyQt5", "PyQt5C", "E4Plugin",
581 "PySide", "PySideC"]:
555 if self.pylupdateProcRunning: 582 if self.pylupdateProcRunning:
556 for act in self.tsprocBackMenuActions: 583 for act in self.tsprocBackMenuActions:
557 act.setEnabled(False) 584 act.setEnabled(False)
558 if self.lreleaseProcRunning: 585 if self.lreleaseProcRunning:
559 for act in self.qmprocBackMenuActions: 586 for act in self.qmprocBackMenuActions:
620 """ 647 """
621 itmList = self.getSelectedItems() 648 itmList = self.getSelectedItems()
622 649
623 translationFiles = [itm.fileName() for itm in itmList] 650 translationFiles = [itm.fileName() for itm in itmList]
624 651
625 from UI.DeleteFilesConfirmationDialog import DeleteFilesConfirmationDialog 652 from UI.DeleteFilesConfirmationDialog import \
653 DeleteFilesConfirmationDialog
626 dlg = DeleteFilesConfirmationDialog(self.parent(), 654 dlg = DeleteFilesConfirmationDialog(self.parent(),
627 self.trUtf8("Delete translation files"), 655 self.trUtf8("Delete translation files"),
628 self.trUtf8("Do you really want to delete these translation files" 656 self.trUtf8("Do you really want to delete these translation files"
629 " from the project?"), 657 " from the project?"),
630 translationFiles) 658 translationFiles)
649 dname = self.project.getRelativePath(itm.dirName()) 677 dname = self.project.getRelativePath(itm.dirName())
650 trfiles = sorted(self.project.pdata["TRANSLATIONS"][:]) 678 trfiles = sorted(self.project.pdata["TRANSLATIONS"][:])
651 for trfile in trfiles: 679 for trfile in trfiles:
652 if trfile.startswith(dname): 680 if trfile.startswith(dname):
653 if trfile not in fileNames: 681 if trfile not in fileNames:
654 fileNames.append(os.path.join(self.project.ppath, trfile)) 682 fileNames.append(
683 os.path.join(self.project.ppath, trfile))
655 else: 684 else:
656 fn = itm.fileName() 685 fn = itm.fileName()
657 if fn not in fileNames: 686 if fn not in fileNames:
658 fileNames.append(os.path.join(self.project.ppath, fn)) 687 fileNames.append(os.path.join(self.project.ppath, fn))
659 else: 688 else:
667 """ 696 """
668 Private slot to handle the Preview all translations action. 697 Private slot to handle the Preview all translations action.
669 """ 698 """
670 self.__TRPreview(True) 699 self.__TRPreview(True)
671 700
672 ############################################################################ 701 ###########################################################################
673 ## Methods to support the generation and release commands 702 ## Methods to support the generation and release commands
674 ############################################################################ 703 ###########################################################################
675 704
676 def __writeTempProjectFile(self, langs, filter): 705 def __writeTempProjectFile(self, langs, filter):
677 """ 706 """
678 Private method to write a temporary project file suitable for pylupdate and 707 Private method to write a temporary project file suitable for
679 lrelease. 708 pylupdate and lrelease.
680 709
681 @param langs list of languages to include in the process. An empty list (default) 710 @param langs list of languages to include in the process. An empty
682 means that all translations should be included. 711 list (default) means that all translations should be included.
683 (list of ProjectBrowserFileItem) 712 (list of ProjectBrowserFileItem)
684 @param filter list of source file extension that should be considered 713 @param filter list of source file extension that should be considered
685 (list of strings) 714 (list of strings)
686 @return flag indicating success 715 @return flag indicating success
687 """ 716 """
769 pf.close() 798 pf.close()
770 self.__tmpProjects.append(outFile) 799 self.__tmpProjects.append(outFile)
771 except IOError: 800 except IOError:
772 E5MessageBox.critical(self, 801 E5MessageBox.critical(self,
773 self.trUtf8("Write temporary project file"), 802 self.trUtf8("Write temporary project file"),
774 self.trUtf8("<p>The temporary project file <b>{0}</b> could not" 803 self.trUtf8(
804 "<p>The temporary project file <b>{0}</b> could not"
775 " be written.</p>").format(outFile)) 805 " be written.</p>").format(outFile))
776 806
777 if len(self.__tmpProjects) == 0: 807 if len(self.__tmpProjects) == 0:
778 return False 808 return False
779 809
853 s = ps 883 s = ps
854 error = str(proc.readLine(), ioEncoding, 'replace') 884 error = str(proc.readLine(), ioEncoding, 'replace')
855 s += error 885 s += error
856 self.appendStderr.emit(s) 886 self.appendStderr.emit(s)
857 887
858 ############################################################################ 888 ###########################################################################
859 ## Methods for the generation commands 889 ## Methods for the generation commands
860 ############################################################################ 890 ###########################################################################
861 891
862 def __extractMessages(self): 892 def __extractMessages(self):
863 """ 893 """
864 Private slot to extract the messages to form a messages template file. 894 Private slot to extract the messages to form a messages template file.
865 """ 895 """
886 self.trUtf8("The generation of the translation files (*.ts)" 916 self.trUtf8("The generation of the translation files (*.ts)"
887 " was successful.")) 917 " was successful."))
888 else: 918 else:
889 E5MessageBox.critical(self, 919 E5MessageBox.critical(self,
890 self.trUtf8("Translation file generation"), 920 self.trUtf8("Translation file generation"),
891 self.trUtf8("The generation of the translation files (*.ts) has failed.")) 921 self.trUtf8(
922 "The generation of the translation files (*.ts) has"
923 " failed."))
892 924
893 proc = self.sender() 925 proc = self.sender()
894 for index in range(len(self.__pylupdateProcesses)): 926 for index in range(len(self.__pylupdateProcesses)):
895 if proc == self.__pylupdateProcesses[index][0]: 927 if proc == self.__pylupdateProcesses[index][0]:
896 try: 928 try:
897 self.__tmpProjects.remove(self.__pylupdateProcesses[index][1]) 929 self.__tmpProjects.remove(
930 self.__pylupdateProcesses[index][1])
898 os.remove(self.__pylupdateProcesses[index][1]) 931 os.remove(self.__pylupdateProcesses[index][1])
899 except EnvironmentError: 932 except EnvironmentError:
900 pass 933 pass
901 del self.__pylupdateProcesses[index] 934 del self.__pylupdateProcesses[index]
902 break 935 break
904 # all done 937 # all done
905 self.pylupdateProcRunning = False 938 self.pylupdateProcRunning = False
906 939
907 def __generateTSFile(self, noobsolete=False, generateAll=True): 940 def __generateTSFile(self, noobsolete=False, generateAll=True):
908 """ 941 """
909 Private method used to run pylupdate/pylupdate4 to generate the .ts files. 942 Private method used to run pylupdate/pylupdate4 to generate the .ts
943 files.
910 944
911 @param noobsolete flag indicating whether obsolete entries should be 945 @param noobsolete flag indicating whether obsolete entries should be
912 kept (boolean) 946 kept (boolean)
913 @param generateAll flag indicating whether all translations should be 947 @param generateAll flag indicating whether all translations should be
914 generated (boolean) 948 generated (boolean)
920 954
921 # Hook support 955 # Hook support
922 if generateAll: 956 if generateAll:
923 if noobsolete: 957 if noobsolete:
924 if self.hooks["generateAll"] is not None: 958 if self.hooks["generateAll"] is not None:
925 self.hooks["generateAll"](self.project.pdata["TRANSLATIONS"]) 959 self.hooks["generateAll"](
960 self.project.pdata["TRANSLATIONS"])
926 return 961 return
927 else: 962 else:
928 if self.hooks["generateAllWithObsolete"] is not None: 963 if self.hooks["generateAllWithObsolete"] is not None:
929 self.hooks["generateAllWithObsolete"]( 964 self.hooks["generateAllWithObsolete"](
930 self.project.pdata["TRANSLATIONS"]) 965 self.project.pdata["TRANSLATIONS"])
943 self.hooks["generateSelectedWithObsolete"](l) 978 self.hooks["generateSelectedWithObsolete"](l)
944 return 979 return
945 980
946 # generate a minimal temporary projectfile suitable for pylupdate 981 # generate a minimal temporary projectfile suitable for pylupdate
947 self.__tmpProjects = [] 982 self.__tmpProjects = []
948 if self.project.pdata["PROGLANGUAGE"][0] in ["Python", "Python2", "Python3"]: 983 if self.project.pdata["PROGLANGUAGE"][0] in \
984 ["Python", "Python2", "Python3"]:
949 ok = self.__writeTempProjectFile(langs, [".py"]) 985 ok = self.__writeTempProjectFile(langs, [".py"])
950 else: 986 else:
951 ok = False 987 ok = False
952 if not ok: 988 if not ok:
953 return 989 return
1017 """ 1053 """
1018 self.__generateTSFile(noobsolete=False, generateAll=True) 1054 self.__generateTSFile(noobsolete=False, generateAll=True)
1019 1055
1020 def __generateSelected(self): 1056 def __generateSelected(self):
1021 """ 1057 """
1022 Private method to generate selected translation files (.ts) for Qt Linguist. 1058 Private method to generate selected translation files (.ts) for
1059 Qt Linguist.
1023 1060
1024 All obsolete strings are removed from the .ts file. 1061 All obsolete strings are removed from the .ts file.
1025 """ 1062 """
1026 self.__generateTSFile(noobsolete=True, generateAll=False) 1063 self.__generateTSFile(noobsolete=True, generateAll=False)
1027 1064
1028 def __generateObsoleteSelected(self): 1065 def __generateObsoleteSelected(self):
1029 """ 1066 """
1030 Private method to generate selected translation files (.ts) for Qt Linguist. 1067 Private method to generate selected translation files (.ts) for
1068 Qt Linguist.
1031 1069
1032 Obsolete strings are kept. 1070 Obsolete strings are kept.
1033 """ 1071 """
1034 self.__generateTSFile(noobsolete=False, generateAll=False) 1072 self.__generateTSFile(noobsolete=False, generateAll=False)
1035 1073
1036 ############################################################################ 1074 ###########################################################################
1037 ## Methods for the release commands 1075 ## Methods for the release commands
1038 ############################################################################ 1076 ###########################################################################
1039 1077
1040 def __releaseTSFileDone(self, exitCode, exitStatus): 1078 def __releaseTSFileDone(self, exitCode, exitStatus):
1041 """ 1079 """
1042 Private slot to handle the finished signal of the lrelease process. 1080 Private slot to handle the finished signal of the lrelease process.
1043 1081
1056 E5MessageBox.information(self, 1094 E5MessageBox.information(self,
1057 self.trUtf8("Translation file release"), 1095 self.trUtf8("Translation file release"),
1058 self.trUtf8("The release of the translation files (*.qm)" 1096 self.trUtf8("The release of the translation files (*.qm)"
1059 " was successful.")) 1097 " was successful."))
1060 if self.project.pdata["TRANSLATIONSBINPATH"]: 1098 if self.project.pdata["TRANSLATIONSBINPATH"]:
1061 target = os.path.join(self.project.ppath, 1099 target = os.path.join(
1062 self.project.pdata["TRANSLATIONSBINPATH"][0]) 1100 self.project.ppath,
1101 self.project.pdata["TRANSLATIONSBINPATH"][0])
1063 for langFile in self.project.pdata["TRANSLATIONS"][:]: 1102 for langFile in self.project.pdata["TRANSLATIONS"][:]:
1064 if langFile.endswith('.ts'): 1103 if langFile.endswith('.ts'):
1065 qmFile = os.path.join(self.project.ppath, 1104 qmFile = os.path.join(self.project.ppath,
1066 langFile.replace('.ts', '.qm')) 1105 langFile.replace('.ts', '.qm'))
1067 if os.path.exists(qmFile): 1106 if os.path.exists(qmFile):
1068 shutil.move(qmFile, target) 1107 shutil.move(qmFile, target)
1069 else: 1108 else:
1070 E5MessageBox.critical(self, 1109 E5MessageBox.critical(self,
1071 self.trUtf8("Translation file release"), 1110 self.trUtf8("Translation file release"),
1072 self.trUtf8("The release of the translation files (*.qm) has failed.")) 1111 self.trUtf8(
1112 "The release of the translation files (*.qm) has failed."))
1073 1113
1074 proc = self.sender() 1114 proc = self.sender()
1075 for index in range(len(self.__lreleaseProcesses)): 1115 for index in range(len(self.__lreleaseProcesses)):
1076 if proc == self.__lreleaseProcesses[index][0]: 1116 if proc == self.__lreleaseProcesses[index][0]:
1077 try: 1117 try:
1078 self.__tmpProjects.remove(self.__lreleaseProcesses[index][1]) 1118 self.__tmpProjects.remove(
1119 self.__lreleaseProcesses[index][1])
1079 os.remove(self.__lreleaseProcesses[index][1]) 1120 os.remove(self.__lreleaseProcesses[index][1])
1080 except EnvironmentError: 1121 except EnvironmentError:
1081 pass 1122 pass
1082 del self.__lreleaseProcesses[index] 1123 del self.__lreleaseProcesses[index]
1083 break 1124 break
1110 self.hooks["releaseSelected"](l) 1151 self.hooks["releaseSelected"](l)
1111 return 1152 return
1112 1153
1113 # generate a minimal temporary projectfile suitable for lrelease 1154 # generate a minimal temporary projectfile suitable for lrelease
1114 self.__tmpProjects = [] 1155 self.__tmpProjects = []
1115 if self.project.pdata["PROGLANGUAGE"][0] in ["Python", "Python2", "Python3"]: 1156 if self.project.pdata["PROGLANGUAGE"][0] in \
1157 ["Python", "Python2", "Python3"]:
1116 ok = self.__writeTempProjectFile(langs, [".py"]) 1158 ok = self.__writeTempProjectFile(langs, [".py"])
1117 else: 1159 else:
1118 ok = False 1160 ok = False
1119 if not ok: 1161 if not ok:
1120 return 1162 return
1121 1163
1122 if self.project.getProjectType() in \ 1164 if self.project.getProjectType() in \
1123 ["Qt4", "Qt4C", "PyQt5", "PyQt5C", "E4Plugin", "PySide", "PySideC"]: 1165 ["Qt4", "Qt4C", "PyQt5", "PyQt5C", "E4Plugin",
1166 "PySide", "PySideC"]:
1124 lrelease = os.path.join( 1167 lrelease = os.path.join(
1125 Utilities.getQtBinariesPath(), 1168 Utilities.getQtBinariesPath(),
1126 Utilities.generateQtToolName("lrelease")) 1169 Utilities.generateQtToolName("lrelease"))
1127 else: 1170 else:
1128 return 1171 return
1172 """ 1215 """
1173 Private method to release the translation files (.qm). 1216 Private method to release the translation files (.qm).
1174 """ 1217 """
1175 self.__releaseTSFile(generateAll=True) 1218 self.__releaseTSFile(generateAll=True)
1176 1219
1177 ############################################################################ 1220 ###########################################################################
1178 ## Support for hooks below 1221 ## Support for hooks below
1179 ############################################################################ 1222 ###########################################################################
1180 1223
1181 def _initHookMethods(self): 1224 def _initHookMethods(self):
1182 """ 1225 """
1183 Protected method to initialize the hooks dictionary. 1226 Protected method to initialize the hooks dictionary.
1184 1227
1186 <ul> 1229 <ul>
1187 <li>extractMessages: takes no parameters</li> 1230 <li>extractMessages: takes no parameters</li>
1188 <li>generateAll: takes list of filenames as parameter</li> 1231 <li>generateAll: takes list of filenames as parameter</li>
1189 <li>generateAllWithObsolete: takes list of filenames as parameter</li> 1232 <li>generateAllWithObsolete: takes list of filenames as parameter</li>
1190 <li>generateSelected: takes list of filenames as parameter</li> 1233 <li>generateSelected: takes list of filenames as parameter</li>
1191 <li>generateSelectedWithObsolete: takes list of filenames as parameter</li> 1234 <li>generateSelectedWithObsolete: takes list of filenames as
1235 parameter</li>
1192 <li>releaseAll: takes list of filenames as parameter</li> 1236 <li>releaseAll: takes list of filenames as parameter</li>
1193 <li>releaseSelected: takes list of filenames as parameter</li> 1237 <li>releaseSelected: takes list of filenames as parameter</li>
1194 <li>open: takes a filename as parameter</li> 1238 <li>open: takes a filename as parameter</li>
1195 </ul> 1239 </ul>
1196 1240

eric ide

mercurial