From bfe177aa1706aad87fb58d73ab0978cd8a46f5e1 Mon Sep 17 00:00:00 2001 From: misyaguziya Date: Thu, 19 Oct 2023 15:39:39 +0900 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B[bugfix]=20Model=20:=20Auth=20key?= =?UTF-8?q?=E3=81=AE=E5=BE=A9=E6=97=A7=E4=BD=9C=E6=A5=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.py | 19 ++++++ controller.py | 36 ++++++++++ model.py | 50 ++++++++++++++ models/translation/translation_languages.py | 72 +++++++++++++++++++- models/translation/translation_translator.py | 34 ++++++++- requirements.txt | 1 + view.py | 2 +- 7 files changed, 211 insertions(+), 3 deletions(-) diff --git a/config.py b/config.py index f8953bd3..a684e649 100644 --- a/config.py +++ b/config.py @@ -415,6 +415,19 @@ class Config: self._OSC_PORT = value saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + @property + @json_serializable('AUTH_KEYS') + def AUTH_KEYS(self): + return self._AUTH_KEYS + + @AUTH_KEYS.setter + def AUTH_KEYS(self, value): + if type(value) is dict and set(value.keys()) == set(self.AUTH_KEYS.keys()): + for key, value in value.items(): + if type(value) is str: + self._AUTH_KEYS[key] = value + saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, self.AUTH_KEYS) + @property @json_serializable('MESSAGE_FORMAT') def MESSAGE_FORMAT(self): @@ -550,6 +563,12 @@ class Config: self._INPUT_SPEAKER_MAX_PHRASES = 10 self._OSC_IP_ADDRESS = "127.0.0.1" self._OSC_PORT = 9000 + self._AUTH_KEYS = { + "DeepL_API": None, + "DeepL": None, + "Bing": None, + "Google": None, + } self._MESSAGE_FORMAT = "[message]([translation])" self._ENABLE_AUTO_CLEAR_MESSAGE_BOX = True self._ENABLE_NOTICE_XSOVERLAY = False diff --git a/controller.py b/controller.py index 228e55ed..d6c6bdb4 100644 --- a/controller.py +++ b/controller.py @@ -22,6 +22,8 @@ def sendMicMessage(message): return elif config.ENABLE_TRANSLATION is False: pass + elif model.getTranslatorStatus() is False: + view.printToTextbox_AuthenticationError() else: translation = model.getInputTranslate(message) @@ -85,6 +87,8 @@ def receiveSpeakerMessage(message): translation = "" if config.ENABLE_TRANSLATION is False: pass + elif model.getTranslatorStatus() is False: + view.printToTextbox_AuthenticationError() else: translation = model.getOutputTranslate(message) @@ -150,6 +154,8 @@ def sendChatMessage(message): translation = "" if config.ENABLE_TRANSLATION is False: pass + elif model.getTranslatorStatus() is False: + view.printToTextbox_AuthenticationError() else: translation = model.getInputTranslate(message) @@ -206,6 +212,7 @@ def initSetLanguageAndCountry(): config.TARGET_LANGUAGE = language config.TARGET_COUNTRY = country config.CHOICE_TRANSLATOR = model.findTranslationEngine(config.SOURCE_LANGUAGE, config.TARGET_LANGUAGE) + model.authenticationTranslator(callbackSetAuthKeys) def setYourLanguageAndCountry(select): languages = config.SELECTED_TAB_YOUR_LANGUAGES @@ -215,6 +222,7 @@ def setYourLanguageAndCountry(select): config.SOURCE_LANGUAGE = language config.SOURCE_COUNTRY = country config.CHOICE_TRANSLATOR = model.findTranslationEngine(config.SOURCE_LANGUAGE, config.TARGET_LANGUAGE) + model.authenticationTranslator(callbackSetAuthKeys) view.printToTextbox_selectedYourLanguages(select) def setTargetLanguageAndCountry(select): @@ -225,6 +233,7 @@ def setTargetLanguageAndCountry(select): config.TARGET_LANGUAGE = language config.TARGET_COUNTRY = country config.CHOICE_TRANSLATOR = model.findTranslationEngine(config.SOURCE_LANGUAGE, config.TARGET_LANGUAGE) + model.authenticationTranslator(callbackSetAuthKeys) view.printToTextbox_selectedTargetLanguages(select) def callbackSelectedLanguagePresetTab(selected_tab_no): @@ -241,8 +250,11 @@ def callbackSelectedLanguagePresetTab(selected_tab_no): config.TARGET_LANGUAGE = language config.TARGET_COUNTRY = country config.CHOICE_TRANSLATOR = model.findTranslationEngine(config.SOURCE_LANGUAGE, config.TARGET_LANGUAGE) + model.authenticationTranslator(callbackSetAuthKeys) view.printToTextbox_changedLanguagePresetTab(config.SELECTED_TAB_NO) +def callbackSetAuthKeys(keys): + config.AUTH_KEYS = keys # command func def callbackToggleTranslation(is_turned_on): @@ -362,6 +374,21 @@ def callbackSetUiLanguage(value): config.UI_LANGUAGE = value view.showRestartButtonIfRequired(locale=config.UI_LANGUAGE) +# Translation Tab +def callbackSetDeeplAuthkey(value): + print("callbackSetDeeplAuthkey", str(value)) + if len(value) > 0 and model.authenticationTranslator(callbackSetAuthKeys, choice_translator="DeepL(auth)", auth_key=value) is True: + config.CHOICE_TRANSLATOR = model.findTranslationEngine(config.SOURCE_LANGUAGE, config.TARGET_LANGUAGE) + model.authenticationTranslator(callbackSetAuthKeys) + view.printToTextbox_AuthenticationSuccess() + elif len(value) == 0: + auth_keys = config.AUTH_KEYS + auth_keys["DeepL(auth)"] = None + config.AUTH_KEYS = auth_keys + model.authenticationTranslator(callbackSetAuthKeys) + else: + view.printToTextbox_AuthenticationError() + # Transcription Tab (Mic) def callbackSetMicHost(value): print("callbackSetMicHost", value) @@ -607,6 +634,12 @@ def createMainWindow(): # init config initSetLanguageAndCountry() + if model.authenticationTranslator(callbackSetAuthKeys) is False: + # error update Auth key + view.printToTextbox_AuthenticationError() + config.CHOICE_TRANSLATOR = model.findTranslationEngine(config.SOURCE_LANGUAGE, config.TARGET_LANGUAGE) + model.authenticationTranslator(callbackSetAuthKeys) + # set word filter model.addKeywords() @@ -666,6 +699,9 @@ def createMainWindow(): "callback_set_font_family": callbackSetFontFamily, "callback_set_ui_language": callbackSetUiLanguage, + # Translation Tab + "callback_set_deepl_authkey": callbackSetDeeplAuthkey, + # Transcription Tab (Mic) "callback_set_mic_host": callbackSetMicHost, "list_mic_host": model.getListInputHost(), diff --git a/model.py b/model.py index da78a9a5..68b48e81 100644 --- a/model.py +++ b/model.py @@ -81,6 +81,22 @@ class Model: del self.keyword_processor self.keyword_processor = KeywordProcessor() + def authenticationTranslator(self, fnc, choice_translator=None, auth_key=None): + if choice_translator == None: + choice_translator = config.CHOICE_TRANSLATOR + if auth_key == None: + auth_key = config.AUTH_KEYS[choice_translator] + + result = self.translator.authentication(choice_translator, auth_key) + if result: + auth_keys = config.AUTH_KEYS + auth_keys[choice_translator] = auth_key + try: + fnc(auth_keys) + except: + pass + return result + def startLogger(self): os_makedirs(os_path.join(os_path.dirname(sys.argv[0]), "logs"), exist_ok=True) logger = getLogger() @@ -121,10 +137,32 @@ class Model: if source_lang in source_languages and target_lang in target_languages: compatible_engines.append(engine) engine_name = compatible_engines[0] + + if engine_name == "DeepL" and config.AUTH_KEYS["DeepL_API"] != None: + engine_name = "DeepL" + return engine_name + def getTranslatorStatus(self): + return self.translator.translator_status[config.CHOICE_TRANSLATOR] + + def getListTranslatorName(self): + return list(self.translator.translator_status.keys()) + def getInputTranslate(self, message): try: + if config.CHOICE_TRANSLATOR == "DeepL_API": + if config.TARGET_LANGUAGE == "English": + if config.TARGET_COUNTRY in ["United States", "Canada", "Philippines"]: + config.TARGET_LANGUAGE = "English American" + else: + config.TARGET_LANGUAGE = "English British" + elif config.TARGET_LANGUAGE in ["Portuguese"]: + if config.TARGET_COUNTRY == "Portugal": + config.TARGET_LANGUAGE = "Portuguese European" + else: + config.TARGET_LANGUAGE = "Portuguese Brazilian" + translation = self.translator.translate( translator_name=config.CHOICE_TRANSLATOR, source_language=config.SOURCE_LANGUAGE, @@ -137,6 +175,18 @@ class Model: def getOutputTranslate(self, message): try: + if config.CHOICE_TRANSLATOR == "DeepL_API": + if config.SOURCE_LANGUAGE == "English": + if config.SOURCE_COUNTRY in ["United States", "Canada", "Philippines"]: + config.SOURCE_LANGUAGE = "English American" + else: + config.SOURCE_LANGUAGE = "English British" + elif config.SOURCE_LANGUAGE in ["Portuguese"]: + if config.SOURCE_COUNTRY == "Portugal": + config.SOURCE_LANGUAGE = "Portuguese European" + else: + config.SOURCE_LANGUAGE = "Portuguese Brazilian" + translation = self.translator.translate( translator_name=config.CHOICE_TRANSLATOR, source_language=config.TARGET_LANGUAGE, diff --git a/models/translation/translation_languages.py b/models/translation/translation_languages.py index f51b12a1..ae57d4cc 100644 --- a/models/translation/translation_languages.py +++ b/models/translation/translation_languages.py @@ -1,4 +1,4 @@ -translatorEngine = ["DeepL", "Google", "Bing"] +translatorEngine = ["DeepL", "DeepL_API", "Google", "Bing"] translation_lang = {} dict_deepl_languages = { "Japanese":"JA", @@ -36,6 +36,76 @@ translation_lang["DeepL"] = { "target":dict_deepl_languages, } +dict_deepl_api_source_languages = { + "Japanese":"ja", + "English":"en", + "Bulgarian":"bg", + "Czech":"cs", + "Danish":"da", + "German":"de", + "Greek":"el", + "Spanish":"es", + "Estonian":"et", + "Finnish":"fi", + "French":"fr", + "Hungarian":"hu", + "Indonesian":"id", + "Italian":"it", + "Korean":"ko", + "Lithuanian":"lt", + "Latvian":"lv", + "Norwegian":"nb", + "Dutch":"nl", + "Polish":"pl", + "Portuguese":"pt", + "Romanian":"ro", + "Russian":"ru", + "Slovak":"sk", + "Slovenian":"sl", + "Swedish":"sv", + "Turkish":"tr", + "Ukrainian":"uk", + "Chinese":"zh" +} +dict_deepl_api_target_languages = { + "Japanese":"ja", + "English American":"en-US", + "English British":"en-GB", + "Bulgarian":"bg", + "Czech":"cs", + "Danish":"da", + "German":"de", + "Greek":"el", + "English":"en", + "Spanish":"es", + "Estonian":"et", + "Finnish":"fi", + "French":"fr", + "Hungarian":"hu", + "Indonesian":"id", + "Italian":"it", + "Korean":"ko", + "Lithuanian":"lt", + "Latvian":"lv", + "Norwegian":"nb", + "Dutch":"nl", + "Polish":"pl", + "Portuguese Brazilian":"pt-BR", + "Portuguese European":"pt-PT", + "Romanian":"ro", + "Russian":"ru", + "Slovak":"sk", + "Slovenian":"sl", + "Swedish":"sv", + "Turkish":"tr", + "Ukrainian":"uk", + "Chinese":"zh" +} +translation_lang["DeepL_API"] = { + "source": dict_deepl_api_source_languages, + "target": dict_deepl_api_target_languages, +} + dict_google_languages = { "Japanese":"ja", "English":"en", diff --git a/models/translation/translation_translator.py b/models/translation/translation_translator.py index 872df21c..4f4a1550 100644 --- a/models/translation/translation_translator.py +++ b/models/translation/translation_translator.py @@ -1,3 +1,4 @@ +from deepl import Translator as deepl_Translator from deepl_translate import translate as deepl_web_Translator from translators import translate_text as other_web_Translator from .translation_languages import translatorEngine, translation_lang @@ -5,7 +6,32 @@ from .translation_languages import translatorEngine, translation_lang # Translator class Translator(): def __init__(self): - pass + self.translator_status = {} + for translator in translatorEngine: + self.translator_status[translator] = False + self.deepl_client = None + + def authentication(self, translator_name, authkey=None): + result = False + match translator_name: + case "DeepL": + self.translator_status[translator_name] = True + result = True + case "DeepL_API": + try: + self.deepl_client = deepl_Translator(authkey) + self.deepl_client.translate_text(" ", target_lang="EN-US") + self.translator_status[translator_name] = True + result = True + except: + self.translator_status[translator_name] = False + case "Google": + self.translator_status[translator_name] = True + result = True + case "Bing": + self.translator_status[translator_name] = True + result = True + return result def translate(self, translator_name, source_language, target_language, message): try: @@ -19,6 +45,12 @@ class Translator(): target_language=target_language, text=message ) + case "DeepL_API": + result = self.deepl_client.translate_text( + message, + source_lang=source_language, + target_lang=target_language, + ).text case "Google": result = other_web_Translator( query_text=message, diff --git a/requirements.txt b/requirements.txt index 386f2860..a399733d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,6 +2,7 @@ pillow == 10.0.0 PyAudioWPatch == 0.2.12.6 python-osc == 1.8.3 customtkinter == 5.2.0 +deepl == 1.15.0 flashtext == 2.7 pyyaml == 6.0.1 python-i18n == 0.3.9 \ No newline at end of file diff --git a/view.py b/view.py index e6c0ed51..77dea02c 100644 --- a/view.py +++ b/view.py @@ -226,7 +226,7 @@ class View(): # VAR_LABEL_DEEPL_AUTH_KEY=StringVar(value=i18n.t("config_window.deepl_auth_key.label")), # VAR_DESC_DEEPL_AUTH_KEY=None, # CALLBACK_SET_DEEPL_AUTH_KEY=None, - # VAR_DEEPL_AUTH_KEY=StringVar(value=""), + # VAR_DEEPL_AUTH_KEY=StringVar(value="config.AUTH_KEYS["DeepL_API"]"), # Transcription Tab (Mic)