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 """ |
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 |
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 |