From 6ba0c4afbd846c47e0320f5d0a44c40d16e4121d Mon Sep 17 00:00:00 2001 From: HalfofBilly Date: Mon, 13 Jan 2025 23:21:15 +1100 Subject: [PATCH 1/2] Adds improvements to localization system --- CONTRIBUTING.md | 4 +- Current Language | 2 +- Languages/{en.json => eng.json} | 14 ++-- Languages/template.json | 10 ++- main.py | 111 +++++++++++++++++------------ src/conversion/converter.py | 24 +++---- src/conversion/fonts.py | 8 +-- src/conversion/notes.py | 10 ++- src/conversion/project_settings.py | 51 +++++++------ src/conversion/shaders.py | 6 +- src/conversion/sounds.py | 12 ++-- src/conversion/sprites.py | 12 ++-- src/conversion/tilesets.py | 8 +-- src/gui/about.py | 22 +++--- src/gui/icon.py | 12 ++-- src/gui/setupui.py | 33 +++++---- src/localization.py | 10 +-- 17 files changed, 171 insertions(+), 178 deletions(-) rename Languages/{en.json => eng.json} (94%) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 02bb771..f52a631 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -98,8 +98,8 @@ We particularly welcome contributions in these areas: ## Localization -To localize GM2Godot into other languages, create a copy of the Template.json file found in the Languages folder in GM2Godot's root directory. Rename the file to the chosen language's ISO-639 (Set 1) code (for example, en for English). Refer to https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes for a list of languages and their corresponding ISO-639 codes. -More information regarding localization can be found in the README section of the Template.json file. +To localize GM2Godot into other languages, create a copy of the Template.json file found in the Languages folder in GM2Godot's root directory. Rename the file to the chosen language's ISO-639 (Set 3) code (for example, eng for English). Refer to [Wikipedia](https://en.wikipedia.org/wiki/List_of_ISO_639-3_codes) for a list of languages and their corresponding ISO-639 codes. +More information regarding localization can be found in the README section of the Template.json file ([GitHub copy](https://raw.githubusercontent.com/Infiland/GM2Godot/refs/heads/main/Languages/template.json)) ## Questions or Issues? diff --git a/Current Language b/Current Language index c574d07..3552b5c 100644 --- a/Current Language +++ b/Current Language @@ -1 +1 @@ -en +eng diff --git a/Languages/en.json b/Languages/eng.json similarity index 94% rename from Languages/en.json rename to Languages/eng.json index 1dbc27d..fda02f5 100755 --- a/Languages/en.json +++ b/Languages/eng.json @@ -10,9 +10,9 @@ ], "Language" : "English", -"Language_Code" : "en", +"Language_Code" : "eng", "Author" : "written by Infiland, structured by HalfofBilly", -"Version" : "1.0.0", +"Version" : "0.0.14", "About_Title" : "About GM2Godot", "About_Description" : "GM2Godot is a tool designed to help developers migrate their GameMaker projects to the Godot Engine.\nIt automates the conversion of various project assets and settings, making the transition smoother.", @@ -47,10 +47,8 @@ "Console_Convertor_Settings" : "Updating project settings...", "Console_Convertor_Settings_Error_yypNotFound" : "No .yyp file found in the GameMaker project folder.", -"Console_Convertor_Settings_Error_GM_FileNotFound" : "{file_path} file not found.", "Console_Convertor_Settings_Error_yypNameNotRead" : "Error reading project name from .yyp file: {error}", -"Console_Convertor_Settings_Error_yypGeneric" : "Error reading {option_name} from {os.path.basename(file_path)}: {error}", -"Console_Convertor_Settings_Error_GD_NotFound" : "project.godot file not found in the Godot project directory.", +"Console_Convertor_Settings_Error_yypGeneric" : "Error reading {option_name} from {file_path}: {error}", "Console_Convertor_Settings_UpdatedName" : "Updated project name to: {gm_project_name}", "Console_Convertor_Settings_Error_Name_GM" : "Could not update project name: GameMaker project name not found.", "Console_Convertor_Settings_Error_NameGeneric" : "Error updating project name: {error)}.", @@ -77,7 +75,7 @@ "Console_Convertor_Tilesets" : "Converting tilesets...", "Console_Convertor_Tilesets_Complete" : "Tileset conversion completed.", -"Console_Convertor_Tilesets_Error_NotFound" : "Tileset folder not found in {self.gm_project_path}", +"Console_Convertor_Tilesets_Error_NotFound" : "Tileset folder not found in {gm_project_path}", "Console_Convertor_Sounds" : "Converting sounds...", "Console_Convertor_Sounds_Converted" : "Converted: {path} -> sounds/{path}", @@ -85,14 +83,14 @@ "Console_Convertor_Sounds_Complete" : "Sound conversion completed.", "Console_Convertor_Sounds_Stopped" : "Sound conversion stopped.", -"Console_Convertor_Shaders_Converted" : "Converted {filename} to {output_path}", +"Console_Convertor_Shaders_Converted" : "Converted {filename} -> {output_path}", "Console_Convertor_Notes" : "Converting notes...", "Console_Convertor_Notes_Copied" : "Copied note: {note_name}", "Console_Convertor_Notes_Stopped" : "Note conversion stopped.", "Console_Convertor_Notes_Error_NotFound" : "No notes folder found in GameMaker project.", -"Icon_Error_Photoimage" : "Failed to set icon using PhotoImage: {error}", +"Icon_Error_PhotoImage" : "Failed to set icon using PhotoImage: {error}", "Icon_Error_Linux" : "Failed to set icon on Linux: {error}", "Icon_Error_Path" : "Failed to load icon from {icon_path}. The icon will not be displayed.", "Icon_Error" : "Failed to load icon from {full_path}: {error}", diff --git a/Languages/template.json b/Languages/template.json index 18582da..5757973 100755 --- a/Languages/template.json +++ b/Languages/template.json @@ -47,10 +47,8 @@ "Console_Convertor_Settings" : "Updating project settings...", "Console_Convertor_Settings_Error_yypNotFound" : "No .yyp file found in the GameMaker project folder.", -"Console_Convertor_Settings_Error_GM_FileNotFound" : "{file_path} file not found.", "Console_Convertor_Settings_Error_yypNameNotRead" : "Error reading project name from .yyp file: {error}", -"Console_Convertor_Settings_Error_yypGeneric" : "Error reading {option_name} from {os.path.basename(file_path)}: {error}", -"Console_Convertor_Settings_Error_GD_NotFound" : "project.godot file not found in the Godot project directory.", +"Console_Convertor_Settings_Error_yypGeneric" : "Error reading {option_name} from {file_path}: {error}", "Console_Convertor_Settings_UpdatedName" : "Updated project name to: {gm_project_name}", "Console_Convertor_Settings_Error_Name_GM" : "Could not update project name: GameMaker project name not found.", "Console_Convertor_Settings_Error_NameGeneric" : "Error updating project name: {error)}.", @@ -77,7 +75,7 @@ "Console_Convertor_Tilesets" : "Converting tilesets...", "Console_Convertor_Tilesets_Complete" : "Tileset conversion completed.", -"Console_Convertor_Tilesets_Error_NotFound" : "Tileset folder not found in {self.gm_project_path}", +"Console_Convertor_Tilesets_Error_NotFound" : "Tileset folder not found in {gm_project_path}", "Console_Convertor_Sounds" : "Converting sounds...", "Console_Convertor_Sounds_Converted" : "Converted: {path} -> sounds/{path}", @@ -85,14 +83,14 @@ "Console_Convertor_Sounds_Complete" : "Sound conversion completed.", "Console_Convertor_Sounds_Stopped" : "Sound conversion stopped.", -"Console_Convertor_Shaders_Converted" : "Converted {filename} to {output_path}", +"Console_Convertor_Shaders_Converted" : "Converted {filename} -> {output_path}", "Console_Convertor_Notes" : "Converting notes...", "Console_Convertor_Notes_Copied" : "Copied note: {note_name}", "Console_Convertor_Notes_Stopped" : "Note conversion stopped.", "Console_Convertor_Notes_Error_NotFound" : "No notes folder found in GameMaker project.", -"Icon_Error_Photoimage" : "Failed to set icon using PhotoImage: {error}", +"Icon_Error_PhotoImage" : "Failed to set icon using PhotoImage: {error}", "Icon_Error_Linux" : "Failed to set icon on Linux: {error}", "Icon_Error_Path" : "Failed to load icon from {icon_path}. The icon will not be displayed.", "Icon_Error" : "Failed to load icon from {full_path}: {error}", diff --git a/main.py b/main.py index 4b2f5f5..4769282 100755 --- a/main.py +++ b/main.py @@ -26,14 +26,13 @@ from src.gui.setupui import SetupUI # Import localization manager -from src.localization import get_localized, get_current_language +from src.localization import get_localized class ConverterGUI: def __init__(self, master): - self.language = get_current_language() self.master = master - self.master.title(get_localized(self.language, 'Menu_Title').format(version=get_version())) + self.master.title(get_localized("Menu_Title").format(version=get_version())) self.master.geometry("800x600") self.master.configure(bg="#1e1e1e") self.icon = Icon(self.master) @@ -58,8 +57,8 @@ def __init__(self, master): self.timer_label = self.setup_ui.timer_label self.status_label = self.setup_ui.status_label - self.convert_button = self.setup_ui.get_button(get_localized(self.language, 'Menu_UI_Button_Convert')) - self.stop_button = self.setup_ui.get_button(get_localized(self.language, 'Menu_UI_Button_Stop')) + self.convert_button = self.setup_ui.get_button(get_localized("Menu_UI_Button_Convert")) + self.stop_button = self.setup_ui.get_button(get_localized("Menu_UI_Button_Stop")) self.setup_conversion_settings() self.conversion_running = threading.Event() @@ -200,7 +199,7 @@ def show_release_notes(self, event): if release_notes: self.display_release_notes(release_notes) else: - messagebox.showerror(get_localized(self.language, 'ReleaseNotes_Error_NoInternet')[0], get_localized(self.language, 'ReleaseNotes_Error_NoInternet')[1]) + messagebox.showerror(get_localized("ReleaseNotes_Error_NoInternet")[0], get_localized("ReleaseNotes_Error_NoInternet")[1]) def fetch_release_notes(self): try: @@ -210,12 +209,12 @@ def fetch_release_notes(self): else: return None except Exception as e: - print(get_localized(self.language, 'ReleaseNotes_Error_Generic').format(error=e)) + print(get_localized("ReleaseNotes_Error_Generic").format(error=e)) return None def display_release_notes(self, notes): notes_window = tk.Toplevel(self.master) - notes_window.title(get_localized(self.language, 'ReleaseNotes_Title')) + notes_window.title(get_localized("ReleaseNotes_Title")) notes_window.geometry("750x600") notes_window.configure(bg="#222222") @@ -263,11 +262,29 @@ def insert_formatted(content): text_widget.configure(state="disabled") def setup_conversion_settings(self): - settings = (set(item for sublist in get_localized(self.language, 'Settings_Categories_Contents') for item in sublist)) # merges all setting categories into a single array + #settings = (set(item for sublist in get_localized("Settings_Categories_Contents") for item in sublist)) # merges all setting categories into a single array + class settings_contents: + values = ["sprites", "fonts", "sounds", "game_icon", "project_name", "project_settings", "audio_buses", "notes", "objects", "shaders", "tilesets"] + + sprites = get_localized("Settings_Categories_Contents")[0][0] + fonts = get_localized("Settings_Categories_Contents")[0][1] + sounds = get_localized("Settings_Categories_Contents")[0][2] + + game_icon = get_localized("Settings_Categories_Contents")[1][0] + project_name = get_localized("Settings_Categories_Contents")[1][1] + project_settings = get_localized("Settings_Categories_Contents")[1][2] + audio_buses = get_localized("Settings_Categories_Contents")[1][3] + notes = get_localized("Settings_Categories_Contents")[1][4] - self.conversion_settings = {setting: tk.BooleanVar(value=True) for setting in settings} - self.conversion_settings[get_localized(self.language, 'Settings_Categories_Contents')[1][4]].set(False) - self.conversion_settings[get_localized(self.language, 'Settings_Categories_Contents')[2][0]].set(False) + objects = get_localized("Settings_Categories_Contents")[2][0] + shaders = get_localized("Settings_Categories_Contents")[2][1] + tilesets = get_localized("Settings_Categories_Contents")[2][2] + + settings = settings_contents() + + self.conversion_settings = {settings.values[i] : tk.BooleanVar(value=True) for i in range(len(settings.values))} + self.conversion_settings["notes"].set(False) + self.conversion_settings["objects"].set(False) match(platform.system()): case "Linux": @@ -282,7 +299,7 @@ def update_platform_settings(self, event): def open_settings(self): settings_window = tk.Toplevel(self.master) - settings_window.title(get_localized(self.language, 'Settings_Title')) + settings_window.title(get_localized("Settings_Title")) settings_window.geometry("800x500") # Wider window for horizontal layout settings_window.configure(bg="#1e1e1e") settings_window.transient(self.master) # Make it float on top of main window @@ -291,7 +308,7 @@ def open_settings(self): main_frame = ttk.Frame(settings_window, padding="20 20 20 20", style="TFrame") main_frame.pack(fill=tk.BOTH, expand=True) - ttk.Label(main_frame, text=get_localized(self.language, "Settings_Files_Heading"), style="TLabel", font=("Segoe UI", 14, "bold")).pack(pady=(0, 20)) + ttk.Label(main_frame, text=get_localized("Settings_Files_Heading"), style="TLabel", font=("Segoe UI", 14, "bold")).pack(pady=(0, 20)) # Create a frame for the categories categories_frame = ttk.Frame(main_frame, style="TFrame") @@ -303,9 +320,9 @@ def open_settings(self): categories_frame.grid_columnconfigure(2, weight=1) categories = { - get_localized(self.language, 'Settings_Categories_Headings')[0] : get_localized(self.language, 'Settings_Categories_Contents')[0], - get_localized(self.language, 'Settings_Categories_Headings')[1] : get_localized(self.language, 'Settings_Categories_Contents')[1], - get_localized(self.language, 'Settings_Categories_Headings')[2] : get_localized(self.language, 'Settings_Categories_Contents')[2] + get_localized("Settings_Categories_Headings")[0] : get_localized("Settings_Categories_Contents")[0], + get_localized("Settings_Categories_Headings")[1] : get_localized("Settings_Categories_Contents")[1], + get_localized("Settings_Categories_Headings")[2] : get_localized("Settings_Categories_Contents")[2] } # Create frames for each category @@ -326,8 +343,8 @@ def open_settings(self): platform_label_frame = ttk.Frame(platform_frame, style="TFrame") platform_label_frame.pack(fill=tk.X) - ttk.Label(platform_label_frame, text=get_localized(self.language, 'Settings_Platform_Heading'), style="TLabel", font=("Segoe UI", 14, "bold")).pack(side=tk.LEFT) - ttk.Label(platform_label_frame, text=get_localized(self.language, 'Settings_Platform_Subheading'), + ttk.Label(platform_label_frame, text=get_localized("Settings_Platform_Heading"), style="TLabel", font=("Segoe UI", 14, "bold")).pack(side=tk.LEFT) + ttk.Label(platform_label_frame, text=get_localized("Settings_Platform_Subheading"), style="TLabel", font=("Segoe UI", 10)).pack(side=tk.LEFT, padx=(10, 0)) combobox_frame = ttk.Frame(platform_frame, style="TFrame") @@ -354,9 +371,9 @@ def deselect_all(): for var in self.conversion_settings.values(): var.set(False) - ModernButton(button_frame, text=get_localized(self.language, 'Settings_Button_SelectAll'), command=select_all).pack(side=tk.LEFT, padx=5) - ModernButton(button_frame, text=get_localized(self.language, 'Settings_Button_DeselectAll'), command=deselect_all).pack(side=tk.LEFT, padx=5) - ModernButton(button_frame, text=get_localized(self.language, 'Settings_Button_Save'), command=settings_window.destroy).pack(side=tk.RIGHT, padx=5) + ModernButton(button_frame, text=get_localized("Settings_Button_SelectAll"), command=select_all).pack(side=tk.LEFT, padx=5) + ModernButton(button_frame, text=get_localized("Settings_Button_DeselectAll"), command=deselect_all).pack(side=tk.LEFT, padx=5) + ModernButton(button_frame, text=get_localized("Settings_Button_Save"), command=settings_window.destroy).pack(side=tk.RIGHT, padx=5) def log(self, message): if self.console: @@ -365,7 +382,7 @@ def log(self, message): self.console.see(tk.END) self.console.configure(state='disabled') else: - print(get_localized(self.language, 'Console_Error_NotInitialized').format(message=message)) + print(get_localized("Console_Error_NotInitialized").format(message=message)) def browse_project(self, entry, file_check, dialog_title): folder = filedialog.askdirectory(title=dialog_title) @@ -375,19 +392,19 @@ def browse_project(self, entry, file_check, dialog_title): file_check(folder) def browse_gm(self): - self.browse_project(self.setup_ui.entries[get_localized(self.language, "Menu_GameMaker").lower()], self.check_gm_project, get_localized(self.language, "Prompt_Path_GameMaker")) + self.browse_project(self.setup_ui.entries["gamemaker"], self.check_gm_project, get_localized("Prompt_Path_GameMaker")) def browse_godot(self): - self.browse_project(self.setup_ui.entries[get_localized(self.language, "Menu_Godot").lower()], self.check_godot_project, get_localized(self.language, "Prompt_Path_Godot")) + self.browse_project(self.setup_ui.entries["godot"], self.check_godot_project, get_localized("Prompt_Path_Godot")) def check_project_file(self, folder, file_extension, file_name): files = [f for f in os.listdir(folder) if f.endswith(file_extension)] if not files: - messagebox.showwarning(get_localized(self.language, 'Console_Error_InvalidProject')[0].format(file_name=file_name), get_localized(self.language, 'Console_Error_InvalidProject')[1].format(file_name=file_name, file_extension=file_extension)) + messagebox.showwarning(get_localized("Console_Error_InvalidProject")[0].format(file_name=file_name), get_localized("Console_Error_InvalidProject")[1].format(file_name=file_name, file_extension=file_extension)) elif len(files) > 1: - messagebox.showwarning(get_localized(self.language, 'Console_Error_MultipleGenericFiles')[0].format(file_extension=file_extension), get_localized(self.language, 'Console_Error_MultipleGenericFiles')[1].format(file_extension=file_extension, files=', '.join(files))) + messagebox.showwarning(get_localized("Console_Error_MultipleGenericFiles")[0].format(file_extension=file_extension), get_localized("Console_Error_MultipleGenericFiles")[1].format(file_extension=file_extension, files=', '.join(files))) else: - self.log(get_localized(self.language, 'Console_ProjectFound').format(file_name=file_name, files=files[0])) + self.log(get_localized("Console_ProjectFound").format(file_name=file_name, files=files[0])) def check_gm_project(self, folder): self.check_project_file(folder, '.yyp', 'GameMaker') @@ -400,9 +417,9 @@ def update_progress(self, value): self.progress_label.config(text=f"{value}%") def start_conversion(self): - gm_path, gm_platform, godot_path = self.setup_ui.entries[get_localized(self.language, "Menu_GameMaker").lower()].get(), self.gm_platform_settings, self.setup_ui.entries[get_localized(self.language, "Menu_Godot").lower()].get() + gm_path, gm_platform, godot_path = self.setup_ui.entries["gamemaker"].get(), self.gm_platform_settings, self.setup_ui.entries["godot"].get() if not gm_path or not godot_path: - self.log(get_localized(self.language, 'Console_Error_MissingDirectories')) + self.log(get_localized("Console_Error_MissingDirectories")) return if not self.validate_projects(gm_path, godot_path): @@ -426,11 +443,11 @@ def validate_projects(self, gm_path, godot_path): def log_project_errors(self, yyp_files, godot_project_file): if not yyp_files: - self.log(get_localized(self.language, 'Console_Error_MissingGamemakerFile')) + self.log(get_localized("Console_Error_MissingGamemakerFile")) elif len(yyp_files) > 1: - self.log(get_localized(self.language, 'Console_Error_MultipleGamemakerFiles').format(yyp_files=', '.join(yyp_files))) + self.log(get_localized("Console_Error_MultipleGamemakerFiles").format(yyp_files=', '.join(yyp_files))) if not os.path.exists(godot_project_file): - self.log(get_localized(self.language, 'Console_Error_MissingGodotFile')) + self.log(get_localized("Console_Error_MissingGodotFile")) def prepare_for_conversion(self): self.convert_button.config(state=tk.DISABLED) @@ -438,12 +455,12 @@ def prepare_for_conversion(self): self.conversion_running.set() self.console.delete('1.0', tk.END) self.progress.update_progress(0) - self.log(get_localized(self.language, 'Console_ConversionStart')) + self.log(get_localized("Console_ConversionStart")) def stop_conversion(self): if self.conversion_running.is_set(): self.conversion_running.clear() - self.log(get_localized(self.language, 'Console_ConversionStopping')) + self.log(get_localized("Console_ConversionStopping")) self.style.configure("Red.TButton", background="white", foreground="white") self.stop_button.config(state=tk.DISABLED, style="TButton") self.master.after(100, self.check_conversion_stopped) @@ -461,7 +478,7 @@ def update_timer(self): elapsed_time = int(time.time() - self.start_time) hours, remainder = divmod(elapsed_time, 3600) minutes, seconds = divmod(remainder, 60) - time_str = f"{get_localized(self.language, 'Menu_UI_Time_Heading')} {hours:02d}:{minutes:02d}:{seconds:02d}" + time_str = f"{get_localized('Menu_UI_Time_Heading')} {hours:02d}:{minutes:02d}:{seconds:02d}" self.timer_label.config(text=time_str) self.master.after(1000, self.update_timer) @@ -469,15 +486,15 @@ def convert(self, gm_path, gm_platform_settings_path, godot_path): project_settings_converter = ProjectSettingsConverter(gm_path, gm_platform_settings_path, godot_path, self.threadsafe_log) converters = [ - (get_localized(self.language, 'Settings_Categories_Contents')[1][0], project_settings_converter.convert_icon, get_localized(self.language, 'Console_Convertor_Icon')), - (get_localized(self.language, 'Settings_Categories_Contents')[1][1], project_settings_converter.update_project_name, get_localized(self.language, 'Console_Convertor_Name')), - (get_localized(self.language, 'Settings_Categories_Contents')[1][2], project_settings_converter.update_project_settings, get_localized(self.language, 'Console_Convertor_Settings')), - (get_localized(self.language, 'Settings_Categories_Contents')[1][3], project_settings_converter.generate_audio_bus_layout, get_localized(self.language, 'Console_Convertor_AudioBus')), - (get_localized(self.language, 'Settings_Categories_Contents')[0][0], lambda: SpriteConverter(gm_path, godot_path, self.threadsafe_log, self.threadsafe_update_progress, self.conversion_running.is_set).convert_all(), get_localized(self.language, 'Console_Convertor_Sprites')), - (get_localized(self.language, 'Settings_Categories_Contents')[0][1], lambda: FontConverter(gm_path, godot_path, self.threadsafe_log, self.threadsafe_update_progress, self.conversion_running.is_set).convert_all(), get_localized(self.language, 'Console_Convertor_Fonts')), - (get_localized(self.language, 'Settings_Categories_Contents')[2][2], lambda: TileSetConverter(gm_path, godot_path, self.threadsafe_log, self.threadsafe_update_progress, self.conversion_running.is_set).convert_all(), get_localized(self.language, 'Console_Convertor_Tilesets')), - (get_localized(self.language, 'Settings_Categories_Contents')[0][2], lambda: SoundConverter(gm_path, godot_path, self.threadsafe_log, self.threadsafe_update_progress, self.conversion_running.is_set).convert_sounds(), get_localized(self.language, 'Console_Convertor_Sounds')), - (get_localized(self.language, 'Settings_Categories_Contents')[1][4], lambda: NoteConverter(gm_path, godot_path, self.threadsafe_log, self.threadsafe_update_progress, self.conversion_running.is_set).convert_all(), get_localized(self.language, 'Console_Convertor_Notes')) + (get_localized("Settings_Categories_Contents")[1][0], project_settings_converter.convert_icon, get_localized("Console_Convertor_Icon")), + (get_localized("Settings_Categories_Contents")[1][1], project_settings_converter.update_project_name, get_localized("Console_Convertor_Name")), + (get_localized("Settings_Categories_Contents")[1][2], project_settings_converter.update_project_settings, get_localized("Console_Convertor_Settings")), + (get_localized("Settings_Categories_Contents")[1][3], project_settings_converter.generate_audio_bus_layout, get_localized("Console_Convertor_AudioBus")), + (get_localized("Settings_Categories_Contents")[0][0], lambda: SpriteConverter(gm_path, godot_path, self.threadsafe_log, self.threadsafe_update_progress, self.conversion_running.is_set).convert_all(), get_localized("Console_Convertor_Sprites")), + (get_localized("Settings_Categories_Contents")[0][1], lambda: FontConverter(gm_path, godot_path, self.threadsafe_log, self.threadsafe_update_progress, self.conversion_running.is_set).convert_all(), get_localized("Console_Convertor_Fonts")), + (get_localized("Settings_Categories_Contents")[2][2], lambda: TileSetConverter(gm_path, godot_path, self.threadsafe_log, self.threadsafe_update_progress, self.conversion_running.is_set).convert_all(), get_localized("Console_Convertor_Tilesets")), + (get_localized("Settings_Categories_Contents")[0][2], lambda: SoundConverter(gm_path, godot_path, self.threadsafe_log, self.threadsafe_update_progress, self.conversion_running.is_set).convert_sounds(), get_localized("Console_Convertor_Sounds")), + (get_localized("Settings_Categories_Contents")[1][4], lambda: NoteConverter(gm_path, godot_path, self.threadsafe_log, self.threadsafe_update_progress, self.conversion_running.is_set).convert_all(), get_localized("Console_Convertor_Notes")) ] for setting, converter, log_message in converters: @@ -506,8 +523,8 @@ def threadsafe_update_progress(self, value): def conversion_complete(self): self.progress.update_progress(100) - self.status_label.config(text="Conversion complete!") - self.log(get_localized(self.language, 'Console_ConversionComplete_B')) if self.conversion_running.is_set() else get_localized(self.language, 'Console_ConversionStopped') + self.status_label.config(text=get_localized("Console_ConversionComplete")) + self.log(get_localized("Console_ConversionComplete_B")) if self.conversion_running.is_set() else get_localized("Console_ConversionStopped") self.conversion_running.clear() self.convert_button.config(state=tk.NORMAL) self.stop_button.config(state=tk.DISABLED) diff --git a/src/conversion/converter.py b/src/conversion/converter.py index 9b8f9b4..f647dc9 100644 --- a/src/conversion/converter.py +++ b/src/conversion/converter.py @@ -6,13 +6,11 @@ from src.conversion.project_settings import ProjectSettingsConverter # Import localization manager -from src.localization import get_localized, get_current_language +from src.localization import get_localized #WORK IN PROGRESS class Converter: def __init__(self, log_callback, progress_callback): - self.language = get_current_language() - self.log = log_callback self.update_progress = progress_callback @@ -20,15 +18,15 @@ def convert(self, gm_path, godot_path, settings): project_settings_converter = ProjectSettingsConverter(gm_path, godot_path, self.log) converters = [ - ("game_icon", project_settings_converter.convert_icon, get_localized(self.language, 'Console_Convertor_Icon')), - ("project_name", project_settings_converter.update_project_name, get_localized(self.language, 'Console_Convertor_Name')), - ("project_settings", project_settings_converter.update_project_settings, get_localized(self.language, 'Console_Convertor_Settings')), - ("audio_buses", project_settings_converter.generate_audio_bus_layout, get_localized(self.language, 'Console_Convertor_AudioBus')), - ("sprites", lambda: SpriteConverter(gm_path, godot_path, self.threadsafe_log, self.threadsafe_update_progress, self.conversion_running.is_set).convert_all(), get_localized(self.language, 'Console_Convertor_Sprites')), - ("fonts", lambda: FontConverter(gm_path, godot_path, self.threadsafe_log, self.threadsafe_update_progress, self.conversion_running.is_set).convert_all(), get_localized(self.language, 'Console_Convertor_Fonts')), - ("tilesets", lambda: TileSetConverter(gm_path, godot_path, self.threadsafe_log, self.threadsafe_update_progress, self.conversion_running.is_set).convert_all(), get_localized(self.language, 'Console_Convertor_Tilesets')), - ("sounds", lambda: SoundConverter(gm_path, godot_path, self.threadsafe_log, self.threadsafe_update_progress, self.conversion_running.is_set).convert_sounds(), get_localized(self.language, 'Console_Convertor_Sounds')), - ("notes", lambda: NoteConverter(gm_path, godot_path, self.threadsafe_log, self.threadsafe_update_progress, self.conversion_running.is_set).convert_all(), get_localized(self.language, 'Console_Convertor_Notes')) + ("game_icon", project_settings_converter.convert_icon, get_localized("Console_Convertor_Icon")), + ("project_name", project_settings_converter.update_project_name, get_localized("Console_Convertor_Name")), + ("project_settings", project_settings_converter.update_project_settings, get_localized("Console_Convertor_Settings")), + ("audio_buses", project_settings_converter.generate_audio_bus_layout, get_localized("Console_Convertor_AudioBus")), + ("sprites", lambda: SpriteConverter(gm_path, godot_path, self.threadsafe_log, self.threadsafe_update_progress, self.conversion_running.is_set).convert_all(), get_localized("Console_Convertor_Sprites")), + ("fonts", lambda: FontConverter(gm_path, godot_path, self.threadsafe_log, self.threadsafe_update_progress, self.conversion_running.is_set).convert_all(), get_localized("Console_Convertor_Fonts")), + ("tilesets", lambda: TileSetConverter(gm_path, godot_path, self.threadsafe_log, self.threadsafe_update_progress, self.conversion_running.is_set).convert_all(), get_localized("Console_Convertor_Tilesets")), + ("sounds", lambda: SoundConverter(gm_path, godot_path, self.threadsafe_log, self.threadsafe_update_progress, self.conversion_running.is_set).convert_sounds(), get_localized("Console_Convertor_Sounds")), + ("notes", lambda: NoteConverter(gm_path, godot_path, self.threadsafe_log, self.threadsafe_update_progress, self.conversion_running.is_set).convert_all(), get_localized("Console_Convertor_Notes")) ] for setting, converter, log_message in converters: @@ -37,4 +35,4 @@ def convert(self, gm_path, godot_path, settings): converter() self.update_progress(0) - self.log(get_localized(self.language, 'Console_ConversionComplete')) + self.log(get_localized("Console_ConversionComplete")) diff --git a/src/conversion/fonts.py b/src/conversion/fonts.py index 097b04d..9d4e671 100644 --- a/src/conversion/fonts.py +++ b/src/conversion/fonts.py @@ -1,14 +1,12 @@ import os # Import localization manager -from src.localization import get_localized, get_current_language +from src.localization import get_localized # WORK IN PROGRESS class FontConverter: def __init__(self, gm_project_path, godot_project_path, log_callback=print, progress_callback=None, conversion_running=None): - self.language = get_current_language() - self.gm_project_path = gm_project_path self.godot_project_path = godot_project_path self.godot_sprites_path = os.path.join(self.godot_project_path, 'fonts') @@ -25,10 +23,10 @@ def convert_fonts(self): gm_sprites_path = os.path.join(self.gm_project_path, 'fonts') if not os.path.exists(gm_sprites_path): - self.log_callback(get_localized(self.language, 'Console_Convertor_Fonts_Error_NotFound').format(gm_project_path={self.gm_project_path})) + self.log_callback(get_localized("Console_Convertor_Fonts_Error_NotFound").format(gm_project_path={self.gm_project_path})) return - self.log_callback(get_localized(self.language, 'Console_Convertor_Fonts_Complete')) + self.log_callback(get_localized("Console_Convertor_Fonts_Complete")) def convert_all(self): self.convert_fonts() diff --git a/src/conversion/notes.py b/src/conversion/notes.py index 8e25bd8..ef8c4e0 100644 --- a/src/conversion/notes.py +++ b/src/conversion/notes.py @@ -2,12 +2,10 @@ import shutil # Import localization manager -from src.localization import get_localized, get_current_language +from src.localization import get_localized class NoteConverter: def __init__(self, gm_path, godot_path, log_function, update_progress, check_running): - self.language = get_current_language() - self.gm_path = gm_path self.godot_path = godot_path self.log = log_function @@ -19,7 +17,7 @@ def convert_notes(self): godot_notes_path = os.path.join(self.godot_path, "notes") if not os.path.exists(gm_notes_path): - self.log(get_localized(self.language, 'Console_Convertor_Notes_Error_NotFound')) + self.log(get_localized("Console_Convertor_Notes_Error_NotFound")) return if not os.path.exists(godot_notes_path): @@ -30,7 +28,7 @@ def convert_notes(self): for root, dirs, files in os.walk(gm_notes_path): if not self.check_running(): - self.log(self.log(get_localized(self.language, 'Console_Convertor_Notes_Stopped'))) + self.log(self.log(get_localized("Console_Convertor_Notes_Stopped"))) return for file in files: @@ -47,7 +45,7 @@ def convert_notes(self): shutil.copy2(src_file, dst_file) - self.log(get_localized(self.language, 'Console_Convertor_Notes_Copied').format(note_name=note_name)) + self.log(get_localized("Console_Convertor_Notes_Copied").format(note_name=note_name)) processed_notes += 1 progress = int((processed_notes / total_notes) * 100) diff --git a/src/conversion/project_settings.py b/src/conversion/project_settings.py index 9112f3d..96385dc 100755 --- a/src/conversion/project_settings.py +++ b/src/conversion/project_settings.py @@ -6,12 +6,10 @@ from typing import Optional, List, Callable # Import localization manager -from src.localization import get_localized, get_current_language +from src.localization import get_localized class ProjectSettingsConverter: def __init__(self, gm_project_path: str, gm_platform: str, godot_project_path: str, log_callback: Callable[[str], None] = print): - self.language = get_current_language() - self.gm_project_path = gm_project_path self.gm_platform = gm_platform self.godot_project_path = godot_project_path @@ -27,34 +25,34 @@ def convert_icon(self) -> bool: godot_png_path = os.path.join(self.godot_project_path, 'icon.png') if not os.path.exists(gm_icon_path): - self.log_callback(get_localized(self.language, 'Console_Convertor_Icon_Error_DirectoryNotFound').format(gm_icon_path=gm_icon_path)) + self.log_callback(get_localized("Console_Convertor_Icon_Error_DirectoryNotFound").format(gm_icon_path=gm_icon_path)) return False icon_files = [f for f in os.listdir(gm_icon_path) if f.endswith('.ico') or f.endswith('.png')] if not (icon_files): - self.log_callback(get_localized(self.language, 'Console_Convertor_Icon_Error_FileNotFound')) + self.log_callback(get_localized("Console_Convertor_Icon_Error_FileNotFound")) return False source_icon = os.path.join(gm_icon_path, icon_files[0]) try: shutil.copy2(source_icon, godot_ico_path) - self.log_callback(get_localized(self.language, 'Console_Convertor_Icon_Copied').format(icon_files=icon_files[0])) + self.log_callback(get_localized("Console_Convertor_Icon_Copied").format(icon_files=icon_files[0])) with Image.open(source_icon) as img: img.save(godot_png_path, 'PNG') - self.log_callback(self.log_callback(get_localized(self.language, 'Console_Convertor_Icon_Converted').format(icon_files=icon_files[0]))) + self.log_callback(self.log_callback(get_localized("Console_Convertor_Icon_Converted").format(icon_files=icon_files[0]))) return True except Exception as e: - self.log_callback(get_localized(self.language, 'Console_Convertor_Error_IconGeneric').format(error=str(e))) + self.log_callback(get_localized("Console_Convertor_Error_IconGeneric").format(error=str(e))) return False def get_gm_project_name(self) -> Optional[str]: yyp_files = [f for f in os.listdir(self.gm_project_path) if f.endswith('.yyp')] if not yyp_files: - self.log_callback(self.log_callback(get_localized(self.language, 'Console_Convertor_Settings_Error_yypNotFound'))) + self.log_callback(self.log_callback(get_localized("Console_Convertor_Settings_Error_yypNotFound"))) return None yyp_file = os.path.join(self.gm_project_path, yyp_files[0]) @@ -64,12 +62,12 @@ def get_gm_project_name(self) -> Optional[str]: match = re.search(r'"%Name":\s*"([^"]*)"', content) return match.group(1) if match else None except Exception as e: - self.log_callback(get_localized(self.language, 'Console_Convertor_Settings_Error_yypNameNotRead').format(error=str(e))) + self.log_callback(get_localized("Console_Convertor_Settings_Error_yypNameNotRead").format(error=str(e))) return None def get_gm_option(self, option_name: str, file_path: str) -> Optional[str]: if not os.path.exists(file_path): - self.log_callback(self.log_callback(get_localized(self.language, 'Console_Convertor_Settings_Error_yypNotFound'))) + self.log_callback(self.log_callback(get_localized("Console_Convertor_Settings_Error_yypNotFound"))) return None try: @@ -78,14 +76,14 @@ def get_gm_option(self, option_name: str, file_path: str) -> Optional[str]: match = re.search(f'"{option_name}":\\s*([^,\n]+)', content) return match.group(1).strip('"') if match else None except Exception as e: - self.log_callback(get_localized(self.language, 'Console_Convertor_Settings_Error_yypGeneric').format(error=str(e))) + self.log_callback(get_localized("Console_Convertor_Settings_Error_yypGeneric").format(option_name=option_name, file_path=os.path.basename(file_path), error=str(e))) return None def update_project_name(self) -> None: project_godot_path = os.path.join(self.godot_project_path, 'project.godot') if not os.path.exists(project_godot_path): - self.log_callback(get_localized(self.language, 'Console_Convertor_Settings_Error_GD_NotFound')) + self.log_callback(get_localized("Console_Error_MissingGodotFile")) return try: @@ -95,21 +93,22 @@ def update_project_name(self) -> None: gm_project_name = self.get_gm_project_name() if gm_project_name: content = re.sub(r'config/name=".*"', f'config/name="{gm_project_name}"', content) - self.log_callback(get_localized(self.language, 'Console_Convertor_Settings_UpdatedName').format(gm_project_name=gm_project_name)) + self.log_callback(get_localized("Console_Convertor_Settings_UpdatedName").format(gm_project_name=gm_project_name)) else: - self.log_callback(get_localized(self.language, 'Console_Convertor_Settings_Error_Name_GM')) + self.log_callback(get_localized("Console_Convertor_Settings_Error_Name_GM")) with open(project_godot_path, 'w') as file: file.write(content) except Exception as e: - self.log_callback(get_localized(self.language, 'Console_Convertor_Settings_Error_NameGeneric').format(error=str(e))) + self.log_callback(get_localized("Console_Convertor_Settings_Error_NameGeneric").format(error=str(e))) def update_project_settings(self) -> None: project_godot_path = os.path.join(self.godot_project_path, 'project.godot') if not os.path.exists(project_godot_path): - self.log_callback(get_localized(self.language, 'Console_Convertor_Settings_Error_GD_NotFound')) + self.log_callback(get_localized("Console_Error_MissingGodotFile")) + self.log_callback(get_localized("")) return try: @@ -139,10 +138,10 @@ def update_project_settings(self) -> None: with open(project_godot_path, 'w') as file: file.write(content) - self.log_callback(get_localized(self.language, 'Console_Convertor_Settings_Updated')) + self.log_callback(get_localized("Console_Convertor_Settings_Updated")) except Exception as e: - self.log_callback(get_localized(self.language, 'Console_Convertor_Settings_Error_NotUpdated').format(error=str(e))) + self.log_callback(get_localized("Console_Convertor_Settings_Error_NotUpdated").format(error=str(e))) def update_godot_setting(self, content: str, setting: str, value: str, section: str = "application") -> str: if section not in content: @@ -170,7 +169,7 @@ def update_godot_setting(self, content: str, setting: str, value: str, section: def read_audio_groups(self) -> List[str]: yyp_files = [f for f in os.listdir(self.gm_project_path) if f.endswith('.yyp')] if not yyp_files: - self.log_callback(get_localized(self.language, 'Console_Convertor_Settings_Error_yypNotFound')) + self.log_callback(get_localized("Console_Convertor_Settings_Error_yypNotFound")) return [] yyp_file = os.path.join(self.gm_project_path, yyp_files[0]) @@ -180,22 +179,22 @@ def read_audio_groups(self) -> List[str]: audio_groups_match = re.search(r'"AudioGroups":\s*\[(.*?)\]', yyp_content, re.DOTALL) if not audio_groups_match: - self.log_callback(get_localized(self.language, 'Console_Convertor_AudioBus_Error_SectionNotFound_GM')) + self.log_callback(get_localized("Console_Convertor_AudioBus_Error_SectionNotFound_GM")) return [] audio_groups_content = audio_groups_match.group(1) audio_group_names = re.findall(r'"%Name":\s*"([^"]*)"', audio_groups_content) if not audio_group_names: - self.log_callback(get_localized(self.language, 'Console_Convertor_AudioBus_Error_NameNotFound_GM')) + self.log_callback(get_localized("Console_Convertor_AudioBus_Error_NameNotFound_GM")) return [] - self.log_callback(get_localized(self.language, 'Console_Convertor_AudioBus_Group_Found').format(audio_group_names=', '.join(audio_group_names))) + self.log_callback(get_localized("Console_Convertor_AudioBus_Group_Found").format(audio_group_names=', '.join(audio_group_names))) return audio_group_names except Exception as e: - self.log_callback(get_localized(self.language, 'Console_Convertor_AudioBus_Error_Group_Generic').format(error=str(e))) + self.log_callback(get_localized("Console_Convertor_AudioBus_Error_Group_Generic").format(error=str(e))) return [] def generate_audio_bus_layout(self) -> None: @@ -227,7 +226,7 @@ def generate_audio_bus_layout(self) -> None: file.write(f'bus/{i}/volume_db = 0.0\n') file.write(f'bus/{i}/send = "Master"\n') - self.log_callback(get_localized(self.language, 'Console_Convertor_AudioBus_Group_Generated').format(audio_groups_num=len(audio_groups))) + self.log_callback(get_localized("Console_Convertor_AudioBus_Group_Generated").format(audio_groups_num=len(audio_groups))) self.log_callback(f"Generated default_bus_layout.tres with {len(audio_groups)} audio buses.") except Exception as e: - self.log_callback(get_localized(self.language, 'Console_Convertor_AudioBus_Error_GroupNotGenerated').format(error=str(e))) + self.log_callback(get_localized("Console_Convertor_AudioBus_Error_GroupNotGenerated").format(error=str(e))) diff --git a/src/conversion/shaders.py b/src/conversion/shaders.py index 0fc13ad..7476632 100644 --- a/src/conversion/shaders.py +++ b/src/conversion/shaders.py @@ -2,12 +2,10 @@ import os # Import localization manager -from src.localization import get_localized, get_current_language +from src.localization import get_localized # WORK IN PROGRESS -self.language = get_current_language() - def convert_gm_to_godot_shader(input_file, output_file): with open(input_file, 'r') as f: content = f.read() @@ -56,7 +54,7 @@ def process_directory(input_dir, output_dir): input_path = os.path.join(input_dir, filename) output_path = os.path.join(output_dir, filename.rsplit('.', 1)[0] + '.gdshader') convert_gm_to_godot_shader(input_path, output_path) - print(get_localized(self.language, 'Console_Convertor_Shaders_Converted').format(filename=filename, output_path=os.path.basename(output_path))) + print(get_localized("Console_Convertor_Shaders_Converted").format(filename=filename, output_path=os.path.basename(output_path))) input_directory = 'path/to/input/directory' output_directory = 'path/to/output/directory' diff --git a/src/conversion/sounds.py b/src/conversion/sounds.py index 196584b..57ca6e9 100644 --- a/src/conversion/sounds.py +++ b/src/conversion/sounds.py @@ -3,12 +3,10 @@ from concurrent.futures import ThreadPoolExecutor, as_completed # Import localization manager -from src.localization import get_localized, get_current_language +from src.localization import get_localized class SoundConverter: def __init__(self, gm_project_path, godot_project_path, log_callback=print, progress_callback=None, conversion_running=None): - self.language = get_current_language() - self.gm_project_path = gm_project_path self.godot_project_path = godot_project_path self.godot_sounds_path = os.path.join(self.godot_project_path, 'sounds') @@ -38,7 +36,7 @@ def process_sound_file(self, gm_sound_path): godot_sound_path = os.path.join(self.godot_sounds_path, rel_path) shutil.copy2(gm_sound_path, godot_sound_path) - self.log_callback(get_localized(self.language, 'Console_Convertor_Sounds_Converted').format(path=rel_path)) + self.log_callback(get_localized("Console_Convertor_Sounds_Converted").format(path=rel_path)) return True def convert_sounds(self): @@ -46,7 +44,7 @@ def convert_sounds(self): sound_files = self.find_sound_files() if not sound_files: - self.log_callback(get_localized(self.language, 'Console_Convertor_Sounds_Error_NotFound')) + self.log_callback(get_localized("Console_Convertor_Sounds_Error_NotFound")) return total_sounds = len(sound_files) @@ -60,6 +58,6 @@ def convert_sounds(self): if self.progress_callback: self.progress_callback(int(processed_sounds / total_sounds * 100)) else: - self.log_callback(get_localized(self.language, 'Console_Convertor_Sounds_Stopped')) + self.log_callback(get_localized("Console_Convertor_Sounds_Stopped")) return - self.log_callback(get_localized(self.language, 'Console_Convertor_Sounds_Complete')) + self.log_callback(get_localized("Console_Convertor_Sounds_Complete")) diff --git a/src/conversion/sprites.py b/src/conversion/sprites.py index 6ade650..85028c4 100644 --- a/src/conversion/sprites.py +++ b/src/conversion/sprites.py @@ -3,12 +3,10 @@ from collections import defaultdict # Import localization manager -from src.localization import get_localized, get_current_language +from src.localization import get_localized class SpriteConverter: def __init__(self, gm_project_path, godot_project_path, log_callback=print, progress_callback=None, conversion_running=None): - self.language = get_current_language() - self.gm_project_path = gm_project_path self.godot_project_path = godot_project_path self.godot_sprites_path = os.path.join(self.godot_project_path, 'sprites') @@ -34,7 +32,7 @@ def convert_sprites(self): sprite_images = self.find_sprite_images() if not sprite_images: - self.log_callback(get_localized(self.language, 'Console_Convertor_Sprites_Error_NotFound')) + self.log_callback(get_localized("Console_Convertor_Sprites_Error_NotFound")) return total_images = sum(len(images) for images in sprite_images.values()) @@ -42,7 +40,7 @@ def convert_sprites(self): for sprite_name, images in sprite_images.items(): if not self.conversion_running(): - self.log_callback(get_localized(self.language, 'Console_Convertor_Sprites_Stopped')) + self.log_callback(get_localized("Console_Convertor_Sprites_Stopped")) return godot_sprite_folder = os.path.join(self.godot_sprites_path, sprite_name) @@ -55,13 +53,13 @@ def convert_sprites(self): with Image.open(gm_sprite_path) as img: img.save(godot_sprite_path, 'PNG') - self.log_callback(get_localized(self.language, 'Console_Convertor_Sprites_Converted').format(relative_path=os.path.relpath(gm_sprite_path, self.gm_project_path), sprite_name=sprite_name, new_filename=new_filename)) + self.log_callback(get_localized("Console_Convertor_Sprites_Converted").format(relative_path=os.path.relpath(gm_sprite_path, self.gm_project_path), sprite_name=sprite_name, new_filename=new_filename)) processed_images += 1 if self.progress_callback: self.progress_callback(int(processed_images / total_images * 100)) - self.log_callback(get_localized(self.language, 'Console_Convertor_Sprites_Complete')) + self.log_callback(get_localized("Console_Convertor_Sprites_Complete")) def convert_all(self): self.convert_sprites() diff --git a/src/conversion/tilesets.py b/src/conversion/tilesets.py index 09e0490..8a76004 100644 --- a/src/conversion/tilesets.py +++ b/src/conversion/tilesets.py @@ -1,14 +1,12 @@ import os # Import localization manager -from src.localization import get_localized, get_current_language +from src.localization import get_localized # WORK IN PROGRESS class TileSetConverter: def __init__(self, gm_project_path, godot_project_path, log_callback=print, progress_callback=None, conversion_running=None): - self.language = get_current_language() - self.gm_project_path = gm_project_path self.godot_project_path = godot_project_path self.godot_sprites_path = os.path.join(self.godot_project_path, 'tilesets') @@ -25,10 +23,10 @@ def convert_tilesets(self): gm_sprites_path = os.path.join(self.gm_project_path, 'tilesets') if not os.path.exists(gm_sprites_path): - self.log_callback(get_localized(self.language, 'Console_Convertor_Tilesets_Error_NotFound').format(project_path=self.gm_project_path)) + self.log_callback(get_localized("Console_Convertor_Tilesets_Error_NotFound").format(project_path=self.gm_project_path)) return - self.log_callback(get_localized(self.language, 'Console_Convertor_Tilesets_Complete')) + self.log_callback(get_localized("Console_Convertor_Tilesets_Complete")) def convert_all(self): self.convert_tilesets() diff --git a/src/gui/about.py b/src/gui/about.py index ed0e40f..312ab09 100644 --- a/src/gui/about.py +++ b/src/gui/about.py @@ -8,14 +8,12 @@ from src.version import get_version # Import localization manager -from src.localization import get_localized, get_current_language +from src.localization import get_localized class AboutDialog: def __init__(self, parent): - self.language = get_current_language() - self.dialog = tk.Toplevel(parent) - self.dialog.title(get_localized(self.language, "About_Title")) + self.dialog.title(get_localized("About_Title")) self.dialog.geometry("600x700") self.dialog.configure(bg="#222222") self.dialog.transient(parent) @@ -54,11 +52,11 @@ def create_widgets(self): main_frame.pack(fill=tk.BOTH, expand=True) ttk.Label(main_frame, - text=get_localized(self.language, "Menu_Title").format(version=get_version()), + text=get_localized("Menu_Title").format(version=get_version()), style="AboutTitle.TLabel").pack(pady=(0, 10)) description = ( - get_localized(self.language, 'About_Description') + get_localized("About_Description") ) ttk.Label(main_frame, text=description, @@ -66,7 +64,7 @@ def create_widgets(self): wraplength=500).pack(pady=(0, 20)) ttk.Label(main_frame, - text=get_localized(self.language, "About_Contributors_Heading"), + text=get_localized("About_Contributors_Heading"), style="AboutSection.TLabel").pack(pady=(0, 10)) self.create_contributors_list(main_frame) @@ -110,9 +108,9 @@ def create_links_section(self, parent): links_frame.pack(pady=20) links = [ - (get_localized(self.language, 'About_Repository'), "https://github.com/Infiland/GM2Godot"), - (get_localized(self.language, 'About_Issues'), "https://github.com/Infiland/GM2Godot/issues"), - (get_localized(self.language, 'About_Website'), "https://infi.land") + (get_localized("About_Repository"), "https://github.com/Infiland/GM2Godot"), + (get_localized("About_Issues"), "https://github.com/Infiland/GM2Godot/issues"), + (get_localized("About_Website"), "https://infi.land") ] for text, url in links: @@ -126,7 +124,7 @@ def create_links_section(self, parent): def create_copyright_label(self, parent): """Create copyright label with current year.""" current_year = datetime.now().year - copyright_text = get_localized(self.language, 'About_Copyright').format(current_year=current_year) + copyright_text = get_localized('About_Copyright').format(current_year=current_year) ttk.Label(parent, text=copyright_text, style="About.TLabel").pack(pady=(20, 0)) @@ -146,7 +144,7 @@ def display_contributors(self, parent_frame): except Exception as e: ttk.Label(parent_frame, - text=get_localized(self.language, 'About_Error_Contributors_NotFound').format(error=str(e)), + text=get_localized("About_Error_Contributors_NotFound").format(error=str(e)), style="About.TLabel").pack(pady=5) def create_contributor_widget(self, parent_frame, contributor): diff --git a/src/gui/icon.py b/src/gui/icon.py index ea5e860..cf494ff 100644 --- a/src/gui/icon.py +++ b/src/gui/icon.py @@ -4,12 +4,10 @@ from tkinter import ttk # Import localization manager -from src.localization import get_localized, get_current_language +from src.localization import get_localized class Icon: def __init__(self, master): - self.language = get_current_language() - self.master = master self.base_path = os.path.dirname(os.path.dirname(os.path.dirname(__file__))) self.set_program_icon() @@ -30,7 +28,7 @@ def set_windows_icon(self, icon_path): icon = tk.PhotoImage(file=icon_path) self.master.iconphoto(False, icon) except Exception as e: - print(get_localized(self.language, 'Icon_Error_Photoimage').format(error=e)) + print(get_localized("Icon_Error_PhotoImage").format(error=e)) self.set_default_icon(icon_path) def set_linux_icon(self, icon_path): @@ -38,7 +36,7 @@ def set_linux_icon(self, icon_path): img = tk.Image("photo", file=icon_path) self.master.tk.call('wm', 'iconphoto', self.master._w, img) except Exception as e: - print(get_localized(self.language, 'Icon_Error_Linux').format(error=e)) + print(get_localized("Icon_Error_Linux").format(error=e)) self.set_default_icon(icon_path) def set_default_icon(self, icon_path): @@ -46,7 +44,7 @@ def set_default_icon(self, icon_path): icon = tk.PhotoImage(file=icon_path) self.master.iconphoto(True, icon) except tk.TclError: - print(get_localized(self.language, 'Icon_Error_Path').format(icon_path=icon_path)) + print(get_localized("Icon_Error_Path").format(icon_path=icon_path)) def load_icon(self, path): try: @@ -55,7 +53,7 @@ def load_icon(self, path): img = Image.open(full_path) return ImageTk.PhotoImage(img.resize((20, 20), Image.Resampling.LANCZOS)) except Exception as e: - print(get_localized(self.language, 'Icon_Error').format(full_path=full_path, error=e)) + print(get_localized("Icon_Error").format(full_path=full_path, error=e)) return None def get_gamemaker_icon(self): diff --git a/src/gui/setupui.py b/src/gui/setupui.py index db26532..0fab838 100644 --- a/src/gui/setupui.py +++ b/src/gui/setupui.py @@ -8,12 +8,10 @@ from src.version import get_version # Import localization manager -from src.localization import get_localized, get_current_language +from src.localization import get_localized class SetupUI: def __init__(self, master, app): - self.language = get_current_language() - self.master = master self.app = app self.icon = Icon(self.master) @@ -47,23 +45,24 @@ def setup_ui(self): self.master.minsize(600, 400) def create_project_path_inputs(self, parent): - paths = [(get_localized(self.language, "Menu_GameMaker"), self.app.browse_gm, self.icon.get_gamemaker_icon()), - (get_localized(self.language, "Menu_Godot"), self.app.browse_godot, self.icon.get_godot_icon())] + paths = [("GameMaker", self.app.browse_gm, self.icon.get_gamemaker_icon()), + ("Godot", self.app.browse_godot, self.icon.get_godot_icon())] for idx, (label, command, icon) in enumerate(paths): + Game_Engine = get_localized(f"Menu_{label}") frame = ttk.Frame(parent, style="TFrame") frame.grid(row=idx, column=0, columnspan=3, sticky="ew", pady=(0, 20)) icon_label = ttk.Label(frame, text=label[:2] if icon is None else "", image=icon, style="TLabel") icon_label.pack(side=tk.LEFT, padx=(0, 10)) - path_label = ttk.Label(frame, text=get_localized(self.language, "Menu_UI_Directory_Heading").format(Game_Engine = label), style="TLabel") + path_label = ttk.Label(frame, text=get_localized("Menu_UI_Directory_Heading").format(Game_Engine = Game_Engine), style="TLabel") path_label.pack(side=tk.LEFT) entry = ttk.Entry(frame, style="TEntry") entry.pack(side=tk.LEFT, fill=tk.X, expand=True, padx=10) - browse_button = ModernButton(frame, text=get_localized(self.language, "Menu_UI_Directory_Button").format(Game_Engine = label), command=command) + browse_button = ModernButton(frame, text=get_localized("Menu_UI_Directory_Button").format(Game_Engine = Game_Engine), command=command) browse_button.pack(side=tk.LEFT) self.entries[label.lower()] = entry @@ -79,9 +78,9 @@ def create_buttons(self, parent): inner_button_frame.grid(row=0, column=1) # Create convert and settings buttons - convert_button = ModernButton(inner_button_frame, text=get_localized(self.language, 'Menu_UI_Button_Convert'), command=self.app.start_conversion) + convert_button = ModernButton(inner_button_frame, text=get_localized("Menu_UI_Button_Convert"), command=self.app.start_conversion) convert_button.grid(row=0, column=0, padx=10) - self.buttons[get_localized(self.language, 'Menu_UI_Button_Convert')] = convert_button + self.buttons[get_localized("Menu_UI_Button_Convert")] = convert_button # Create stop button with icon stop_button = ModernButton(inner_button_frame, command=self.app.stop_conversion, state=tk.DISABLED, icon_only=True) @@ -89,14 +88,14 @@ def create_buttons(self, parent): stop_button.configure(image=stop_icon) stop_button._icon = stop_icon # Keep a reference to prevent garbage collection stop_button.grid(row=0, column=1, padx=10) - self.buttons[get_localized(self.language, 'Menu_UI_Button_Stop')] = stop_button + self.buttons[get_localized("Menu_UI_Button_Stop")] = stop_button - settings_button = ModernButton(inner_button_frame, text=get_localized(self.language, 'Menu_UI_Button_Settings'), command=self.app.open_settings) + settings_button = ModernButton(inner_button_frame, text=get_localized("Menu_UI_Button_Settings"), command=self.app.open_settings) settings_button.grid(row=0, column=2, padx=10) - self.buttons[get_localized(self.language, 'Menu_UI_Button_Settings')] = settings_button + self.buttons[get_localized("Menu_UI_Button_Settings")] = settings_button def get_button(self, button_name): - return self.buttons.get(button_name.lower()) + return self.buttons.get(button_name)#.lower()) def create_console(self, parent): console_frame = ttk.Frame(parent, style="TFrame") @@ -142,7 +141,7 @@ def create_progress_bar(self, parent): status_frame.grid_columnconfigure(1, weight=1) self.timer_label = ttk.Label(status_frame, - text=f"{get_localized(self.language, 'Menu_UI_Time_Heading')} 00:00:00", + text=f"{get_localized('Menu_UI_Time_Heading')} 00:00:00", style="TLabel", font=('Segoe UI', 10)) self.timer_label.grid(row=0, column=0, padx=(0, 20)) @@ -159,7 +158,7 @@ def create_info_labels(self, parent): info_frame.grid_columnconfigure(1, weight=1) version_label = ttk.Label(info_frame, - text=get_localized(self.language, "UI_Label_Version").format(version=get_version()), + text=get_localized("UI_Label_Version").format(version=get_version()), style="TLabel", cursor="hand2", font=('Segoe UI', 9)) @@ -169,7 +168,7 @@ def create_info_labels(self, parent): version_label.bind('', lambda e: version_label.configure(foreground="#e0e0e0")) contribute_label = ttk.Label(info_frame, - text=get_localized(self.language, "UI_Label_Contribute"), + text=get_localized("UI_Label_Contribute"), style="TLabel", cursor="hand2", font=('Segoe UI', 9)) @@ -179,7 +178,7 @@ def create_info_labels(self, parent): contribute_label.bind('', lambda e: contribute_label.configure(foreground="#e0e0e0")) made_by_label = ttk.Label(info_frame, - text=get_localized(self.language, "UI_Label_MadeBy"), + text=get_localized("UI_Label_MadeBy"), style="TLabel", cursor="hand2", font=('Segoe UI', 9)) diff --git a/src/localization.py b/src/localization.py index 3ffe656..2d00307 100644 --- a/src/localization.py +++ b/src/localization.py @@ -1,12 +1,12 @@ import json, string -def get_localized(language, key): +def get_localized(key): + # Find active language + with open('Current Language', 'r') as file: + language = file.readline().strip('\n') + # Find matching key in lanugage json with open(f'Languages/{language}.json', 'r') as file: return json.load(file)[key] -def get_current_language(): - with open('Current Language', 'r') as file: - return file.readline().strip('\n') - From 0f6ad1a2bee28f0ad9bae15bdbfb61be402594f6 Mon Sep 17 00:00:00 2001 From: HalfOfBilly <143804951+HalfOfBilly@users.noreply.github.com> Date: Mon, 13 Jan 2025 12:30:45 +0000 Subject: [PATCH 2/2] Change version to 0.0.14 --- src/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/version.py b/src/version.py index 4c55b92..fda1621 100644 --- a/src/version.py +++ b/src/version.py @@ -1,4 +1,4 @@ -VERSION = "0.0.13" +VERSION = "0.0.14" def get_version(): return VERSION