diff --git a/config.py b/config.py index d4231f91..d5d57b4a 100644 --- a/config.py +++ b/config.py @@ -5,7 +5,6 @@ from json import load as json_load from json import dump as json_dump import tkinter as tk from tkinter import font -from languages import selectable_languages from models.translation.translation_languages import translatorEngine from models.transcription.transcription_utils import getInputDevices, getDefaultInputDevice from utils import generatePercentageStringsList, isUniqueStrings @@ -67,6 +66,30 @@ class Config: def DOCUMENTS_URL(self): return self._DOCUMENTS_URL + @property + def TRANSPARENCY_RANGE(self): + return self._TRANSPARENCY_RANGE + + @property + def APPEARANCE_THEME_LIST(self): + return self._APPEARANCE_THEME_LIST + + @property + def UI_SCALING_LIST(self): + return self._UI_SCALING_LIST + + @property + def TEXTBOX_UI_SCALING_RANGE(self): + return self._TEXTBOX_UI_SCALING_RANGE + + @property + def MESSAGE_BOX_RATIO_RANGE(self): + return self._MESSAGE_BOX_RATIO_RANGE + + @property + def SELECTABLE_UI_LANGUAGES_DICT(self): + return self._SELECTABLE_UI_LANGUAGES_DICT + @property def MAX_MIC_ENERGY_THRESHOLD(self): return self._MAX_MIC_ENERGY_THRESHOLD @@ -211,7 +234,7 @@ class Config: @TRANSPARENCY.setter def TRANSPARENCY(self, value): - if isinstance(value, int) and 0 <= value <= 100: + if isinstance(value, int) and self.TRANSPARENCY_RANGE[0] <= value <= self.TRANSPARENCY_RANGE[1]: self._TRANSPARENCY = value saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @@ -222,7 +245,7 @@ class Config: @APPEARANCE_THEME.setter def APPEARANCE_THEME(self, value): - if value in ["Light", "Dark", "System"]: + if value in self.APPEARANCE_THEME_LIST: self._APPEARANCE_THEME = value saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @@ -233,7 +256,7 @@ class Config: @UI_SCALING.setter def UI_SCALING(self, value): - if value in generatePercentageStringsList(start=40,end=200, step=10): + if value in self.UI_SCALING_LIST: self._UI_SCALING = value saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @@ -244,7 +267,7 @@ class Config: @TEXTBOX_UI_SCALING.setter def TEXTBOX_UI_SCALING(self, value): - if isinstance(value, int) and 50 <= value <= 200: + if isinstance(value, int) and self.TEXTBOX_UI_SCALING_RANGE[0] <= value <= self.TEXTBOX_UI_SCALING_RANGE[1]: self._TEXTBOX_UI_SCALING = value saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @@ -255,7 +278,7 @@ class Config: @MESSAGE_BOX_RATIO.setter def MESSAGE_BOX_RATIO(self, value): - if isinstance(value, int) and 1 <= value <= 99: + if isinstance(value, int) and self.MESSAGE_BOX_RATIO_RANGE[0] <= value <= self.MESSAGE_BOX_RATIO_RANGE[1]: self._MESSAGE_BOX_RATIO = value saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @@ -280,7 +303,7 @@ class Config: @UI_LANGUAGE.setter def UI_LANGUAGE(self, value): - if value in list(selectable_languages.keys()): + if value in list(self.SELECTABLE_UI_LANGUAGES_DICT.keys()): self._UI_LANGUAGE = value saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @@ -627,7 +650,7 @@ class Config: def init_config(self): # Read Only self._VERSION = "2.0.1" - self._ENABLE_SPEAKER2CHATBOX = False + self._ENABLE_SPEAKER2CHATBOX = False # Speaker2Chatbox self._LOCAL_PATH = os_path.dirname(sys.argv[0]) self._PATH_CONFIG = os_path.join(self._LOCAL_PATH, "config.json") self._PATH_LOGS = os_path.join(self._LOCAL_PATH, "logs") @@ -635,6 +658,17 @@ class Config: self._GITHUB_URL = "https://api.github.com/repos/misyaguziya/VRCT/releases/latest" self._BOOTH_URL = "https://misyaguziya.booth.pm/" self._DOCUMENTS_URL = "https://mzsoftware.notion.site/VRCT-Documents-be79b7a165f64442ad8f326d86c22246" + self._TRANSPARENCY_RANGE = (50, 100) + self._APPEARANCE_THEME_LIST = ["Light", "Dark", "System"] + self._UI_SCALING_LIST = generatePercentageStringsList(start=40, end=200, step=10) + self._TEXTBOX_UI_SCALING_RANGE = (50, 200) + self._MESSAGE_BOX_RATIO_RANGE = (1, 99) + self._SELECTABLE_UI_LANGUAGES_DICT = { + "en": "English", + "ja": "日本語", + "ko": "한국어(일부 지원)" + # If you want to add a new language and key, please append it here. + } self._MAX_MIC_ENERGY_THRESHOLD = 2000 self._MAX_SPEAKER_ENERGY_THRESHOLD = 4000 @@ -708,7 +742,7 @@ class Config: self._ENABLE_SEND_ONLY_TRANSLATED_MESSAGES = False self._ENABLE_NOTICE_XSOVERLAY = False self._ENABLE_SEND_MESSAGE_TO_VRC = True - self._ENABLE_SEND_RECEIVED_MESSAGE_TO_VRC = False # speaker2Chatbox + self._ENABLE_SEND_RECEIVED_MESSAGE_TO_VRC = False # Speaker2Chatbox self._ENABLE_LOGGER = False self._IS_CONFIG_WINDOW_COMPACT_MODE = False diff --git a/controller.py b/controller.py index fe6db61a..ce31b75b 100644 --- a/controller.py +++ b/controller.py @@ -4,8 +4,7 @@ from threading import Thread from config import config from model import model from view import view -from utils import get_key_by_value, isUniqueStrings -from languages import selectable_languages +from utils import getKeyByValue, isUniqueStrings import argparse # Common @@ -420,8 +419,8 @@ def callbackSetFontFamily(value): def callbackSetUiLanguage(value): print("callbackSetUiLanguage", value) - value = get_key_by_value(selectable_languages, value) - print("callbackSetUiLanguage__after_get_key_by_value", value) + value = getKeyByValue(config.SELECTABLE_UI_LANGUAGES_DICT, value) + print("callbackSetUiLanguage__after_getKeyByValue", value) config.UI_LANGUAGE = value view.showRestartButtonIfRequired(locale=config.UI_LANGUAGE) diff --git a/languages.py b/languages.py deleted file mode 100644 index 4c7b8c94..00000000 --- a/languages.py +++ /dev/null @@ -1,6 +0,0 @@ -selectable_languages = { - "en": "English", - "ja": "日本語", - "ko": "한국어(일부 지원)" - # 新しい言語とキーを追加する場合はここに追記してください -} \ No newline at end of file diff --git a/utils.py b/utils.py index a5e38fda..87b7d981 100644 --- a/utils.py +++ b/utils.py @@ -6,7 +6,7 @@ def getImageFile(file_name): img = Image_open(os_path.join(os_path.dirname(__file__), "img", file_name)) return img -def get_key_by_value(dictionary, value): +def getKeyByValue(dictionary, value): for key, val in dictionary.items(): if val == value: return key @@ -24,7 +24,7 @@ def makeEven(number, minus:bool=False): return number if isEven(number) else number - 1 return number if isEven(number) else number + 1 -def generatePercentageStringsList(start=40, end=200, step=10): +def generatePercentageStringsList(start:int, end:int, step:int): strings = [] for percent in range(start, end + 1, step): strings.append(f"{percent}%") diff --git a/view.py b/view.py index a169d0a5..2d41cf5f 100644 --- a/view.py +++ b/view.py @@ -5,12 +5,10 @@ from tkinter import font as tk_font import webbrowser import i18n -from languages import selectable_languages - -from customtkinter import StringVar, IntVar, BooleanVar, END as CTK_END, get_appearance_mode +from customtkinter import StringVar, IntVar, BooleanVar, get_appearance_mode from vrct_gui.ui_managers import ColorThemeManager, UiScalingManager from vrct_gui import vrct_gui -from utils import callFunctionIfCallable, generatePercentageStringsList, intToPercentageStringsFormatter +from utils import callFunctionIfCallable, intToPercentageStringsFormatter from config import config @@ -143,7 +141,7 @@ class View(): CALLBACK_SELECTED_LANGUAGE_PRESET_TAB=None, VAR_LABEL_YOUR_LANGUAGE=StringVar(value=i18n.t("main_window.your_language")), - VAR_YOUR_LANGUAGE = StringVar(value="Japanese\n(Japan)"), + VAR_YOUR_LANGUAGE = StringVar(value=f"{config.SOURCE_LANGUAGE}\n({config.SOURCE_COUNTRY})"), CALLBACK_OPEN_SELECTABLE_YOUR_LANGUAGE_WINDOW=None, IS_OPENED_SELECTABLE_YOUR_LANGUAGE_WINDOW=False, CALLBACK_SELECTED_YOUR_LANGUAGE=None, @@ -153,7 +151,7 @@ class View(): CALLBACK_SWAP_LANGUAGES=None, VAR_LABEL_TARGET_LANGUAGE=StringVar(value=i18n.t("main_window.target_language")), - VAR_TARGET_LANGUAGE = StringVar(value="English\n(United States)"), + VAR_TARGET_LANGUAGE = StringVar(value=f"{config.TARGET_LANGUAGE}\n({config.TARGET_COUNTRY})"), CALLBACK_OPEN_SELECTABLE_TARGET_LANGUAGE_WINDOW=None, IS_OPENED_SELECTABLE_TARGET_LANGUAGE_WINDOW=False, CALLBACK_SELECTED_TARGET_LANGUAGE=None, @@ -202,7 +200,7 @@ class View(): # Appearance Tab VAR_LABEL_TRANSPARENCY=StringVar(value=i18n.t("config_window.transparency.label")), VAR_DESC_TRANSPARENCY=StringVar(value=i18n.t("config_window.transparency.desc")), - SLIDER_RANGE_TRANSPARENCY=(50, 100), + SLIDER_RANGE_TRANSPARENCY=config.TRANSPARENCY_RANGE, CALLBACK_SET_TRANSPARENCY=None, VAR_TRANSPARENCY=IntVar(value=config.TRANSPARENCY), CALLBACK_BUTTON_PRESS_TRANSPARENCY=self._closeTheCoverOfMainWindow, @@ -210,19 +208,19 @@ class View(): VAR_LABEL_APPEARANCE_THEME=StringVar(value=i18n.t("config_window.appearance_theme.label")), VAR_DESC_APPEARANCE_THEME=StringVar(value=i18n.t("config_window.appearance_theme.desc")), - LIST_APPEARANCE_THEME=["Light", "Dark", "System"], + LIST_APPEARANCE_THEME=config.APPEARANCE_THEME_LIST, CALLBACK_SET_APPEARANCE_THEME=None, VAR_APPEARANCE_THEME=StringVar(value=config.APPEARANCE_THEME), VAR_LABEL_UI_SCALING=StringVar(value=i18n.t("config_window.ui_size.label")), VAR_DESC_UI_SCALING=None, - LIST_UI_SCALING=generatePercentageStringsList(start=40,end=200, step=10), + LIST_UI_SCALING=config.UI_SCALING_LIST, CALLBACK_SET_UI_SCALING=None, VAR_UI_SCALING=StringVar(value=config.UI_SCALING), VAR_LABEL_TEXTBOX_UI_SCALING=StringVar(value=i18n.t("config_window.textbox_ui_size.label")), VAR_DESC_TEXTBOX_UI_SCALING=StringVar(value=i18n.t("config_window.textbox_ui_size.desc")), - SLIDER_RANGE_TEXTBOX_UI_SCALING=(50, 200), + SLIDER_RANGE_TEXTBOX_UI_SCALING=config.TEXTBOX_UI_SCALING_RANGE, CALLBACK_SET_TEXTBOX_UI_SCALING=None, VAR_TEXTBOX_UI_SCALING=IntVar(value=config.TEXTBOX_UI_SCALING), CALLBACK_BUTTON_PRESS_TEXTBOX_UI_SCALING=self._closeTheCoverOfMainWindow, @@ -230,7 +228,7 @@ class View(): VAR_LABEL_MESSAGE_BOX_RATIO=StringVar(value=i18n.t("config_window.message_box_ratio.label")), VAR_DESC_MESSAGE_BOX_RATIO=StringVar(value=i18n.t("config_window.message_box_ratio.desc")), - SLIDER_RANGE_MESSAGE_BOX_RATIO=(1, 99), + SLIDER_RANGE_MESSAGE_BOX_RATIO=config.MESSAGE_BOX_RATIO_RANGE, CALLBACK_SET_MESSAGE_BOX_RATIO=None, VAR_MESSAGE_BOX_RATIO=IntVar(value=config.MESSAGE_BOX_RATIO), CALLBACK_BUTTON_PRESS_MESSAGE_BOX_RATIO=self._closeTheCoverOfMainWindow, @@ -244,9 +242,9 @@ class View(): VAR_LABEL_UI_LANGUAGE=StringVar(value=i18n.t("config_window.ui_language.label")), VAR_DESC_UI_LANGUAGE=None, - LIST_UI_LANGUAGE=list(selectable_languages.values()), + LIST_UI_LANGUAGE=list(config.SELECTABLE_UI_LANGUAGES_DICT.values()), CALLBACK_SET_UI_LANGUAGE=None, - VAR_UI_LANGUAGE=StringVar(value=selectable_languages[config.UI_LANGUAGE]), + VAR_UI_LANGUAGE=StringVar(value=config.SELECTABLE_UI_LANGUAGES_DICT[config.UI_LANGUAGE]), VAR_LABEL_ENABLE_RESTORE_MAIN_WINDOW_GEOMETRY=StringVar(value=i18n.t("config_window.to_restore_main_window_geometry.label")), VAR_DESC_ENABLE_RESTORE_MAIN_WINDOW_GEOMETRY=StringVar(value=i18n.t("config_window.to_restore_main_window_geometry.desc")), @@ -1111,13 +1109,13 @@ class View(): @staticmethod def setMainWindowMessageBoxRatio(message_box_ratio:int): - if message_box_ratio <= 0 or message_box_ratio > 99: - raise ValueError("Input must be between 1 and 99 (inclusive)") + if message_box_ratio < config.MESSAGE_BOX_RATIO_RANGE[0] or message_box_ratio > config.MESSAGE_BOX_RATIO_RANGE[1]: + raise ValueError(f"Input must be between {config.MESSAGE_BOX_RATIO_RANGE[0]} and {config.MESSAGE_BOX_RATIO_RANGE[1]} (inclusive)") - vrct_gui.main_bg_container.grid_rowconfigure(tuple(range(1, 101)), weight=1) - textbox_ratio = int(100 - message_box_ratio) + vrct_gui.main_bg_container.grid_rowconfigure(tuple(range(config.MESSAGE_BOX_RATIO_RANGE[0], config.MESSAGE_BOX_RATIO_RANGE[1]+2)), weight=1) + textbox_ratio = int((config.MESSAGE_BOX_RATIO_RANGE[1]+1) - message_box_ratio) message_box_row = int(textbox_ratio + 1) - message_box_rowwpan = int(100 - textbox_ratio) + message_box_rowwpan = int((config.MESSAGE_BOX_RATIO_RANGE[1]+1) - textbox_ratio) # print(textbox_ratio, message_box_row, message_box_rowwpan) vrct_gui.main_textbox_container.grid(row=1, rowspan=textbox_ratio, column=0, sticky="nsew") vrct_gui.main_entry_message_container.grid(row=message_box_row, rowspan=message_box_rowwpan, column=0, sticky="nsew")