--- a/Plugins/UiExtensionPlugins/Translator/TranslatorWidget.py Sat Jul 07 12:58:50 2018 +0200 +++ b/Plugins/UiExtensionPlugins/Translator/TranslatorWidget.py Sat Jul 07 14:38:13 2018 +0200 @@ -96,25 +96,55 @@ Private slot to update the language combo boxes. """ supportedCodes = self.__translationEngine.supportedLanguages() + enabledCodes = self.__plugin.getPreferences("EnabledLanguages") + + # 1. save current selections origLanguage = self.origLanguageComboBox.itemData( self.origLanguageComboBox.currentIndex()) transLanguage = self.transLanguageComboBox.itemData( self.transLanguageComboBox.currentIndex()) + + # 2. reload the original language combo box + self.origLanguageComboBox.blockSignals(True) self.origLanguageComboBox.clear() - self.transLanguageComboBox.clear() - for code in self.__plugin.getPreferences("EnabledLanguages"): + for code in enabledCodes: if code in supportedCodes: language = self.__languages.getLanguage(code) if language: icon = self.__languages.getLanguageIcon(code) self.origLanguageComboBox.addItem(icon, language, code) - self.transLanguageComboBox.addItem(icon, language, code) self.origLanguageComboBox.model().sort(0) - self.transLanguageComboBox.model().sort(0) - self.origLanguageComboBox.setCurrentIndex( - self.origLanguageComboBox.findData(origLanguage)) - self.transLanguageComboBox.setCurrentIndex( - self.transLanguageComboBox.findData(transLanguage)) + origIndex = self.origLanguageComboBox.findData(origLanguage) + if origIndex == -1: + origIndex = 0 + self.origLanguageComboBox.blockSignals(False) + self.origLanguageComboBox.setCurrentIndex(origIndex) + + # 3. reload the target language combo box, if the target is not + # dependent upon the source language + supportedTargetCodes = \ + self.__translationEngine.supportedTargetLanguages( + self.origLanguageComboBox.itemData( + self.origLanguageComboBox.currentIndex() + ) + ) + if supportedTargetCodes is None: + # supported target codes are independent + self.transLanguageComboBox.clear() + for code in enabledCodes: + if code in supportedCodes: + language = self.__languages.getLanguage(code) + if language: + icon = self.__languages.getLanguageIcon(code) + self.transLanguageComboBox.addItem(icon, language, + code) + self.transLanguageComboBox.model().sort(0) + index = self.transLanguageComboBox.findData(transLanguage) + if index == -1: + index = 0 + self.transLanguageComboBox.setCurrentIndex(index) + else: + self.on_origLanguageComboBox_currentIndexChanged(origIndex) def __updateEngines(self): """ @@ -190,10 +220,22 @@ """ Private slot to swap the languages. """ - oIdx = self.origLanguageComboBox.currentIndex() - self.origLanguageComboBox.setCurrentIndex( + # save selected language codes + oLanguage = self.origLanguageComboBox.itemData( + self.origLanguageComboBox.currentIndex()) + + tLanguage = self.transLanguageComboBox.itemData( self.transLanguageComboBox.currentIndex()) - self.transLanguageComboBox.setCurrentIndex(oIdx) + + oIdx = self.origLanguageComboBox.findData(tLanguage) + if oIdx < 0: + oIdx = 0 + self.origLanguageComboBox.setCurrentIndex(oIdx) + + tIdx = self.transLanguageComboBox.findData(oLanguage) + if tIdx < 0: + tIdx = 0 + self.transLanguageComboBox.setCurrentIndex(tIdx) origText = self.origEdit.toPlainText() self.origEdit.setPlainText(self.transEdit.toPlainText()) @@ -212,10 +254,9 @@ """ Private slot to handle changes of the original text. """ - enable = bool(self.origEdit.toPlainText()) - self.translateButton.setEnabled(enable) self.__updatePronounceButtons() self.__updateClearButton() + self.__updateTranslateButton() @pyqtSlot() def on_transEdit_textChanged(self): @@ -234,6 +275,31 @@ """ self.__plugin.setPreferences( "OriginalLanguage", self.origLanguageComboBox.itemData(index)) + + supportedTargetCodes = \ + self.__translationEngine.supportedTargetLanguages( + self.origLanguageComboBox.itemData(index) + ) + if supportedTargetCodes is not None: + enabledCodes = self.__plugin.getPreferences("EnabledLanguages") + transLanguage = self.transLanguageComboBox.itemData( + self.transLanguageComboBox.currentIndex()) + self.transLanguageComboBox.clear() + if len(supportedTargetCodes) > 0: + for code in enabledCodes: + if code in supportedTargetCodes: + language = self.__languages.getLanguage(code) + if language: + icon = self.__languages.getLanguageIcon(code) + self.transLanguageComboBox.addItem( + icon, language, code) + self.transLanguageComboBox.model().sort(0) + index = self.transLanguageComboBox.findData(transLanguage) + if index == -1: + index = 0 + self.transLanguageComboBox.setCurrentIndex(index) + + self.__updateTranslateButton() @pyqtSlot(int) def on_transLanguageComboBox_currentIndexChanged(self, index): @@ -272,7 +338,10 @@ """ Private slot to set the state of the pronounce buttons. """ - hasTTS = self.__translationEngine.hasTTS() + if self.__translationEngine is not None: + hasTTS = self.__translationEngine.hasTTS() + else: + hasTTS = False self.pronounceOrigButton.setEnabled( hasTTS and bool(self.origEdit.toPlainText())) self.pronounceTransButton.setEnabled( @@ -286,6 +355,14 @@ bool(self.transEdit.toPlainText()) self.clearButton.setEnabled(enable) + def __updateTranslateButton(self): + """ + Private slot to set the state of the translate button. + """ + enable = bool(self.origEdit.toPlainText()) + enable &= bool(self.__translationLanguage()) + self.translateButton.setEnabled(enable) + def __translate(self, text, originalLanguage, translationLanguage): """ Private method to translate the given text.