diff --git a/config.py b/config.py index 772773af..bbc4ac74 100644 --- a/config.py +++ b/config.py @@ -7,6 +7,7 @@ import tkinter as tk from tkinter import font from models.translation.translation_languages import translation_lang from models.transcription.transcription_utils import getInputDevices, getDefaultInputDevice +from models.transcription.transcription_languages import transcription_lang from utils import generatePercentageStringsList, isUniqueStrings json_serializable_vars = {} @@ -288,9 +289,18 @@ class Config: @SELECTED_TAB_YOUR_LANGUAGES.setter def SELECTED_TAB_YOUR_LANGUAGES(self, value): - if isinstance(value, dict): - self._SELECTED_TAB_YOUR_LANGUAGES = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + try: + if isinstance(value, dict): + value_old = self.SELECTED_TAB_YOUR_LANGUAGES + for k, v in value.items(): + language = v["language"] + country = v["country"] + if language not in list(transcription_lang.keys()) or country not in list(transcription_lang[language].keys()): + value[k] = value_old[k] + self._SELECTED_TAB_YOUR_LANGUAGES = value + except Exception: + pass + saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @property @json_serializable('SELECTED_TAB_TARGET_LANGUAGES') @@ -299,9 +309,18 @@ class Config: @SELECTED_TAB_TARGET_LANGUAGES.setter def SELECTED_TAB_TARGET_LANGUAGES(self, value): - if isinstance(value, dict): - self._SELECTED_TAB_TARGET_LANGUAGES = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + try: + if isinstance(value, dict): + value_old = self.SELECTED_TAB_TARGET_LANGUAGES + for k, v in value.items(): + language = v["language"] + country = v["country"] + if language not in list(transcription_lang.keys()) or country not in list(transcription_lang[language].keys()): + value[k] = value_old[k] + self._SELECTED_TAB_TARGET_LANGUAGES = value + except Exception: + pass + saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @property @json_serializable('SELECTED_TRANSCRIPTION_ENGINE') @@ -885,14 +904,32 @@ class Config: "3":"CTranslate2", } self._SELECTED_TAB_YOUR_LANGUAGES = { - "1":"Japanese\n(Japan)", - "2":"Japanese\n(Japan)", - "3":"Japanese\n(Japan)", + "1":{ + "language":"Japanese", + "country":"Japan" + }, + "2":{ + "language":"Japanese", + "country":"Japan" + }, + "3":{ + "language":"Japanese", + "country":"Japan" + }, } self._SELECTED_TAB_TARGET_LANGUAGES = { - "1":"English\n(United States)", - "2":"English\n(United States)", - "3":"English\n(United States)", + "1":{ + "language":"English", + "country":"United States" + }, + "2":{ + "language":"English", + "country":"United States" + }, + "3":{ + "language":"English", + "country":"United States" + }, } self._SELECTED_TRANSCRIPTION_ENGINE = "Google" self._IS_MAIN_WINDOW_SIDEBAR_COMPACT_MODE = False diff --git a/controller.py b/controller.py index f695ee45..fe0ccb6a 100644 --- a/controller.py +++ b/controller.py @@ -292,13 +292,11 @@ def initSetTranslateEngine(): def initSetLanguageAndCountry(): select = config.SELECTED_TAB_YOUR_LANGUAGES[config.SELECTED_TAB_NO] - language, country = model.getLanguageAndCountry(select) - config.SOURCE_LANGUAGE = language - config.SOURCE_COUNTRY = country + config.SOURCE_LANGUAGE = select["language"] + config.SOURCE_COUNTRY = select["country"] select = config.SELECTED_TAB_TARGET_LANGUAGES[config.SELECTED_TAB_NO] - language, country = model.getLanguageAndCountry(select) - config.TARGET_LANGUAGE = language - config.TARGET_COUNTRY = country + config.TARGET_LANGUAGE = select["language"] + config.TARGET_COUNTRY = select["country"] def setYourTranslateEngine(select): engines = config.SELECTED_TAB_YOUR_TRANSLATOR_ENGINES @@ -316,9 +314,8 @@ def setYourLanguageAndCountry(select): languages = config.SELECTED_TAB_YOUR_LANGUAGES languages[config.SELECTED_TAB_NO] = select config.SELECTED_TAB_YOUR_LANGUAGES = languages - language, country = model.getLanguageAndCountry(select) - config.SOURCE_LANGUAGE = language - config.SOURCE_COUNTRY = country + config.SOURCE_LANGUAGE = select["language"] + config.SOURCE_COUNTRY = select["country"] updateTranslationEngineAndEngineList() view.printToTextbox_selectedYourLanguages(select) @@ -326,9 +323,8 @@ def setTargetLanguageAndCountry(select): languages = config.SELECTED_TAB_TARGET_LANGUAGES languages[config.SELECTED_TAB_NO] = select config.SELECTED_TAB_TARGET_LANGUAGES = languages - language, country = model.getLanguageAndCountry(select) - config.TARGET_LANGUAGE = language - config.TARGET_COUNTRY = country + config.TARGET_LANGUAGE = select["language"] + config.TARGET_COUNTRY = select["country"] updateTranslationEngineAndEngineList() view.printToTextbox_selectedTargetLanguages(select) @@ -355,15 +351,13 @@ def callbackSelectedLanguagePresetTab(selected_tab_no): languages = config.SELECTED_TAB_YOUR_LANGUAGES select = languages[config.SELECTED_TAB_NO] - language, country = model.getLanguageAndCountry(select) - config.SOURCE_LANGUAGE = language - config.SOURCE_COUNTRY = country + config.SOURCE_LANGUAGE = select["language"] + config.SOURCE_COUNTRY = select["country"] languages = config.SELECTED_TAB_TARGET_LANGUAGES select = languages[config.SELECTED_TAB_NO] - language, country = model.getLanguageAndCountry(select) - config.TARGET_LANGUAGE = language - config.TARGET_COUNTRY = country + config.TARGET_LANGUAGE = select["language"] + config.TARGET_COUNTRY = select["country"] view.printToTextbox_changedLanguagePresetTab(config.SELECTED_TAB_NO) updateTranslationEngineAndEngineList() diff --git a/model.py b/model.py index e39b718f..2af4135a 100644 --- a/model.py +++ b/model.py @@ -106,26 +106,24 @@ class Model: def getListLanguageAndCountry(self): transcription_langs = list(transcription_lang.keys()) - tl_keys = translation_lang.keys() translation_langs = [] - for tl_key in tl_keys: + for tl_key in translation_lang.keys(): for lang in translation_lang[tl_key]["source"]: translation_langs.append(lang) translation_langs = list(set(translation_langs)) supported_langs = list(filter(lambda x: x in transcription_langs, translation_langs)) - langs = [] - for lang in supported_langs: - for country in transcription_lang[lang]: - langs.append(f"{lang}\n({country})") - return sorted(langs) - - @staticmethod - def getLanguageAndCountry(select): - parts = select.split("\n") - language = parts[0] - country = parts[1][1:-1] - return language, country + languages = [] + for language in supported_langs: + for country in transcription_lang[language]: + languages.append( + { + "language" : language, + "country" : country, + } + ) + languages = sorted(languages, key=lambda x: x['language']) + return languages def findTranslationEngines(self, source_lang, target_lang): compatible_engines = [] diff --git a/models/transcription/transcription_languages.py b/models/transcription/transcription_languages.py index 63d92568..c2cfa914 100644 --- a/models/transcription/transcription_languages.py +++ b/models/transcription/transcription_languages.py @@ -85,20 +85,22 @@ transcription_lang = { "Whisper": "ca", }, }, - "Chinese":{ - "Mandarin (Simplified, China)":{ + "Chinese Simplified":{ + "China":{ "Google": "cmn-Hans-CN", "Whisper": "zh", }, - "Mandarin (Simplified, Hong Kong)":{ + "Hong Kong":{ "Google": "cmn-Hans-HK", "Whisper": "zh", }, - "Mandarin (Traditional, Taiwan)":{ + }, + "Chinese Traditional":{ + "Taiwan":{ "Google": "cmn-Hant-TW", "Whisper": "zh", }, - "Cantonese (Traditional Hong Kong)":{ + "Hong Kong":{ "Google": "yue-Hant-HK", "Whisper": "yue", }, diff --git a/models/translation/translation_languages.py b/models/translation/translation_languages.py index 44051f8a..a697960b 100644 --- a/models/translation/translation_languages.py +++ b/models/translation/translation_languages.py @@ -1,40 +1,41 @@ translation_lang = {} dict_deepl_languages = { - 'Arabic':'ar', - 'Bulgarian':'bg', - 'Czech':'cs', - 'Danish':'da', - 'German':'de', - 'Greek':'el', - 'English':'en', - 'Spanish':'es', - 'Estonian':'et', - 'Finnish':'fi', - 'French':'fr', - 'Irish':'ga', - 'Croatian':'hr', - 'Hungarian':'hu', - 'Indonesian':'id', - 'Icelandic':'is', - 'Italian':'it', - 'Japanese':'ja', - 'Korean':'ko', - 'Lithuanian':'lt', - 'Latvian':'lv', - 'Maltese':'mt', - 'Bokmal':'nb', - 'Dutch':'nl', - 'Norwegian':'no', - 'Polish':'pl', - 'Portuguese':'pt', - 'Romanian':'ro', - 'Russian':'ru', - 'Slovak':'sk', - 'Slovenian':'sl', - 'Swedish':'sv', - 'Turkish':'tr', - 'Ukrainian':'uk', - 'Chinese':'zh', + "Arabic":"ar", + "Bulgarian":"bg", + "Czech":"cs", + "Danish":"da", + "German":"de", + "Greek":"el", + "English":"en", + "Spanish":"es", + "Estonian":"et", + "Finnish":"fi", + "French":"fr", + "Irish":"ga", + "Croatian":"hr", + "Hungarian":"hu", + "Indonesian":"id", + "Icelandic":"is", + "Italian":"it", + "Japanese":"ja", + "Korean":"ko", + "Lithuanian":"lt", + "Latvian":"lv", + "Maltese":"mt", + "Bokmal":"nb", + "Dutch":"nl", + "Norwegian":"no", + "Polish":"pl", + "Portuguese":"pt", + "Romanian":"ro", + "Russian":"ru", + "Slovak":"sk", + "Slovenian":"sl", + "Swedish":"sv", + "Turkish":"tr", + "Ukrainian":"uk", + "Chinese Simplified":"zh", + "Chinese Traditional":"zh" } translation_lang["DeepL"] = { "source":dict_deepl_languages, @@ -70,7 +71,8 @@ dict_deepl_api_source_languages = { "Swedish":"sv", "Turkish":"tr", "Ukrainian":"uk", - "Chinese":"zh" + "Chinese Simplified":"zh", + "Chinese Traditional":"zh" } dict_deepl_api_target_languages = { "Japanese":"ja", @@ -104,7 +106,8 @@ dict_deepl_api_target_languages = { "Swedish":"sv", "Turkish":"tr", "Ukrainian":"uk", - "Chinese":"zh" + "Chinese Simplified":"zh", + "Chinese Traditional":"zh" } translation_lang["DeepL_API"] = { "source": dict_deepl_api_source_languages, @@ -114,7 +117,8 @@ translation_lang["DeepL_API"] = { dict_google_languages = { "Japanese":"ja", "English":"en", - "Chinese":"zh", + "Chinese Simplified":"zh", + "Chinese Traditional":"zh-TW", "Arabic":"ar", "Russian":"ru", "French":"fr", @@ -183,7 +187,8 @@ translation_lang["Google"] = { dict_bing_languages = { "Japanese":"ja", "English":"en", - "Chinese":"zh", + "Chinese Simplified":"zh", + "Chinese Traditional":"zh-Hant", "Arabic":"ar", "Russian":"ru", "French":"fr", @@ -248,20 +253,21 @@ translation_lang["Bing"] = { } dict_papago_languages = { - 'German': 'de', - 'English': 'en', - 'Spanish':'es', - 'French': 'fr', - 'Hindi': 'hi', - 'Indonesian': 'id', - 'Italian': 'it', - 'Japanese': 'ja', - 'Korean': 'ko', - 'Portuguese': 'pt', - 'Russian': 'ru', - 'Thai': 'th', - 'Vietnamese': 'vi', - 'Chinese':'zh-CN', + "German": "de", + "English": "en", + "Spanish":"es", + "French": "fr", + "Hindi": "hi", + "Indonesian": "id", + "Italian": "it", + "Japanese": "ja", + "Korean": "ko", + "Portuguese": "pt", + "Russian": "ru", + "Thai": "th", + "Vietnamese": "vi", + "Chinese Simplified":"zh-CN", + "Chinese Traditional":"zh-TW", } translation_lang["Papago"] = { @@ -270,105 +276,106 @@ translation_lang["Papago"] = { } dict_ctranslate2_languages = { - 'English': 'en', - 'Chinese': 'zh', - 'German': 'de', - 'Spanish': 'es', - 'Russian': 'ru', - 'Korean': 'ko', - 'French': 'fr', - 'Japanese': 'ja', - 'Portuguese': 'pt', - 'Turkish': 'tr', - 'Polish': 'pl', - 'Catalan': 'ca', - 'Dutch': 'nl', - 'Arabic': 'ar', - 'Swedish': 'sv', - 'Italian': 'it', - 'Indonesian': 'id', - 'Hindi': 'hi', - 'Finnish': 'fi', - 'Vietnamese': 'vi', - 'Hebrew': 'he', - 'Ukrainian': 'uk', - 'Greek': 'el', - 'Malay': 'ms', - 'Czech': 'cs', - 'Romanian': 'ro', - 'Danish': 'da', - 'Hungarian': 'hu', - 'Tamil': 'ta', - 'Norwegian': 'no', - 'Thai': 'th', - 'Urdu': 'ur', - 'Croatian': 'hr', - 'Bulgarian': 'bg', - 'Lithuanian': 'lt', - 'Latin': 'la', - 'Maori': 'mi', - 'Malayalam': 'ml', - 'Welsh': 'cy', - 'Slovak': 'sk', - 'Telugu': 'te', - 'Persian': 'fa', - 'Latvian': 'lv', - 'Bengali': 'bn', - 'Serbian': 'sr', - 'Azerbaijani': 'az', - 'Slovenian': 'sl', - 'Kannada': 'kn', - 'Estonian': 'et', - 'Macedonian': 'mk', - 'Breton': 'br', - 'Basque': 'eu', - 'Icelandic': 'is', - 'Armenian': 'hy', - 'Nepali': 'ne', - 'Mongolian': 'mn', - 'Bosnian': 'bs', - 'Kazakh': 'kk', - 'Albanian': 'sq', - 'Swahili': 'sw', - 'Galician': 'gl', - 'Marathi': 'mr', - 'Punjabi': 'pa', - 'Sinhala': 'si', - 'Khmer': 'km', - 'Shona': 'sn', - 'Yoruba': 'yo', - 'Somali': 'so', - 'Afrikaans': 'af', - 'Occitan': 'oc', - 'Georgian': 'ka', - 'Belarusian': 'be', - 'Tajik': 'tg', - 'Sindhi': 'sd', - 'Gujarati': 'gu', - 'Amharic': 'am', - 'Yiddish': 'yi', - 'Lao': 'lo', - 'Uzbek': 'uz', - 'Faroese': 'fo', - 'Haitian creole': 'ht', - 'Pashto': 'ps', - 'Turkmen': 'tk', - 'Nynorsk': 'nn', - 'Maltese': 'mt', - 'Sanskrit': 'sa', - 'Luxembourgish': 'lb', - 'Myanmar': 'my', - 'Tibetan': 'bo', - 'Filipino': 'tl', - 'Malagasy': 'mg', - 'Assamese': 'as', - 'Tatar': 'tt', - 'Hawaiian': 'haw', - 'Lingala': 'ln', - 'Hausa': 'ha', - 'Bashkir': 'ba', - 'Javanese': 'jw', - 'Sundanese': 'su' + "English": "en", + "Chinese Simplified": "zh", + "Chinese Traditional":"zh", + "German": "de", + "Spanish": "es", + "Russian": "ru", + "Korean": "ko", + "French": "fr", + "Japanese": "ja", + "Portuguese": "pt", + "Turkish": "tr", + "Polish": "pl", + "Catalan": "ca", + "Dutch": "nl", + "Arabic": "ar", + "Swedish": "sv", + "Italian": "it", + "Indonesian": "id", + "Hindi": "hi", + "Finnish": "fi", + "Vietnamese": "vi", + "Hebrew": "he", + "Ukrainian": "uk", + "Greek": "el", + "Malay": "ms", + "Czech": "cs", + "Romanian": "ro", + "Danish": "da", + "Hungarian": "hu", + "Tamil": "ta", + "Norwegian": "no", + "Thai": "th", + "Urdu": "ur", + "Croatian": "hr", + "Bulgarian": "bg", + "Lithuanian": "lt", + "Latin": "la", + "Maori": "mi", + "Malayalam": "ml", + "Welsh": "cy", + "Slovak": "sk", + "Telugu": "te", + "Persian": "fa", + "Latvian": "lv", + "Bengali": "bn", + "Serbian": "sr", + "Azerbaijani": "az", + "Slovenian": "sl", + "Kannada": "kn", + "Estonian": "et", + "Macedonian": "mk", + "Breton": "br", + "Basque": "eu", + "Icelandic": "is", + "Armenian": "hy", + "Nepali": "ne", + "Mongolian": "mn", + "Bosnian": "bs", + "Kazakh": "kk", + "Albanian": "sq", + "Swahili": "sw", + "Galician": "gl", + "Marathi": "mr", + "Punjabi": "pa", + "Sinhala": "si", + "Khmer": "km", + "Shona": "sn", + "Yoruba": "yo", + "Somali": "so", + "Afrikaans": "af", + "Occitan": "oc", + "Georgian": "ka", + "Belarusian": "be", + "Tajik": "tg", + "Sindhi": "sd", + "Gujarati": "gu", + "Amharic": "am", + "Yiddish": "yi", + "Lao": "lo", + "Uzbek": "uz", + "Faroese": "fo", + "Haitian creole": "ht", + "Pashto": "ps", + "Turkmen": "tk", + "Nynorsk": "nn", + "Maltese": "mt", + "Sanskrit": "sa", + "Luxembourgish": "lb", + "Myanmar": "my", + "Tibetan": "bo", + "Filipino": "tl", + "Malagasy": "mg", + "Assamese": "as", + "Tatar": "tt", + "Hawaiian": "haw", + "Lingala": "ln", + "Hausa": "ha", + "Bashkir": "ba", + "Javanese": "jw", + "Sundanese": "su" } translation_lang["CTranslate2"] = { diff --git a/view.py b/view.py index e7962850..39ac795f 100644 --- a/view.py +++ b/view.py @@ -1508,8 +1508,14 @@ class View(): # Update GuiVariable (view_variable) def updateGuiVariableByPresetTabNo(self, tab_no:str): - self.view_variable.VAR_YOUR_LANGUAGE.set(config.SELECTED_TAB_YOUR_LANGUAGES[tab_no]) - self.view_variable.VAR_TARGET_LANGUAGE.set(config.SELECTED_TAB_TARGET_LANGUAGES[tab_no]) + select = config.SELECTED_TAB_YOUR_LANGUAGES[tab_no] + your_language = select["language"] + your_country = select["country"] + self.view_variable.VAR_YOUR_LANGUAGE.set(f"{your_language}\n({your_country})") + select = config.SELECTED_TAB_TARGET_LANGUAGES[tab_no] + target_language = select["language"] + target_country = select["country"] + self.view_variable.VAR_TARGET_LANGUAGE.set(f"{target_language}\n({target_country})") def updateList_selectableLanguages(self, new_selectable_language_list:list): @@ -1651,11 +1657,15 @@ class View(): def printToTextbox_selectedYourLanguages(self, selected_your_language): - your_language = selected_your_language.replace("\n", " ") + language = selected_your_language["language"] + country = selected_your_language["country"] + your_language = f"{language} ({country})" self._printToTextbox_Info(i18n.t("main_window.textbox_system_message.selected_your_language", your_language=your_language)) def printToTextbox_selectedTargetLanguages(self, selected_target_language): - target_language = selected_target_language.replace("\n", " ") + language = selected_target_language["language"] + country = selected_target_language["country"] + target_language = f"{language} ({country})" self._printToTextbox_Info(i18n.t("main_window.textbox_system_message.selected_target_language", target_language=target_language)) def printToTextbox_changedLanguagePresetTab(self, tab_no:str): diff --git a/vrct_gui/_CreateSelectableLanguagesWindow.py b/vrct_gui/_CreateSelectableLanguagesWindow.py index dd6c6327..4c5482cd 100644 --- a/vrct_gui/_CreateSelectableLanguagesWindow.py +++ b/vrct_gui/_CreateSelectableLanguagesWindow.py @@ -49,6 +49,14 @@ class _CreateSelectableLanguagesWindow(CTkToplevel): def callbackSelectableLanguages(self, value, _e): + language = value["language"] + country = value["country"] + callback_value = { + "language" : language, + "country" : country, + } + set_value = f"{language}\n({country})" + if self.selectable_language_window_type == "your_language": callback = self._view_variable.CALLBACK_SELECTED_YOUR_LANGUAGE target_variable = self._view_variable.VAR_YOUR_LANGUAGE @@ -56,8 +64,8 @@ class _CreateSelectableLanguagesWindow(CTkToplevel): callback = self._view_variable.CALLBACK_SELECTED_TARGET_LANGUAGE target_variable = self._view_variable.VAR_TARGET_LANGUAGE - target_variable.set(value) - callFunctionIfCallable(callback, value) + target_variable.set(set_value) + callFunctionIfCallable(callback, callback_value) self.vrct_gui._closeSelectableLanguagesWindow() @@ -135,7 +143,7 @@ class _CreateSelectableLanguagesWindow(CTkToplevel): max_row+=1 row=0 column=0 - for selectable_language_name in self._view_variable.LIST_SELECTABLE_LANGUAGES: + for selectable_language_dict in self._view_variable.LIST_SELECTABLE_LANGUAGES: self.wrapper = CTkFrame(self.container, corner_radius=0, fg_color=self.settings.ctm.LANGUAGE_BUTTON_BG_COLOR, width=0, height=0, cursor="hand2") self.wrapper.grid(row=row, column=column, sticky="nsew") @@ -144,10 +152,9 @@ class _CreateSelectableLanguagesWindow(CTkToplevel): self.wrapper.grid_rowconfigure((0,2), weight=1) - selectable_language_name_for_text = selectable_language_name.replace("\n", " ") label_widget = CTkLabel( self.wrapper, - text=selectable_language_name_for_text, + text=f"{selectable_language_dict['language']} ({selectable_language_dict['country']})", height=0, corner_radius=0, font=CTkFont(family=self.settings.FONT_FAMILY, size=self.settings.uism.VALUES_TEXT_FONT_SIZE, weight="normal"), @@ -164,7 +171,7 @@ class _CreateSelectableLanguagesWindow(CTkToplevel): - callback = partial(self.callbackSelectableLanguages, selectable_language_name) + callback = partial(self.callbackSelectableLanguages, selectable_language_dict) bindButtonReleaseFunction([self.wrapper, label_widget], callback) if row == max_row: