diff --git a/Doc/G-LAUNCHER-HANDOFF.md b/Doc/G-LAUNCHER-HANDOFF.md index a1f97bb..1b5164c 100644 --- a/Doc/G-LAUNCHER-HANDOFF.md +++ b/Doc/G-LAUNCHER-HANDOFF.md @@ -34,6 +34,7 @@ | **Thai Mod Engine (ExcelData)** | ✅ | ✅ | ✅ | ⚠️ รอเกมจริง | `internal/language-service/thai-patch.go` มีระบบ `.backup` | | **Multi-Language (i18n)** | ✅ | ✅ | ✅ | ✅ | 6 ภาษา (`th`, `en`, `ja`, `ko`, `vi`, `zh`) ใน `frontend/public/locales/` | | **Standalone Tool Extraction** | ✅ | ✅ | ✅ | ✅ | แตกไฟล์ `assets/` (`7za.exe`, `hpatchz.exe`, `zift.exe`) ลง `bin/` | +| **Server Selection & GaCy PS** | ✅ | ✅ | ✅ | ✅ | ปุ่มเลือกเซิร์ฟเวอร์ด้านข้าง + ระบบดาวน์โหลด GaCy-GO (ZIP หรือ standalone sdk/server) | --- diff --git a/build/windows/icon.ico b/build/windows/icon.ico index 376804d..7a561b0 100644 Binary files a/build/windows/icon.ico and b/build/windows/icon.ico differ diff --git a/build/windows/icons.ico b/build/windows/icons.ico index 0a91376..7a561b0 100644 Binary files a/build/windows/icons.ico and b/build/windows/icons.ico differ diff --git a/frontend/bindings/g-launcher/internal/git-service/gitservice.js b/frontend/bindings/g-launcher/internal/git-service/gitservice.js index ad99600..5f7bb48 100644 --- a/frontend/bindings/g-launcher/internal/git-service/gitservice.js +++ b/frontend/bindings/g-launcher/internal/git-service/gitservice.js @@ -30,6 +30,13 @@ export function DownloadServerProgress(version) { return $Call.ByID(1818966979, version); } +/** + * @returns {$CancellablePromise<[string, string]>} + */ +export function FindServerExecutables() { + return $Call.ByID(1413748964); +} + /** * @returns {$CancellablePromise<[boolean, string, string]>} */ diff --git a/frontend/public/appicon.png b/frontend/public/appicon.png index 97b018c..8a497c9 100644 Binary files a/frontend/public/appicon.png and b/frontend/public/appicon.png differ diff --git a/frontend/public/favicon.ico b/frontend/public/favicon.ico new file mode 100644 index 0000000..7a561b0 Binary files /dev/null and b/frontend/public/favicon.ico differ diff --git a/frontend/public/locales/en.json b/frontend/public/locales/en.json index c1f30cb..2ae6031 100644 --- a/frontend/public/locales/en.json +++ b/frontend/public/locales/en.json @@ -1,337 +1,337 @@ -{ - "header": { - "home": "Home", - "tools": "Tools", - "language": "Language", - "diff": "Diff", - "client_update": "Client Update", - "plugins": "Plugins", - "analysis": "Analysis (Veritas)", - "firefly_tools": "Firefly Tools", - "how_to": "How to?", - "about": "About", - "settings": "Settings", - "minimize": "Minimize", - "close": "Close", - "by": "Firefly Shelter" - }, - "background": { - "select_bg": "Select Background", - "choose_bg": "Choose Background", - "paste_url": "Paste image URL (https://...)", - "add": "Add", - "upload": "Upload", - "upload_from_computer": "Upload from computer", - "done": "Done", - "remove": "Remove", - "invalid_url": "Invalid url" - }, - "close": { - "title": "Confirm Action", - "description": "Do you want to minimize the application to the system tray or close the application?", - "dont_ask": "Do not ask me again", - "minimize": "Minimize", - "close": "Close" - }, - "setting": { - "title": "Settings", - "launcher_update_title": "Launcher Update", - "launcher_update_desc": "Check if your launcher is up to date.", - "launcher_update_btn": "Check for Launcher Updates", - "launcher_update_success": "Launcher is already up to date", - "closing_options_title": "Closing Options", - "set_dont_ask_again": "Set do not ask again", - "closing_auto_desc": "Next time you close the app, it will automatically {{action}} without asking.", - "action_minimize": "minimize to system tray", - "action_quit": "quit the app", - "version_label": "Version", - "server_label": "Server", - "proxy_label": "Proxy", - "launcher_label": "Launcher" - }, - "home": { - "header_title": "Firefly GO", - "tooltip_how_to": "How to use all tools & commands", - "btn_select_game": "Select Game file", - "btn_selecting": "Selecting...", - "btn_start_game": "Start Game", - "btn_game_running": "Game is running", - "menu_change_path": "Change Game Path", - "menu_check_update": "Check for Updates Server & Proxy", - "menu_open_server": "Open server folder", - "menu_open_proxy": "Open proxy folder", - "menu_open_voice": "Open voice folder", - "status_updating_launcher": "Updating launcher", - "status_update_success": "Launcher updated successfully, auto closing after 5s", - "status_update_failed": "Launcher update failed, auto closing after 5s", - "status_wait": "Please wait...", - "status_complete": "Complete!", - "modal_update_title": "Update Data", - "modal_update_msg": "Do you want to update data server and proxy?", - "modal_download_title": "Download Data", - "modal_download_msg": "Data server and proxy download required", - "modal_self_update_title": "Update Launcher", - "modal_self_update_msg": "Do you want to update launcher?", - "btn_yes": "Yes", - "btn_no": "No", - "btn_download": "Download", - "error_game_dir": "Invalid game directory", - "error_file_type": "Incorrect file type", - "game_path_success": "Game path set successfully", - "no_updates": "No updates available", - "toast_pick_folder_error": "Pick folder error: ", - "toast_start_proxy_failed": "Failed to start proxy: ", - "toast_start_server_failed": "Failed to start server: ", - "toast_start_game_failed": "Failed to start game: ", - "toast_start_game_error": "Start game error: " - }, - "diff": { - "header_title": "🎮 Game Update by Diff Tool", - "header_desc": "Help you update game with Diff Tool", - "game_dir_title": "Game Directory", - "btn_selecting": "Selecting...", - "btn_select_game": "Select Game Folder", - "game_dir_valid": "Valid game directory found!", - "game_dir_invalid": "Game directory not found. Please select the correct folder.", - "diff_file_title": "Diff file Directory", - "btn_select_diff": "Select Diff file Folder", - "diff_file_valid": "Valid diff file found!", - "diff_file_invalid": "Diff file not found. Please select the correct file.", - "btn_updating": "Updating...", - "btn_update_game": "Update Game", - "modal_update_title": "Update Game", - "status_wait": "Please wait...", - "inst_title": "📋 Instructions:", - "inst_step_1": "1. Click \"Select Game Folder\" and choose your game's root directory", - "inst_step_2": "2. Wait for the system to validate the game directory", - "inst_step_3": "3. Click \"Select Diff file Folder\" and choose your diff file's root directory", - "inst_step_4": "4. Wait for the system to validate the diff file directory", - "inst_step_5": "5. Click \"Update Game\" to save your changes", - "toast_game_dir_not_found": "Game directory not found. Please select the correct folder.", - "toast_no_folder_selected": "No folder path selected", - "toast_pick_folder_error": "Pick folder error: ", - "toast_invalid_file_type": "Not valid file type", - "toast_no_file_selected": "No file path selected", - "toast_pick_file_error": "Pick file error: ", - "toast_select_both": "Please select game directory and diff file", - "toast_update_completed": "Update game completed", - "stage_check_type": "Check Type Diff Tool", - "stage_version_validate": "Version Validate", - "stage_data_extract": "Data Extract", - "stage_cut_data": "Cut Data", - "stage_patch_data": "Patch Data", - "stage_delete_old_files": "Delete old files" - }, - "language": { - "header_title": "🎮 Game Language Manager", - "header_desc": "Manage text and voice language settings for your game", - "game_dir_title": "Game Directory", - "btn_select_game": "Select Game Folder", - "btn_selecting": "Selecting...", - "game_dir_valid": "Valid game directory found!", - "game_dir_invalid": "Game directory not found. Please select the correct folder.", - "current_languages_title": "Current Languages", - "text_language": "Text Language", - "voice_language": "Voice Language", - "language_settings_title": "Language Settings", - "select_text_placeholder": "Select text language...", - "select_voice_placeholder": "Select voice language...", - "btn_apply": "Apply Language Settings", - "btn_applying": "Applying...", - "inst_title": "📋 Instructions:", - "inst_step_1": "1. Click \"Select Game Folder\" and choose your game's root directory", - "inst_step_2": "2. Wait for the system to validate the game directory", - "inst_step_3": "3. Select your preferred text and voice languages", - "inst_step_4": "4. Click \"Apply Language Settings\" to save your changes", - "toast_no_folder_selected": "No folder path selected", - "toast_pick_folder_error": "Pick Folder error: ", - "toast_set_language_success": "Language set successfully", - "toast_set_language_error": "Set language error: " - }, - "howto": { - "title": "How to Use", - "sect1_title": "Using the Launcher Features", - "sect1_auto_update_pre": "Automatically update", - "sect1_auto_update_post": "and proxy tools when launching.", - "sect1_launch_game": "Launch the game directly through the launcher with correct parameters and runtime environment.", - "sect1_lang_pre": "Support switching in-game language (e.g., EN, JP, ZH, KR) via", - "sect1_lang_link": "Language Tools", - "sect1_patch_title": "Patch & Update Game Files", - "sect1_patch_desc_1_pre": "Use the", - "sect1_patch_desc_1_link": "Diff Tool", - "sect1_patch_desc_1_post": "(DiffPatch) for fast & lightweight incremental updates.", - "sect1_patch_desc_2_pre": "Supports", - "sect1_patch_desc_2_post": ", and custom diff formats.", - "sect2_title": "FireflyGo Chat Commands", - "sect2_desc_pre": "Below are in-game chat commands you can use. Some commands require you to enable", - "sect2_desc_bold": "Theorycraft Mode", - "sect2_desc_post": ".", - "sect2_tc_req_title": "Theorycraft Mode Required", - "sect2_tc_req_desc_pre": "The following commands are only available when", - "sect2_tc_req_desc_bold": "Theorycraft Mode", - "sect2_tc_req_desc_post": "is enabled:", - "sect2_extra_title": "Extra Settings", - "sect2_hidden_ui_title": "Hidden UI", - "sect2_hidden_ui_desc": "Instantly hides the entire game UI — often used in DIM showcase videos.", - "sect2_censor_title": "Disable Censorship", - "sect2_censor_desc": "Remove the Lens Flare censor effect 💀 for a cleaner experience.", - "sect2_tc_title": "Theorycraft Mode", - "sect2_tc_desc": "No need to type chat commands anymore — configure everything through the web: adjust monster HP, set cycles, view logs, and more.", - "sect2_cmd_title": "Available Commands:", - "sect2_cmd_tc": "Theorycraft Mode", - "sect2_cmd_tc_enable": "— Enable Theorycraft Mode", - "sect2_cmd_tc_disable": "— Disable Theorycraft Mode", - "sect2_cmd_cycle": "Cycle Control", - "sect2_cmd_tc_only": "(Theorycraft only)", - "sect2_cmd_cycle_desc": "— Set cycle count in battle", - "sect2_cmd_cycle_ex1_pre": "Example:", - "sect2_cmd_cycle_ex1_post": "sets battle to 30 cycles", - "sect2_cmd_cycle_ex2_post": "disables custom cycle", - "sect2_cmd_hp": "HP Override", - "sect2_cmd_hp_desc1": "— Set monster HP (only available in Theorycraft mode)", - "sect2_cmd_hp_desc2": "— Disable the set HP feature", - "sect2_cmd_hp_desc3": "— Set HP for each monster in a specific wave", - "sect2_cmd_hp_ex_pre": "Example:", - "sect2_cmd_hp_ex_post": "sets wave 1 monster1 HP=2,000,000 and monster2 HP=3,000,000", - "sect2_cmd_log": "Battle Log", - "sect2_cmd_log_desc1": "— Enable battle log output", - "sect2_cmd_log_desc2": "— Disable battle log", - "sect2_cmd_log_out_pre": "Output will be written as", - "sect2_cmd_skip": "Skip Nodes", - "sect2_cmd_skip_desc": "— Skip nodes in MOC / AS / Pure Fiction", - "sect2_cmd_skip_ex1_pre": "Example:", - "sect2_cmd_skip_ex1_post": "skips node 2", - "sect2_cmd_skip_ex2_post": "disables skipping", - "sect2_cmd_id": "Character Path Switch", - "sect2_cmd_id_desc": "— Switch path for multi-form characters", - "sect2_cmd_id_ex1_pre": "Example:", - "sect2_cmd_id_ex1_post": "to change MC (Trailblazer) form", - "sect2_cmd_id_ex2_pre": "Works with IDs like", - "sect2_cmd_update": "Refresh Data", - "sect2_cmd_update_desc_pre": "— Refresh server data from current", - "sect3_title": "Other Notes", - "sect3_admin_title": "Administrator Rights", - "sect3_admin_desc": "Always run the launcher as Administrator for file permission access.", - "sect3_backup_title": "Backup Data", - "sect3_backup_desc_pre": "Backup your", - "sect3_backup_desc_mid": "and", - "sect3_backup_desc_post": "regularly.", - "sect3_voice_title": "Enable Voice Packs in Beta Client", - "sect3_voice_step1_pre": "Copy the desired voice folder (e.g.,", - "sect3_voice_step1_mid": ") from:", - "sect3_voice_step1_post_pre": "to the beta folder by clicking", - "sect3_voice_step1_post_bold": "\"Open Voice Folder\"", - "sect3_voice_step1_post_post": "on the Home tab.", - "sect3_voice_step2": "When launching the game for the first time, it may delete the voice folder. If so, repeat step 1 to restore it.", - "btn_back": "Back to Home" - }, - "about": { - "title": "About", - "p1_pre": "Hello! We are ", - "p1_post": ", a developer team passionate about building useful tools and improving user experiences.", - "p2_pre": "I created a lightweight and modern ", - "p2_highlight": "Game Launcher", - "p2_post": " to help users easily launch and manage their games with better performance and simplicity.", - "p3_pre": "The launcher is built using ", - "p3_mid": ", with a clean and responsive interface styled with ", - "p3_and": " and ", - "p3_post": ".", - "p4": "My goal is to make tools that are fast, efficient, and enjoyable to use — and this launcher is just the beginning.", - "btn_back": "Back to Home" - }, - "fireflytools": { - "title": "Firefly Tools", - "sect1_title": "About Firefly Tools", - "sect1_p1_pre": "This site is another version of ", - "sect1_p1_tool": "Firefly Tools ", - "sect1_p1_mid": "developed by ", - "sect1_p1_author": "Firefly Shelter", - "sect1_master_site": "Master Website", - "sect1_p2_pre": "The original tool was created by a third-party developer named ", - "sect1_p2_author": "Amazing", - "sect1_p2_post": ". This version is directly based on that work, without modification to core logic.", - "sect1_p3_pre": "There is also a more modern version by the same author available at ", - "sect2_title": "Main Features", - "sect2_feat1": "Configure characters, light cones, relics, traces, and eidolons easily in your browser.", - "sect2_feat2_pre": "Instantly apply setups to ", - "sect2_feat2_server": "Firefly GO Server", - "sect2_feat2_mid": " using ", - "sect2_feat2_conn": "Connect PS", - "sect2_feat2_post": " — no manual file uploads required.", - "sect2_feat3_title": "Extra Settings", - "sect2_feat3_desc_pre": "Enhance your ", - "sect2_feat3_desc_server": "Firefly GO Server", - "sect2_feat3_desc_post": " experience with extra features:", - "sect2_feat3_ui": "Hidden Game UI", - "sect2_feat3_ui_desc": "— remove the entire game interface.", - "sect2_feat3_censor": "Disable Censorship", - "sect2_feat3_censor_desc": "— get rid of Lens Flare censor 💀.", - "sect2_feat3_tc": "Theorycraft Mode", - "sect2_feat3_tc_desc": "— configure HP, cycles, and more via the web.", - "sect2_feat4_pre": "Export and import full builds using ", - "sect2_feat4_post": ".", - "sect2_feat5": "Fast testing workflow — no sync cooldowns, instant in-game updates.", - "sect3_title": "Getting Started", - "sect3_step1": "Access the tool through your browser at the self-hosted instance.", - "sect3_step2": "Configure your character builds with the intuitive web interface.", - "sect3_step3_pre": "Use ", - "sect3_step3_bold": "Connect PS", - "sect3_step3_post": " feature to instantly sync with your private server.", - "sect3_step4": "Test your builds in-game with real-time updates and modifications.", - "btn_back": "Back to Home" - }, - "analysis": { - "title": "Firefly Analysis & Veritas Plugin", - "sect1_title": "About Veritas", - "sect1_p1_pre": "Veritas", - "sect1_p1_mid": " is a powerful ", - "sect1_p1_highlight": "Damage Logger", - "sect1_p1_post": " designed for analyzing damage in real-time during gameplay.", - "sect1_p2": "It's lightweight, fast, and easy to use for comprehensive damage analysis.", - "sect1_github": "GitHub Repository", - "sect2_title": "Web Analysis Tools", - "sect2_desc": "Use these web applications for real-time damage analysis with Veritas:", - "sect2_master": "Master Website", - "sect2_backup": "Backup Website", - "sect2_tip_pre": "Tip:", - "sect2_tip_post": " If your country has issues loading from the master site, please use the backup site instead.", - "sect3_title": "Installation Instructions", - "sect3_subtitle": "Important Setup Step", - "sect3_desc": "After downloading Veritas, you must rename the file for it to work properly:", - "sect3_rename": "Rename: ", - "sect3_place": "Then place ", - "sect3_place_post": " into your game directory.", - "sect4_title": "How to Use Web App", - "sect4_sub1": "For Firefly GO Local", - "sect4_sub1_step1_pre": "Launch the ", - "sect4_sub1_step1_game": "game", - "sect4_sub1_step1_mid": " and your ", - "sect4_sub1_step1_server": "Firefly GO Server (PS)", - "sect4_sub1_step1_post": ".", - "sect4_sub1_step2": "Open one of the web analysis tools.", - "sect4_sub1_step3_pre": "Go to ", - "sect4_sub1_step3_conn": "Connection Settings", - "sect4_sub1_step3_mid1": " → select ", - "sect4_sub1_step3_type": "Connection Type: PS", - "sect4_sub1_step3_mid2": " → click ", - "sect4_sub1_step3_btn": "Connect", - "sect4_sub1_step3_post": ".", - "sect4_sub1_step4": "Once connected, play the game. The tool will automatically analyze in the background.", - "sect4_sub2": "For Other Private Servers", - "sect4_sub2_step1_pre": "Launch the ", - "sect4_sub2_step1_game": "game", - "sect4_sub2_step1_mid": " and your ", - "sect4_sub2_step1_server": "Private Server", - "sect4_sub2_step1_post": ".", - "sect4_sub2_step2": "Open one of the web analysis tools.", - "sect4_sub2_step3_pre": "Go to ", - "sect4_sub2_step3_conn": "Connection Settings", - "sect4_sub2_step3_mid1": " → select ", - "sect4_sub2_step3_type": "Connection Type: Native", - "sect4_sub2_step3_mid2": " → click ", - "sect4_sub2_step3_btn": "Connect", - "sect4_sub2_step3_post": ".", - "sect4_sub2_step4": "Once connected, play the game normally.", - "btn_back": "Back to Home" - } +{ + "header": { + "home": "Home", + "tools": "Tools", + "language": "Language", + "diff": "Diff", + "client_update": "Client Update", + "plugins": "Plugins", + "analysis": "Analysis (Veritas)", + "firefly_tools": "Firefly Tools", + "how_to": "How to?", + "about": "About", + "settings": "Settings", + "minimize": "Minimize", + "close": "Close", + "by": "GaCy" + }, + "background": { + "select_bg": "Select Background", + "choose_bg": "Choose Background", + "paste_url": "Paste image URL (https://...)", + "add": "Add", + "upload": "Upload", + "upload_from_computer": "Upload from computer", + "done": "Done", + "remove": "Remove", + "invalid_url": "Invalid url" + }, + "close": { + "title": "Confirm Action", + "description": "Do you want to minimize the application to the system tray or close the application?", + "dont_ask": "Do not ask me again", + "minimize": "Minimize", + "close": "Close" + }, + "setting": { + "title": "Settings", + "launcher_update_title": "Launcher Update", + "launcher_update_desc": "Check if your launcher is up to date.", + "launcher_update_btn": "Check for Launcher Updates", + "launcher_update_success": "Launcher is already up to date", + "closing_options_title": "Closing Options", + "set_dont_ask_again": "Set do not ask again", + "closing_auto_desc": "Next time you close the app, it will automatically {{action}} without asking.", + "action_minimize": "minimize to system tray", + "action_quit": "quit the app", + "version_label": "Version", + "server_label": "Server", + "proxy_label": "Proxy", + "launcher_label": "Launcher" + }, + "home": { + "header_title": "G Launcher", + "tooltip_how_to": "How to use all tools \u0026 commands", + "btn_select_game": "Select Game file", + "btn_selecting": "Selecting...", + "btn_start_game": "Start Game", + "btn_game_running": "Game is running", + "menu_change_path": "Change Game Path", + "menu_check_update": "Check for Updates Server \u0026 Proxy", + "menu_open_server": "Open server folder", + "menu_open_proxy": "Open proxy folder", + "menu_open_voice": "Open voice folder", + "status_updating_launcher": "Updating launcher", + "status_update_success": "Launcher updated successfully, auto closing after 5s", + "status_update_failed": "Launcher update failed, auto closing after 5s", + "status_wait": "Please wait...", + "status_complete": "Complete!", + "modal_update_title": "Update Data", + "modal_update_msg": "Do you want to update data server and proxy?", + "modal_download_title": "Download Data", + "modal_download_msg": "Data server and proxy download required", + "modal_self_update_title": "Update Launcher", + "modal_self_update_msg": "Do you want to update launcher?", + "btn_yes": "Yes", + "btn_no": "No", + "btn_download": "Download", + "error_game_dir": "Invalid game directory", + "error_file_type": "Incorrect file type", + "game_path_success": "Game path set successfully", + "no_updates": "No updates available", + "toast_pick_folder_error": "Pick folder error: ", + "toast_start_proxy_failed": "Failed to start proxy: ", + "toast_start_server_failed": "Failed to start server: ", + "toast_start_game_failed": "Failed to start game: ", + "toast_start_game_error": "Start game error: " + }, + "diff": { + "header_title": "🎮 Game Update by Diff Tool", + "header_desc": "Help you update game with Diff Tool", + "game_dir_title": "Game Directory", + "btn_selecting": "Selecting...", + "btn_select_game": "Select Game Folder", + "game_dir_valid": "Valid game directory found!", + "game_dir_invalid": "Game directory not found. Please select the correct folder.", + "diff_file_title": "Diff file Directory", + "btn_select_diff": "Select Diff file Folder", + "diff_file_valid": "Valid diff file found!", + "diff_file_invalid": "Diff file not found. Please select the correct file.", + "btn_updating": "Updating...", + "btn_update_game": "Update Game", + "modal_update_title": "Update Game", + "status_wait": "Please wait...", + "inst_title": "📋 Instructions:", + "inst_step_1": "1. Click \"Select Game Folder\" and choose your game\u0027s root directory", + "inst_step_2": "2. Wait for the system to validate the game directory", + "inst_step_3": "3. Click \"Select Diff file Folder\" and choose your diff file\u0027s root directory", + "inst_step_4": "4. Wait for the system to validate the diff file directory", + "inst_step_5": "5. Click \"Update Game\" to save your changes", + "toast_game_dir_not_found": "Game directory not found. Please select the correct folder.", + "toast_no_folder_selected": "No folder path selected", + "toast_pick_folder_error": "Pick folder error: ", + "toast_invalid_file_type": "Not valid file type", + "toast_no_file_selected": "No file path selected", + "toast_pick_file_error": "Pick file error: ", + "toast_select_both": "Please select game directory and diff file", + "toast_update_completed": "Update game completed", + "stage_check_type": "Check Type Diff Tool", + "stage_version_validate": "Version Validate", + "stage_data_extract": "Data Extract", + "stage_cut_data": "Cut Data", + "stage_patch_data": "Patch Data", + "stage_delete_old_files": "Delete old files" + }, + "language": { + "header_title": "🎮 Game Language Manager", + "header_desc": "Manage text and voice language settings for your game", + "game_dir_title": "Game Directory", + "btn_select_game": "Select Game Folder", + "btn_selecting": "Selecting...", + "game_dir_valid": "Valid game directory found!", + "game_dir_invalid": "Game directory not found. Please select the correct folder.", + "current_languages_title": "Current Languages", + "text_language": "Text Language", + "voice_language": "Voice Language", + "language_settings_title": "Language Settings", + "select_text_placeholder": "Select text language...", + "select_voice_placeholder": "Select voice language...", + "btn_apply": "Apply Language Settings", + "btn_applying": "Applying...", + "inst_title": "📋 Instructions:", + "inst_step_1": "1. Click \"Select Game Folder\" and choose your game\u0027s root directory", + "inst_step_2": "2. Wait for the system to validate the game directory", + "inst_step_3": "3. Select your preferred text and voice languages", + "inst_step_4": "4. Click \"Apply Language Settings\" to save your changes", + "toast_no_folder_selected": "No folder path selected", + "toast_pick_folder_error": "Pick Folder error: ", + "toast_set_language_success": "Language set successfully", + "toast_set_language_error": "Set language error: " + }, + "howto": { + "title": "How to Use", + "sect1_title": "Using the Launcher Features", + "sect1_auto_update_pre": "Automatically update", + "sect1_auto_update_post": "and proxy tools when launching.", + "sect1_launch_game": "Launch the game directly through the launcher with correct parameters and runtime environment.", + "sect1_lang_pre": "Support switching in-game language (e.g., EN, JP, ZH, KR) via", + "sect1_lang_link": "Language Tools", + "sect1_patch_title": "Patch \u0026 Update Game Files", + "sect1_patch_desc_1_pre": "Use the", + "sect1_patch_desc_1_link": "Diff Tool", + "sect1_patch_desc_1_post": "(DiffPatch) for fast \u0026 lightweight incremental updates.", + "sect1_patch_desc_2_pre": "Supports", + "sect1_patch_desc_2_post": ", and custom diff formats.", + "sect2_title": "FireflyGo Chat Commands", + "sect2_desc_pre": "Below are in-game chat commands you can use. Some commands require you to enable", + "sect2_desc_bold": "Theorycraft Mode", + "sect2_desc_post": ".", + "sect2_tc_req_title": "Theorycraft Mode Required", + "sect2_tc_req_desc_pre": "The following commands are only available when", + "sect2_tc_req_desc_bold": "Theorycraft Mode", + "sect2_tc_req_desc_post": "is enabled:", + "sect2_extra_title": "Extra Settings", + "sect2_hidden_ui_title": "Hidden UI", + "sect2_hidden_ui_desc": "Instantly hides the entire game UI — often used in DIM showcase videos.", + "sect2_censor_title": "Disable Censorship", + "sect2_censor_desc": "Remove the Lens Flare censor effect 💀 for a cleaner experience.", + "sect2_tc_title": "Theorycraft Mode", + "sect2_tc_desc": "No need to type chat commands anymore — configure everything through the web: adjust monster HP, set cycles, view logs, and more.", + "sect2_cmd_title": "Available Commands:", + "sect2_cmd_tc": "Theorycraft Mode", + "sect2_cmd_tc_enable": "— Enable Theorycraft Mode", + "sect2_cmd_tc_disable": "— Disable Theorycraft Mode", + "sect2_cmd_cycle": "Cycle Control", + "sect2_cmd_tc_only": "(Theorycraft only)", + "sect2_cmd_cycle_desc": "— Set cycle count in battle", + "sect2_cmd_cycle_ex1_pre": "Example:", + "sect2_cmd_cycle_ex1_post": "sets battle to 30 cycles", + "sect2_cmd_cycle_ex2_post": "disables custom cycle", + "sect2_cmd_hp": "HP Override", + "sect2_cmd_hp_desc1": "— Set monster HP (only available in Theorycraft mode)", + "sect2_cmd_hp_desc2": "— Disable the set HP feature", + "sect2_cmd_hp_desc3": "— Set HP for each monster in a specific wave", + "sect2_cmd_hp_ex_pre": "Example:", + "sect2_cmd_hp_ex_post": "sets wave 1 monster1 HP=2,000,000 and monster2 HP=3,000,000", + "sect2_cmd_log": "Battle Log", + "sect2_cmd_log_desc1": "— Enable battle log output", + "sect2_cmd_log_desc2": "— Disable battle log", + "sect2_cmd_log_out_pre": "Output will be written as", + "sect2_cmd_skip": "Skip Nodes", + "sect2_cmd_skip_desc": "— Skip nodes in MOC / AS / Pure Fiction", + "sect2_cmd_skip_ex1_pre": "Example:", + "sect2_cmd_skip_ex1_post": "skips node 2", + "sect2_cmd_skip_ex2_post": "disables skipping", + "sect2_cmd_id": "Character Path Switch", + "sect2_cmd_id_desc": "— Switch path for multi-form characters", + "sect2_cmd_id_ex1_pre": "Example:", + "sect2_cmd_id_ex1_post": "to change MC (Trailblazer) form", + "sect2_cmd_id_ex2_pre": "Works with IDs like", + "sect2_cmd_update": "Refresh Data", + "sect2_cmd_update_desc_pre": "— Refresh server data from current", + "sect3_title": "Other Notes", + "sect3_admin_title": "Administrator Rights", + "sect3_admin_desc": "Always run the launcher as Administrator for file permission access.", + "sect3_backup_title": "Backup Data", + "sect3_backup_desc_pre": "Backup your", + "sect3_backup_desc_mid": "and", + "sect3_backup_desc_post": "regularly.", + "sect3_voice_title": "Enable Voice Packs in Beta Client", + "sect3_voice_step1_pre": "Copy the desired voice folder (e.g.,", + "sect3_voice_step1_mid": ") from:", + "sect3_voice_step1_post_pre": "to the beta folder by clicking", + "sect3_voice_step1_post_bold": "\"Open Voice Folder\"", + "sect3_voice_step1_post_post": "on the Home tab.", + "sect3_voice_step2": "When launching the game for the first time, it may delete the voice folder. If so, repeat step 1 to restore it.", + "btn_back": "Back to Home" + }, + "about": { + "title": "About", + "p1_pre": "Hello! We are ", + "p1_post": ", a developer team passionate about building useful tools and improving user experiences.", + "p2_pre": "I created a lightweight and modern ", + "p2_highlight": "Game Launcher", + "p2_post": " to help users easily launch and manage their games with better performance and simplicity.", + "p3_pre": "The launcher is built using ", + "p3_mid": ", with a clean and responsive interface styled with ", + "p3_and": " and ", + "p3_post": ".", + "p4": "My goal is to make tools that are fast, efficient, and enjoyable to use — and this launcher is just the beginning.", + "btn_back": "Back to Home" + }, + "fireflytools": { + "title": "Firefly Tools", + "sect1_title": "About Firefly Tools", + "sect1_p1_pre": "This site is another version of ", + "sect1_p1_tool": "Firefly Tools ", + "sect1_p1_mid": "developed by ", + "sect1_p1_author": "Firefly Shelter", + "sect1_master_site": "Master Website", + "sect1_p2_pre": "The original tool was created by a third-party developer named ", + "sect1_p2_author": "Amazing", + "sect1_p2_post": ". This version is directly based on that work, without modification to core logic.", + "sect1_p3_pre": "There is also a more modern version by the same author available at ", + "sect2_title": "Main Features", + "sect2_feat1": "Configure characters, light cones, relics, traces, and eidolons easily in your browser.", + "sect2_feat2_pre": "Instantly apply setups to ", + "sect2_feat2_server": "Firefly GO Server", + "sect2_feat2_mid": " using ", + "sect2_feat2_conn": "Connect PS", + "sect2_feat2_post": " — no manual file uploads required.", + "sect2_feat3_title": "Extra Settings", + "sect2_feat3_desc_pre": "Enhance your ", + "sect2_feat3_desc_server": "Firefly GO Server", + "sect2_feat3_desc_post": " experience with extra features:", + "sect2_feat3_ui": "Hidden Game UI", + "sect2_feat3_ui_desc": "— remove the entire game interface.", + "sect2_feat3_censor": "Disable Censorship", + "sect2_feat3_censor_desc": "— get rid of Lens Flare censor 💀.", + "sect2_feat3_tc": "Theorycraft Mode", + "sect2_feat3_tc_desc": "— configure HP, cycles, and more via the web.", + "sect2_feat4_pre": "Export and import full builds using ", + "sect2_feat4_post": ".", + "sect2_feat5": "Fast testing workflow — no sync cooldowns, instant in-game updates.", + "sect3_title": "Getting Started", + "sect3_step1": "Access the tool through your browser at the self-hosted instance.", + "sect3_step2": "Configure your character builds with the intuitive web interface.", + "sect3_step3_pre": "Use ", + "sect3_step3_bold": "Connect PS", + "sect3_step3_post": " feature to instantly sync with your private server.", + "sect3_step4": "Test your builds in-game with real-time updates and modifications.", + "btn_back": "Back to Home" + }, + "analysis": { + "title": "Firefly Analysis \u0026 Veritas Plugin", + "sect1_title": "About Veritas", + "sect1_p1_pre": "Veritas", + "sect1_p1_mid": " is a powerful ", + "sect1_p1_highlight": "Damage Logger", + "sect1_p1_post": " designed for analyzing damage in real-time during gameplay.", + "sect1_p2": "It\u0027s lightweight, fast, and easy to use for comprehensive damage analysis.", + "sect1_github": "GitHub Repository", + "sect2_title": "Web Analysis Tools", + "sect2_desc": "Use these web applications for real-time damage analysis with Veritas:", + "sect2_master": "Master Website", + "sect2_backup": "Backup Website", + "sect2_tip_pre": "Tip:", + "sect2_tip_post": " If your country has issues loading from the master site, please use the backup site instead.", + "sect3_title": "Installation Instructions", + "sect3_subtitle": "Important Setup Step", + "sect3_desc": "After downloading Veritas, you must rename the file for it to work properly:", + "sect3_rename": "Rename: ", + "sect3_place": "Then place ", + "sect3_place_post": " into your game directory.", + "sect4_title": "How to Use Web App", + "sect4_sub1": "For Firefly GO Local", + "sect4_sub1_step1_pre": "Launch the ", + "sect4_sub1_step1_game": "game", + "sect4_sub1_step1_mid": " and your ", + "sect4_sub1_step1_server": "Firefly GO Server (PS)", + "sect4_sub1_step1_post": ".", + "sect4_sub1_step2": "Open one of the web analysis tools.", + "sect4_sub1_step3_pre": "Go to ", + "sect4_sub1_step3_conn": "Connection Settings", + "sect4_sub1_step3_mid1": " → select ", + "sect4_sub1_step3_type": "Connection Type: PS", + "sect4_sub1_step3_mid2": " → click ", + "sect4_sub1_step3_btn": "Connect", + "sect4_sub1_step3_post": ".", + "sect4_sub1_step4": "Once connected, play the game. The tool will automatically analyze in the background.", + "sect4_sub2": "For Other Private Servers", + "sect4_sub2_step1_pre": "Launch the ", + "sect4_sub2_step1_game": "game", + "sect4_sub2_step1_mid": " and your ", + "sect4_sub2_step1_server": "Private Server", + "sect4_sub2_step1_post": ".", + "sect4_sub2_step2": "Open one of the web analysis tools.", + "sect4_sub2_step3_pre": "Go to ", + "sect4_sub2_step3_conn": "Connection Settings", + "sect4_sub2_step3_mid1": " → select ", + "sect4_sub2_step3_type": "Connection Type: Native", + "sect4_sub2_step3_mid2": " → click ", + "sect4_sub2_step3_btn": "Connect", + "sect4_sub2_step3_post": ".", + "sect4_sub2_step4": "Once connected, play the game normally.", + "btn_back": "Back to Home" + } } \ No newline at end of file diff --git a/frontend/public/locales/ja.json b/frontend/public/locales/ja.json index fcf4068..762feec 100644 --- a/frontend/public/locales/ja.json +++ b/frontend/public/locales/ja.json @@ -1,337 +1,337 @@ -{ - "header": { - "home": "ホーム", - "tools": "ツール", - "language": "言語", - "diff": "差分", - "client_update": "クライアント更新", - "plugins": "プラグイン", - "analysis": "分析(Veritas)", - "firefly_tools": "Fireflyツール", - "how_to": "使い方", - "about": "概要", - "settings": "設定", - "minimize": "最小化", - "close": "閉じる", - "by": "Firefly Shelter" - }, - "background": { - "select_bg": "背景を選択", - "choose_bg": "背景を選択", - "paste_url": "画像URLを貼り付け (https://...)", - "add": "追加", - "upload": "アップロード", - "upload_from_computer": "パソコンからアップロード", - "done": "完了", - "remove": "削除", - "invalid_url": "無効なURLです" - }, - "close": { - "title": "実行の確認", - "description": "最小化してシステムトレイに格納しますか?それとも終了しますか?", - "dont_ask": "次回から表示しない", - "minimize": "最小化", - "close": "終了" - }, - "setting": { - "title": "設定", - "launcher_update_title": "ランチャーの更新", - "launcher_update_desc": "最新バージョンかどうかを確認します。", - "launcher_update_btn": "更新を確認", - "launcher_update_success": "ランチャーは最新の状態です", - "closing_options_title": "終了オプション", - "set_dont_ask_again": "次回から表示しない", - "closing_auto_desc": "次回終了時、確認なしで自動的に{{action}}します。", - "action_minimize": "システムトレイに最小化", - "action_quit": "アプリを終了", - "version_label": "バージョン", - "server_label": "Server", - "proxy_label": "Proxy", - "launcher_label": "Launcher" - }, - "home": { -"header_title": "Firefly GO", - "tooltip_how_to": "ツールとコマンドの使い方", - "btn_select_game": "ゲームファイルを選択", - "btn_selecting": "選択中...", - "btn_start_game": "ゲーム開始", - "btn_game_running": "実行中", - "menu_change_path": "ゲームパスを変更", - "menu_check_update": "サーバーとプロキシの更新を確認", - "menu_open_server": "サーバーフォルダを開く", - "menu_open_proxy": "プロキシフォルダを開く", - "menu_open_voice": "ボイスフォルダを開く", - "status_updating_launcher": "ランチャーを更新中", - "status_update_success": "更新完了。5秒後に閉じます", - "status_update_failed": "更新失敗。5秒後に閉じます", - "status_wait": "お待ちください...", - "status_complete": "完了!", - "modal_update_title": "データ更新", - "modal_update_msg": "サーバーとプロキシを更新しますか?", - "modal_download_title": "データダウンロード", - "modal_download_msg": "サーバーとプロキシのダウンロードが必要です", - "modal_self_update_title": "ランチャー更新", - "modal_self_update_msg": "ランチャーを更新しますか?", - "btn_yes": "はい", - "btn_no": "いいえ", - "btn_download": "ダウンロード", - "error_game_dir": "無効なゲームディレクトリ", - "error_file_type": "ファイル形式が正しくありません", - "game_path_success": "ゲームパスが設定されました", - "no_updates": "利用可能なアップデートはありません", - "toast_pick_folder_error": "フォルダ選択エラー: ", - "toast_start_proxy_failed": "プロキシの起動に失敗しました: ", - "toast_start_server_failed": "サーバーの起動に失敗しました: ", - "toast_start_game_failed": "ゲームの起動に失敗しました: ", - "toast_start_game_error": "ゲーム起動エラー: " - }, - "diff": { - "header_title": "🎮 Diff Toolによるゲーム更新", - "header_desc": "Diff Toolを使用したゲームの更新をサポートします", - "game_dir_title": "ゲームディレクトリ", - "btn_selecting": "選択中...", - "btn_select_game": "ゲームフォルダを選択", - "game_dir_valid": "有効なゲームディレクトリが見つかりました!", - "game_dir_invalid": "ゲームディレクトリが見つかりません。正しいフォルダを選択してください。", - "diff_file_title": "Diffファイルディレクトリ", - "btn_select_diff": "Diffファイルを選択", - "diff_file_valid": "有効なDiffファイルが見つかりました!", - "diff_file_invalid": "Diffファイルが見つかりません。正しいファイルを選択してください。", - "btn_updating": "更新中...", - "btn_update_game": "ゲームを更新", - "modal_update_title": "ゲームを更新", - "status_wait": "お待ちください...", - "inst_title": "📋 手順:", - "inst_step_1": "1. 「ゲームフォルダを選択」をクリックし、ゲームのルートディレクトリを選択します", - "inst_step_2": "2. システムがゲームディレクトリを検証するのを待ちます", - "inst_step_3": "3. 「Diffファイルを選択」をクリックし、Diffファイルを選択します", - "inst_step_4": "4. システムがDiffファイルを検証するのを待ちます", - "inst_step_5": "5. 「ゲームを更新」をクリックして変更を保存します", - "toast_game_dir_not_found": "ゲームディレクトリが見つかりません。正しいフォルダを選択してください。", - "toast_no_folder_selected": "フォルダパスが選択されていません", - "toast_pick_folder_error": "フォルダ選択エラー: ", - "toast_invalid_file_type": "無効なファイル形式です", - "toast_no_file_selected": "ファイルパスが選択されていません", - "toast_pick_file_error": "ファイル選択エラー: ", - "toast_select_both": "ゲームディレクトリとDiffファイルの両方を選択してください", - "toast_update_completed": "ゲームの更新が完了しました", - "stage_check_type": "Diff Toolタイプの確認", - "stage_version_validate": "バージョンの検証", - "stage_data_extract": "データの抽出", - "stage_cut_data": "データの切り取り", - "stage_patch_data": "データのパッチ適用", - "stage_delete_old_files": "古いファイルの削除" - }, - "language": { - "header_title": "🎮 ゲーム言語マネージャー", - "header_desc": "ゲームのテキストと音声言語の設定を管理します", - "game_dir_title": "ゲームディレクトリ", - "btn_select_game": "ゲームフォルダを選択", - "btn_selecting": "選択中...", - "game_dir_valid": "有効なゲームディレクトリが見つかりました!", - "game_dir_invalid": "ゲームディレクトリが見つかりません。正しいフォルダを選択してください。", - "current_languages_title": "現在の言語", - "text_language": "テキスト言語", - "voice_language": "音声言語", - "language_settings_title": "言語設定", - "select_text_placeholder": "テキスト言語を選択...", - "select_voice_placeholder": "音声言語を選択...", - "btn_apply": "言語設定を適用", - "btn_applying": "適用中...", - "inst_title": "📋 手順:", - "inst_step_1": "1. 「ゲームフォルダを選択」をクリックし、ゲームのルートディレクトリを選択します", - "inst_step_2": "2. システムがゲームディレクトリを検証するのを待ちます", - "inst_step_3": "3. 希望するテキスト言語と音声言語を選択します", - "inst_step_4": "4. 「言語設定を適用」をクリックして変更を保存します", - "toast_no_folder_selected": "フォルダパスが選択されていません", - "toast_pick_folder_error": "フォルダ選択エラー: ", - "toast_set_language_success": "言語が正常に設定されました", - "toast_set_language_error": "言語設定エラー: " - }, - "howto": { - "title": "使い方", - "sect1_title": "ランチャー機能の使用", - "sect1_auto_update_pre": "起動時に", - "sect1_auto_update_post": "およびプロキシツールを自動的に更新します。", - "sect1_launch_game": "正しいパラメータと実行環境で、ランチャーから直接ゲームを起動します。", - "sect1_lang_pre": "ゲーム内言語(例: EN, JP, ZH, KR)の切り替えをサポートします:", - "sect1_lang_link": "言語ツール", - "sect1_patch_title": "ゲームファイルのパッチと更新", - "sect1_patch_desc_1_pre": "高速で軽量な差分更新には", - "sect1_patch_desc_1_link": "Diff Tool", - "sect1_patch_desc_1_post": "(DiffPatch)を使用します。", - "sect1_patch_desc_2_pre": "サポート形式:", - "sect1_patch_desc_2_post": "、およびカスタムdiffフォーマット。", - "sect2_title": "FireflyGo チャットコマンド", - "sect2_desc_pre": "ゲーム内で使用できるチャットコマンドは以下の通りです。一部のコマンドは", - "sect2_desc_bold": "Theorycraftモード", - "sect2_desc_post": "を有効にする必要があります。", - "sect2_tc_req_title": "Theorycraftモードが必要", - "sect2_tc_req_desc_pre": "以下のコマンドは", - "sect2_tc_req_desc_bold": "Theorycraftモード", - "sect2_tc_req_desc_post": "が有効な場合のみ使用できます:", - "sect2_extra_title": "追加設定", - "sect2_hidden_ui_title": "UIを隠す", - "sect2_hidden_ui_desc": "ゲームUI全体を即座に非表示にします — DIMショーケースビデオでよく使用されます。", - "sect2_censor_title": "検閲の無効化", - "sect2_censor_desc": "よりクリーンな体験のためにレンズフレア検閲効果 💀 を削除します。", - "sect2_tc_title": "Theorycraftモード", - "sect2_tc_desc": "チャットコマンドを入力する必要はもうありません — ウェブからすべてを設定できます:モンスターのHP調整、サイクルの設定、ログの表示など。", - "sect2_cmd_title": "利用可能なコマンド:", - "sect2_cmd_tc": "Theorycraftモード", - "sect2_cmd_tc_enable": "— Theorycraftモードを有効にする", - "sect2_cmd_tc_disable": "— Theorycraftモードを無効にする", - "sect2_cmd_cycle": "サイクル制御", - "sect2_cmd_tc_only": "(Theorycraftのみ)", - "sect2_cmd_cycle_desc": "— 戦闘でのサイクル数を設定する", - "sect2_cmd_cycle_ex1_pre": "例:", - "sect2_cmd_cycle_ex1_post": "は戦闘を30サイクルに設定します", - "sect2_cmd_cycle_ex2_post": "はカスタムサイクルを無効にします", - "sect2_cmd_hp": "HPの上書き", - "sect2_cmd_hp_desc1": "— モンスターのHPを設定する (Theorycraftモードでのみ利用可能)", - "sect2_cmd_hp_desc2": "— HP設定機能を無効にする", - "sect2_cmd_hp_desc3": "— 特定のウェーブの各モンスターにHPを設定する", - "sect2_cmd_hp_ex_pre": "例:", - "sect2_cmd_hp_ex_post": "はウェーブ1のモンスター1のHPを2,000,000に、モンスター2のHPを3,000,000に設定します", - "sect2_cmd_log": "バトルログ", - "sect2_cmd_log_desc1": "— バトルログ出力を有効にする", - "sect2_cmd_log_desc2": "— バトルログを無効にする", - "sect2_cmd_log_out_pre": "出力は以下の形式で書き込まれます:", - "sect2_cmd_skip": "ノードのスキップ", - "sect2_cmd_skip_desc": "— MOC / AS / 虚構叙事でノードをスキップする", - "sect2_cmd_skip_ex1_pre": "例:", - "sect2_cmd_skip_ex1_post": "はノード2をスキップします", - "sect2_cmd_skip_ex2_post": "はスキップを無効にします", - "sect2_cmd_id": "キャラクター運命の切り替え", - "sect2_cmd_id_desc": "— 複数形態を持つキャラクターの運命を切り替える", - "sect2_cmd_id_ex1_pre": "例:", - "sect2_cmd_id_ex1_post": "は主人公(開拓者)の形態を変更します", - "sect2_cmd_id_ex2_pre": "対応ID例:", - "sect2_cmd_update": "データのリフレッシュ", - "sect2_cmd_update_desc_pre": "— 現在のファイルからサーバーデータを更新します:", - "sect3_title": "その他の注意事項", - "sect3_admin_title": "管理者権限", - "sect3_admin_desc": "ファイル権限にアクセスするため、常にランチャーを管理者として実行してください。", - "sect3_backup_title": "データのバックアップ", - "sect3_backup_desc_pre": "定期的に", - "sect3_backup_desc_mid": "と", - "sect3_backup_desc_post": "をバックアップしてください。", - "sect3_voice_title": "ベータクライアントでボイスパックを有効にする", - "sect3_voice_step1_pre": "希望するボイスフォルダ (例:", - "sect3_voice_step1_mid": ") を以下からコピーし:", - "sect3_voice_step1_post_pre": "ホームタブの", - "sect3_voice_step1_post_bold": "「ボイスフォルダを開く」", - "sect3_voice_step1_post_post": "をクリックしてベータフォルダに配置します。", - "sect3_voice_step2": "ゲームを初めて起動した際、ボイスフォルダが削除される場合があります。その場合は、手順1を繰り返して復元してください。", - "btn_back": "ホームに戻る" - }, - "about": { - "title": "概要", - "p1_pre": "こんにちは!私たちは ", - "p1_post": " です。便利なツールの構築とユーザー体験の向上に情熱を注ぐ開発チームです。", - "p2_pre": "ユーザーがより良いパフォーマンスとシンプルさで簡単にゲームを起動・管理できるように、軽量でモダンな ", - "p2_highlight": "Game Launcher", - "p2_post": " を作成しました。", - "p3_pre": "ランチャーは ", - "p3_mid": " を使用して構築されており、", - "p3_and": " と ", - "p3_post": " でデザインされたクリーンでレスポンシブなインターフェースを備えています。", - "p4": "私の目標は、高速で効率的、そして使って楽しいツールを作ることです。このランチャーはその始まりに過ぎません。", - "btn_back": "ホームに戻る" - }, - "fireflytools": { - "title": "Firefly ツール", - "sect1_title": "Firefly ツールについて", - "sect1_p1_pre": "このサイトは ", - "sect1_p1_tool": "Firefly Tools ", - "sect1_p1_mid": "の別バージョンであり、開発元は ", - "sect1_p1_author": "Firefly Shelter", - "sect1_master_site": "マスターウェブサイト", - "sect1_p2_pre": "オリジナルのツールは、", - "sect1_p2_author": "Amazing", - "sect1_p2_post": " というサードパーティの開発者によって作成されました。このバージョンは、コアロジックを変更することなく、その作業に直接基づいています。", - "sect1_p3_pre": "同じ作者によるよりモダンなバージョンも以下で利用可能です:", - "sect2_title": "主な機能", - "sect2_feat1": "ブラウザでキャラクター、光円錐、遺物、軌跡、星魂を簡単に設定できます。", - "sect2_feat2_pre": "", - "sect2_feat2_server": "Firefly GO Server", - "sect2_feat2_mid": " に ", - "sect2_feat2_conn": "Connect PS", - "sect2_feat2_post": " を使用して設定を即座に適用します — 手動でのファイルアップロードは不要です。", - "sect2_feat3_title": "追加設定", - "sect2_feat3_desc_pre": "追加機能で ", - "sect2_feat3_desc_server": "Firefly GO Server", - "sect2_feat3_desc_post": " の体験を向上させます:", - "sect2_feat3_ui": "UIを隠す", - "sect2_feat3_ui_desc": "— ゲームインターフェース全体を削除します。", - "sect2_feat3_censor": "検閲の無効化", - "sect2_feat3_censor_desc": "— レンズフレア検閲 💀 を取り除きます。", - "sect2_feat3_tc": "Theorycraft モード", - "sect2_feat3_tc_desc": "— ウェブ経由でHP、サイクルなどを設定します。", - "sect2_feat4_pre": "を使用して完全なビルドをエクスポートおよびインポートします:", - "sect2_feat4_post": "。", - "sect2_feat5": "高速なテストワークフロー — 同期のクールダウンなし、ゲーム内の即時更新。", - "sect3_title": "はじめに", - "sect3_step1": "セルフホストされたインスタンスのブラウザからツールにアクセスします。", - "sect3_step2": "直感的なウェブインターフェースでキャラクタービルドを設定します。", - "sect3_step3_pre": "", - "sect3_step3_bold": "Connect PS", - "sect3_step3_post": " 機能を使用して、プライベートサーバーと即座に同期します。", - "sect3_step4": "リアルタイムの更新と変更を使用して、ゲーム内でビルドをテストします。", - "btn_back": "ホームに戻る" - }, - "analysis": { - "title": "Firefly 分析 & Veritas プラグイン", - "sect1_title": "Veritas について", - "sect1_p1_pre": "Veritas", - "sect1_p1_mid": " は、ゲームプレイ中のダメージをリアルタイムで分析するために設計された強力な ", - "sect1_p1_highlight": "ダメージロガー", - "sect1_p1_post": " です。", - "sect1_p2": "軽量で高速、包括的なダメージ分析に使いやすいツールです。", - "sect1_github": "GitHub リポジトリ", - "sect2_title": "Web 分析ツール", - "sect2_desc": "Veritas を使用したリアルタイムダメージ分析には、以下の Web アプリケーションを使用してください:", - "sect2_master": "マスターウェブサイト", - "sect2_backup": "バックアップウェブサイト", - "sect2_tip_pre": "ヒント:", - "sect2_tip_post": " マスターサイトの読み込みに問題がある場合は、バックアップサイトをご利用ください。", - "sect3_title": "インストール手順", - "sect3_subtitle": "重要なセットアップ手順", - "sect3_desc": "Veritas をダウンロードした後、正常に動作させるにはファイル名を変更する必要があります:", - "sect3_rename": "名前の変更: ", - "sect3_place": "その後、", - "sect3_place_post": " をゲームディレクトリに配置します。", - "sect4_title": "Web アプリの使い方", - "sect4_sub1": "Firefly GO ローカル用", - "sect4_sub1_step1_pre": "", - "sect4_sub1_step1_game": "ゲーム", - "sect4_sub1_step1_mid": " と ", - "sect4_sub1_step1_server": "Firefly GO サーバー (PS)", - "sect4_sub1_step1_post": " を起動します。", - "sect4_sub1_step2": "いずれかの Web 分析ツールを開きます。", - "sect4_sub1_step3_pre": "", - "sect4_sub1_step3_conn": "Connection Settings", - "sect4_sub1_step3_mid1": " に移動し、", - "sect4_sub1_step3_type": "Connection Type: PS", - "sect4_sub1_step3_mid2": " を選択して、", - "sect4_sub1_step3_btn": "Connect", - "sect4_sub1_step3_post": " をクリックします。", - "sect4_sub1_step4": "接続後、ゲームをプレイしてください。ツールがバックグラウンドで自動的に分析を行います。", - "sect4_sub2": "その他のプライベートサーバー用", - "sect4_sub2_step1_pre": "", - "sect4_sub2_step1_game": "ゲーム", - "sect4_sub2_step1_mid": " と ", - "sect4_sub2_step1_server": "プライベートサーバー", - "sect4_sub2_step1_post": " を起動します。", - "sect4_sub2_step2": "いずれかの Web 分析ツールを開きます。", - "sect4_sub2_step3_pre": "", - "sect4_sub2_step3_conn": "Connection Settings", - "sect4_sub2_step3_mid1": " に移動し、", - "sect4_sub2_step3_type": "Connection Type: Native", - "sect4_sub2_step3_mid2": " を選択して、", - "sect4_sub2_step3_btn": "Connect", - "sect4_sub2_step3_post": " をクリックします。", - "sect4_sub2_step4": "接続後、通常通りゲームをプレイしてください。", - "btn_back": "ホームに戻る" - } +{ + "header": { + "home": "ホーム", + "tools": "ツール", + "language": "言語", + "diff": "差分", + "client_update": "クライアント更新", + "plugins": "プラグイン", + "analysis": "分析(Veritas)", + "firefly_tools": "Fireflyツール", + "how_to": "使い方", + "about": "概要", + "settings": "設定", + "minimize": "最小化", + "close": "閉じる", + "by": "GaCy" + }, + "background": { + "select_bg": "背景を選択", + "choose_bg": "背景を選択", + "paste_url": "画像URLを貼り付け (https://...)", + "add": "追加", + "upload": "アップロード", + "upload_from_computer": "パソコンからアップロード", + "done": "完了", + "remove": "削除", + "invalid_url": "無効なURLです" + }, + "close": { + "title": "実行の確認", + "description": "最小化してシステムトレイに格納しますか?それとも終了しますか?", + "dont_ask": "次回から表示しない", + "minimize": "最小化", + "close": "終了" + }, + "setting": { + "title": "設定", + "launcher_update_title": "ランチャーの更新", + "launcher_update_desc": "最新バージョンかどうかを確認します。", + "launcher_update_btn": "更新を確認", + "launcher_update_success": "ランチャーは最新の状態です", + "closing_options_title": "終了オプション", + "set_dont_ask_again": "次回から表示しない", + "closing_auto_desc": "次回終了時、確認なしで自動的に{{action}}します。", + "action_minimize": "システムトレイに最小化", + "action_quit": "アプリを終了", + "version_label": "バージョン", + "server_label": "Server", + "proxy_label": "Proxy", + "launcher_label": "Launcher" + }, + "home": { + "header_title": "G Launcher", + "tooltip_how_to": "ツールとコマンドの使い方", + "btn_select_game": "ゲームファイルを選択", + "btn_selecting": "選択中...", + "btn_start_game": "ゲーム開始", + "btn_game_running": "実行中", + "menu_change_path": "ゲームパスを変更", + "menu_check_update": "サーバーとプロキシの更新を確認", + "menu_open_server": "サーバーフォルダを開く", + "menu_open_proxy": "プロキシフォルダを開く", + "menu_open_voice": "ボイスフォルダを開く", + "status_updating_launcher": "ランチャーを更新中", + "status_update_success": "更新完了。5秒後に閉じます", + "status_update_failed": "更新失敗。5秒後に閉じます", + "status_wait": "お待ちください...", + "status_complete": "完了!", + "modal_update_title": "データ更新", + "modal_update_msg": "サーバーとプロキシを更新しますか?", + "modal_download_title": "データダウンロード", + "modal_download_msg": "サーバーとプロキシのダウンロードが必要です", + "modal_self_update_title": "ランチャー更新", + "modal_self_update_msg": "ランチャーを更新しますか?", + "btn_yes": "はい", + "btn_no": "いいえ", + "btn_download": "ダウンロード", + "error_game_dir": "無効なゲームディレクトリ", + "error_file_type": "ファイル形式が正しくありません", + "game_path_success": "ゲームパスが設定されました", + "no_updates": "利用可能なアップデートはありません", + "toast_pick_folder_error": "フォルダ選択エラー: ", + "toast_start_proxy_failed": "プロキシの起動に失敗しました: ", + "toast_start_server_failed": "サーバーの起動に失敗しました: ", + "toast_start_game_failed": "ゲームの起動に失敗しました: ", + "toast_start_game_error": "ゲーム起動エラー: " + }, + "diff": { + "header_title": "🎮 Diff Toolによるゲーム更新", + "header_desc": "Diff Toolを使用したゲームの更新をサポートします", + "game_dir_title": "ゲームディレクトリ", + "btn_selecting": "選択中...", + "btn_select_game": "ゲームフォルダを選択", + "game_dir_valid": "有効なゲームディレクトリが見つかりました!", + "game_dir_invalid": "ゲームディレクトリが見つかりません。正しいフォルダを選択してください。", + "diff_file_title": "Diffファイルディレクトリ", + "btn_select_diff": "Diffファイルを選択", + "diff_file_valid": "有効なDiffファイルが見つかりました!", + "diff_file_invalid": "Diffファイルが見つかりません。正しいファイルを選択してください。", + "btn_updating": "更新中...", + "btn_update_game": "ゲームを更新", + "modal_update_title": "ゲームを更新", + "status_wait": "お待ちください...", + "inst_title": "📋 手順:", + "inst_step_1": "1. 「ゲームフォルダを選択」をクリックし、ゲームのルートディレクトリを選択します", + "inst_step_2": "2. システムがゲームディレクトリを検証するのを待ちます", + "inst_step_3": "3. 「Diffファイルを選択」をクリックし、Diffファイルを選択します", + "inst_step_4": "4. システムがDiffファイルを検証するのを待ちます", + "inst_step_5": "5. 「ゲームを更新」をクリックして変更を保存します", + "toast_game_dir_not_found": "ゲームディレクトリが見つかりません。正しいフォルダを選択してください。", + "toast_no_folder_selected": "フォルダパスが選択されていません", + "toast_pick_folder_error": "フォルダ選択エラー: ", + "toast_invalid_file_type": "無効なファイル形式です", + "toast_no_file_selected": "ファイルパスが選択されていません", + "toast_pick_file_error": "ファイル選択エラー: ", + "toast_select_both": "ゲームディレクトリとDiffファイルの両方を選択してください", + "toast_update_completed": "ゲームの更新が完了しました", + "stage_check_type": "Diff Toolタイプの確認", + "stage_version_validate": "バージョンの検証", + "stage_data_extract": "データの抽出", + "stage_cut_data": "データの切り取り", + "stage_patch_data": "データのパッチ適用", + "stage_delete_old_files": "古いファイルの削除" + }, + "language": { + "header_title": "🎮 ゲーム言語マネージャー", + "header_desc": "ゲームのテキストと音声言語の設定を管理します", + "game_dir_title": "ゲームディレクトリ", + "btn_select_game": "ゲームフォルダを選択", + "btn_selecting": "選択中...", + "game_dir_valid": "有効なゲームディレクトリが見つかりました!", + "game_dir_invalid": "ゲームディレクトリが見つかりません。正しいフォルダを選択してください。", + "current_languages_title": "現在の言語", + "text_language": "テキスト言語", + "voice_language": "音声言語", + "language_settings_title": "言語設定", + "select_text_placeholder": "テキスト言語を選択...", + "select_voice_placeholder": "音声言語を選択...", + "btn_apply": "言語設定を適用", + "btn_applying": "適用中...", + "inst_title": "📋 手順:", + "inst_step_1": "1. 「ゲームフォルダを選択」をクリックし、ゲームのルートディレクトリを選択します", + "inst_step_2": "2. システムがゲームディレクトリを検証するのを待ちます", + "inst_step_3": "3. 希望するテキスト言語と音声言語を選択します", + "inst_step_4": "4. 「言語設定を適用」をクリックして変更を保存します", + "toast_no_folder_selected": "フォルダパスが選択されていません", + "toast_pick_folder_error": "フォルダ選択エラー: ", + "toast_set_language_success": "言語が正常に設定されました", + "toast_set_language_error": "言語設定エラー: " + }, + "howto": { + "title": "使い方", + "sect1_title": "ランチャー機能の使用", + "sect1_auto_update_pre": "起動時に", + "sect1_auto_update_post": "およびプロキシツールを自動的に更新します。", + "sect1_launch_game": "正しいパラメータと実行環境で、ランチャーから直接ゲームを起動します。", + "sect1_lang_pre": "ゲーム内言語(例: EN, JP, ZH, KR)の切り替えをサポートします:", + "sect1_lang_link": "言語ツール", + "sect1_patch_title": "ゲームファイルのパッチと更新", + "sect1_patch_desc_1_pre": "高速で軽量な差分更新には", + "sect1_patch_desc_1_link": "Diff Tool", + "sect1_patch_desc_1_post": "(DiffPatch)を使用します。", + "sect1_patch_desc_2_pre": "サポート形式:", + "sect1_patch_desc_2_post": "、およびカスタムdiffフォーマット。", + "sect2_title": "FireflyGo チャットコマンド", + "sect2_desc_pre": "ゲーム内で使用できるチャットコマンドは以下の通りです。一部のコマンドは", + "sect2_desc_bold": "Theorycraftモード", + "sect2_desc_post": "を有効にする必要があります。", + "sect2_tc_req_title": "Theorycraftモードが必要", + "sect2_tc_req_desc_pre": "以下のコマンドは", + "sect2_tc_req_desc_bold": "Theorycraftモード", + "sect2_tc_req_desc_post": "が有効な場合のみ使用できます:", + "sect2_extra_title": "追加設定", + "sect2_hidden_ui_title": "UIを隠す", + "sect2_hidden_ui_desc": "ゲームUI全体を即座に非表示にします — DIMショーケースビデオでよく使用されます。", + "sect2_censor_title": "検閲の無効化", + "sect2_censor_desc": "よりクリーンな体験のためにレンズフレア検閲効果 💀 を削除します。", + "sect2_tc_title": "Theorycraftモード", + "sect2_tc_desc": "チャットコマンドを入力する必要はもうありません — ウェブからすべてを設定できます:モンスターのHP調整、サイクルの設定、ログの表示など。", + "sect2_cmd_title": "利用可能なコマンド:", + "sect2_cmd_tc": "Theorycraftモード", + "sect2_cmd_tc_enable": "— Theorycraftモードを有効にする", + "sect2_cmd_tc_disable": "— Theorycraftモードを無効にする", + "sect2_cmd_cycle": "サイクル制御", + "sect2_cmd_tc_only": "(Theorycraftのみ)", + "sect2_cmd_cycle_desc": "— 戦闘でのサイクル数を設定する", + "sect2_cmd_cycle_ex1_pre": "例:", + "sect2_cmd_cycle_ex1_post": "は戦闘を30サイクルに設定します", + "sect2_cmd_cycle_ex2_post": "はカスタムサイクルを無効にします", + "sect2_cmd_hp": "HPの上書き", + "sect2_cmd_hp_desc1": "— モンスターのHPを設定する (Theorycraftモードでのみ利用可能)", + "sect2_cmd_hp_desc2": "— HP設定機能を無効にする", + "sect2_cmd_hp_desc3": "— 特定のウェーブの各モンスターにHPを設定する", + "sect2_cmd_hp_ex_pre": "例:", + "sect2_cmd_hp_ex_post": "はウェーブ1のモンスター1のHPを2,000,000に、モンスター2のHPを3,000,000に設定します", + "sect2_cmd_log": "バトルログ", + "sect2_cmd_log_desc1": "— バトルログ出力を有効にする", + "sect2_cmd_log_desc2": "— バトルログを無効にする", + "sect2_cmd_log_out_pre": "出力は以下の形式で書き込まれます:", + "sect2_cmd_skip": "ノードのスキップ", + "sect2_cmd_skip_desc": "— MOC / AS / 虚構叙事でノードをスキップする", + "sect2_cmd_skip_ex1_pre": "例:", + "sect2_cmd_skip_ex1_post": "はノード2をスキップします", + "sect2_cmd_skip_ex2_post": "はスキップを無効にします", + "sect2_cmd_id": "キャラクター運命の切り替え", + "sect2_cmd_id_desc": "— 複数形態を持つキャラクターの運命を切り替える", + "sect2_cmd_id_ex1_pre": "例:", + "sect2_cmd_id_ex1_post": "は主人公(開拓者)の形態を変更します", + "sect2_cmd_id_ex2_pre": "対応ID例:", + "sect2_cmd_update": "データのリフレッシュ", + "sect2_cmd_update_desc_pre": "— 現在のファイルからサーバーデータを更新します:", + "sect3_title": "その他の注意事項", + "sect3_admin_title": "管理者権限", + "sect3_admin_desc": "ファイル権限にアクセスするため、常にランチャーを管理者として実行してください。", + "sect3_backup_title": "データのバックアップ", + "sect3_backup_desc_pre": "定期的に", + "sect3_backup_desc_mid": "と", + "sect3_backup_desc_post": "をバックアップしてください。", + "sect3_voice_title": "ベータクライアントでボイスパックを有効にする", + "sect3_voice_step1_pre": "希望するボイスフォルダ (例:", + "sect3_voice_step1_mid": ") を以下からコピーし:", + "sect3_voice_step1_post_pre": "ホームタブの", + "sect3_voice_step1_post_bold": "「ボイスフォルダを開く」", + "sect3_voice_step1_post_post": "をクリックしてベータフォルダに配置します。", + "sect3_voice_step2": "ゲームを初めて起動した際、ボイスフォルダが削除される場合があります。その場合は、手順1を繰り返して復元してください。", + "btn_back": "ホームに戻る" + }, + "about": { + "title": "概要", + "p1_pre": "こんにちは!私たちは ", + "p1_post": " です。便利なツールの構築とユーザー体験の向上に情熱を注ぐ開発チームです。", + "p2_pre": "ユーザーがより良いパフォーマンスとシンプルさで簡単にゲームを起動・管理できるように、軽量でモダンな ", + "p2_highlight": "Game Launcher", + "p2_post": " を作成しました。", + "p3_pre": "ランチャーは ", + "p3_mid": " を使用して構築されており、", + "p3_and": " と ", + "p3_post": " でデザインされたクリーンでレスポンシブなインターフェースを備えています。", + "p4": "私の目標は、高速で効率的、そして使って楽しいツールを作ることです。このランチャーはその始まりに過ぎません。", + "btn_back": "ホームに戻る" + }, + "fireflytools": { + "title": "Firefly ツール", + "sect1_title": "Firefly ツールについて", + "sect1_p1_pre": "このサイトは ", + "sect1_p1_tool": "Firefly Tools ", + "sect1_p1_mid": "の別バージョンであり、開発元は ", + "sect1_p1_author": "Firefly Shelter", + "sect1_master_site": "マスターウェブサイト", + "sect1_p2_pre": "オリジナルのツールは、", + "sect1_p2_author": "Amazing", + "sect1_p2_post": " というサードパーティの開発者によって作成されました。このバージョンは、コアロジックを変更することなく、その作業に直接基づいています。", + "sect1_p3_pre": "同じ作者によるよりモダンなバージョンも以下で利用可能です:", + "sect2_title": "主な機能", + "sect2_feat1": "ブラウザでキャラクター、光円錐、遺物、軌跡、星魂を簡単に設定できます。", + "sect2_feat2_pre": "", + "sect2_feat2_server": "Firefly GO Server", + "sect2_feat2_mid": " に ", + "sect2_feat2_conn": "Connect PS", + "sect2_feat2_post": " を使用して設定を即座に適用します — 手動でのファイルアップロードは不要です。", + "sect2_feat3_title": "追加設定", + "sect2_feat3_desc_pre": "追加機能で ", + "sect2_feat3_desc_server": "Firefly GO Server", + "sect2_feat3_desc_post": " の体験を向上させます:", + "sect2_feat3_ui": "UIを隠す", + "sect2_feat3_ui_desc": "— ゲームインターフェース全体を削除します。", + "sect2_feat3_censor": "検閲の無効化", + "sect2_feat3_censor_desc": "— レンズフレア検閲 💀 を取り除きます。", + "sect2_feat3_tc": "Theorycraft モード", + "sect2_feat3_tc_desc": "— ウェブ経由でHP、サイクルなどを設定します。", + "sect2_feat4_pre": "を使用して完全なビルドをエクスポートおよびインポートします:", + "sect2_feat4_post": "。", + "sect2_feat5": "高速なテストワークフロー — 同期のクールダウンなし、ゲーム内の即時更新。", + "sect3_title": "はじめに", + "sect3_step1": "セルフホストされたインスタンスのブラウザからツールにアクセスします。", + "sect3_step2": "直感的なウェブインターフェースでキャラクタービルドを設定します。", + "sect3_step3_pre": "", + "sect3_step3_bold": "Connect PS", + "sect3_step3_post": " 機能を使用して、プライベートサーバーと即座に同期します。", + "sect3_step4": "リアルタイムの更新と変更を使用して、ゲーム内でビルドをテストします。", + "btn_back": "ホームに戻る" + }, + "analysis": { + "title": "Firefly 分析 \u0026 Veritas プラグイン", + "sect1_title": "Veritas について", + "sect1_p1_pre": "Veritas", + "sect1_p1_mid": " は、ゲームプレイ中のダメージをリアルタイムで分析するために設計された強力な ", + "sect1_p1_highlight": "ダメージロガー", + "sect1_p1_post": " です。", + "sect1_p2": "軽量で高速、包括的なダメージ分析に使いやすいツールです。", + "sect1_github": "GitHub リポジトリ", + "sect2_title": "Web 分析ツール", + "sect2_desc": "Veritas を使用したリアルタイムダメージ分析には、以下の Web アプリケーションを使用してください:", + "sect2_master": "マスターウェブサイト", + "sect2_backup": "バックアップウェブサイト", + "sect2_tip_pre": "ヒント:", + "sect2_tip_post": " マスターサイトの読み込みに問題がある場合は、バックアップサイトをご利用ください。", + "sect3_title": "インストール手順", + "sect3_subtitle": "重要なセットアップ手順", + "sect3_desc": "Veritas をダウンロードした後、正常に動作させるにはファイル名を変更する必要があります:", + "sect3_rename": "名前の変更: ", + "sect3_place": "その後、", + "sect3_place_post": " をゲームディレクトリに配置します。", + "sect4_title": "Web アプリの使い方", + "sect4_sub1": "Firefly GO ローカル用", + "sect4_sub1_step1_pre": "", + "sect4_sub1_step1_game": "ゲーム", + "sect4_sub1_step1_mid": " と ", + "sect4_sub1_step1_server": "Firefly GO サーバー (PS)", + "sect4_sub1_step1_post": " を起動します。", + "sect4_sub1_step2": "いずれかの Web 分析ツールを開きます。", + "sect4_sub1_step3_pre": "", + "sect4_sub1_step3_conn": "Connection Settings", + "sect4_sub1_step3_mid1": " に移動し、", + "sect4_sub1_step3_type": "Connection Type: PS", + "sect4_sub1_step3_mid2": " を選択して、", + "sect4_sub1_step3_btn": "Connect", + "sect4_sub1_step3_post": " をクリックします。", + "sect4_sub1_step4": "接続後、ゲームをプレイしてください。ツールがバックグラウンドで自動的に分析を行います。", + "sect4_sub2": "その他のプライベートサーバー用", + "sect4_sub2_step1_pre": "", + "sect4_sub2_step1_game": "ゲーム", + "sect4_sub2_step1_mid": " と ", + "sect4_sub2_step1_server": "プライベートサーバー", + "sect4_sub2_step1_post": " を起動します。", + "sect4_sub2_step2": "いずれかの Web 分析ツールを開きます。", + "sect4_sub2_step3_pre": "", + "sect4_sub2_step3_conn": "Connection Settings", + "sect4_sub2_step3_mid1": " に移動し、", + "sect4_sub2_step3_type": "Connection Type: Native", + "sect4_sub2_step3_mid2": " を選択して、", + "sect4_sub2_step3_btn": "Connect", + "sect4_sub2_step3_post": " をクリックします。", + "sect4_sub2_step4": "接続後、通常通りゲームをプレイしてください。", + "btn_back": "ホームに戻る" + } } \ No newline at end of file diff --git a/frontend/public/locales/ko.json b/frontend/public/locales/ko.json index f4b8792..098bb08 100644 --- a/frontend/public/locales/ko.json +++ b/frontend/public/locales/ko.json @@ -1,337 +1,337 @@ -{ - "header": { - "home": "홈", - "tools": "도구", - "language": "언어", - "diff": "비교", - "client_update": "클라이언트 업데이트", - "plugins": "플러그인", - "analysis": "분석 (Veritas)", - "firefly_tools": "Firefly 도구", - "how_to": "사용 방법", - "about": "정보", - "settings": "설정", - "minimize": "최소화", - "close": "닫기", - "by": "Firefly Shelter" - }, - "background": { - "select_bg": "배경 선택", - "choose_bg": "배경 선택", - "paste_url": "이미지 URL 붙여넣기 (https://...)", - "add": "추가", - "upload": "업로드", - "upload_from_computer": "컴퓨터에서 업로드", - "done": "완료", - "remove": "삭제", - "invalid_url": "잘못된 URL입니다" - }, - "close": { - "title": "작업 확인", - "description": "앱을 트레이로 최소화하시겠습니까, 아니면 종료하시겠습니까?", - "dont_ask": "다시 묻지 않음", - "minimize": "최소화", - "close": "종료" - }, - "setting": { - "title": "설정", - "launcher_update_title": "런처 업데이트", - "launcher_update_desc": "런처가 최신 상태인지 확인합니다.", - "launcher_update_btn": "업데이트 확인", - "launcher_update_success": "런처가 이미 최신 버전입니다", - "closing_options_title": "종료 옵션", - "set_dont_ask_again": "다시 묻지 않음 설정", - "closing_auto_desc": "다음 종료 시 묻지 않고 자동으로 {{action}}합니다.", - "action_minimize": "트레이로 최소화", - "action_quit": "앱 종료", - "version_label": "버전", - "server_label": "Server", - "proxy_label": "Proxy", - "launcher_label": "Launcher" - }, - "home": { -"header_title": "Firefly GO", - "tooltip_how_to": "도구 및 명령 사용법", - "btn_select_game": "게임 파일 선택", - "btn_selecting": "선택 중...", - "btn_start_game": "게임 시작", - "btn_game_running": "게임 실행 중", - "menu_change_path": "게임 경로 변경", - "menu_check_update": "서버 및 프록시 업데이트 확인", - "menu_open_server": "서버 폴더 열기", - "menu_open_proxy": "프록시 폴더 열기", - "menu_open_voice": "음성 폴더 열기", - "status_updating_launcher": "런처 업데이트 중", - "status_update_success": "업데이트 완료, 5초 후 종료", - "status_update_failed": "업데이트 실패, 5초 후 종료", - "status_wait": "잠시만 기다려 주세요...", - "status_complete": "완료!", - "modal_update_title": "데이터 업데이트", - "modal_update_msg": "서버 및 프록시 데이터를 업데이트하시겠습니까?", - "modal_download_title": "데이터 다운로드", - "modal_download_msg": "서버 및 프록시 데이터 다운로드가 필요합니다", - "modal_self_update_title": "런처 업데이트", - "modal_self_update_msg": "런처를 업데이트하시겠습니까?", - "btn_yes": "예", - "btn_no": "아니요", - "btn_download": "다운로드", - "error_game_dir": "잘못된 게임 디렉토리", - "error_file_type": "잘못된 파일 형식", - "game_path_success": "게임 경로 설정 완료", - "no_updates": "업데이트가 없습니다", - "toast_pick_folder_error": "폴더 선택 오류: ", - "toast_start_proxy_failed": "프록시 시작 실패: ", - "toast_start_server_failed": "서버 시작 실패: ", - "toast_start_game_failed": "게임 시작 실패: ", - "toast_start_game_error": "게임 시작 오류: " - }, - "diff": { - "header_title": "🎮 Diff Tool로 게임 업데이트", - "header_desc": "Diff Tool을 사용하여 게임을 업데이트하도록 도와줍니다", - "game_dir_title": "게임 디렉토리", - "btn_selecting": "선택 중...", - "btn_select_game": "게임 폴더 선택", - "game_dir_valid": "유효한 게임 디렉토리를 찾았습니다!", - "game_dir_invalid": "게임 디렉토리를 찾을 수 없습니다. 올바른 폴더를 선택해주세요.", - "diff_file_title": "Diff 파일 디렉토리", - "btn_select_diff": "Diff 파일 선택", - "diff_file_valid": "유효한 Diff 파일을 찾았습니다!", - "diff_file_invalid": "Diff 파일을 찾을 수 없습니다. 올바른 파일을 선택해주세요.", - "btn_updating": "업데이트 중...", - "btn_update_game": "게임 업데이트", - "modal_update_title": "게임 업데이트", - "status_wait": "잠시만 기다려 주세요...", - "inst_title": "📋 지침:", - "inst_step_1": "1. \"게임 폴더 선택\"을 클릭하고 게임의 루트 디렉토리를 선택합니다", - "inst_step_2": "2. 시스템이 게임 디렉토리를 검증할 때까지 기다립니다", - "inst_step_3": "3. \"Diff 파일 선택\"을 클릭하고 Diff 파일을 선택합니다", - "inst_step_4": "4. 시스템이 Diff 파일을 검증할 때까지 기다립니다", - "inst_step_5": "5. \"게임 업데이트\"를 클릭하여 변경 사항을 저장합니다", - "toast_game_dir_not_found": "게임 디렉토리를 찾을 수 없습니다. 올바른 폴더를 선택해주세요.", - "toast_no_folder_selected": "폴더 경로가 선택되지 않았습니다", - "toast_pick_folder_error": "폴더 선택 오류: ", - "toast_invalid_file_type": "유효하지 않은 파일 형식입니다", - "toast_no_file_selected": "파일 경로가 선택되지 않았습니다", - "toast_pick_file_error": "파일 선택 오류: ", - "toast_select_both": "게임 디렉토리와 Diff 파일을 모두 선택해주세요", - "toast_update_completed": "게임 업데이트가 완료되었습니다", - "stage_check_type": "Diff Tool 유형 확인", - "stage_version_validate": "버전 유효성 검사", - "stage_data_extract": "데이터 추출", - "stage_cut_data": "데이터 자르기", - "stage_patch_data": "데이터 패치", - "stage_delete_old_files": "오래된 파일 삭제" - }, - "language": { - "header_title": "🎮 게임 언어 관리자", - "header_desc": "게임의 텍스트 및 음성 언어 설정을 관리합니다", - "game_dir_title": "게임 디렉토리", - "btn_select_game": "게임 폴더 선택", - "btn_selecting": "선택 중...", - "game_dir_valid": "유효한 게임 디렉토리를 찾았습니다!", - "game_dir_invalid": "게임 디렉토리를 찾을 수 없습니다. 올바른 폴더를 선택해주세요.", - "current_languages_title": "현재 언어", - "text_language": "텍스트 언어", - "voice_language": "음성 언어", - "language_settings_title": "언어 설정", - "select_text_placeholder": "텍스트 언어 선택...", - "select_voice_placeholder": "음성 언어 선택...", - "btn_apply": "언어 설정 적용", - "btn_applying": "적용 중...", - "inst_title": "📋 지침:", - "inst_step_1": "1. \"게임 폴더 선택\"을 클릭하고 게임의 루트 디렉토리를 선택합니다", - "inst_step_2": "2. 시스템이 게임 디렉토리를 검증할 때까지 기다립니다", - "inst_step_3": "3. 선호하는 텍스트 및 음성 언어를 선택합니다", - "inst_step_4": "4. \"언어 설정 적용\"을 클릭하여 변경 사항을 저장합니다", - "toast_no_folder_selected": "폴더 경로가 선택되지 않았습니다", - "toast_pick_folder_error": "폴더 선택 오류: ", - "toast_set_language_success": "언어 설정이 완료되었습니다", - "toast_set_language_error": "언어 설정 오류: " - }, - "howto": { - "title": "사용 방법", - "sect1_title": "런처 기능 사용", - "sect1_auto_update_pre": "실행 시", - "sect1_auto_update_post": "및 프록시 도구를 자동으로 업데이트합니다.", - "sect1_launch_game": "올바른 매개변수와 실행 환경으로 런처를 통해 게임을 직접 실행합니다.", - "sect1_lang_pre": "게임 내 언어(예: EN, JP, ZH, KR) 전환 지원:", - "sect1_lang_link": "언어 도구", - "sect1_patch_title": "게임 파일 패치 및 업데이트", - "sect1_patch_desc_1_pre": "빠르고 가벼운 증분 업데이트를 위해", - "sect1_patch_desc_1_link": "Diff Tool", - "sect1_patch_desc_1_post": "(DiffPatch)을 사용합니다.", - "sect1_patch_desc_2_pre": "지원 형식:", - "sect1_patch_desc_2_post": "및 사용자 정의 diff 형식.", - "sect2_title": "FireflyGo 채팅 명령", - "sect2_desc_pre": "게임 내에서 사용할 수 있는 채팅 명령어입니다. 일부 명령은", - "sect2_desc_bold": "Theorycraft 모드", - "sect2_desc_post": "를 활성화해야 합니다.", - "sect2_tc_req_title": "Theorycraft 모드 필요", - "sect2_tc_req_desc_pre": "다음 명령은", - "sect2_tc_req_desc_bold": "Theorycraft 모드", - "sect2_tc_req_desc_post": "가 활성화된 경우에만 사용할 수 있습니다:", - "sect2_extra_title": "추가 설정", - "sect2_hidden_ui_title": "UI 숨기기", - "sect2_hidden_ui_desc": "DIM 쇼케이스 비디오에서 자주 사용되는 게임 UI 전체를 즉시 숨깁니다.", - "sect2_censor_title": "검열 비활성화", - "sect2_censor_desc": "더 깔끔한 경험을 위해 렌즈 플레어 검열 효과 💀를 제거합니다.", - "sect2_tc_title": "Theorycraft 모드", - "sect2_tc_desc": "더 이상 채팅 명령어를 입력할 필요가 없습니다 — 몬스터 HP 조정, 주기 설정, 로그 보기 등 모든 것을 웹을 통해 구성하세요.", - "sect2_cmd_title": "사용 가능한 명령:", - "sect2_cmd_tc": "Theorycraft 모드", - "sect2_cmd_tc_enable": "— Theorycraft 모드 활성화", - "sect2_cmd_tc_disable": "— Theorycraft 모드 비활성화", - "sect2_cmd_cycle": "주기 제어", - "sect2_cmd_tc_only": "(Theorycraft 전용)", - "sect2_cmd_cycle_desc": "— 전투에서 주기 수 설정", - "sect2_cmd_cycle_ex1_pre": "예:", - "sect2_cmd_cycle_ex1_post": "는 전투를 30주기로 설정합니다", - "sect2_cmd_cycle_ex2_post": "는 사용자 정의 주기를 비활성화합니다", - "sect2_cmd_hp": "HP 덮어쓰기", - "sect2_cmd_hp_desc1": "— 몬스터 HP 설정 (Theorycraft 모드에서만 사용 가능)", - "sect2_cmd_hp_desc2": "— HP 설정 기능 비활성화", - "sect2_cmd_hp_desc3": "— 특정 웨이브의 각 몬스터에 HP 설정", - "sect2_cmd_hp_ex_pre": "예:", - "sect2_cmd_hp_ex_post": "는 웨이브 1 몬스터1 HP를 2,000,000으로, 몬스터2 HP를 3,000,000으로 설정합니다", - "sect2_cmd_log": "전투 로그", - "sect2_cmd_log_desc1": "— 전투 로그 출력 활성화", - "sect2_cmd_log_desc2": "— 전투 로그 비활성화", - "sect2_cmd_log_out_pre": "출력은 다음 형식으로 작성됩니다:", - "sect2_cmd_skip": "노드 건너뛰기", - "sect2_cmd_skip_desc": "— 혼돈의 기억 / 허구 이야기에서 노드 건너뛰기", - "sect2_cmd_skip_ex1_pre": "예:", - "sect2_cmd_skip_ex1_post": "는 노드 2를 건너뜁니다", - "sect2_cmd_skip_ex2_post": "는 건너뛰기를 비활성화합니다", - "sect2_cmd_id": "캐릭터 운명의 길 전환", - "sect2_cmd_id_desc": "— 다중 형태를 가진 캐릭터의 운명의 길 전환", - "sect2_cmd_id_ex1_pre": "예:", - "sect2_cmd_id_ex1_post": "는 개척자 형태를 변경합니다", - "sect2_cmd_id_ex2_pre": "지원되는 ID 예:", - "sect2_cmd_update": "데이터 새로고침", - "sect2_cmd_update_desc_pre": "— 다음 파일에서 서버 데이터를 새로고침합니다:", - "sect3_title": "기타 참고 사항", - "sect3_admin_title": "관리자 권한", - "sect3_admin_desc": "파일 권한 액세스를 위해 항상 런처를 관리자 권한으로 실행하세요.", - "sect3_backup_title": "데이터 백업", - "sect3_backup_desc_pre": "정기적으로", - "sect3_backup_desc_mid": "및", - "sect3_backup_desc_post": "를 백업하세요.", - "sect3_voice_title": "베타 클라이언트에서 음성 팩 활성화", - "sect3_voice_step1_pre": "원하는 음성 폴더(예:", - "sect3_voice_step1_mid": ")를 다음 경로에서 복사하여:", - "sect3_voice_step1_post_pre": "홈 탭에서", - "sect3_voice_step1_post_bold": "\"음성 폴더 열기\"", - "sect3_voice_step1_post_post": "를 클릭해 베타 폴더에 넣습니다.", - "sect3_voice_step2": "게임을 처음 실행할 때 음성 폴더가 삭제될 수 있습니다. 그런 경우 1단계를 반복하여 복구하세요.", - "btn_back": "홈으로 돌아가기" - }, - "about": { - "title": "소개", - "p1_pre": "안녕하세요! 저희는 유용한 도구를 개발하고 사용자 경험을 개선하는 데 열정을 쏟는 개발팀 ", - "p1_post": " 입니다.", - "p2_pre": "사용자가 더 나은 성능과 단순함으로 게임을 쉽게 실행하고 관리할 수 있도록 가볍고 현대적인 ", - "p2_highlight": "Game Launcher", - "p2_post": " 를 만들었습니다.", - "p3_pre": "런처는 ", - "p3_mid": " 을(를) 사용하여 구축되었으며, ", - "p3_and": " 및 ", - "p3_post": " (으)로 디자인된 깔끔하고 반응형인 인터페이스를 특징으로 합니다.", - "p4": "제 목표는 빠르고 효율적이며 사용하기 즐거운 도구를 만드는 것입니다 — 이 런처는 단지 시작일 뿐입니다.", - "btn_back": "홈으로 돌아가기" - }, - "fireflytools": { - "title": "Firefly 도구", - "sect1_title": "Firefly 도구 소개", - "sect1_p1_pre": "이 사이트는 ", - "sect1_p1_tool": "Firefly Shelter", - "sect1_p1_mid": "에서 개발한 ", - "sect1_p1_author": "Firefly Tools", - "sect1_master_site": "마스터 웹사이트", - "sect1_p2_pre": "원본 도구는 ", - "sect1_p2_author": "Amazing", - "sect1_p2_post": " 이라는 타사 개발자가 만들었습니다. 이 버전은 핵심 논리를 수정하지 않고 해당 작업을 직접 기반으로 합니다.", - "sect1_p3_pre": "동일한 작성자의 더 현대적인 버전도 다음에서 사용할 수 있습니다: ", - "sect2_title": "주요 기능", - "sect2_feat1": "브라우저에서 캐릭터, 광추, 유물, 행적 및 성혼을 쉽게 구성하세요.", - "sect2_feat2_pre": "", - "sect2_feat2_server": "Firefly GO Server", - "sect2_feat2_mid": "에 ", - "sect2_feat2_conn": "Connect PS", - "sect2_feat2_post": "를 사용하여 설정을 즉시 적용합니다 — 수동 파일 업로드가 필요하지 않습니다.", - "sect2_feat3_title": "추가 설정", - "sect2_feat3_desc_pre": "추가 기능으로 ", - "sect2_feat3_desc_server": "Firefly GO Server", - "sect2_feat3_desc_post": " 환경을 향상시키세요:", - "sect2_feat3_ui": "게임 UI 숨기기", - "sect2_feat3_ui_desc": "— 전체 게임 인터페이스를 제거합니다.", - "sect2_feat3_censor": "검열 비활성화", - "sect2_feat3_censor_desc": "— 렌즈 플레어 검열 💀을 제거합니다.", - "sect2_feat3_tc": "Theorycraft 모드", - "sect2_feat3_tc_desc": "— 웹을 통해 HP, 주기 등을 구성합니다.", - "sect2_feat4_pre": "다음을 사용하여 전체 빌드를 내보내고 가져옵니다: ", - "sect2_feat4_post": ".", - "sect2_feat5": "빠른 테스트 워크플로 — 동기화 재사용 대기시간 없음, 즉각적인 게임 내 업데이트.", - "sect3_title": "시작하기", - "sect3_step1": "자체 호스팅 인스턴스에서 브라우저를 통해 도구에 액세스합니다.", - "sect3_step2": "직관적인 웹 인터페이스로 캐릭터 빌드를 구성합니다.", - "sect3_step3_pre": "", - "sect3_step3_bold": "Connect PS", - "sect3_step3_post": " 기능을 사용하여 사설 서버와 즉시 동기화합니다.", - "sect3_step4": "실시간 업데이트 및 수정 사항을 통해 게임 내에서 빌드를 테스트합니다.", - "btn_back": "홈으로 돌아가기" - }, - "analysis": { - "title": "Firefly 분석 & Veritas 플러그인", - "sect1_title": "Veritas 소개", - "sect1_p1_pre": "Veritas", - "sect1_p1_mid": "는 게임 플레이 중 실시간으로 피해량을 분석하도록 설계된 강력한 ", - "sect1_p1_highlight": "데미지 로거", - "sect1_p1_post": "입니다.", - "sect1_p2": "포괄적인 피해 분석을 위해 가볍고 빠르며 사용하기 쉽습니다.", - "sect1_github": "GitHub 저장소", - "sect2_title": "웹 분석 도구", - "sect2_desc": "Veritas를 통한 실시간 피해 분석을 위해 다음 웹 애플리케이션을 사용하세요:", - "sect2_master": "마스터 웹사이트", - "sect2_backup": "백업 웹사이트", - "sect2_tip_pre": "팁:", - "sect2_tip_post": " 해당 국가에서 마스터 사이트 로딩에 문제가 있는 경우 백업 사이트를 대신 사용하세요.", - "sect3_title": "설치 지침", - "sect3_subtitle": "중요 설정 단계", - "sect3_desc": "Veritas를 다운로드한 후 정상적으로 작동하려면 파일 이름을 변경해야 합니다:", - "sect3_rename": "이름 변경: ", - "sect3_place": "그런 다음 ", - "sect3_place_post": "를 게임 디렉토리에 배치합니다.", - "sect4_title": "웹 앱 사용 방법", - "sect4_sub1": "Firefly GO 로컬용", - "sect4_sub1_step1_pre": "", - "sect4_sub1_step1_game": "게임", - "sect4_sub1_step1_mid": "과 ", - "sect4_sub1_step1_server": "Firefly GO 서버(PS)", - "sect4_sub1_step1_post": "를 실행합니다.", - "sect4_sub1_step2": "웹 분석 도구 중 하나를 엽니다.", - "sect4_sub1_step3_pre": "", - "sect4_sub1_step3_conn": "Connection Settings", - "sect4_sub1_step3_mid1": "로 이동 → ", - "sect4_sub1_step3_type": "Connection Type: PS", - "sect4_sub1_step3_mid2": " 선택 → ", - "sect4_sub1_step3_btn": "Connect", - "sect4_sub1_step3_post": "를 클릭합니다.", - "sect4_sub1_step4": "연결되면 게임을 플레이합니다. 도구가 백그라운드에서 자동으로 분석합니다.", - "sect4_sub2": "기타 사설 서버용", - "sect4_sub2_step1_pre": "", - "sect4_sub2_step1_game": "게임", - "sect4_sub2_step1_mid": "과 ", - "sect4_sub2_step1_server": "사설 서버", - "sect4_sub2_step1_post": "를 실행합니다.", - "sect4_sub2_step2": "웹 분석 도구 중 하나를 엽니다.", - "sect4_sub2_step3_pre": "", - "sect4_sub2_step3_conn": "Connection Settings", - "sect4_sub2_step3_mid1": "로 이동 → ", - "sect4_sub2_step3_type": "Connection Type: Native", - "sect4_sub2_step3_mid2": " 선택 → ", - "sect4_sub2_step3_btn": "Connect", - "sect4_sub2_step3_post": "를 클릭합니다.", - "sect4_sub2_step4": "연결되면 평소처럼 게임을 플레이합니다.", - "btn_back": "홈으로 돌아가기" - } +{ + "header": { + "home": "홈", + "tools": "도구", + "language": "언어", + "diff": "비교", + "client_update": "클라이언트 업데이트", + "plugins": "플러그인", + "analysis": "분석 (Veritas)", + "firefly_tools": "Firefly 도구", + "how_to": "사용 방법", + "about": "정보", + "settings": "설정", + "minimize": "최소화", + "close": "닫기", + "by": "GaCy" + }, + "background": { + "select_bg": "배경 선택", + "choose_bg": "배경 선택", + "paste_url": "이미지 URL 붙여넣기 (https://...)", + "add": "추가", + "upload": "업로드", + "upload_from_computer": "컴퓨터에서 업로드", + "done": "완료", + "remove": "삭제", + "invalid_url": "잘못된 URL입니다" + }, + "close": { + "title": "작업 확인", + "description": "앱을 트레이로 최소화하시겠습니까, 아니면 종료하시겠습니까?", + "dont_ask": "다시 묻지 않음", + "minimize": "최소화", + "close": "종료" + }, + "setting": { + "title": "설정", + "launcher_update_title": "런처 업데이트", + "launcher_update_desc": "런처가 최신 상태인지 확인합니다.", + "launcher_update_btn": "업데이트 확인", + "launcher_update_success": "런처가 이미 최신 버전입니다", + "closing_options_title": "종료 옵션", + "set_dont_ask_again": "다시 묻지 않음 설정", + "closing_auto_desc": "다음 종료 시 묻지 않고 자동으로 {{action}}합니다.", + "action_minimize": "트레이로 최소화", + "action_quit": "앱 종료", + "version_label": "버전", + "server_label": "Server", + "proxy_label": "Proxy", + "launcher_label": "Launcher" + }, + "home": { + "header_title": "G Launcher", + "tooltip_how_to": "도구 및 명령 사용법", + "btn_select_game": "게임 파일 선택", + "btn_selecting": "선택 중...", + "btn_start_game": "게임 시작", + "btn_game_running": "게임 실행 중", + "menu_change_path": "게임 경로 변경", + "menu_check_update": "서버 및 프록시 업데이트 확인", + "menu_open_server": "서버 폴더 열기", + "menu_open_proxy": "프록시 폴더 열기", + "menu_open_voice": "음성 폴더 열기", + "status_updating_launcher": "런처 업데이트 중", + "status_update_success": "업데이트 완료, 5초 후 종료", + "status_update_failed": "업데이트 실패, 5초 후 종료", + "status_wait": "잠시만 기다려 주세요...", + "status_complete": "완료!", + "modal_update_title": "데이터 업데이트", + "modal_update_msg": "서버 및 프록시 데이터를 업데이트하시겠습니까?", + "modal_download_title": "데이터 다운로드", + "modal_download_msg": "서버 및 프록시 데이터 다운로드가 필요합니다", + "modal_self_update_title": "런처 업데이트", + "modal_self_update_msg": "런처를 업데이트하시겠습니까?", + "btn_yes": "예", + "btn_no": "아니요", + "btn_download": "다운로드", + "error_game_dir": "잘못된 게임 디렉토리", + "error_file_type": "잘못된 파일 형식", + "game_path_success": "게임 경로 설정 완료", + "no_updates": "업데이트가 없습니다", + "toast_pick_folder_error": "폴더 선택 오류: ", + "toast_start_proxy_failed": "프록시 시작 실패: ", + "toast_start_server_failed": "서버 시작 실패: ", + "toast_start_game_failed": "게임 시작 실패: ", + "toast_start_game_error": "게임 시작 오류: " + }, + "diff": { + "header_title": "🎮 Diff Tool로 게임 업데이트", + "header_desc": "Diff Tool을 사용하여 게임을 업데이트하도록 도와줍니다", + "game_dir_title": "게임 디렉토리", + "btn_selecting": "선택 중...", + "btn_select_game": "게임 폴더 선택", + "game_dir_valid": "유효한 게임 디렉토리를 찾았습니다!", + "game_dir_invalid": "게임 디렉토리를 찾을 수 없습니다. 올바른 폴더를 선택해주세요.", + "diff_file_title": "Diff 파일 디렉토리", + "btn_select_diff": "Diff 파일 선택", + "diff_file_valid": "유효한 Diff 파일을 찾았습니다!", + "diff_file_invalid": "Diff 파일을 찾을 수 없습니다. 올바른 파일을 선택해주세요.", + "btn_updating": "업데이트 중...", + "btn_update_game": "게임 업데이트", + "modal_update_title": "게임 업데이트", + "status_wait": "잠시만 기다려 주세요...", + "inst_title": "📋 지침:", + "inst_step_1": "1. \"게임 폴더 선택\"을 클릭하고 게임의 루트 디렉토리를 선택합니다", + "inst_step_2": "2. 시스템이 게임 디렉토리를 검증할 때까지 기다립니다", + "inst_step_3": "3. \"Diff 파일 선택\"을 클릭하고 Diff 파일을 선택합니다", + "inst_step_4": "4. 시스템이 Diff 파일을 검증할 때까지 기다립니다", + "inst_step_5": "5. \"게임 업데이트\"를 클릭하여 변경 사항을 저장합니다", + "toast_game_dir_not_found": "게임 디렉토리를 찾을 수 없습니다. 올바른 폴더를 선택해주세요.", + "toast_no_folder_selected": "폴더 경로가 선택되지 않았습니다", + "toast_pick_folder_error": "폴더 선택 오류: ", + "toast_invalid_file_type": "유효하지 않은 파일 형식입니다", + "toast_no_file_selected": "파일 경로가 선택되지 않았습니다", + "toast_pick_file_error": "파일 선택 오류: ", + "toast_select_both": "게임 디렉토리와 Diff 파일을 모두 선택해주세요", + "toast_update_completed": "게임 업데이트가 완료되었습니다", + "stage_check_type": "Diff Tool 유형 확인", + "stage_version_validate": "버전 유효성 검사", + "stage_data_extract": "데이터 추출", + "stage_cut_data": "데이터 자르기", + "stage_patch_data": "데이터 패치", + "stage_delete_old_files": "오래된 파일 삭제" + }, + "language": { + "header_title": "🎮 게임 언어 관리자", + "header_desc": "게임의 텍스트 및 음성 언어 설정을 관리합니다", + "game_dir_title": "게임 디렉토리", + "btn_select_game": "게임 폴더 선택", + "btn_selecting": "선택 중...", + "game_dir_valid": "유효한 게임 디렉토리를 찾았습니다!", + "game_dir_invalid": "게임 디렉토리를 찾을 수 없습니다. 올바른 폴더를 선택해주세요.", + "current_languages_title": "현재 언어", + "text_language": "텍스트 언어", + "voice_language": "음성 언어", + "language_settings_title": "언어 설정", + "select_text_placeholder": "텍스트 언어 선택...", + "select_voice_placeholder": "음성 언어 선택...", + "btn_apply": "언어 설정 적용", + "btn_applying": "적용 중...", + "inst_title": "📋 지침:", + "inst_step_1": "1. \"게임 폴더 선택\"을 클릭하고 게임의 루트 디렉토리를 선택합니다", + "inst_step_2": "2. 시스템이 게임 디렉토리를 검증할 때까지 기다립니다", + "inst_step_3": "3. 선호하는 텍스트 및 음성 언어를 선택합니다", + "inst_step_4": "4. \"언어 설정 적용\"을 클릭하여 변경 사항을 저장합니다", + "toast_no_folder_selected": "폴더 경로가 선택되지 않았습니다", + "toast_pick_folder_error": "폴더 선택 오류: ", + "toast_set_language_success": "언어 설정이 완료되었습니다", + "toast_set_language_error": "언어 설정 오류: " + }, + "howto": { + "title": "사용 방법", + "sect1_title": "런처 기능 사용", + "sect1_auto_update_pre": "실행 시", + "sect1_auto_update_post": "및 프록시 도구를 자동으로 업데이트합니다.", + "sect1_launch_game": "올바른 매개변수와 실행 환경으로 런처를 통해 게임을 직접 실행합니다.", + "sect1_lang_pre": "게임 내 언어(예: EN, JP, ZH, KR) 전환 지원:", + "sect1_lang_link": "언어 도구", + "sect1_patch_title": "게임 파일 패치 및 업데이트", + "sect1_patch_desc_1_pre": "빠르고 가벼운 증분 업데이트를 위해", + "sect1_patch_desc_1_link": "Diff Tool", + "sect1_patch_desc_1_post": "(DiffPatch)을 사용합니다.", + "sect1_patch_desc_2_pre": "지원 형식:", + "sect1_patch_desc_2_post": "및 사용자 정의 diff 형식.", + "sect2_title": "FireflyGo 채팅 명령", + "sect2_desc_pre": "게임 내에서 사용할 수 있는 채팅 명령어입니다. 일부 명령은", + "sect2_desc_bold": "Theorycraft 모드", + "sect2_desc_post": "를 활성화해야 합니다.", + "sect2_tc_req_title": "Theorycraft 모드 필요", + "sect2_tc_req_desc_pre": "다음 명령은", + "sect2_tc_req_desc_bold": "Theorycraft 모드", + "sect2_tc_req_desc_post": "가 활성화된 경우에만 사용할 수 있습니다:", + "sect2_extra_title": "추가 설정", + "sect2_hidden_ui_title": "UI 숨기기", + "sect2_hidden_ui_desc": "DIM 쇼케이스 비디오에서 자주 사용되는 게임 UI 전체를 즉시 숨깁니다.", + "sect2_censor_title": "검열 비활성화", + "sect2_censor_desc": "더 깔끔한 경험을 위해 렌즈 플레어 검열 효과 💀를 제거합니다.", + "sect2_tc_title": "Theorycraft 모드", + "sect2_tc_desc": "더 이상 채팅 명령어를 입력할 필요가 없습니다 — 몬스터 HP 조정, 주기 설정, 로그 보기 등 모든 것을 웹을 통해 구성하세요.", + "sect2_cmd_title": "사용 가능한 명령:", + "sect2_cmd_tc": "Theorycraft 모드", + "sect2_cmd_tc_enable": "— Theorycraft 모드 활성화", + "sect2_cmd_tc_disable": "— Theorycraft 모드 비활성화", + "sect2_cmd_cycle": "주기 제어", + "sect2_cmd_tc_only": "(Theorycraft 전용)", + "sect2_cmd_cycle_desc": "— 전투에서 주기 수 설정", + "sect2_cmd_cycle_ex1_pre": "예:", + "sect2_cmd_cycle_ex1_post": "는 전투를 30주기로 설정합니다", + "sect2_cmd_cycle_ex2_post": "는 사용자 정의 주기를 비활성화합니다", + "sect2_cmd_hp": "HP 덮어쓰기", + "sect2_cmd_hp_desc1": "— 몬스터 HP 설정 (Theorycraft 모드에서만 사용 가능)", + "sect2_cmd_hp_desc2": "— HP 설정 기능 비활성화", + "sect2_cmd_hp_desc3": "— 특정 웨이브의 각 몬스터에 HP 설정", + "sect2_cmd_hp_ex_pre": "예:", + "sect2_cmd_hp_ex_post": "는 웨이브 1 몬스터1 HP를 2,000,000으로, 몬스터2 HP를 3,000,000으로 설정합니다", + "sect2_cmd_log": "전투 로그", + "sect2_cmd_log_desc1": "— 전투 로그 출력 활성화", + "sect2_cmd_log_desc2": "— 전투 로그 비활성화", + "sect2_cmd_log_out_pre": "출력은 다음 형식으로 작성됩니다:", + "sect2_cmd_skip": "노드 건너뛰기", + "sect2_cmd_skip_desc": "— 혼돈의 기억 / 허구 이야기에서 노드 건너뛰기", + "sect2_cmd_skip_ex1_pre": "예:", + "sect2_cmd_skip_ex1_post": "는 노드 2를 건너뜁니다", + "sect2_cmd_skip_ex2_post": "는 건너뛰기를 비활성화합니다", + "sect2_cmd_id": "캐릭터 운명의 길 전환", + "sect2_cmd_id_desc": "— 다중 형태를 가진 캐릭터의 운명의 길 전환", + "sect2_cmd_id_ex1_pre": "예:", + "sect2_cmd_id_ex1_post": "는 개척자 형태를 변경합니다", + "sect2_cmd_id_ex2_pre": "지원되는 ID 예:", + "sect2_cmd_update": "데이터 새로고침", + "sect2_cmd_update_desc_pre": "— 다음 파일에서 서버 데이터를 새로고침합니다:", + "sect3_title": "기타 참고 사항", + "sect3_admin_title": "관리자 권한", + "sect3_admin_desc": "파일 권한 액세스를 위해 항상 런처를 관리자 권한으로 실행하세요.", + "sect3_backup_title": "데이터 백업", + "sect3_backup_desc_pre": "정기적으로", + "sect3_backup_desc_mid": "및", + "sect3_backup_desc_post": "를 백업하세요.", + "sect3_voice_title": "베타 클라이언트에서 음성 팩 활성화", + "sect3_voice_step1_pre": "원하는 음성 폴더(예:", + "sect3_voice_step1_mid": ")를 다음 경로에서 복사하여:", + "sect3_voice_step1_post_pre": "홈 탭에서", + "sect3_voice_step1_post_bold": "\"음성 폴더 열기\"", + "sect3_voice_step1_post_post": "를 클릭해 베타 폴더에 넣습니다.", + "sect3_voice_step2": "게임을 처음 실행할 때 음성 폴더가 삭제될 수 있습니다. 그런 경우 1단계를 반복하여 복구하세요.", + "btn_back": "홈으로 돌아가기" + }, + "about": { + "title": "소개", + "p1_pre": "안녕하세요! 저희는 유용한 도구를 개발하고 사용자 경험을 개선하는 데 열정을 쏟는 개발팀 ", + "p1_post": " 입니다.", + "p2_pre": "사용자가 더 나은 성능과 단순함으로 게임을 쉽게 실행하고 관리할 수 있도록 가볍고 현대적인 ", + "p2_highlight": "Game Launcher", + "p2_post": " 를 만들었습니다.", + "p3_pre": "런처는 ", + "p3_mid": " 을(를) 사용하여 구축되었으며, ", + "p3_and": " 및 ", + "p3_post": " (으)로 디자인된 깔끔하고 반응형인 인터페이스를 특징으로 합니다.", + "p4": "제 목표는 빠르고 효율적이며 사용하기 즐거운 도구를 만드는 것입니다 — 이 런처는 단지 시작일 뿐입니다.", + "btn_back": "홈으로 돌아가기" + }, + "fireflytools": { + "title": "Firefly 도구", + "sect1_title": "Firefly 도구 소개", + "sect1_p1_pre": "이 사이트는 ", + "sect1_p1_tool": "Firefly Shelter", + "sect1_p1_mid": "에서 개발한 ", + "sect1_p1_author": "Firefly Tools", + "sect1_master_site": "마스터 웹사이트", + "sect1_p2_pre": "원본 도구는 ", + "sect1_p2_author": "Amazing", + "sect1_p2_post": " 이라는 타사 개발자가 만들었습니다. 이 버전은 핵심 논리를 수정하지 않고 해당 작업을 직접 기반으로 합니다.", + "sect1_p3_pre": "동일한 작성자의 더 현대적인 버전도 다음에서 사용할 수 있습니다: ", + "sect2_title": "주요 기능", + "sect2_feat1": "브라우저에서 캐릭터, 광추, 유물, 행적 및 성혼을 쉽게 구성하세요.", + "sect2_feat2_pre": "", + "sect2_feat2_server": "Firefly GO Server", + "sect2_feat2_mid": "에 ", + "sect2_feat2_conn": "Connect PS", + "sect2_feat2_post": "를 사용하여 설정을 즉시 적용합니다 — 수동 파일 업로드가 필요하지 않습니다.", + "sect2_feat3_title": "추가 설정", + "sect2_feat3_desc_pre": "추가 기능으로 ", + "sect2_feat3_desc_server": "Firefly GO Server", + "sect2_feat3_desc_post": " 환경을 향상시키세요:", + "sect2_feat3_ui": "게임 UI 숨기기", + "sect2_feat3_ui_desc": "— 전체 게임 인터페이스를 제거합니다.", + "sect2_feat3_censor": "검열 비활성화", + "sect2_feat3_censor_desc": "— 렌즈 플레어 검열 💀을 제거합니다.", + "sect2_feat3_tc": "Theorycraft 모드", + "sect2_feat3_tc_desc": "— 웹을 통해 HP, 주기 등을 구성합니다.", + "sect2_feat4_pre": "다음을 사용하여 전체 빌드를 내보내고 가져옵니다: ", + "sect2_feat4_post": ".", + "sect2_feat5": "빠른 테스트 워크플로 — 동기화 재사용 대기시간 없음, 즉각적인 게임 내 업데이트.", + "sect3_title": "시작하기", + "sect3_step1": "자체 호스팅 인스턴스에서 브라우저를 통해 도구에 액세스합니다.", + "sect3_step2": "직관적인 웹 인터페이스로 캐릭터 빌드를 구성합니다.", + "sect3_step3_pre": "", + "sect3_step3_bold": "Connect PS", + "sect3_step3_post": " 기능을 사용하여 사설 서버와 즉시 동기화합니다.", + "sect3_step4": "실시간 업데이트 및 수정 사항을 통해 게임 내에서 빌드를 테스트합니다.", + "btn_back": "홈으로 돌아가기" + }, + "analysis": { + "title": "Firefly 분석 \u0026 Veritas 플러그인", + "sect1_title": "Veritas 소개", + "sect1_p1_pre": "Veritas", + "sect1_p1_mid": "는 게임 플레이 중 실시간으로 피해량을 분석하도록 설계된 강력한 ", + "sect1_p1_highlight": "데미지 로거", + "sect1_p1_post": "입니다.", + "sect1_p2": "포괄적인 피해 분석을 위해 가볍고 빠르며 사용하기 쉽습니다.", + "sect1_github": "GitHub 저장소", + "sect2_title": "웹 분석 도구", + "sect2_desc": "Veritas를 통한 실시간 피해 분석을 위해 다음 웹 애플리케이션을 사용하세요:", + "sect2_master": "마스터 웹사이트", + "sect2_backup": "백업 웹사이트", + "sect2_tip_pre": "팁:", + "sect2_tip_post": " 해당 국가에서 마스터 사이트 로딩에 문제가 있는 경우 백업 사이트를 대신 사용하세요.", + "sect3_title": "설치 지침", + "sect3_subtitle": "중요 설정 단계", + "sect3_desc": "Veritas를 다운로드한 후 정상적으로 작동하려면 파일 이름을 변경해야 합니다:", + "sect3_rename": "이름 변경: ", + "sect3_place": "그런 다음 ", + "sect3_place_post": "를 게임 디렉토리에 배치합니다.", + "sect4_title": "웹 앱 사용 방법", + "sect4_sub1": "Firefly GO 로컬용", + "sect4_sub1_step1_pre": "", + "sect4_sub1_step1_game": "게임", + "sect4_sub1_step1_mid": "과 ", + "sect4_sub1_step1_server": "Firefly GO 서버(PS)", + "sect4_sub1_step1_post": "를 실행합니다.", + "sect4_sub1_step2": "웹 분석 도구 중 하나를 엽니다.", + "sect4_sub1_step3_pre": "", + "sect4_sub1_step3_conn": "Connection Settings", + "sect4_sub1_step3_mid1": "로 이동 → ", + "sect4_sub1_step3_type": "Connection Type: PS", + "sect4_sub1_step3_mid2": " 선택 → ", + "sect4_sub1_step3_btn": "Connect", + "sect4_sub1_step3_post": "를 클릭합니다.", + "sect4_sub1_step4": "연결되면 게임을 플레이합니다. 도구가 백그라운드에서 자동으로 분석합니다.", + "sect4_sub2": "기타 사설 서버용", + "sect4_sub2_step1_pre": "", + "sect4_sub2_step1_game": "게임", + "sect4_sub2_step1_mid": "과 ", + "sect4_sub2_step1_server": "사설 서버", + "sect4_sub2_step1_post": "를 실행합니다.", + "sect4_sub2_step2": "웹 분석 도구 중 하나를 엽니다.", + "sect4_sub2_step3_pre": "", + "sect4_sub2_step3_conn": "Connection Settings", + "sect4_sub2_step3_mid1": "로 이동 → ", + "sect4_sub2_step3_type": "Connection Type: Native", + "sect4_sub2_step3_mid2": " 선택 → ", + "sect4_sub2_step3_btn": "Connect", + "sect4_sub2_step3_post": "를 클릭합니다.", + "sect4_sub2_step4": "연결되면 평소처럼 게임을 플레이합니다.", + "btn_back": "홈으로 돌아가기" + } } \ No newline at end of file diff --git a/frontend/public/locales/th.json b/frontend/public/locales/th.json index d0bd6a4..8641ce8 100644 --- a/frontend/public/locales/th.json +++ b/frontend/public/locales/th.json @@ -1,333 +1,333 @@ -{ - "header": { - "home": "หน้าแรก", - "tools": "เครื่องมือ", - "language": "ภาษา", - "diff": "อัปเดตไฟล์ (Diff)", - "client_update": "อัปเดตไคลเอนต์", - "plugins": "ปลั๊กอิน", - "analysis": "การวิเคราะห์ (Veritas)", - "firefly_tools": "เครื่องมือเซิร์ฟเวอร์", - "how_to": "วิธีใช้งาน", - "about": "เกี่ยวกับ", - "settings": "ตั้งค่า", - "minimize": "ย่อหน้าต่าง", - "close": "ปิด", - "by": "GaCy" - }, - "background": { - "select_bg": "เลือกภาพพื้นหลัง", - "choose_bg": "เลือกพื้นหลัง", - "paste_url": "วาง URL รูปภาพ (https://...)", - "add": "เพิ่ม", - "upload": "อัปโหลด", - "upload_from_computer": "เลือกไฟล์จากเครื่อง", - "done": "เสร็จสิ้น", - "remove": "ลบออก", - "invalid_url": "URL ไม่ถูกต้อง" - }, - "close": { - "title": "ยืนยันการดำเนินการ", - "description": "คุณต้องการย่อแอปไปยัง System Tray หรือปิดโปรแกรมทันที?", - "dont_ask": "ไม่ต้องถามอีกในครั้งต่อไป", - "minimize": "ย่อหน้าต่าง", - "close": "ปิดโปรแกรม" - }, - "setting": { - "title": "ตั้งค่า", - "launcher_update_title": "อัปเดต Launcher", - "launcher_update_desc": "ตรวจสอบว่าเวอร์ชัน Launcher ของคุณเป็นเวอร์ชันล่าสุดหรือไม่", - "launcher_update_btn": "ตรวจสอบการอัปเดต Launcher", - "launcher_update_success": "Launcher ของคุณเป็นเวอร์ชันล่าสุดแล้ว", - "closing_options_title": "ตัวเลือกเมื่อกดปิด", - "set_dont_ask_again": "จำตัวเลือกนี้ไว้", - "closing_auto_desc": "ครั้งถัดไปที่กดปิด โปรแกรมจะทำการ {{action}} โดยอัตโนมัติ", - "action_minimize": "ย่อไปยัง System Tray", - "action_quit": "ออกจากโปรแกรม", - "version_label": "เวอร์ชัน", - "server_label": "เซิร์ฟเวอร์", - "proxy_label": "พร็อกซี", - "launcher_label": "Launcher" - }, - "home": { - "header_title": "G Launcher", - "tooltip_how_to": "วิธีใช้เครื่องมือและคำสั่งทั้งหมด", - "btn_select_game": "เลือกโฟลเดอร์หรือไฟล์เกม", - "btn_selecting": "กำลังเลือก...", - "btn_start_game": "เริ่มเกม", - "btn_game_running": "เกมกำลังทำงานอยู่", - "menu_change_path": "เปลี่ยนโฟลเดอร์เกม", - "menu_check_update": "ตรวจสอบอัปเดตเซิร์ฟเวอร์ & พร็อกซี", - "menu_open_server": "เปิดโฟลเดอร์เซิร์ฟเวอร์", - "menu_open_proxy": "เปิดโฟลเดอร์พร็อกซี", - "menu_open_voice": "เปิดโฟลเดอร์เสียงพากย์", - "status_updating_launcher": "กำลังอัปเดต Launcher", - "status_update_success": "อัปเดต Launcher สำเร็จ ปิดอัตโนมัติใน 5 วินาที", - "status_update_failed": "อัปเดต Launcher ไม่สำเร็จ ปิดอัตโนมัติใน 5 วินาที", - "status_wait": "โปรดรอสักครู่...", - "status_complete": "เสร็จสิ้น!", - "modal_update_title": "อัปเดตข้อมูล", - "modal_update_msg": "คุณต้องการอัปเดตข้อมูลเซิร์ฟเวอร์และพร็อกซีหรือไม่?", - "modal_download_title": "ดาวน์โหลดข้อมูล", - "modal_download_msg": "จำเป็นต้องดาวน์โหลดข้อมูลเซิร์ฟเวอร์และพร็อกซี", - "modal_self_update_title": "อัปเดต Launcher", - "modal_self_update_msg": "คุณต้องการอัปเดต Launcher เป็นเวอร์ชันใหม่หรือไม่?", - "btn_yes": "ใช่", - "btn_no": "ไม่ใช่", - "btn_download": "ดาวน์โหลด", - "error_game_dir": "โฟลเดอร์เกมไม่ถูกต้อง", - "error_file_type": "ประเภทไฟล์ไม่ถูกต้อง", - "game_path_success": "ตั้งค่าโฟลเดอร์เกมสำเร็จ", - "no_updates": "ไม่มีการอัปเดตใหม่ในขณะนี้", - "toast_pick_folder_error": "เกิดข้อผิดพลาดในการเลือกโฟลเดอร์: ", - "toast_start_proxy_failed": "ไม่สามารถเริ่มพร็อกซีได้: ", - "toast_start_server_failed": "ไม่สามารถเริ่มเซิร์ฟเวอร์ได้: ", - "toast_start_game_failed": "ไม่สามารถเริ่มเกมได้: ", - "toast_start_game_error": "ข้อผิดพลาดในการเปิดเกม: " - }, - "diff": { - "header_title": "🎮 อัปเดตเกมด้วย Diff Tool", - "header_desc": "ช่วยอัปเดตไฟล์เกมแบบลดขนาดด้วยระบบ Diff", - "game_dir_title": "โฟลเดอร์เกม", - "btn_selecting": "กำลังเลือก...", - "btn_select_game": "เลือกโฟลเดอร์เกม", - "game_dir_valid": "พบโฟลเดอร์เกมที่ถูกต้อง!", - "game_dir_invalid": "ไม่พบโฟลเดอร์เกม กรุณาเลือกโฟลเดอร์ที่ถูกต้อง", - "diff_file_title": "ไฟล์ Diff / Patch", - "btn_select_diff": "เลือกไฟล์ Diff", - "diff_file_valid": "พบไฟล์ Diff ที่ถูกต้อง!", - "diff_file_invalid": "ไม่พบไฟล์ Diff กรุณาเลือกไฟล์ที่ถูกต้อง", - "btn_updating": "กำลังอัปเดต...", - "btn_update_game": "อัปเดตเกม", - "modal_update_title": "อัปเดตเกม", - "status_wait": "โปรดรอสักครู่...", - "inst_title": "📋 ขั้นตอนการใช้งาน:", - "inst_step_1": "1. คลิก \"เลือกโฟลเดอร์เกม\" และเลือกโฟลเดอร์หลักของเกม", - "inst_step_2": "2. รอให้ระบบตรวจสอบความถูกต้องของโฟลเดอร์เกม", - "inst_step_3": "3. คลิก \"เลือกไฟล์ Diff\" และเลือกไฟล์แพตช์ของคุณ (.zip, .7z, .ziff)", - "inst_step_4": "4. รอให้ระบบตรวจสอบความถูกต้องของไฟล์แพตช์", - "inst_step_5": "5. คลิก \"อัปเดตเกม\" เพื่อเริ่มลงแพตช์", - "toast_game_dir_not_found": "ไม่พบโฟลเดอร์เกม กรุณาเลือกโฟลเดอร์ที่ถูกต้อง", - "toast_no_folder_selected": "ยังไม่ได้เลือกโฟลเดอร์", - "toast_pick_folder_error": "ข้อผิดพลาดในการเลือกโฟลเดอร์: ", - "toast_invalid_file_type": "ประเภทไฟล์ไม่ถูกต้อง", - "toast_no_file_selected": "ยังไม่ได้เลือกไฟล์", - "toast_pick_file_error": "ข้อผิดพลาดในการเลือกไฟล์: ", - "toast_select_both": "กรุณาเลือกทั้งโฟลเดอร์เกมและไฟล์ Diff", - "toast_update_completed": "อัปเดตเกมเสร็จสมบูรณ์", - "stage_check_type": "ตรวจสอบประเภท Diff Tool", - "stage_version_validate": "ตรวจสอบเวอร์ชัน", - "stage_data_extract": "แตกไฟล์ข้อมูล", - "stage_cut_data": "แยกส่วนข้อมูล", - "stage_patch_data": "กำลังลงแพตช์ข้อมูล", - "stage_delete_old_files": "ลบไฟล์เวอร์ชันเก่า" - }, - "language": { - "header_title": "🎮 ตัวจัดการภาษาของเกม", - "header_desc": "ตั้งค่าภาษาข้อความและเสียงพากย์ในเกม", - "game_dir_title": "โฟลเดอร์เกม", - "btn_select_game": "เลือกโฟลเดอร์เกม", - "btn_selecting": "กำลังเลือก...", - "game_dir_valid": "พบโฟลเดอร์เกมที่ถูกต้อง!", - "game_dir_invalid": "ไม่พบโฟลเดอร์เกม กรุณาเลือกโฟลเดอร์ที่ถูกต้อง", - "current_languages_title": "ภาษาที่ตั้งไว้ในปัจจุบัน", - "text_language": "ภาษาข้อความ (Text)", - "voice_language": "ภาษาเสียงพากย์ (Voice)", - "language_settings_title": "ตั้งค่าภาษา", - "select_text_placeholder": "เลือกภาษาข้อความ...", - "select_voice_placeholder": "เลือกภาษาเสียงพากย์...", - "btn_apply": "บันทึกการตั้งค่าภาษา", - "btn_applying": "กำลังบันทึก...", - "inst_title": "📋 วิธีใช้งาน:", - "inst_step_1": "1. คลิก \"เลือกโฟลเดอร์เกม\" และเลือกโฟลเดอร์หลักของเกม", - "inst_step_2": "2. รอให้ระบบตรวจสอบโฟลเดอร์เกม", - "inst_step_3": "3. เลือกภาษาข้อความและเสียงพากย์ที่ต้องการ", - "inst_step_4": "4. คลิก \"บันทึกการตั้งค่าภาษา\"", - "toast_no_folder_selected": "ยังไม่ได้เลือกโฟลเดอร์", - "toast_pick_folder_error": "ข้อผิดพลาดในการเลือกโฟลเดอร์: ", - "toast_set_language_success": "ตั้งค่าภาษาสำเร็จแล้ว", - "toast_set_language_error": "ข้อผิดพลาดในการตั้งค่าภาษา: " - }, - "howto": { - "title": "วิธีใช้งาน", - "sect1_title": "การใช้งานฟีเจอร์ต่างๆ ของ Launcher", - "sect1_auto_update_pre": "ระบบอัปเดตอัตโนมัติสำหรับ", - "sect1_auto_update_post": "และเครื่องมือพร็อกซีเมื่อเปิดโปรแกรม", - "sect1_launch_game": "เปิดเกมผ่าน Launcher พร้อมพารามิเตอร์และสภาพแวดล้อมที่ถูกต้อง", - "sect1_lang_pre": "รองรับการสลับภาษาในเกม (เช่น EN, JP, ZH, KR) ผ่านเมนู", - "sect1_lang_link": "เครื่องมือภาษา", - "sect1_patch_title": "แพตช์และอัปเดตไฟล์เกม", - "sect1_patch_desc_1_pre": "ใช้", - "sect1_patch_desc_1_link": "Diff Tool", - "sect1_patch_desc_1_post": "สำหรับการอัปเดตขนาดเล็กที่รวดเร็ว", - "sect1_patch_desc_2_pre": "รองรับรูปแบบ", - "sect1_patch_desc_2_post": "และไฟล์ Diff อื่นๆ", - "sect2_title": "คำสั่งในเกม (Commands)", - "sect2_desc_pre": "ด้านล่างนี้คือคำสั่งที่สามารถพิมพ์ในช่องแชทของเกม บางคำสั่งต้องเปิดใช้งาน", - "sect2_desc_bold": "Theorycraft Mode", - "sect2_desc_post": "ก่อน", - "sect2_tc_req_title": "จำเป็นต้องเปิด Theorycraft Mode", - "sect2_tc_req_desc_pre": "คำสั่งต่อไปนี้จะใช้งานได้เฉพาะเมื่อเปิด", - "sect2_tc_req_desc_bold": "Theorycraft Mode", - "sect2_tc_req_desc_post": "เท่านั้น:", - "sect2_extra_title": "การตั้งค่าเพิ่มเติม", - "sect2_hidden_ui_title": "ซ่อน UI ทั้งหมด", - "sect2_hidden_ui_desc": "ซ่อนอินเทอร์เฟซทั้งหมดของเกมทันที เหมาะสำหรับการถ่ายวิดีโอ Showcase", - "sect2_censor_title": "ปิดเซ็นเซอร์แสง", - "sect2_censor_desc": "ปิดเอฟเฟกต์ Lens Flare เพื่อความคมชัด", - "sect2_tc_title": "Theorycraft Mode", - "sect2_tc_desc": "ปรับแต่งค่าทุกอย่างผ่านเว็บได้ทันที เช่น ปรับเลือดมอนสเตอร์, ตั้งค่ารอบต่อสู้, ดู Log การต่อสู้", - "sect2_cmd_title": "คำสั่งที่ใช้งานได้:", - "sect2_cmd_tc": "Theorycraft Mode", - "sect2_cmd_tc_enable": "— เปิดใช้งาน Theorycraft Mode", - "sect2_cmd_tc_disable": "— ปิดการใช้งาน Theorycraft Mode", - "sect2_cmd_cycle": "ควบคุมรอบการต่อสู้ (Cycle)", - "sect2_cmd_tc_only": "(เฉพาะ Theorycraft)", - "sect2_cmd_cycle_desc": "— กำหนดจำนวน Cycle ในการต่อสู้", - "sect2_cmd_cycle_ex1_pre": "ตัวอย่าง:", - "sect2_cmd_cycle_ex1_post": "ตั้งการต่อสู้เป็น 30 cycles", - "sect2_cmd_cycle_ex2_post": "ปิดการตั้ง cycle แบบกำหนดเอง", - "sect2_cmd_hp": "ปรับ HP มอนสเตอร์", - "sect2_cmd_hp_desc1": "— ปรับ HP ของมอนสเตอร์ (เฉพาะโหมด Theorycraft)", - "sect2_cmd_hp_desc2": "— ปิดฟังก์ชันปรับ HP", - "sect2_cmd_hp_desc3": "— ตั้ง HP ให้มอนสเตอร์แต่ละตัวใน Wave ที่กำหนด", - "sect2_cmd_hp_ex_pre": "ตัวอย่าง:", - "sect2_cmd_hp_ex_post": "ตั้ง Wave 1 ตัวแรก HP=2,000,000 และตัวที่สอง HP=3,000,000", - "sect2_cmd_log": "Battle Log", - "sect2_cmd_log_desc1": "— เปิดบันทึก Log การต่อสู้", - "sect2_cmd_log_desc2": "— ปิดบันทึก Log การต่อสู้", - "sect2_cmd_log_out_pre": "Log จะถูกเขียนออกมา", - "sect2_cmd_skip": "ข้าม Node (Skip)", - "sect2_cmd_skip_desc": "— ข้าม Node ใน MoC / AS / Pure Fiction", - "sect2_cmd_skip_ex1_pre": "ตัวอย่าง:", - "sect2_cmd_skip_ex1_post": "ข้าม node 2", - "sect2_cmd_skip_ex2_post": "ปิดการข้าม node", - "sect2_cmd_id": "เปลี่ยนฟอร์มตัวละคร (Path)", - "sect2_cmd_id_desc": "— สลับ Path สำหรับตัวละครที่มีหลายร่าง", - "sect2_cmd_id_ex1_pre": "ตัวอย่าง:", - "sect2_cmd_id_ex1_post": "เพื่อเปลี่ยนฟอร์มผู้บุกเบิก (Trailblazer)", - "sect2_cmd_id_ex2_pre": "ใช้กับ ID เช่น", - "sect2_cmd_update": "รีเฟรชข้อมูล", - "sect2_cmd_update_desc_pre": "— รีเฟรชข้อมูลเซิร์ฟเวอร์", - "sect3_title": "ข้อควรทราบอื่นๆ", - "sect3_admin_title": "สิทธิ์ Administrator", - "sect3_admin_desc": "ควรเปิด Launcher ในฐานะ Administrator เสมอ เพื่อให้มีสิทธิ์เข้าถึงและเขียนไฟล์เกม", - "sect3_backup_title": "การสำรองข้อมูล", - "sect3_backup_desc_pre": "สำรองข้อมูลโฟลเดอร์", - "sect3_backup_desc_mid": "และ", - "sect3_backup_desc_post": "อย่างสม่ำเสมอ", - "sect3_voice_title": "เปิดใช้งานเสียงพากย์ในไคลเอนต์ Beta", - "sect3_voice_step1_pre": "คัดลอกโฟลเดอร์เสียงพากย์ที่ต้องการ (เช่น", - "sect3_voice_step1_mid": ") จากเกมตัวเต็มไปยังโฟลเดอร์ Beta โดยกดปุ่ม", - "sect3_voice_step1_post_bold": "\"เปิดโฟลเดอร์เสียงพากย์\"", - "sect3_voice_step1_post_post": "ในหน้าแรก", - "sect3_voice_step2": "หากเปิดเกมครั้งแรกแล้วเกมลบโฟลเดอร์เสียง ให้ทำตามขั้นตอนที่ 1 ซ้ำอีกครั้ง", - "btn_back": "กลับสู่หน้าแรก" - }, - "about": { - "title": "เกี่ยวกับ G Launcher", - "p1_pre": "สวัสดีครับ! เราคือ ", - "p1_post": " ทีมพัฒนาที่มุ่งมั่นสร้างเครื่องมือที่เป็นประโยชน์และมอบประสบการณ์ที่ดีที่สุดให้กับผู้ใช้", - "p2_pre": "เราสร้าง ", - "p2_highlight": "G Launcher", - "p2_post": " ที่ทันสมัยและน้ำหนักเบา เพื่อช่วยให้ผู้เล่นสามารถจัดการและเปิดเกมได้อย่างง่ายดายและมีประสิทธิภาพสูงสุด", - "p3_pre": "Launcher ตัวนี้สร้างด้วย ", - "p3_mid": " พร้อมอินเทอร์เฟซที่สวยงาม ตอบสนองรวดเร็วด้วย ", - "p3_and": " และ ", - "p3_post": ".", - "p4": "เป้าหมายของเราคือการสร้างเครื่องมือที่เร็ว เสถียร และใช้งานง่ายสำหรับทุกคน", - "btn_back": "กลับสู่หน้าแรก" - }, - "fireflytools": { - "title": "เครื่องมือเซิร์ฟเวอร์", - "sect1_title": "เกี่ยวกับเครื่องมือเซิร์ฟเวอร์", - "sect1_p1_pre": "หน้านี้รวบรวมเครื่องมือจัดการ ", - "sect1_p1_tool": "G Launcher Tools ", - "sect1_p1_mid": "พัฒนาโดย ", - "sect1_p1_author": "GaCy", - "sect1_master_site": "เว็บไซต์หลัก", - "sect1_p2_pre": "ออกแบบมาเพื่อให้ผู้เล่นปรับแต่งและทดสอบคอนเทนต์ในเกมได้อย่างสะดวก", - "sect1_p2_author": "Amazing", - "sect1_p2_post": "", - "sect1_p3_pre": "", - "sect2_title": "ฟีเจอร์หลัก", - "sect2_feat1": "ปรับแต่งตัวละคร, Light Cone, Relic, Trace และ Eidolon ได้ง่ายๆ ผ่านเว็บเบราว์เซอร์", - "sect2_feat2_pre": "ซิงค์การตั้งค่าเข้ากับ ", - "sect2_feat2_server": "Private Server", - "sect2_feat2_mid": " ผ่านปุ่ม ", - "sect2_feat2_conn": "Connect PS", - "sect2_feat2_post": " ได้ทันทีโดยไม่ต้องอัปโหลดไฟล์ด้วยตนเอง", - "sect2_feat3_title": "ฟังก์ชันเพิ่มเติม", - "sect2_feat3_ui": "ซ่อน UI เกมทั้งหมด", - "sect2_feat3_ui_desc": "— ปิดการแสดงผล UI เพื่อถ่ายภาพหรือคลิปอย่างสวยงาม", - "sect2_feat3_censor": "ปิดเอฟเฟกต์แสงจ้า", - "sect2_feat3_censor_desc": "— ปิด Lens Flare เพื่อมุมมองที่สะอาดตายิ่งขึ้น", - "sect2_feat3_tc": "Theorycraft Mode", - "sect2_feat3_tc_desc": "— ปรับ HP มอนสเตอร์, Cycle และอื่นๆ แบบ Real-time", - "sect2_feat4_pre": "นำเข้าและส่งออก Build ตัวละครด้วย ", - "sect2_feat4_post": "", - "sect2_feat5": "ทดสอบได้รวดเร็วทันใจ ซิงค์ข้อมูลเข้าเกมแบบเรียลไทม์", - "sect3_title": "เริ่มต้นใช้งาน", - "sect3_step1": "เปิดเครื่องมือผ่านเบราว์เซอร์ของคุณ", - "sect3_step2": "ปรับแต่ง Build ตัวละครของคุณผ่านหน้าเว็บ", - "sect3_step3_pre": "ใช้ฟังก์ชัน ", - "sect3_step3_bold": "Connect PS", - "sect3_step3_post": " เพื่อเชื่อมต่อเข้ากับเซิร์ฟเวอร์ของคุณ", - "sect3_step4": "ทดสอบ Build ในเกมได้ทันที", - "btn_back": "กลับสู่หน้าแรก" - }, - "analysis": { - "title": "การวิเคราะห์และปลั๊กอิน Veritas", - "sect1_title": "เกี่ยวกับ Veritas", - "sect1_p1_pre": "Veritas", - "sect1_p1_mid": " คือเครื่องมือ ", - "sect1_p1_highlight": "Damage Logger", - "sect1_p1_post": " ประสิทธิภาพสูงสำหรับการวิเคราะห์ดาเมจแบบเรียลไทม์ระหว่างเล่นเกม", - "sect1_p2": "น้ำหนักเบา รวดเร็ว และใช้งานง่ายสำหรับการวิเคราะห์เชิงลึก", - "sect1_github": "GitHub Repository", - "sect2_title": "เว็บแอปสำหรับการวิเคราะห์", - "sect2_desc": "ใช้เว็บแอปเหล่านี้เพื่อดูสถิติและดาเมจแบบสดๆ:", - "sect2_master": "เว็บไซต์หลัก", - "sect2_backup": "เว็บไซต์สำรอง", - "sect2_tip_pre": "ข้อแนะนำ:", - "sect2_tip_post": " หากมีปัญหาในการเข้าถึงเว็บไซต์หลัก สามารถสลับไปใช้เว็บไซต์สำรองได้", - "sect3_title": "คำแนะนำในการติดตั้ง", - "sect3_subtitle": "ขั้นตอนการติดตั้งที่สำคัญ", - "sect3_desc": "หลังจากดาวน์โหลด Veritas ต้องเปลี่ยนชื่อไฟล์ให้ถูกต้อง:", - "sect3_rename": "เปลี่ยนชื่อเป็น: ", - "sect3_place": "จากนั้นนำไฟล์ ", - "sect3_place_post": " ไปวางไว้ในโฟลเดอร์เกมของคุณ", - "sect4_title": "วิธีเชื่อมต่อกับ Web App", - "sect4_sub1": "สำหรับเซิร์ฟเวอร์ Local", - "sect4_sub1_step1_pre": "เปิด ", - "sect4_sub1_step1_game": "ตัวเกม", - "sect4_sub1_step1_mid": " และ ", - "sect4_sub1_step1_server": "เซิร์ฟเวอร์ของคุณ", - "sect4_sub1_step1_post": "", - "sect4_sub1_step2": "เปิดหน้าเว็บวิเคราะห์ดาเมจ", - "sect4_sub1_step3_pre": "ไปที่ ", - "sect4_sub1_step3_conn": "Connection Settings", - "sect4_sub1_step3_mid1": " → เลือก ", - "sect4_sub1_step3_type": "Connection Type: PS", - "sect4_sub1_step3_mid2": " → กดปุ่ม ", - "sect4_sub1_step3_btn": "Connect", - "sect4_sub1_step3_post": "", - "sect4_sub1_step4": "เมื่อเชื่อมต่อแล้ว ให้เล่นเกมตามปกติ เครื่องมือจะบันทึกดาเมจให้อัตโนมัติ", - "sect4_sub2": "สำหรับ Private Server อื่นๆ", - "sect4_sub2_step1_pre": "เปิด ", - "sect4_sub2_step1_game": "ตัวเกม", - "sect4_sub2_step1_mid": " และ ", - "sect4_sub2_step1_server": "Private Server", - "sect4_sub2_step1_post": "", - "sect4_sub2_step2": "เปิดหน้าเว็บวิเคราะห์ดาเมจ", - "sect4_sub2_step3_pre": "ไปที่ ", - "sect4_sub2_step3_conn": "Connection Settings", - "sect4_sub2_step3_mid1": " → เลือก ", - "sect4_sub2_step3_type": "Connection Type: Native", - "sect4_sub2_step3_mid2": " → กดปุ่ม ", - "sect4_sub2_step3_btn": "Connect", - "sect4_sub2_step3_post": "", - "sect4_sub2_step4": "เมื่อเชื่อมต่อแล้ว สามารถเล่นเกมได้ตามปกติ", - "btn_back": "กลับสู่หน้าแรก" - } -} +{ + "header": { + "home": "หน้าแรก", + "tools": "เครื่องมือ", + "language": "ภาษา", + "diff": "อัปเดตไฟล์ (Diff)", + "client_update": "อัปเดตไคลเอนต์", + "plugins": "ปลั๊กอิน", + "analysis": "การวิเคราะห์ (Veritas)", + "firefly_tools": "เครื่องมือเซิร์ฟเวอร์", + "how_to": "วิธีใช้งาน", + "about": "เกี่ยวกับ", + "settings": "ตั้งค่า", + "minimize": "ย่อหน้าต่าง", + "close": "ปิด", + "by": "GaCy" + }, + "background": { + "select_bg": "เลือกภาพพื้นหลัง", + "choose_bg": "เลือกพื้นหลัง", + "paste_url": "วาง URL รูปภาพ (https://...)", + "add": "เพิ่ม", + "upload": "อัปโหลด", + "upload_from_computer": "เลือกไฟล์จากเครื่อง", + "done": "เสร็จสิ้น", + "remove": "ลบออก", + "invalid_url": "URL ไม่ถูกต้อง" + }, + "close": { + "title": "ยืนยันการดำเนินการ", + "description": "คุณต้องการย่อแอปไปยัง System Tray หรือปิดโปรแกรมทันที?", + "dont_ask": "ไม่ต้องถามอีกในครั้งต่อไป", + "minimize": "ย่อหน้าต่าง", + "close": "ปิดโปรแกรม" + }, + "setting": { + "title": "ตั้งค่า", + "launcher_update_title": "อัปเดต Launcher", + "launcher_update_desc": "ตรวจสอบว่าเวอร์ชัน Launcher ของคุณเป็นเวอร์ชันล่าสุดหรือไม่", + "launcher_update_btn": "ตรวจสอบการอัปเดต Launcher", + "launcher_update_success": "Launcher ของคุณเป็นเวอร์ชันล่าสุดแล้ว", + "closing_options_title": "ตัวเลือกเมื่อกดปิด", + "set_dont_ask_again": "จำตัวเลือกนี้ไว้", + "closing_auto_desc": "ครั้งถัดไปที่กดปิด โปรแกรมจะทำการ {{action}} โดยอัตโนมัติ", + "action_minimize": "ย่อไปยัง System Tray", + "action_quit": "ออกจากโปรแกรม", + "version_label": "เวอร์ชัน", + "server_label": "เซิร์ฟเวอร์", + "proxy_label": "พร็อกซี", + "launcher_label": "Launcher" + }, + "home": { + "header_title": "G Launcher", + "tooltip_how_to": "วิธีใช้เครื่องมือและคำสั่งทั้งหมด", + "btn_select_game": "เลือกโฟลเดอร์หรือไฟล์เกม", + "btn_selecting": "กำลังเลือก...", + "btn_start_game": "เริ่มเกม", + "btn_game_running": "เกมกำลังทำงานอยู่", + "menu_change_path": "เปลี่ยนโฟลเดอร์เกม", + "menu_check_update": "ตรวจสอบอัปเดตเซิร์ฟเวอร์ \u0026 พร็อกซี", + "menu_open_server": "เปิดโฟลเดอร์เซิร์ฟเวอร์", + "menu_open_proxy": "เปิดโฟลเดอร์พร็อกซี", + "menu_open_voice": "เปิดโฟลเดอร์เสียงพากย์", + "status_updating_launcher": "กำลังอัปเดต Launcher", + "status_update_success": "อัปเดต Launcher สำเร็จ ปิดอัตโนมัติใน 5 วินาที", + "status_update_failed": "อัปเดต Launcher ไม่สำเร็จ ปิดอัตโนมัติใน 5 วินาที", + "status_wait": "โปรดรอสักครู่...", + "status_complete": "เสร็จสิ้น!", + "modal_update_title": "อัปเดตข้อมูล", + "modal_update_msg": "คุณต้องการอัปเดตข้อมูลเซิร์ฟเวอร์และพร็อกซีหรือไม่?", + "modal_download_title": "ดาวน์โหลดข้อมูล", + "modal_download_msg": "จำเป็นต้องดาวน์โหลดข้อมูลเซิร์ฟเวอร์และพร็อกซี", + "modal_self_update_title": "อัปเดต Launcher", + "modal_self_update_msg": "คุณต้องการอัปเดต Launcher เป็นเวอร์ชันใหม่หรือไม่?", + "btn_yes": "ใช่", + "btn_no": "ไม่ใช่", + "btn_download": "ดาวน์โหลด", + "error_game_dir": "โฟลเดอร์เกมไม่ถูกต้อง", + "error_file_type": "ประเภทไฟล์ไม่ถูกต้อง", + "game_path_success": "ตั้งค่าโฟลเดอร์เกมสำเร็จ", + "no_updates": "ไม่มีการอัปเดตใหม่ในขณะนี้", + "toast_pick_folder_error": "เกิดข้อผิดพลาดในการเลือกโฟลเดอร์: ", + "toast_start_proxy_failed": "ไม่สามารถเริ่มพร็อกซีได้: ", + "toast_start_server_failed": "ไม่สามารถเริ่มเซิร์ฟเวอร์ได้: ", + "toast_start_game_failed": "ไม่สามารถเริ่มเกมได้: ", + "toast_start_game_error": "ข้อผิดพลาดในการเปิดเกม: " + }, + "diff": { + "header_title": "🎮 อัปเดตเกมด้วย Diff Tool", + "header_desc": "ช่วยอัปเดตไฟล์เกมแบบลดขนาดด้วยระบบ Diff", + "game_dir_title": "โฟลเดอร์เกม", + "btn_selecting": "กำลังเลือก...", + "btn_select_game": "เลือกโฟลเดอร์เกม", + "game_dir_valid": "พบโฟลเดอร์เกมที่ถูกต้อง!", + "game_dir_invalid": "ไม่พบโฟลเดอร์เกม กรุณาเลือกโฟลเดอร์ที่ถูกต้อง", + "diff_file_title": "ไฟล์ Diff / Patch", + "btn_select_diff": "เลือกไฟล์ Diff", + "diff_file_valid": "พบไฟล์ Diff ที่ถูกต้อง!", + "diff_file_invalid": "ไม่พบไฟล์ Diff กรุณาเลือกไฟล์ที่ถูกต้อง", + "btn_updating": "กำลังอัปเดต...", + "btn_update_game": "อัปเดตเกม", + "modal_update_title": "อัปเดตเกม", + "status_wait": "โปรดรอสักครู่...", + "inst_title": "📋 ขั้นตอนการใช้งาน:", + "inst_step_1": "1. คลิก \"เลือกโฟลเดอร์เกม\" และเลือกโฟลเดอร์หลักของเกม", + "inst_step_2": "2. รอให้ระบบตรวจสอบความถูกต้องของโฟลเดอร์เกม", + "inst_step_3": "3. คลิก \"เลือกไฟล์ Diff\" และเลือกไฟล์แพตช์ของคุณ (.zip, .7z, .ziff)", + "inst_step_4": "4. รอให้ระบบตรวจสอบความถูกต้องของไฟล์แพตช์", + "inst_step_5": "5. คลิก \"อัปเดตเกม\" เพื่อเริ่มลงแพตช์", + "toast_game_dir_not_found": "ไม่พบโฟลเดอร์เกม กรุณาเลือกโฟลเดอร์ที่ถูกต้อง", + "toast_no_folder_selected": "ยังไม่ได้เลือกโฟลเดอร์", + "toast_pick_folder_error": "ข้อผิดพลาดในการเลือกโฟลเดอร์: ", + "toast_invalid_file_type": "ประเภทไฟล์ไม่ถูกต้อง", + "toast_no_file_selected": "ยังไม่ได้เลือกไฟล์", + "toast_pick_file_error": "ข้อผิดพลาดในการเลือกไฟล์: ", + "toast_select_both": "กรุณาเลือกทั้งโฟลเดอร์เกมและไฟล์ Diff", + "toast_update_completed": "อัปเดตเกมเสร็จสมบูรณ์", + "stage_check_type": "ตรวจสอบประเภท Diff Tool", + "stage_version_validate": "ตรวจสอบเวอร์ชัน", + "stage_data_extract": "แตกไฟล์ข้อมูล", + "stage_cut_data": "แยกส่วนข้อมูล", + "stage_patch_data": "กำลังลงแพตช์ข้อมูล", + "stage_delete_old_files": "ลบไฟล์เวอร์ชันเก่า" + }, + "language": { + "header_title": "🎮 ตัวจัดการภาษาของเกม", + "header_desc": "ตั้งค่าภาษาข้อความและเสียงพากย์ในเกม", + "game_dir_title": "โฟลเดอร์เกม", + "btn_select_game": "เลือกโฟลเดอร์เกม", + "btn_selecting": "กำลังเลือก...", + "game_dir_valid": "พบโฟลเดอร์เกมที่ถูกต้อง!", + "game_dir_invalid": "ไม่พบโฟลเดอร์เกม กรุณาเลือกโฟลเดอร์ที่ถูกต้อง", + "current_languages_title": "ภาษาที่ตั้งไว้ในปัจจุบัน", + "text_language": "ภาษาข้อความ (Text)", + "voice_language": "ภาษาเสียงพากย์ (Voice)", + "language_settings_title": "ตั้งค่าภาษา", + "select_text_placeholder": "เลือกภาษาข้อความ...", + "select_voice_placeholder": "เลือกภาษาเสียงพากย์...", + "btn_apply": "บันทึกการตั้งค่าภาษา", + "btn_applying": "กำลังบันทึก...", + "inst_title": "📋 วิธีใช้งาน:", + "inst_step_1": "1. คลิก \"เลือกโฟลเดอร์เกม\" และเลือกโฟลเดอร์หลักของเกม", + "inst_step_2": "2. รอให้ระบบตรวจสอบโฟลเดอร์เกม", + "inst_step_3": "3. เลือกภาษาข้อความและเสียงพากย์ที่ต้องการ", + "inst_step_4": "4. คลิก \"บันทึกการตั้งค่าภาษา\"", + "toast_no_folder_selected": "ยังไม่ได้เลือกโฟลเดอร์", + "toast_pick_folder_error": "ข้อผิดพลาดในการเลือกโฟลเดอร์: ", + "toast_set_language_success": "ตั้งค่าภาษาสำเร็จแล้ว", + "toast_set_language_error": "ข้อผิดพลาดในการตั้งค่าภาษา: " + }, + "howto": { + "title": "วิธีใช้งาน", + "sect1_title": "การใช้งานฟีเจอร์ต่างๆ ของ Launcher", + "sect1_auto_update_pre": "ระบบอัปเดตอัตโนมัติสำหรับ", + "sect1_auto_update_post": "และเครื่องมือพร็อกซีเมื่อเปิดโปรแกรม", + "sect1_launch_game": "เปิดเกมผ่าน Launcher พร้อมพารามิเตอร์และสภาพแวดล้อมที่ถูกต้อง", + "sect1_lang_pre": "รองรับการสลับภาษาในเกม (เช่น EN, JP, ZH, KR) ผ่านเมนู", + "sect1_lang_link": "เครื่องมือภาษา", + "sect1_patch_title": "แพตช์และอัปเดตไฟล์เกม", + "sect1_patch_desc_1_pre": "ใช้", + "sect1_patch_desc_1_link": "Diff Tool", + "sect1_patch_desc_1_post": "สำหรับการอัปเดตขนาดเล็กที่รวดเร็ว", + "sect1_patch_desc_2_pre": "รองรับรูปแบบ", + "sect1_patch_desc_2_post": "และไฟล์ Diff อื่นๆ", + "sect2_title": "คำสั่งในเกม (Commands)", + "sect2_desc_pre": "ด้านล่างนี้คือคำสั่งที่สามารถพิมพ์ในช่องแชทของเกม บางคำสั่งต้องเปิดใช้งาน", + "sect2_desc_bold": "Theorycraft Mode", + "sect2_desc_post": "ก่อน", + "sect2_tc_req_title": "จำเป็นต้องเปิด Theorycraft Mode", + "sect2_tc_req_desc_pre": "คำสั่งต่อไปนี้จะใช้งานได้เฉพาะเมื่อเปิด", + "sect2_tc_req_desc_bold": "Theorycraft Mode", + "sect2_tc_req_desc_post": "เท่านั้น:", + "sect2_extra_title": "การตั้งค่าเพิ่มเติม", + "sect2_hidden_ui_title": "ซ่อน UI ทั้งหมด", + "sect2_hidden_ui_desc": "ซ่อนอินเทอร์เฟซทั้งหมดของเกมทันที เหมาะสำหรับการถ่ายวิดีโอ Showcase", + "sect2_censor_title": "ปิดเซ็นเซอร์แสง", + "sect2_censor_desc": "ปิดเอฟเฟกต์ Lens Flare เพื่อความคมชัด", + "sect2_tc_title": "Theorycraft Mode", + "sect2_tc_desc": "ปรับแต่งค่าทุกอย่างผ่านเว็บได้ทันที เช่น ปรับเลือดมอนสเตอร์, ตั้งค่ารอบต่อสู้, ดู Log การต่อสู้", + "sect2_cmd_title": "คำสั่งที่ใช้งานได้:", + "sect2_cmd_tc": "Theorycraft Mode", + "sect2_cmd_tc_enable": "— เปิดใช้งาน Theorycraft Mode", + "sect2_cmd_tc_disable": "— ปิดการใช้งาน Theorycraft Mode", + "sect2_cmd_cycle": "ควบคุมรอบการต่อสู้ (Cycle)", + "sect2_cmd_tc_only": "(เฉพาะ Theorycraft)", + "sect2_cmd_cycle_desc": "— กำหนดจำนวน Cycle ในการต่อสู้", + "sect2_cmd_cycle_ex1_pre": "ตัวอย่าง:", + "sect2_cmd_cycle_ex1_post": "ตั้งการต่อสู้เป็น 30 cycles", + "sect2_cmd_cycle_ex2_post": "ปิดการตั้ง cycle แบบกำหนดเอง", + "sect2_cmd_hp": "ปรับ HP มอนสเตอร์", + "sect2_cmd_hp_desc1": "— ปรับ HP ของมอนสเตอร์ (เฉพาะโหมด Theorycraft)", + "sect2_cmd_hp_desc2": "— ปิดฟังก์ชันปรับ HP", + "sect2_cmd_hp_desc3": "— ตั้ง HP ให้มอนสเตอร์แต่ละตัวใน Wave ที่กำหนด", + "sect2_cmd_hp_ex_pre": "ตัวอย่าง:", + "sect2_cmd_hp_ex_post": "ตั้ง Wave 1 ตัวแรก HP=2,000,000 และตัวที่สอง HP=3,000,000", + "sect2_cmd_log": "Battle Log", + "sect2_cmd_log_desc1": "— เปิดบันทึก Log การต่อสู้", + "sect2_cmd_log_desc2": "— ปิดบันทึก Log การต่อสู้", + "sect2_cmd_log_out_pre": "Log จะถูกเขียนออกมา", + "sect2_cmd_skip": "ข้าม Node (Skip)", + "sect2_cmd_skip_desc": "— ข้าม Node ใน MoC / AS / Pure Fiction", + "sect2_cmd_skip_ex1_pre": "ตัวอย่าง:", + "sect2_cmd_skip_ex1_post": "ข้าม node 2", + "sect2_cmd_skip_ex2_post": "ปิดการข้าม node", + "sect2_cmd_id": "เปลี่ยนฟอร์มตัวละคร (Path)", + "sect2_cmd_id_desc": "— สลับ Path สำหรับตัวละครที่มีหลายร่าง", + "sect2_cmd_id_ex1_pre": "ตัวอย่าง:", + "sect2_cmd_id_ex1_post": "เพื่อเปลี่ยนฟอร์มผู้บุกเบิก (Trailblazer)", + "sect2_cmd_id_ex2_pre": "ใช้กับ ID เช่น", + "sect2_cmd_update": "รีเฟรชข้อมูล", + "sect2_cmd_update_desc_pre": "— รีเฟรชข้อมูลเซิร์ฟเวอร์", + "sect3_title": "ข้อควรทราบอื่นๆ", + "sect3_admin_title": "สิทธิ์ Administrator", + "sect3_admin_desc": "ควรเปิด Launcher ในฐานะ Administrator เสมอ เพื่อให้มีสิทธิ์เข้าถึงและเขียนไฟล์เกม", + "sect3_backup_title": "การสำรองข้อมูล", + "sect3_backup_desc_pre": "สำรองข้อมูลโฟลเดอร์", + "sect3_backup_desc_mid": "และ", + "sect3_backup_desc_post": "อย่างสม่ำเสมอ", + "sect3_voice_title": "เปิดใช้งานเสียงพากย์ในไคลเอนต์ Beta", + "sect3_voice_step1_pre": "คัดลอกโฟลเดอร์เสียงพากย์ที่ต้องการ (เช่น", + "sect3_voice_step1_mid": ") จากเกมตัวเต็มไปยังโฟลเดอร์ Beta โดยกดปุ่ม", + "sect3_voice_step1_post_bold": "\"เปิดโฟลเดอร์เสียงพากย์\"", + "sect3_voice_step1_post_post": "ในหน้าแรก", + "sect3_voice_step2": "หากเปิดเกมครั้งแรกแล้วเกมลบโฟลเดอร์เสียง ให้ทำตามขั้นตอนที่ 1 ซ้ำอีกครั้ง", + "btn_back": "กลับสู่หน้าแรก" + }, + "about": { + "title": "เกี่ยวกับ G Launcher", + "p1_pre": "สวัสดีครับ! เราคือ ", + "p1_post": " ทีมพัฒนาที่มุ่งมั่นสร้างเครื่องมือที่เป็นประโยชน์และมอบประสบการณ์ที่ดีที่สุดให้กับผู้ใช้", + "p2_pre": "เราสร้าง ", + "p2_highlight": "G Launcher", + "p2_post": " ที่ทันสมัยและน้ำหนักเบา เพื่อช่วยให้ผู้เล่นสามารถจัดการและเปิดเกมได้อย่างง่ายดายและมีประสิทธิภาพสูงสุด", + "p3_pre": "Launcher ตัวนี้สร้างด้วย ", + "p3_mid": " พร้อมอินเทอร์เฟซที่สวยงาม ตอบสนองรวดเร็วด้วย ", + "p3_and": " และ ", + "p3_post": ".", + "p4": "เป้าหมายของเราคือการสร้างเครื่องมือที่เร็ว เสถียร และใช้งานง่ายสำหรับทุกคน", + "btn_back": "กลับสู่หน้าแรก" + }, + "fireflytools": { + "title": "เครื่องมือเซิร์ฟเวอร์", + "sect1_title": "เกี่ยวกับเครื่องมือเซิร์ฟเวอร์", + "sect1_p1_pre": "หน้านี้รวบรวมเครื่องมือจัดการ ", + "sect1_p1_tool": "G Launcher Tools ", + "sect1_p1_mid": "พัฒนาโดย ", + "sect1_p1_author": "GaCy", + "sect1_master_site": "เว็บไซต์หลัก", + "sect1_p2_pre": "ออกแบบมาเพื่อให้ผู้เล่นปรับแต่งและทดสอบคอนเทนต์ในเกมได้อย่างสะดวก", + "sect1_p2_author": "Amazing", + "sect1_p2_post": "", + "sect1_p3_pre": "", + "sect2_title": "ฟีเจอร์หลัก", + "sect2_feat1": "ปรับแต่งตัวละคร, Light Cone, Relic, Trace และ Eidolon ได้ง่ายๆ ผ่านเว็บเบราว์เซอร์", + "sect2_feat2_pre": "ซิงค์การตั้งค่าเข้ากับ ", + "sect2_feat2_server": "Private Server", + "sect2_feat2_mid": " ผ่านปุ่ม ", + "sect2_feat2_conn": "Connect PS", + "sect2_feat2_post": " ได้ทันทีโดยไม่ต้องอัปโหลดไฟล์ด้วยตนเอง", + "sect2_feat3_title": "ฟังก์ชันเพิ่มเติม", + "sect2_feat3_ui": "ซ่อน UI เกมทั้งหมด", + "sect2_feat3_ui_desc": "— ปิดการแสดงผล UI เพื่อถ่ายภาพหรือคลิปอย่างสวยงาม", + "sect2_feat3_censor": "ปิดเอฟเฟกต์แสงจ้า", + "sect2_feat3_censor_desc": "— ปิด Lens Flare เพื่อมุมมองที่สะอาดตายิ่งขึ้น", + "sect2_feat3_tc": "Theorycraft Mode", + "sect2_feat3_tc_desc": "— ปรับ HP มอนสเตอร์, Cycle และอื่นๆ แบบ Real-time", + "sect2_feat4_pre": "นำเข้าและส่งออก Build ตัวละครด้วย ", + "sect2_feat4_post": "", + "sect2_feat5": "ทดสอบได้รวดเร็วทันใจ ซิงค์ข้อมูลเข้าเกมแบบเรียลไทม์", + "sect3_title": "เริ่มต้นใช้งาน", + "sect3_step1": "เปิดเครื่องมือผ่านเบราว์เซอร์ของคุณ", + "sect3_step2": "ปรับแต่ง Build ตัวละครของคุณผ่านหน้าเว็บ", + "sect3_step3_pre": "ใช้ฟังก์ชัน ", + "sect3_step3_bold": "Connect PS", + "sect3_step3_post": " เพื่อเชื่อมต่อเข้ากับเซิร์ฟเวอร์ของคุณ", + "sect3_step4": "ทดสอบ Build ในเกมได้ทันที", + "btn_back": "กลับสู่หน้าแรก" + }, + "analysis": { + "title": "การวิเคราะห์และปลั๊กอิน Veritas", + "sect1_title": "เกี่ยวกับ Veritas", + "sect1_p1_pre": "Veritas", + "sect1_p1_mid": " คือเครื่องมือ ", + "sect1_p1_highlight": "Damage Logger", + "sect1_p1_post": " ประสิทธิภาพสูงสำหรับการวิเคราะห์ดาเมจแบบเรียลไทม์ระหว่างเล่นเกม", + "sect1_p2": "น้ำหนักเบา รวดเร็ว และใช้งานง่ายสำหรับการวิเคราะห์เชิงลึก", + "sect1_github": "GitHub Repository", + "sect2_title": "เว็บแอปสำหรับการวิเคราะห์", + "sect2_desc": "ใช้เว็บแอปเหล่านี้เพื่อดูสถิติและดาเมจแบบสดๆ:", + "sect2_master": "เว็บไซต์หลัก", + "sect2_backup": "เว็บไซต์สำรอง", + "sect2_tip_pre": "ข้อแนะนำ:", + "sect2_tip_post": " หากมีปัญหาในการเข้าถึงเว็บไซต์หลัก สามารถสลับไปใช้เว็บไซต์สำรองได้", + "sect3_title": "คำแนะนำในการติดตั้ง", + "sect3_subtitle": "ขั้นตอนการติดตั้งที่สำคัญ", + "sect3_desc": "หลังจากดาวน์โหลด Veritas ต้องเปลี่ยนชื่อไฟล์ให้ถูกต้อง:", + "sect3_rename": "เปลี่ยนชื่อเป็น: ", + "sect3_place": "จากนั้นนำไฟล์ ", + "sect3_place_post": " ไปวางไว้ในโฟลเดอร์เกมของคุณ", + "sect4_title": "วิธีเชื่อมต่อกับ Web App", + "sect4_sub1": "สำหรับเซิร์ฟเวอร์ Local", + "sect4_sub1_step1_pre": "เปิด ", + "sect4_sub1_step1_game": "ตัวเกม", + "sect4_sub1_step1_mid": " และ ", + "sect4_sub1_step1_server": "เซิร์ฟเวอร์ของคุณ", + "sect4_sub1_step1_post": "", + "sect4_sub1_step2": "เปิดหน้าเว็บวิเคราะห์ดาเมจ", + "sect4_sub1_step3_pre": "ไปที่ ", + "sect4_sub1_step3_conn": "Connection Settings", + "sect4_sub1_step3_mid1": " → เลือก ", + "sect4_sub1_step3_type": "Connection Type: PS", + "sect4_sub1_step3_mid2": " → กดปุ่ม ", + "sect4_sub1_step3_btn": "Connect", + "sect4_sub1_step3_post": "", + "sect4_sub1_step4": "เมื่อเชื่อมต่อแล้ว ให้เล่นเกมตามปกติ เครื่องมือจะบันทึกดาเมจให้อัตโนมัติ", + "sect4_sub2": "สำหรับ Private Server อื่นๆ", + "sect4_sub2_step1_pre": "เปิด ", + "sect4_sub2_step1_game": "ตัวเกม", + "sect4_sub2_step1_mid": " และ ", + "sect4_sub2_step1_server": "Private Server", + "sect4_sub2_step1_post": "", + "sect4_sub2_step2": "เปิดหน้าเว็บวิเคราะห์ดาเมจ", + "sect4_sub2_step3_pre": "ไปที่ ", + "sect4_sub2_step3_conn": "Connection Settings", + "sect4_sub2_step3_mid1": " → เลือก ", + "sect4_sub2_step3_type": "Connection Type: Native", + "sect4_sub2_step3_mid2": " → กดปุ่ม ", + "sect4_sub2_step3_btn": "Connect", + "sect4_sub2_step3_post": "", + "sect4_sub2_step4": "เมื่อเชื่อมต่อแล้ว สามารถเล่นเกมได้ตามปกติ", + "btn_back": "กลับสู่หน้าแรก" + } +} \ No newline at end of file diff --git a/frontend/public/locales/vi.json b/frontend/public/locales/vi.json index cc050da..be2dd8e 100644 --- a/frontend/public/locales/vi.json +++ b/frontend/public/locales/vi.json @@ -1,337 +1,337 @@ -{ - "header": { - "home": "Trang chủ", - "tools": "Công cụ", - "language": "Ngôn ngữ", - "diff": "So sánh", - "client_update": "Cập nhật client", - "plugins": "Plugin", - "analysis": "Phân tích (Veritas)", - "firefly_tools": "Firefly Tools", - "how_to": "Hướng dẫn", - "about": "Giới thiệu", - "settings": "Cài đặt", - "minimize": "Thu nhỏ", - "close": "Đóng", - "by": "Firefly Shelter" - }, - "background": { - "select_bg": "Chọn nền", - "choose_bg": "Chọn ảnh nền", - "paste_url": "Dán URL ảnh (https://...)", - "add": "Thêm", - "upload": "Tải lên", - "upload_from_computer": "Tải từ máy tính", - "done": "Xong", - "remove": "Xóa", - "invalid_url": "URL không hợp lệ" - }, - "close": { - "title": "Xác nhận hành động", - "description": "Bạn muốn thu nhỏ ứng dụng xuống khay hệ thống hay đóng ứng dụng?", - "dont_ask": "Không hỏi lại tôi", - "minimize": "Thu nhỏ", - "close": "Đóng" - }, - "setting": { - "title": "Cài đặt", - "launcher_update_title": "Cập nhật Launcher", - "launcher_update_desc": "Kiểm tra xem launcher của bạn đã là phiên bản mới nhất chưa.", - "launcher_update_btn": "Kiểm tra cập nhật", - "launcher_update_success": "Launcher đã là phiên bản mới nhất", - "closing_options_title": "Tùy chọn đóng", - "set_dont_ask_again": "Không hỏi lại lần sau", - "closing_auto_desc": "Lần tới khi bạn đóng, ứng dụng sẽ tự động {{action}} mà không cần hỏi.", - "action_minimize": "thu nhỏ xuống khay hệ thống", - "action_quit": "thoát ứng dụng", - "version_label": "Phiên bản", - "server_label": "Server", - "proxy_label": "Proxy", - "launcher_label": "Launcher" - }, - "home": { - "header_title": "Firefly GO", - "tooltip_how_to": "Cách sử dụng công cụ & lệnh", - "btn_select_game": "Chọn tệp Game", - "btn_selecting": "Đang chọn...", - "btn_start_game": "Bắt đầu Game", - "btn_game_running": "Game đang chạy", - "menu_change_path": "Thay đổi đường dẫn Game", - "menu_check_update": "Kiểm tra cập nhật Server & Proxy", - "menu_open_server": "Mở thư mục Server", - "menu_open_proxy": "Mở thư mục Proxy", - "menu_open_voice": "Mở thư mục Voice", - "status_updating_launcher": "Đang cập nhật Launcher", - "status_update_success": "Cập nhật thành công, tự động đóng sau 5s", - "status_update_failed": "Cập nhật thất bại, tự động đóng sau 5s", - "status_wait": "Vui lòng đợi...", - "status_complete": "Hoàn tất!", - "modal_update_title": "Cập nhật dữ liệu", - "modal_update_msg": "Bạn có muốn cập nhật Server và Proxy không?", - "modal_download_title": "Tải dữ liệu", - "modal_download_msg": "Yêu cầu tải xuống dữ liệu Server và Proxy", - "modal_self_update_title": "Cập nhật Launcher", - "modal_self_update_msg": "Bạn có muốn cập nhật Launcher không?", - "btn_yes": "Có", - "btn_no": "Không", - "btn_download": "Tải xuống", - "error_game_dir": "Thư mục Game không hợp lệ", - "error_file_type": "Định dạng tệp không đúng", - "game_path_success": "Đã lưu đường dẫn Game thành công", - "no_updates": "Không có bản cập nhật nào", - "toast_pick_folder_error": "Lỗi chọn thư mục: ", - "toast_start_proxy_failed": "Khởi động proxy thất bại: ", - "toast_start_server_failed": "Khởi động server thất bại: ", - "toast_start_game_failed": "Khởi động game thất bại: ", - "toast_start_game_error": "Lỗi khởi động game: " - }, - "diff": { - "header_title": "🎮 Cập nhật Game bằng Diff Tool", - "header_desc": "Hỗ trợ bạn cập nhật game bằng Diff Tool", - "game_dir_title": "Thư mục Game", - "btn_selecting": "Đang chọn...", - "btn_select_game": "Chọn Thư mục Game", - "game_dir_valid": "Đã tìm thấy thư mục game hợp lệ!", - "game_dir_invalid": "Không tìm thấy thư mục game. Vui lòng chọn đúng thư mục.", - "diff_file_title": "Tệp Diff", - "btn_select_diff": "Chọn Tệp Diff", - "diff_file_valid": "Đã tìm thấy tệp diff hợp lệ!", - "diff_file_invalid": "Không tìm thấy tệp diff. Vui lòng chọn đúng tệp.", - "btn_updating": "Đang cập nhật...", - "btn_update_game": "Cập nhật Game", - "modal_update_title": "Cập nhật Game", - "status_wait": "Vui lòng đợi...", - "inst_title": "📋 Hướng dẫn:", - "inst_step_1": "1. Nhấn \"Chọn Thư mục Game\" và chọn thư mục gốc của game", - "inst_step_2": "2. Đợi hệ thống xác thực thư mục game", - "inst_step_3": "3. Nhấn \"Chọn Tệp Diff\" và chọn tệp diff của bạn", - "inst_step_4": "4. Đợi hệ thống xác thực tệp diff", - "inst_step_5": "5. Nhấn \"Cập nhật Game\" để bắt đầu quá trình", - "toast_game_dir_not_found": "Không tìm thấy thư mục game. Vui lòng chọn đúng thư mục.", - "toast_no_folder_selected": "Chưa chọn đường dẫn thư mục", - "toast_pick_folder_error": "Lỗi chọn thư mục: ", - "toast_invalid_file_type": "Định dạng tệp không hợp lệ", - "toast_no_file_selected": "Chưa chọn đường dẫn tệp", - "toast_pick_file_error": "Lỗi chọn tệp: ", - "toast_select_both": "Vui lòng chọn cả thư mục game và tệp diff", - "toast_update_completed": "Cập nhật game hoàn tất", - "stage_check_type": "Kiểm tra loại Diff Tool", - "stage_version_validate": "Xác thực phiên bản", - "stage_data_extract": "Trích xuất dữ liệu", - "stage_cut_data": "Cắt dữ liệu", - "stage_patch_data": "Vá dữ liệu", - "stage_delete_old_files": "Xóa tệp cũ" - }, - "language": { - "header_title": "🎮 Quản lý ngôn ngữ Game", - "header_desc": "Quản lý cài đặt ngôn ngữ văn bản và giọng nói cho game của bạn", - "game_dir_title": "Thư mục Game", - "btn_select_game": "Chọn Thư mục Game", - "btn_selecting": "Đang chọn...", - "game_dir_valid": "Đã tìm thấy thư mục game hợp lệ!", - "game_dir_invalid": "Không tìm thấy thư mục game. Vui lòng chọn đúng thư mục.", - "current_languages_title": "Ngôn ngữ hiện tại", - "text_language": "Ngôn ngữ văn bản", - "voice_language": "Ngôn ngữ giọng nói", - "language_settings_title": "Cài đặt ngôn ngữ", - "select_text_placeholder": "Chọn ngôn ngữ văn bản...", - "select_voice_placeholder": "Chọn ngôn ngữ giọng nói...", - "btn_apply": "Áp dụng Cài đặt Ngôn ngữ", - "btn_applying": "Đang áp dụng...", - "inst_title": "📋 Hướng dẫn:", - "inst_step_1": "1. Nhấn \"Chọn Thư mục Game\" và chọn thư mục gốc của game", - "inst_step_2": "2. Đợi hệ thống xác thực thư mục game", - "inst_step_3": "3. Chọn ngôn ngữ văn bản và giọng nói bạn muốn", - "inst_step_4": "4. Nhấn \"Áp dụng Cài đặt Ngôn ngữ\" để lưu thay đổi", - "toast_no_folder_selected": "Chưa chọn đường dẫn thư mục", - "toast_pick_folder_error": "Lỗi chọn thư mục: ", - "toast_set_language_success": "Cài đặt ngôn ngữ thành công", - "toast_set_language_error": "Lỗi cài đặt ngôn ngữ: " - }, - "howto": { - "title": "Hướng dẫn sử dụng", - "sect1_title": "Sử dụng các tính năng của Launcher", - "sect1_auto_update_pre": "Tự động cập nhật", - "sect1_auto_update_post": "và các công cụ proxy khi khởi chạy.", - "sect1_launch_game": "Khởi chạy game trực tiếp thông qua launcher với các thông số và môi trường chạy chính xác.", - "sect1_lang_pre": "Hỗ trợ chuyển đổi ngôn ngữ trong game (ví dụ: EN, JP, ZH, KR) qua", - "sect1_lang_link": "Công cụ Ngôn ngữ", - "sect1_patch_title": "Vá & Cập nhật Tệp Game", - "sect1_patch_desc_1_pre": "Sử dụng", - "sect1_patch_desc_1_link": "Công cụ Diff", - "sect1_patch_desc_1_post": "(DiffPatch) để cập nhật gia tăng nhanh chóng & nhẹ nhàng.", - "sect1_patch_desc_2_pre": "Hỗ trợ", - "sect1_patch_desc_2_post": "và các định dạng diff tùy chỉnh.", - "sect2_title": "Lệnh Chat FireflyGo", - "sect2_desc_pre": "Dưới đây là các lệnh chat trong game bạn có thể sử dụng. Một số lệnh yêu cầu bạn phải bật", - "sect2_desc_bold": "Chế độ Theorycraft", - "sect2_desc_post": ".", - "sect2_tc_req_title": "Yêu cầu Chế độ Theorycraft", - "sect2_tc_req_desc_pre": "Các lệnh sau chỉ khả dụng khi", - "sect2_tc_req_desc_bold": "Chế độ Theorycraft", - "sect2_tc_req_desc_post": "được bật:", - "sect2_extra_title": "Cài đặt Bổ sung", - "sect2_hidden_ui_title": "Ẩn UI", - "sect2_hidden_ui_desc": "Ẩn ngay lập tức toàn bộ giao diện game — thường được dùng trong các video showcase DIM.", - "sect2_censor_title": "Tắt Kiểm duyệt", - "sect2_censor_desc": "Loại bỏ hiệu ứng kiểm duyệt Lens Flare 💀 để có trải nghiệm rõ ràng hơn.", - "sect2_tc_title": "Chế độ Theorycraft", - "sect2_tc_desc": "Không cần gõ lệnh chat nữa — cấu hình mọi thứ qua web: điều chỉnh HP quái, đặt chu kỳ, xem log, và hơn thế nữa.", - "sect2_cmd_title": "Các lệnh khả dụng:", - "sect2_cmd_tc": "Chế độ Theorycraft", - "sect2_cmd_tc_enable": "— Bật Chế độ Theorycraft", - "sect2_cmd_tc_disable": "— Tắt Chế độ Theorycraft", - "sect2_cmd_cycle": "Điều khiển Chu kỳ", - "sect2_cmd_tc_only": "(Chỉ Theorycraft)", - "sect2_cmd_cycle_desc": "— Đặt số chu kỳ trong trận đấu", - "sect2_cmd_cycle_ex1_pre": "Ví dụ:", - "sect2_cmd_cycle_ex1_post": "đặt trận đấu thành 30 chu kỳ", - "sect2_cmd_cycle_ex2_post": "tắt chu kỳ tùy chỉnh", - "sect2_cmd_hp": "Ghi đè HP", - "sect2_cmd_hp_desc1": "— Đặt HP quái vật (chỉ khả dụng trong chế độ Theorycraft)", - "sect2_cmd_hp_desc2": "— Tắt tính năng đặt HP", - "sect2_cmd_hp_desc3": "— Đặt HP cho từng quái vật trong một đợt (wave) cụ thể", - "sect2_cmd_hp_ex_pre": "Ví dụ:", - "sect2_cmd_hp_ex_post": "đặt đợt 1 quái 1 HP=2,000,000 và quái 2 HP=3,000,000", - "sect2_cmd_log": "Nhật ký Trận đấu (Log)", - "sect2_cmd_log_desc1": "— Bật xuất nhật ký trận đấu", - "sect2_cmd_log_desc2": "— Tắt nhật ký trận đấu", - "sect2_cmd_log_out_pre": "Đầu ra sẽ được ghi dưới dạng", - "sect2_cmd_skip": "Bỏ qua Node", - "sect2_cmd_skip_desc": "— Bỏ qua các node trong MOC / AS / Pure Fiction", - "sect2_cmd_skip_ex1_pre": "Ví dụ:", - "sect2_cmd_skip_ex1_post": "bỏ qua node 2", - "sect2_cmd_skip_ex2_post": "tắt tính năng bỏ qua", - "sect2_cmd_id": "Chuyển đổi Vận mệnh Nhân vật", - "sect2_cmd_id_desc": "— Chuyển vận mệnh cho các nhân vật có nhiều form", - "sect2_cmd_id_ex1_pre": "Ví dụ:", - "sect2_cmd_id_ex1_post": "để đổi form MC (Nhà Khai Phá)", - "sect2_cmd_id_ex2_pre": "Hoạt động với các ID như", - "sect2_cmd_update": "Làm mới Dữ liệu", - "sect2_cmd_update_desc_pre": "— Làm mới dữ liệu máy chủ từ tệp", - "sect3_title": "Các Lưu ý Khác", - "sect3_admin_title": "Quyền Quản trị viên (Administrator)", - "sect3_admin_desc": "Luôn chạy launcher dưới quyền Administrator để có quyền truy cập tệp.", - "sect3_backup_title": "Sao lưu Dữ liệu", - "sect3_backup_desc_pre": "Sao lưu tệp", - "sect3_backup_desc_mid": "và", - "sect3_backup_desc_post": "của bạn thường xuyên.", - "sect3_voice_title": "Bật Gói Giọng nói (Voice Packs) trong Client Beta", - "sect3_voice_step1_pre": "Sao chép thư mục giọng nói bạn muốn (ví dụ:", - "sect3_voice_step1_mid": "từ:", - "sect3_voice_step1_post_pre": "vào thư mục beta bằng cách nhấn", - "sect3_voice_step1_post_bold": "\"Mở thư mục Voice\"", - "sect3_voice_step1_post_post": "trên tab Trang chủ.", - "sect3_voice_step2": "Khi khởi chạy game lần đầu, thư mục giọng nói có thể bị xóa. Nếu vậy, hãy lặp lại bước 1 để khôi phục.", - "btn_back": "Trở về Trang chủ" - }, - "about": { - "title": "Giới thiệu", - "p1_pre": "Xin chào! Chúng tôi là ", - "p1_post": ", một nhóm phát triển đam mê xây dựng các công cụ hữu ích và cải thiện trải nghiệm người dùng.", - "p2_pre": "Tôi đã tạo ra một ", - "p2_highlight": "Game Launcher", - "p2_post": " hiện đại và gọn nhẹ để giúp người dùng dễ dàng khởi chạy và quản lý game với hiệu suất tốt hơn và đơn giản hơn.", - "p3_pre": "Launcher được xây dựng bằng ", - "p3_mid": ", với giao diện gọn gàng và tốc độ phản hồi nhanh được thiết kế bằng ", - "p3_and": " và ", - "p3_post": ".", - "p4": "Mục tiêu của tôi là tạo ra các công cụ nhanh, hiệu quả và mang lại trải nghiệm sử dụng thú vị — và launcher này chỉ là sự khởi đầu.", - "btn_back": "Trở về Trang chủ" - }, - "fireflytools": { - "title": "Công cụ Firefly", - "sect1_title": "Về Công cụ Firefly", - "sect1_p1_pre": "Trang web này là một phiên bản khác của ", - "sect1_p1_tool": "Firefly Tools ", - "sect1_p1_mid": "được phát triển bởi ", - "sect1_p1_author": "Firefly Shelter", - "sect1_master_site": "Trang web Gốc", - "sect1_p2_pre": "Công cụ ban đầu được tạo ra bởi một nhà phát triển bên thứ ba tên là ", - "sect1_p2_author": "Amazing", - "sect1_p2_post": ". Phiên bản này dựa trực tiếp trên công việc đó, không sửa đổi logic cốt lõi.", - "sect1_p3_pre": "Ngoài ra còn có một phiên bản hiện đại hơn của cùng tác giả tại ", - "sect2_title": "Tính năng Chính", - "sect2_feat1": "Cấu hình nhân vật, nón ánh sáng, di vật, vết tích và tinh hồn dễ dàng trên trình duyệt của bạn.", - "sect2_feat2_pre": "Áp dụng ngay các thiết lập vào ", - "sect2_feat2_server": "Máy chủ Firefly GO", - "sect2_feat2_mid": " bằng cách sử dụng ", - "sect2_feat2_conn": "Connect PS", - "sect2_feat2_post": " — không cần tải tệp lên thủ công.", - "sect2_feat3_title": "Cài đặt Bổ sung", - "sect2_feat3_desc_pre": "Nâng cao trải nghiệm ", - "sect2_feat3_desc_server": "Máy chủ Firefly GO", - "sect2_feat3_desc_post": " của bạn với các tính năng bổ sung:", - "sect2_feat3_ui": "Ẩn UI Game", - "sect2_feat3_ui_desc": "— xóa toàn bộ giao diện trò chơi.", - "sect2_feat3_censor": "Tắt Kiểm duyệt", - "sect2_feat3_censor_desc": "— loại bỏ hiệu ứng kiểm duyệt Lens Flare 💀.", - "sect2_feat3_tc": "Chế độ Theorycraft", - "sect2_feat3_tc_desc": "— cấu hình HP, chu kỳ và nhiều tính năng khác qua web.", - "sect2_feat4_pre": "Xuất và nhập toàn bộ bản build bằng ", - "sect2_feat4_post": ".", - "sect2_feat5": "Quy trình thử nghiệm nhanh chóng — không có thời gian chờ đồng bộ, cập nhật ngay lập tức trong game.", - "sect3_title": "Bắt đầu Sử dụng", - "sect3_step1": "Truy cập công cụ thông qua trình duyệt của bạn tại phiên bản tự lưu trữ (self-hosted).", - "sect3_step2": "Cấu hình bản build nhân vật của bạn với giao diện web trực quan.", - "sect3_step3_pre": "Sử dụng tính năng ", - "sect3_step3_bold": "Connect PS", - "sect3_step3_post": " để đồng bộ tức thì với máy chủ riêng của bạn.", - "sect3_step4": "Thử nghiệm bản build trong game với các bản cập nhật và sửa đổi theo thời gian thực.", - "btn_back": "Trở về Trang chủ" - }, - "analysis": { - "title": "Phân tích Firefly & Plugin Veritas", - "sect1_title": "Về Veritas", - "sect1_p1_pre": "", - "sect1_p1_mid": " là một ", - "sect1_p1_highlight": "Damage Logger", - "sect1_p1_post": " mạnh mẽ được thiết kế để phân tích sát thương theo thời gian thực trong quá trình chơi game.", - "sect1_p2": "Nó gọn nhẹ, nhanh chóng và dễ sử dụng để phân tích sát thương toàn diện.", - "sect1_github": "Kho lưu trữ GitHub", - "sect2_title": "Công cụ Phân tích Web", - "sect2_desc": "Sử dụng các ứng dụng web này để phân tích sát thương thời gian thực với Veritas:", - "sect2_master": "Trang web Gốc", - "sect2_backup": "Trang web Dự phòng", - "sect2_tip_pre": "Mẹo:", - "sect2_tip_post": " Nếu quốc gia của bạn gặp sự cố khi tải trang web gốc, vui lòng sử dụng trang web dự phòng.", - "sect3_title": "Hướng dẫn Cài đặt", - "sect3_subtitle": "Bước Thiết lập Quan trọng", - "sect3_desc": "Sau khi tải xuống Veritas, bạn phải đổi tên tệp để nó hoạt động bình thường:", - "sect3_rename": "Đổi tên: ", - "sect3_place": "Sau đó đặt ", - "sect3_place_post": " vào thư mục game của bạn.", - "sect4_title": "Cách sử dụng Web App", - "sect4_sub1": "Dành cho Firefly GO Local", - "sect4_sub1_step1_pre": "Khởi chạy ", - "sect4_sub1_step1_game": "game", - "sect4_sub1_step1_mid": " và ", - "sect4_sub1_step1_server": "Máy chủ Firefly GO (PS)", - "sect4_sub1_step1_post": " của bạn.", - "sect4_sub1_step2": "Mở một trong các công cụ phân tích web.", - "sect4_sub1_step3_pre": "Đi tới ", - "sect4_sub1_step3_conn": "Cài đặt Kết nối", - "sect4_sub1_step3_mid1": " → chọn ", - "sect4_sub1_step3_type": "Loại Kết nối: PS", - "sect4_sub1_step3_mid2": " → nhấn ", - "sect4_sub1_step3_btn": "Kết nối", - "sect4_sub1_step3_post": ".", - "sect4_sub1_step4": "Sau khi kết nối, hãy chơi game. Công cụ sẽ tự động phân tích ở chế độ nền.", - "sect4_sub2": "Dành cho các Máy chủ riêng Khác", - "sect4_sub2_step1_pre": "Khởi chạy ", - "sect4_sub2_step1_game": "game", - "sect4_sub2_step1_mid": " và ", - "sect4_sub2_step1_server": "Máy chủ riêng", - "sect4_sub2_step1_post": " của bạn.", - "sect4_sub2_step2": "Mở một trong các công cụ phân tích web.", - "sect4_sub2_step3_pre": "Đi tới ", - "sect4_sub2_step3_conn": "Cài đặt Kết nối", - "sect4_sub2_step3_mid1": " → chọn ", - "sect4_sub2_step3_type": "Loại Kết nối: Native", - "sect4_sub2_step3_mid2": " → nhấn ", - "sect4_sub2_step3_btn": "Kết nối", - "sect4_sub2_step3_post": ".", - "sect4_sub2_step4": "Sau khi kết nối, hãy chơi game bình thường.", - "btn_back": "Trở về Trang chủ" - } +{ + "header": { + "home": "Trang chủ", + "tools": "Công cụ", + "language": "Ngôn ngữ", + "diff": "So sánh", + "client_update": "Cập nhật client", + "plugins": "Plugin", + "analysis": "Phân tích (Veritas)", + "firefly_tools": "Firefly Tools", + "how_to": "Hướng dẫn", + "about": "Giới thiệu", + "settings": "Cài đặt", + "minimize": "Thu nhỏ", + "close": "Đóng", + "by": "GaCy" + }, + "background": { + "select_bg": "Chọn nền", + "choose_bg": "Chọn ảnh nền", + "paste_url": "Dán URL ảnh (https://...)", + "add": "Thêm", + "upload": "Tải lên", + "upload_from_computer": "Tải từ máy tính", + "done": "Xong", + "remove": "Xóa", + "invalid_url": "URL không hợp lệ" + }, + "close": { + "title": "Xác nhận hành động", + "description": "Bạn muốn thu nhỏ ứng dụng xuống khay hệ thống hay đóng ứng dụng?", + "dont_ask": "Không hỏi lại tôi", + "minimize": "Thu nhỏ", + "close": "Đóng" + }, + "setting": { + "title": "Cài đặt", + "launcher_update_title": "Cập nhật Launcher", + "launcher_update_desc": "Kiểm tra xem launcher của bạn đã là phiên bản mới nhất chưa.", + "launcher_update_btn": "Kiểm tra cập nhật", + "launcher_update_success": "Launcher đã là phiên bản mới nhất", + "closing_options_title": "Tùy chọn đóng", + "set_dont_ask_again": "Không hỏi lại lần sau", + "closing_auto_desc": "Lần tới khi bạn đóng, ứng dụng sẽ tự động {{action}} mà không cần hỏi.", + "action_minimize": "thu nhỏ xuống khay hệ thống", + "action_quit": "thoát ứng dụng", + "version_label": "Phiên bản", + "server_label": "Server", + "proxy_label": "Proxy", + "launcher_label": "Launcher" + }, + "home": { + "header_title": "G Launcher", + "tooltip_how_to": "Cách sử dụng công cụ \u0026 lệnh", + "btn_select_game": "Chọn tệp Game", + "btn_selecting": "Đang chọn...", + "btn_start_game": "Bắt đầu Game", + "btn_game_running": "Game đang chạy", + "menu_change_path": "Thay đổi đường dẫn Game", + "menu_check_update": "Kiểm tra cập nhật Server \u0026 Proxy", + "menu_open_server": "Mở thư mục Server", + "menu_open_proxy": "Mở thư mục Proxy", + "menu_open_voice": "Mở thư mục Voice", + "status_updating_launcher": "Đang cập nhật Launcher", + "status_update_success": "Cập nhật thành công, tự động đóng sau 5s", + "status_update_failed": "Cập nhật thất bại, tự động đóng sau 5s", + "status_wait": "Vui lòng đợi...", + "status_complete": "Hoàn tất!", + "modal_update_title": "Cập nhật dữ liệu", + "modal_update_msg": "Bạn có muốn cập nhật Server và Proxy không?", + "modal_download_title": "Tải dữ liệu", + "modal_download_msg": "Yêu cầu tải xuống dữ liệu Server và Proxy", + "modal_self_update_title": "Cập nhật Launcher", + "modal_self_update_msg": "Bạn có muốn cập nhật Launcher không?", + "btn_yes": "Có", + "btn_no": "Không", + "btn_download": "Tải xuống", + "error_game_dir": "Thư mục Game không hợp lệ", + "error_file_type": "Định dạng tệp không đúng", + "game_path_success": "Đã lưu đường dẫn Game thành công", + "no_updates": "Không có bản cập nhật nào", + "toast_pick_folder_error": "Lỗi chọn thư mục: ", + "toast_start_proxy_failed": "Khởi động proxy thất bại: ", + "toast_start_server_failed": "Khởi động server thất bại: ", + "toast_start_game_failed": "Khởi động game thất bại: ", + "toast_start_game_error": "Lỗi khởi động game: " + }, + "diff": { + "header_title": "🎮 Cập nhật Game bằng Diff Tool", + "header_desc": "Hỗ trợ bạn cập nhật game bằng Diff Tool", + "game_dir_title": "Thư mục Game", + "btn_selecting": "Đang chọn...", + "btn_select_game": "Chọn Thư mục Game", + "game_dir_valid": "Đã tìm thấy thư mục game hợp lệ!", + "game_dir_invalid": "Không tìm thấy thư mục game. Vui lòng chọn đúng thư mục.", + "diff_file_title": "Tệp Diff", + "btn_select_diff": "Chọn Tệp Diff", + "diff_file_valid": "Đã tìm thấy tệp diff hợp lệ!", + "diff_file_invalid": "Không tìm thấy tệp diff. Vui lòng chọn đúng tệp.", + "btn_updating": "Đang cập nhật...", + "btn_update_game": "Cập nhật Game", + "modal_update_title": "Cập nhật Game", + "status_wait": "Vui lòng đợi...", + "inst_title": "📋 Hướng dẫn:", + "inst_step_1": "1. Nhấn \"Chọn Thư mục Game\" và chọn thư mục gốc của game", + "inst_step_2": "2. Đợi hệ thống xác thực thư mục game", + "inst_step_3": "3. Nhấn \"Chọn Tệp Diff\" và chọn tệp diff của bạn", + "inst_step_4": "4. Đợi hệ thống xác thực tệp diff", + "inst_step_5": "5. Nhấn \"Cập nhật Game\" để bắt đầu quá trình", + "toast_game_dir_not_found": "Không tìm thấy thư mục game. Vui lòng chọn đúng thư mục.", + "toast_no_folder_selected": "Chưa chọn đường dẫn thư mục", + "toast_pick_folder_error": "Lỗi chọn thư mục: ", + "toast_invalid_file_type": "Định dạng tệp không hợp lệ", + "toast_no_file_selected": "Chưa chọn đường dẫn tệp", + "toast_pick_file_error": "Lỗi chọn tệp: ", + "toast_select_both": "Vui lòng chọn cả thư mục game và tệp diff", + "toast_update_completed": "Cập nhật game hoàn tất", + "stage_check_type": "Kiểm tra loại Diff Tool", + "stage_version_validate": "Xác thực phiên bản", + "stage_data_extract": "Trích xuất dữ liệu", + "stage_cut_data": "Cắt dữ liệu", + "stage_patch_data": "Vá dữ liệu", + "stage_delete_old_files": "Xóa tệp cũ" + }, + "language": { + "header_title": "🎮 Quản lý ngôn ngữ Game", + "header_desc": "Quản lý cài đặt ngôn ngữ văn bản và giọng nói cho game của bạn", + "game_dir_title": "Thư mục Game", + "btn_select_game": "Chọn Thư mục Game", + "btn_selecting": "Đang chọn...", + "game_dir_valid": "Đã tìm thấy thư mục game hợp lệ!", + "game_dir_invalid": "Không tìm thấy thư mục game. Vui lòng chọn đúng thư mục.", + "current_languages_title": "Ngôn ngữ hiện tại", + "text_language": "Ngôn ngữ văn bản", + "voice_language": "Ngôn ngữ giọng nói", + "language_settings_title": "Cài đặt ngôn ngữ", + "select_text_placeholder": "Chọn ngôn ngữ văn bản...", + "select_voice_placeholder": "Chọn ngôn ngữ giọng nói...", + "btn_apply": "Áp dụng Cài đặt Ngôn ngữ", + "btn_applying": "Đang áp dụng...", + "inst_title": "📋 Hướng dẫn:", + "inst_step_1": "1. Nhấn \"Chọn Thư mục Game\" và chọn thư mục gốc của game", + "inst_step_2": "2. Đợi hệ thống xác thực thư mục game", + "inst_step_3": "3. Chọn ngôn ngữ văn bản và giọng nói bạn muốn", + "inst_step_4": "4. Nhấn \"Áp dụng Cài đặt Ngôn ngữ\" để lưu thay đổi", + "toast_no_folder_selected": "Chưa chọn đường dẫn thư mục", + "toast_pick_folder_error": "Lỗi chọn thư mục: ", + "toast_set_language_success": "Cài đặt ngôn ngữ thành công", + "toast_set_language_error": "Lỗi cài đặt ngôn ngữ: " + }, + "howto": { + "title": "Hướng dẫn sử dụng", + "sect1_title": "Sử dụng các tính năng của Launcher", + "sect1_auto_update_pre": "Tự động cập nhật", + "sect1_auto_update_post": "và các công cụ proxy khi khởi chạy.", + "sect1_launch_game": "Khởi chạy game trực tiếp thông qua launcher với các thông số và môi trường chạy chính xác.", + "sect1_lang_pre": "Hỗ trợ chuyển đổi ngôn ngữ trong game (ví dụ: EN, JP, ZH, KR) qua", + "sect1_lang_link": "Công cụ Ngôn ngữ", + "sect1_patch_title": "Vá \u0026 Cập nhật Tệp Game", + "sect1_patch_desc_1_pre": "Sử dụng", + "sect1_patch_desc_1_link": "Công cụ Diff", + "sect1_patch_desc_1_post": "(DiffPatch) để cập nhật gia tăng nhanh chóng \u0026 nhẹ nhàng.", + "sect1_patch_desc_2_pre": "Hỗ trợ", + "sect1_patch_desc_2_post": "và các định dạng diff tùy chỉnh.", + "sect2_title": "Lệnh Chat FireflyGo", + "sect2_desc_pre": "Dưới đây là các lệnh chat trong game bạn có thể sử dụng. Một số lệnh yêu cầu bạn phải bật", + "sect2_desc_bold": "Chế độ Theorycraft", + "sect2_desc_post": ".", + "sect2_tc_req_title": "Yêu cầu Chế độ Theorycraft", + "sect2_tc_req_desc_pre": "Các lệnh sau chỉ khả dụng khi", + "sect2_tc_req_desc_bold": "Chế độ Theorycraft", + "sect2_tc_req_desc_post": "được bật:", + "sect2_extra_title": "Cài đặt Bổ sung", + "sect2_hidden_ui_title": "Ẩn UI", + "sect2_hidden_ui_desc": "Ẩn ngay lập tức toàn bộ giao diện game — thường được dùng trong các video showcase DIM.", + "sect2_censor_title": "Tắt Kiểm duyệt", + "sect2_censor_desc": "Loại bỏ hiệu ứng kiểm duyệt Lens Flare 💀 để có trải nghiệm rõ ràng hơn.", + "sect2_tc_title": "Chế độ Theorycraft", + "sect2_tc_desc": "Không cần gõ lệnh chat nữa — cấu hình mọi thứ qua web: điều chỉnh HP quái, đặt chu kỳ, xem log, và hơn thế nữa.", + "sect2_cmd_title": "Các lệnh khả dụng:", + "sect2_cmd_tc": "Chế độ Theorycraft", + "sect2_cmd_tc_enable": "— Bật Chế độ Theorycraft", + "sect2_cmd_tc_disable": "— Tắt Chế độ Theorycraft", + "sect2_cmd_cycle": "Điều khiển Chu kỳ", + "sect2_cmd_tc_only": "(Chỉ Theorycraft)", + "sect2_cmd_cycle_desc": "— Đặt số chu kỳ trong trận đấu", + "sect2_cmd_cycle_ex1_pre": "Ví dụ:", + "sect2_cmd_cycle_ex1_post": "đặt trận đấu thành 30 chu kỳ", + "sect2_cmd_cycle_ex2_post": "tắt chu kỳ tùy chỉnh", + "sect2_cmd_hp": "Ghi đè HP", + "sect2_cmd_hp_desc1": "— Đặt HP quái vật (chỉ khả dụng trong chế độ Theorycraft)", + "sect2_cmd_hp_desc2": "— Tắt tính năng đặt HP", + "sect2_cmd_hp_desc3": "— Đặt HP cho từng quái vật trong một đợt (wave) cụ thể", + "sect2_cmd_hp_ex_pre": "Ví dụ:", + "sect2_cmd_hp_ex_post": "đặt đợt 1 quái 1 HP=2,000,000 và quái 2 HP=3,000,000", + "sect2_cmd_log": "Nhật ký Trận đấu (Log)", + "sect2_cmd_log_desc1": "— Bật xuất nhật ký trận đấu", + "sect2_cmd_log_desc2": "— Tắt nhật ký trận đấu", + "sect2_cmd_log_out_pre": "Đầu ra sẽ được ghi dưới dạng", + "sect2_cmd_skip": "Bỏ qua Node", + "sect2_cmd_skip_desc": "— Bỏ qua các node trong MOC / AS / Pure Fiction", + "sect2_cmd_skip_ex1_pre": "Ví dụ:", + "sect2_cmd_skip_ex1_post": "bỏ qua node 2", + "sect2_cmd_skip_ex2_post": "tắt tính năng bỏ qua", + "sect2_cmd_id": "Chuyển đổi Vận mệnh Nhân vật", + "sect2_cmd_id_desc": "— Chuyển vận mệnh cho các nhân vật có nhiều form", + "sect2_cmd_id_ex1_pre": "Ví dụ:", + "sect2_cmd_id_ex1_post": "để đổi form MC (Nhà Khai Phá)", + "sect2_cmd_id_ex2_pre": "Hoạt động với các ID như", + "sect2_cmd_update": "Làm mới Dữ liệu", + "sect2_cmd_update_desc_pre": "— Làm mới dữ liệu máy chủ từ tệp", + "sect3_title": "Các Lưu ý Khác", + "sect3_admin_title": "Quyền Quản trị viên (Administrator)", + "sect3_admin_desc": "Luôn chạy launcher dưới quyền Administrator để có quyền truy cập tệp.", + "sect3_backup_title": "Sao lưu Dữ liệu", + "sect3_backup_desc_pre": "Sao lưu tệp", + "sect3_backup_desc_mid": "và", + "sect3_backup_desc_post": "của bạn thường xuyên.", + "sect3_voice_title": "Bật Gói Giọng nói (Voice Packs) trong Client Beta", + "sect3_voice_step1_pre": "Sao chép thư mục giọng nói bạn muốn (ví dụ:", + "sect3_voice_step1_mid": "từ:", + "sect3_voice_step1_post_pre": "vào thư mục beta bằng cách nhấn", + "sect3_voice_step1_post_bold": "\"Mở thư mục Voice\"", + "sect3_voice_step1_post_post": "trên tab Trang chủ.", + "sect3_voice_step2": "Khi khởi chạy game lần đầu, thư mục giọng nói có thể bị xóa. Nếu vậy, hãy lặp lại bước 1 để khôi phục.", + "btn_back": "Trở về Trang chủ" + }, + "about": { + "title": "Giới thiệu", + "p1_pre": "Xin chào! Chúng tôi là ", + "p1_post": ", một nhóm phát triển đam mê xây dựng các công cụ hữu ích và cải thiện trải nghiệm người dùng.", + "p2_pre": "Tôi đã tạo ra một ", + "p2_highlight": "Game Launcher", + "p2_post": " hiện đại và gọn nhẹ để giúp người dùng dễ dàng khởi chạy và quản lý game với hiệu suất tốt hơn và đơn giản hơn.", + "p3_pre": "Launcher được xây dựng bằng ", + "p3_mid": ", với giao diện gọn gàng và tốc độ phản hồi nhanh được thiết kế bằng ", + "p3_and": " và ", + "p3_post": ".", + "p4": "Mục tiêu của tôi là tạo ra các công cụ nhanh, hiệu quả và mang lại trải nghiệm sử dụng thú vị — và launcher này chỉ là sự khởi đầu.", + "btn_back": "Trở về Trang chủ" + }, + "fireflytools": { + "title": "Công cụ Firefly", + "sect1_title": "Về Công cụ Firefly", + "sect1_p1_pre": "Trang web này là một phiên bản khác của ", + "sect1_p1_tool": "Firefly Tools ", + "sect1_p1_mid": "được phát triển bởi ", + "sect1_p1_author": "Firefly Shelter", + "sect1_master_site": "Trang web Gốc", + "sect1_p2_pre": "Công cụ ban đầu được tạo ra bởi một nhà phát triển bên thứ ba tên là ", + "sect1_p2_author": "Amazing", + "sect1_p2_post": ". Phiên bản này dựa trực tiếp trên công việc đó, không sửa đổi logic cốt lõi.", + "sect1_p3_pre": "Ngoài ra còn có một phiên bản hiện đại hơn của cùng tác giả tại ", + "sect2_title": "Tính năng Chính", + "sect2_feat1": "Cấu hình nhân vật, nón ánh sáng, di vật, vết tích và tinh hồn dễ dàng trên trình duyệt của bạn.", + "sect2_feat2_pre": "Áp dụng ngay các thiết lập vào ", + "sect2_feat2_server": "Máy chủ Firefly GO", + "sect2_feat2_mid": " bằng cách sử dụng ", + "sect2_feat2_conn": "Connect PS", + "sect2_feat2_post": " — không cần tải tệp lên thủ công.", + "sect2_feat3_title": "Cài đặt Bổ sung", + "sect2_feat3_desc_pre": "Nâng cao trải nghiệm ", + "sect2_feat3_desc_server": "Máy chủ Firefly GO", + "sect2_feat3_desc_post": " của bạn với các tính năng bổ sung:", + "sect2_feat3_ui": "Ẩn UI Game", + "sect2_feat3_ui_desc": "— xóa toàn bộ giao diện trò chơi.", + "sect2_feat3_censor": "Tắt Kiểm duyệt", + "sect2_feat3_censor_desc": "— loại bỏ hiệu ứng kiểm duyệt Lens Flare 💀.", + "sect2_feat3_tc": "Chế độ Theorycraft", + "sect2_feat3_tc_desc": "— cấu hình HP, chu kỳ và nhiều tính năng khác qua web.", + "sect2_feat4_pre": "Xuất và nhập toàn bộ bản build bằng ", + "sect2_feat4_post": ".", + "sect2_feat5": "Quy trình thử nghiệm nhanh chóng — không có thời gian chờ đồng bộ, cập nhật ngay lập tức trong game.", + "sect3_title": "Bắt đầu Sử dụng", + "sect3_step1": "Truy cập công cụ thông qua trình duyệt của bạn tại phiên bản tự lưu trữ (self-hosted).", + "sect3_step2": "Cấu hình bản build nhân vật của bạn với giao diện web trực quan.", + "sect3_step3_pre": "Sử dụng tính năng ", + "sect3_step3_bold": "Connect PS", + "sect3_step3_post": " để đồng bộ tức thì với máy chủ riêng của bạn.", + "sect3_step4": "Thử nghiệm bản build trong game với các bản cập nhật và sửa đổi theo thời gian thực.", + "btn_back": "Trở về Trang chủ" + }, + "analysis": { + "title": "Phân tích Firefly \u0026 Plugin Veritas", + "sect1_title": "Về Veritas", + "sect1_p1_pre": "", + "sect1_p1_mid": " là một ", + "sect1_p1_highlight": "Damage Logger", + "sect1_p1_post": " mạnh mẽ được thiết kế để phân tích sát thương theo thời gian thực trong quá trình chơi game.", + "sect1_p2": "Nó gọn nhẹ, nhanh chóng và dễ sử dụng để phân tích sát thương toàn diện.", + "sect1_github": "Kho lưu trữ GitHub", + "sect2_title": "Công cụ Phân tích Web", + "sect2_desc": "Sử dụng các ứng dụng web này để phân tích sát thương thời gian thực với Veritas:", + "sect2_master": "Trang web Gốc", + "sect2_backup": "Trang web Dự phòng", + "sect2_tip_pre": "Mẹo:", + "sect2_tip_post": " Nếu quốc gia của bạn gặp sự cố khi tải trang web gốc, vui lòng sử dụng trang web dự phòng.", + "sect3_title": "Hướng dẫn Cài đặt", + "sect3_subtitle": "Bước Thiết lập Quan trọng", + "sect3_desc": "Sau khi tải xuống Veritas, bạn phải đổi tên tệp để nó hoạt động bình thường:", + "sect3_rename": "Đổi tên: ", + "sect3_place": "Sau đó đặt ", + "sect3_place_post": " vào thư mục game của bạn.", + "sect4_title": "Cách sử dụng Web App", + "sect4_sub1": "Dành cho Firefly GO Local", + "sect4_sub1_step1_pre": "Khởi chạy ", + "sect4_sub1_step1_game": "game", + "sect4_sub1_step1_mid": " và ", + "sect4_sub1_step1_server": "Máy chủ Firefly GO (PS)", + "sect4_sub1_step1_post": " của bạn.", + "sect4_sub1_step2": "Mở một trong các công cụ phân tích web.", + "sect4_sub1_step3_pre": "Đi tới ", + "sect4_sub1_step3_conn": "Cài đặt Kết nối", + "sect4_sub1_step3_mid1": " → chọn ", + "sect4_sub1_step3_type": "Loại Kết nối: PS", + "sect4_sub1_step3_mid2": " → nhấn ", + "sect4_sub1_step3_btn": "Kết nối", + "sect4_sub1_step3_post": ".", + "sect4_sub1_step4": "Sau khi kết nối, hãy chơi game. Công cụ sẽ tự động phân tích ở chế độ nền.", + "sect4_sub2": "Dành cho các Máy chủ riêng Khác", + "sect4_sub2_step1_pre": "Khởi chạy ", + "sect4_sub2_step1_game": "game", + "sect4_sub2_step1_mid": " và ", + "sect4_sub2_step1_server": "Máy chủ riêng", + "sect4_sub2_step1_post": " của bạn.", + "sect4_sub2_step2": "Mở một trong các công cụ phân tích web.", + "sect4_sub2_step3_pre": "Đi tới ", + "sect4_sub2_step3_conn": "Cài đặt Kết nối", + "sect4_sub2_step3_mid1": " → chọn ", + "sect4_sub2_step3_type": "Loại Kết nối: Native", + "sect4_sub2_step3_mid2": " → nhấn ", + "sect4_sub2_step3_btn": "Kết nối", + "sect4_sub2_step3_post": ".", + "sect4_sub2_step4": "Sau khi kết nối, hãy chơi game bình thường.", + "btn_back": "Trở về Trang chủ" + } } \ No newline at end of file diff --git a/frontend/public/locales/zh.json b/frontend/public/locales/zh.json index 2ae7ca3..53bc738 100644 --- a/frontend/public/locales/zh.json +++ b/frontend/public/locales/zh.json @@ -1,337 +1,337 @@ -{ - "header": { - "home": "首页", - "tools": "工具", - "language": "语言", - "diff": "差异", - "client_update": "客户端更新", - "plugins": "插件", - "analysis": "分析(Veritas)", - "firefly_tools": "Firefly工具", - "how_to": "使用方法", - "about": "关于", - "settings": "设置", - "minimize": "最小化", - "close": "关闭", - "by": "Firefly Shelter" - }, - "background": { - "select_bg": "选择背景", - "choose_bg": "选择背景", - "paste_url": "粘贴图片链接 (https://...)", - "add": "添加", - "upload": "上传", - "upload_from_computer": "从电脑上传", - "done": "完成", - "remove": "删除", - "invalid_url": "无效的URL" - }, - "close": { - "title": "确认操作", - "description": "您是要最小化到系统托盘还是关闭应用程序?", - "dont_ask": "不再提示", - "minimize": "最小化", - "close": "关闭" - }, - "setting": { - "title": "设置", - "launcher_update_title": "启动器更新", - "launcher_update_desc": "检查您的启动器是否为最新版本。", - "launcher_update_btn": "检查更新", - "launcher_update_success": "启动器已是最新版本", - "closing_options_title": "关闭选项", - "set_dont_ask_again": "不再提示", - "closing_auto_desc": "下次关闭时,将自动{{action}}而不进行询问。", - "action_minimize": "最小化到系统托盘", - "action_quit": "退出应用程序", - "version_label": "版本", - "server_label": "Server", - "proxy_label": "Proxy", - "launcher_label": "Launcher" - }, - "home": { - "header_title": "Firefly GO", - "tooltip_how_to": "如何使用工具与命令", - "btn_select_game": "选择游戏文件", - "btn_selecting": "正在选择...", - "btn_start_game": "开始游戏", - "btn_game_running": "游戏正在运行", - "menu_change_path": "更改游戏路径", - "menu_check_update": "检查服务器与代理更新", - "menu_open_server": "打开服务器文件夹", - "menu_open_proxy": "打开代理文件夹", - "menu_open_voice": "打开语音文件夹", - "status_updating_launcher": "正在更新启动器", - "status_update_success": "更新成功,5秒后自动关闭", - "status_update_failed": "更新失败,5秒后自动关闭", - "status_wait": "请稍候...", - "status_complete": "完成!", - "modal_update_title": "更新数据", - "modal_update_msg": "是否要更新服务器和代理数据?", - "modal_download_title": "下载数据", - "modal_download_msg": "需要下载服务器和代理数据", - "modal_self_update_title": "更新启动器", - "modal_self_update_msg": "是否要更新启动器?", - "btn_yes": "是", - "btn_no": "否", - "btn_download": "下载", - "error_game_dir": "无效的游戏目录", - "error_file_type": "文件类型错误", - "game_path_success": "游戏路径设置成功", - "no_updates": "暂无更新", - "toast_pick_folder_error": "选择文件夹错误: ", - "toast_start_proxy_failed": "启动代理失败: ", - "toast_start_server_failed": "启动服务器失败: ", - "toast_start_game_failed": "启动游戏失败: ", - "toast_start_game_error": "启动游戏错误: " - }, - "diff": { - "header_title": "🎮 使用 Diff Tool 更新游戏", - "header_desc": "帮助您使用 Diff Tool 轻松更新游戏", - "game_dir_title": "游戏目录", - "btn_selecting": "正在选择...", - "btn_select_game": "选择游戏文件夹", - "game_dir_valid": "找到有效的游戏目录!", - "game_dir_invalid": "未找到游戏目录,请选择正确的文件夹。", - "diff_file_title": "Diff 文件目录", - "btn_select_diff": "选择 Diff 文件", - "diff_file_valid": "找到有效的 Diff 文件!", - "diff_file_invalid": "未找到 Diff 文件,请选择正确的文件。", - "btn_updating": "正在更新...", - "btn_update_game": "更新游戏", - "modal_update_title": "更新游戏", - "status_wait": "请稍候...", - "inst_title": "📋 使用说明:", - "inst_step_1": "1. 点击“选择游戏文件夹”并选择您的游戏根目录", - "inst_step_2": "2. 等待系统验证游戏目录", - "inst_step_3": "3. 点击“选择 Diff 文件”并选择您的差异文件", - "inst_step_4": "4. 等待系统验证 Diff 文件", - "inst_step_5": "5. 点击“更新游戏”以保存更改", - "toast_game_dir_not_found": "未找到游戏目录,请选择正确的文件夹。", - "toast_no_folder_selected": "未选择文件夹路径", - "toast_pick_folder_error": "选择文件夹错误:", - "toast_invalid_file_type": "无效的文件类型", - "toast_no_file_selected": "未选择文件路径", - "toast_pick_file_error": "选择文件错误:", - "toast_select_both": "请同时选择游戏目录和 Diff 文件", - "toast_update_completed": "游戏更新完成", - "stage_check_type": "检查 Diff Tool 类型", - "stage_version_validate": "验证版本", - "stage_data_extract": "提取数据", - "stage_cut_data": "裁剪数据", - "stage_patch_data": "修补数据", - "stage_delete_old_files": "删除旧文件" - }, - "language": { - "header_title": "🎮 游戏语言管理器", - "header_desc": "管理游戏的文本和语音语言设置", - "game_dir_title": "游戏目录", - "btn_select_game": "选择游戏文件夹", - "btn_selecting": "正在选择...", - "game_dir_valid": "找到有效的游戏目录!", - "game_dir_invalid": "未找到游戏目录,请选择正确的文件夹。", - "current_languages_title": "当前语言", - "text_language": "文本语言", - "voice_language": "语音语言", - "language_settings_title": "语言设置", - "select_text_placeholder": "选择文本语言...", - "select_voice_placeholder": "选择语音语言...", - "btn_apply": "应用语言设置", - "btn_applying": "正在应用...", - "inst_title": "📋 使用说明:", - "inst_step_1": "1. 点击“选择游戏文件夹”并选择您的游戏根目录", - "inst_step_2": "2. 等待系统验证游戏目录", - "inst_step_3": "3. 选择您偏好的文本和语音语言", - "inst_step_4": "4. 点击“应用语言设置”以保存更改", - "toast_no_folder_selected": "未选择文件夹路径", - "toast_pick_folder_error": "选择文件夹错误:", - "toast_set_language_success": "语言设置成功", - "toast_set_language_error": "设置语言错误:" - }, - "howto": { - "title": "使用说明", - "sect1_title": "使用启动器功能", - "sect1_auto_update_pre": "启动时自动更新", - "sect1_auto_update_post": "及代理工具。", - "sect1_launch_game": "使用正确的参数和运行环境,直接通过启动器启动游戏。", - "sect1_lang_pre": "支持切换游戏内语言(例如:EN, JP, ZH, KR),通过", - "sect1_lang_link": "语言工具", - "sect1_patch_title": "修补与更新游戏文件", - "sect1_patch_desc_1_pre": "使用", - "sect1_patch_desc_1_link": "Diff Tool", - "sect1_patch_desc_1_post": "(DiffPatch)进行快速轻量的增量更新。", - "sect1_patch_desc_2_pre": "支持", - "sect1_patch_desc_2_post": "以及自定义 diff 格式。", - "sect2_title": "FireflyGo 聊天指令", - "sect2_desc_pre": "以下是您可以在游戏中使用的聊天指令。部分指令需要您开启", - "sect2_desc_bold": "Theorycraft 模式", - "sect2_desc_post": "。", - "sect2_tc_req_title": "需要开启 Theorycraft 模式", - "sect2_tc_req_desc_pre": "以下指令仅在", - "sect2_tc_req_desc_bold": "Theorycraft 模式", - "sect2_tc_req_desc_post": "开启时可用:", - "sect2_extra_title": "额外设置", - "sect2_hidden_ui_title": "隐藏 UI", - "sect2_hidden_ui_desc": "立即隐藏整个游戏UI — 常用于 DIM 演示视频中。", - "sect2_censor_title": "禁用和谐", - "sect2_censor_desc": "移除镜头光晕和谐效果 💀,获得更纯净的体验。", - "sect2_tc_title": "Theorycraft 模式", - "sect2_tc_desc": "再也不需要输入聊天指令了 — 通过网页配置一切:调整怪物HP、设置轮数、查看日志等。", - "sect2_cmd_title": "可用指令:", - "sect2_cmd_tc": "Theorycraft 模式", - "sect2_cmd_tc_enable": "— 启用 Theorycraft 模式", - "sect2_cmd_tc_disable": "— 禁用 Theorycraft 模式", - "sect2_cmd_cycle": "轮数控制", - "sect2_cmd_tc_only": "(仅 Theorycraft 模式)", - "sect2_cmd_cycle_desc": "— 设置战斗中的轮数", - "sect2_cmd_cycle_ex1_pre": "示例:", - "sect2_cmd_cycle_ex1_post": "将战斗设置为30轮", - "sect2_cmd_cycle_ex2_post": "禁用自定义轮数", - "sect2_cmd_hp": "HP 覆写", - "sect2_cmd_hp_desc1": "— 设置怪物 HP(仅在 Theorycraft 模式下可用)", - "sect2_cmd_hp_desc2": "— 禁用 HP 设置功能", - "sect2_cmd_hp_desc3": "— 为特定波次中的每个怪物设置 HP", - "sect2_cmd_hp_ex_pre": "示例:", - "sect2_cmd_hp_ex_post": "设置第 1 波次怪物 1 的 HP=2,000,000,怪物 2 的 HP=3,000,000", - "sect2_cmd_log": "战斗日志", - "sect2_cmd_log_desc1": "— 启用战斗日志输出", - "sect2_cmd_log_desc2": "— 禁用战斗日志", - "sect2_cmd_log_out_pre": "输出将被写入为", - "sect2_cmd_skip": "跳过节点", - "sect2_cmd_skip_desc": "— 跳过 混沌回忆 / 虚构叙事 中的节点", - "sect2_cmd_skip_ex1_pre": "示例:", - "sect2_cmd_skip_ex1_post": "跳过节点 2", - "sect2_cmd_skip_ex2_post": "禁用跳过", - "sect2_cmd_id": "角色命途切换", - "sect2_cmd_id_desc": "— 为多形态角色切换命途", - "sect2_cmd_id_ex1_pre": "示例:", - "sect2_cmd_id_ex1_post": "更改开拓者的形态", - "sect2_cmd_id_ex2_pre": "支持的 ID 如", - "sect2_cmd_update": "刷新数据", - "sect2_cmd_update_desc_pre": "— 从当前文件刷新服务器数据:", - "sect3_title": "其他注意事项", - "sect3_admin_title": "管理员权限", - "sect3_admin_desc": "请始终以管理员身份运行启动器,以获取文件权限。", - "sect3_backup_title": "备份数据", - "sect3_backup_desc_pre": "请定期备份您的", - "sect3_backup_desc_mid": "和", - "sect3_backup_desc_post": "。", - "sect3_voice_title": "在 Beta 客户端中启用语音包", - "sect3_voice_step1_pre": "将所需的语音文件夹(例如:", - "sect3_voice_step1_mid": ")从:", - "sect3_voice_step1_post_pre": "复制到 beta 文件夹中,在首页点击", - "sect3_voice_step1_post_bold": "“打开语音文件夹”", - "sect3_voice_step1_post_post": "即可。", - "sect3_voice_step2": "首次启动游戏时可能会删除语音文件夹。如果发生这种情况,请重复步骤 1 进行恢复。", - "btn_back": "返回主页" - }, - "about": { - "title": "关于", - "p1_pre": "你好!我们是 ", - "p1_post": ",一个致力于构建实用工具并改善用户体验的开发者团队。", - "p2_pre": "我创建了一个轻量且现代的 ", - "p2_highlight": "游戏启动器", - "p2_post": ",旨在帮助用户以更好的性能和极简的操作轻松启动与管理他们的游戏。", - "p3_pre": "启动器使用 ", - "p3_mid": " 构建,并采用 ", - "p3_and": " 和 ", - "p3_post": " 设计了简洁响应式的界面。", - "p4": "我的目标是制作快速、高效且使用起来令人愉悦的工具 —— 而这个启动器仅仅是个开始。", - "btn_back": "返回主页" - }, - "fireflytools": { - "title": "Firefly 工具", - "sect1_title": "关于 Firefly 工具", - "sect1_p1_pre": "本网站是 ", - "sect1_p1_tool": "Firefly Tools ", - "sect1_p1_mid": "的另一个版本,由 ", - "sect1_p1_author": "Firefly Shelter", - "sect1_master_site": "主站", - "sect1_p2_pre": "原始工具由名为 ", - "sect1_p2_author": "Amazing", - "sect1_p2_post": " 的第三方开发者创建。此版本直接基于该作品,未修改核心逻辑。", - "sect1_p3_pre": "原作者还有一个更现代的版本,请访问:", - "sect2_title": "主要功能", - "sect2_feat1": "在浏览器中轻松配置角色、光锥、遗器、行迹和星魂。", - "sect2_feat2_pre": "使用 ", - "sect2_feat2_server": "Connect PS", - "sect2_feat2_mid": " 立即将设置应用到 ", - "sect2_feat2_conn": "Firefly GO Server", - "sect2_feat2_post": " —— 无需手动上传文件。", - "sect2_feat3_title": "额外设置", - "sect2_feat3_desc_pre": "使用额外功能增强您的 ", - "sect2_feat3_desc_server": "Firefly GO Server", - "sect2_feat3_desc_post": " 体验:", - "sect2_feat3_ui": "隐藏游戏 UI", - "sect2_feat3_ui_desc": "—— 移除整个游戏界面。", - "sect2_feat3_censor": "禁用和谐", - "sect2_feat3_censor_desc": "—— 移除镜头光晕和谐 💀。", - "sect2_feat3_tc": "Theorycraft 模式", - "sect2_feat3_tc_desc": "—— 通过网页配置 HP、轮数等。", - "sect2_feat4_pre": "使用 ", - "sect2_feat4_post": " 导入和导出完整配置。", - "sect2_feat5": "快速测试工作流 —— 无同步冷却,游戏内即时更新。", - "sect3_title": "快速开始", - "sect3_step1": "通过浏览器访问自托管实例中的工具。", - "sect3_step2": "使用直观的 Web 界面配置您的角色搭配。", - "sect3_step3_pre": "使用 ", - "sect3_step3_bold": "Connect PS", - "sect3_step3_post": " 功能立即与您的私服同步。", - "sect3_step4": "通过实时更新和修改在游戏中测试您的搭配。", - "btn_back": "返回主页" - }, - "analysis": { - "title": "Firefly 分析 & Veritas 插件", - "sect1_title": "关于 Veritas", - "sect1_p1_pre": "Veritas", - "sect1_p1_mid": " 是一款强大的", - "sect1_p1_highlight": "伤害记录器", - "sect1_p1_post": ",专为在游戏过程中实时分析伤害而设计。", - "sect1_p2": "它轻量、快速且易于使用,适合全面的伤害分析。", - "sect1_github": "GitHub 仓库", - "sect2_title": "Web 分析工具", - "sect2_desc": "使用这些 Web 应用程序与 Veritas 进行实时伤害分析:", - "sect2_master": "主站", - "sect2_backup": "备用网站", - "sect2_tip_pre": "提示:", - "sect2_tip_post": " 如果您的国家加载主站有困难,请改用备用网站。", - "sect3_title": "安装说明", - "sect3_subtitle": "重要设置步骤", - "sect3_desc": "下载 Veritas 后,您必须重命名该文件才能正常工作:", - "sect3_rename": "重命名:", - "sect3_place": "然后将 ", - "sect3_place_post": " 放入您的游戏目录。", - "sect4_title": "如何使用 Web 应用", - "sect4_sub1": "适用于 Firefly GO 本地端", - "sect4_sub1_step1_pre": "启动 ", - "sect4_sub1_step1_game": "游戏", - "sect4_sub1_step1_mid": " 和您的 ", - "sect4_sub1_step1_server": "Firefly GO 服务器 (PS)", - "sect4_sub1_step1_post": "。", - "sect4_sub1_step2": "打开其中一个 Web 分析工具。", - "sect4_sub1_step3_pre": "转到 ", - "sect4_sub1_step3_conn": "Connection Settings", - "sect4_sub1_step3_mid1": " → 选择 ", - "sect4_sub1_step3_type": "Connection Type: PS", - "sect4_sub1_step3_mid2": " → 点击 ", - "sect4_sub1_step3_btn": "Connect", - "sect4_sub1_step3_post": "。", - "sect4_sub1_step4": "连接后,游玩游戏。工具将在后台自动进行分析。", - "sect4_sub2": "适用于其他私服", - "sect4_sub2_step1_pre": "启动 ", - "sect4_sub2_step1_game": "游戏", - "sect4_sub2_step1_mid": " 和您的 ", - "sect4_sub2_step1_server": "私服", - "sect4_sub2_step1_post": "。", - "sect4_sub2_step2": "打开其中一个 Web 分析工具。", - "sect4_sub2_step3_pre": "转到 ", - "sect4_sub2_step3_conn": "Connection Settings", - "sect4_sub2_step3_mid1": " → 选择 ", - "sect4_sub2_step3_type": "Connection Type: Native", - "sect4_sub2_step3_mid2": " → 点击 ", - "sect4_sub2_step3_btn": "Connect", - "sect4_sub2_step3_post": "。", - "sect4_sub2_step4": "连接后,正常游玩游戏即可。", - "btn_back": "返回主页" - } +{ + "header": { + "home": "首页", + "tools": "工具", + "language": "语言", + "diff": "差异", + "client_update": "客户端更新", + "plugins": "插件", + "analysis": "分析(Veritas)", + "firefly_tools": "Firefly工具", + "how_to": "使用方法", + "about": "关于", + "settings": "设置", + "minimize": "最小化", + "close": "关闭", + "by": "GaCy" + }, + "background": { + "select_bg": "选择背景", + "choose_bg": "选择背景", + "paste_url": "粘贴图片链接 (https://...)", + "add": "添加", + "upload": "上传", + "upload_from_computer": "从电脑上传", + "done": "完成", + "remove": "删除", + "invalid_url": "无效的URL" + }, + "close": { + "title": "确认操作", + "description": "您是要最小化到系统托盘还是关闭应用程序?", + "dont_ask": "不再提示", + "minimize": "最小化", + "close": "关闭" + }, + "setting": { + "title": "设置", + "launcher_update_title": "启动器更新", + "launcher_update_desc": "检查您的启动器是否为最新版本。", + "launcher_update_btn": "检查更新", + "launcher_update_success": "启动器已是最新版本", + "closing_options_title": "关闭选项", + "set_dont_ask_again": "不再提示", + "closing_auto_desc": "下次关闭时,将自动{{action}}而不进行询问。", + "action_minimize": "最小化到系统托盘", + "action_quit": "退出应用程序", + "version_label": "版本", + "server_label": "Server", + "proxy_label": "Proxy", + "launcher_label": "Launcher" + }, + "home": { + "header_title": "G Launcher", + "tooltip_how_to": "如何使用工具与命令", + "btn_select_game": "选择游戏文件", + "btn_selecting": "正在选择...", + "btn_start_game": "开始游戏", + "btn_game_running": "游戏正在运行", + "menu_change_path": "更改游戏路径", + "menu_check_update": "检查服务器与代理更新", + "menu_open_server": "打开服务器文件夹", + "menu_open_proxy": "打开代理文件夹", + "menu_open_voice": "打开语音文件夹", + "status_updating_launcher": "正在更新启动器", + "status_update_success": "更新成功,5秒后自动关闭", + "status_update_failed": "更新失败,5秒后自动关闭", + "status_wait": "请稍候...", + "status_complete": "完成!", + "modal_update_title": "更新数据", + "modal_update_msg": "是否要更新服务器和代理数据?", + "modal_download_title": "下载数据", + "modal_download_msg": "需要下载服务器和代理数据", + "modal_self_update_title": "更新启动器", + "modal_self_update_msg": "是否要更新启动器?", + "btn_yes": "是", + "btn_no": "否", + "btn_download": "下载", + "error_game_dir": "无效的游戏目录", + "error_file_type": "文件类型错误", + "game_path_success": "游戏路径设置成功", + "no_updates": "暂无更新", + "toast_pick_folder_error": "选择文件夹错误: ", + "toast_start_proxy_failed": "启动代理失败: ", + "toast_start_server_failed": "启动服务器失败: ", + "toast_start_game_failed": "启动游戏失败: ", + "toast_start_game_error": "启动游戏错误: " + }, + "diff": { + "header_title": "🎮 使用 Diff Tool 更新游戏", + "header_desc": "帮助您使用 Diff Tool 轻松更新游戏", + "game_dir_title": "游戏目录", + "btn_selecting": "正在选择...", + "btn_select_game": "选择游戏文件夹", + "game_dir_valid": "找到有效的游戏目录!", + "game_dir_invalid": "未找到游戏目录,请选择正确的文件夹。", + "diff_file_title": "Diff 文件目录", + "btn_select_diff": "选择 Diff 文件", + "diff_file_valid": "找到有效的 Diff 文件!", + "diff_file_invalid": "未找到 Diff 文件,请选择正确的文件。", + "btn_updating": "正在更新...", + "btn_update_game": "更新游戏", + "modal_update_title": "更新游戏", + "status_wait": "请稍候...", + "inst_title": "📋 使用说明:", + "inst_step_1": "1. 点击“选择游戏文件夹”并选择您的游戏根目录", + "inst_step_2": "2. 等待系统验证游戏目录", + "inst_step_3": "3. 点击“选择 Diff 文件”并选择您的差异文件", + "inst_step_4": "4. 等待系统验证 Diff 文件", + "inst_step_5": "5. 点击“更新游戏”以保存更改", + "toast_game_dir_not_found": "未找到游戏目录,请选择正确的文件夹。", + "toast_no_folder_selected": "未选择文件夹路径", + "toast_pick_folder_error": "选择文件夹错误:", + "toast_invalid_file_type": "无效的文件类型", + "toast_no_file_selected": "未选择文件路径", + "toast_pick_file_error": "选择文件错误:", + "toast_select_both": "请同时选择游戏目录和 Diff 文件", + "toast_update_completed": "游戏更新完成", + "stage_check_type": "检查 Diff Tool 类型", + "stage_version_validate": "验证版本", + "stage_data_extract": "提取数据", + "stage_cut_data": "裁剪数据", + "stage_patch_data": "修补数据", + "stage_delete_old_files": "删除旧文件" + }, + "language": { + "header_title": "🎮 游戏语言管理器", + "header_desc": "管理游戏的文本和语音语言设置", + "game_dir_title": "游戏目录", + "btn_select_game": "选择游戏文件夹", + "btn_selecting": "正在选择...", + "game_dir_valid": "找到有效的游戏目录!", + "game_dir_invalid": "未找到游戏目录,请选择正确的文件夹。", + "current_languages_title": "当前语言", + "text_language": "文本语言", + "voice_language": "语音语言", + "language_settings_title": "语言设置", + "select_text_placeholder": "选择文本语言...", + "select_voice_placeholder": "选择语音语言...", + "btn_apply": "应用语言设置", + "btn_applying": "正在应用...", + "inst_title": "📋 使用说明:", + "inst_step_1": "1. 点击“选择游戏文件夹”并选择您的游戏根目录", + "inst_step_2": "2. 等待系统验证游戏目录", + "inst_step_3": "3. 选择您偏好的文本和语音语言", + "inst_step_4": "4. 点击“应用语言设置”以保存更改", + "toast_no_folder_selected": "未选择文件夹路径", + "toast_pick_folder_error": "选择文件夹错误:", + "toast_set_language_success": "语言设置成功", + "toast_set_language_error": "设置语言错误:" + }, + "howto": { + "title": "使用说明", + "sect1_title": "使用启动器功能", + "sect1_auto_update_pre": "启动时自动更新", + "sect1_auto_update_post": "及代理工具。", + "sect1_launch_game": "使用正确的参数和运行环境,直接通过启动器启动游戏。", + "sect1_lang_pre": "支持切换游戏内语言(例如:EN, JP, ZH, KR),通过", + "sect1_lang_link": "语言工具", + "sect1_patch_title": "修补与更新游戏文件", + "sect1_patch_desc_1_pre": "使用", + "sect1_patch_desc_1_link": "Diff Tool", + "sect1_patch_desc_1_post": "(DiffPatch)进行快速轻量的增量更新。", + "sect1_patch_desc_2_pre": "支持", + "sect1_patch_desc_2_post": "以及自定义 diff 格式。", + "sect2_title": "FireflyGo 聊天指令", + "sect2_desc_pre": "以下是您可以在游戏中使用的聊天指令。部分指令需要您开启", + "sect2_desc_bold": "Theorycraft 模式", + "sect2_desc_post": "。", + "sect2_tc_req_title": "需要开启 Theorycraft 模式", + "sect2_tc_req_desc_pre": "以下指令仅在", + "sect2_tc_req_desc_bold": "Theorycraft 模式", + "sect2_tc_req_desc_post": "开启时可用:", + "sect2_extra_title": "额外设置", + "sect2_hidden_ui_title": "隐藏 UI", + "sect2_hidden_ui_desc": "立即隐藏整个游戏UI — 常用于 DIM 演示视频中。", + "sect2_censor_title": "禁用和谐", + "sect2_censor_desc": "移除镜头光晕和谐效果 💀,获得更纯净的体验。", + "sect2_tc_title": "Theorycraft 模式", + "sect2_tc_desc": "再也不需要输入聊天指令了 — 通过网页配置一切:调整怪物HP、设置轮数、查看日志等。", + "sect2_cmd_title": "可用指令:", + "sect2_cmd_tc": "Theorycraft 模式", + "sect2_cmd_tc_enable": "— 启用 Theorycraft 模式", + "sect2_cmd_tc_disable": "— 禁用 Theorycraft 模式", + "sect2_cmd_cycle": "轮数控制", + "sect2_cmd_tc_only": "(仅 Theorycraft 模式)", + "sect2_cmd_cycle_desc": "— 设置战斗中的轮数", + "sect2_cmd_cycle_ex1_pre": "示例:", + "sect2_cmd_cycle_ex1_post": "将战斗设置为30轮", + "sect2_cmd_cycle_ex2_post": "禁用自定义轮数", + "sect2_cmd_hp": "HP 覆写", + "sect2_cmd_hp_desc1": "— 设置怪物 HP(仅在 Theorycraft 模式下可用)", + "sect2_cmd_hp_desc2": "— 禁用 HP 设置功能", + "sect2_cmd_hp_desc3": "— 为特定波次中的每个怪物设置 HP", + "sect2_cmd_hp_ex_pre": "示例:", + "sect2_cmd_hp_ex_post": "设置第 1 波次怪物 1 的 HP=2,000,000,怪物 2 的 HP=3,000,000", + "sect2_cmd_log": "战斗日志", + "sect2_cmd_log_desc1": "— 启用战斗日志输出", + "sect2_cmd_log_desc2": "— 禁用战斗日志", + "sect2_cmd_log_out_pre": "输出将被写入为", + "sect2_cmd_skip": "跳过节点", + "sect2_cmd_skip_desc": "— 跳过 混沌回忆 / 虚构叙事 中的节点", + "sect2_cmd_skip_ex1_pre": "示例:", + "sect2_cmd_skip_ex1_post": "跳过节点 2", + "sect2_cmd_skip_ex2_post": "禁用跳过", + "sect2_cmd_id": "角色命途切换", + "sect2_cmd_id_desc": "— 为多形态角色切换命途", + "sect2_cmd_id_ex1_pre": "示例:", + "sect2_cmd_id_ex1_post": "更改开拓者的形态", + "sect2_cmd_id_ex2_pre": "支持的 ID 如", + "sect2_cmd_update": "刷新数据", + "sect2_cmd_update_desc_pre": "— 从当前文件刷新服务器数据:", + "sect3_title": "其他注意事项", + "sect3_admin_title": "管理员权限", + "sect3_admin_desc": "请始终以管理员身份运行启动器,以获取文件权限。", + "sect3_backup_title": "备份数据", + "sect3_backup_desc_pre": "请定期备份您的", + "sect3_backup_desc_mid": "和", + "sect3_backup_desc_post": "。", + "sect3_voice_title": "在 Beta 客户端中启用语音包", + "sect3_voice_step1_pre": "将所需的语音文件夹(例如:", + "sect3_voice_step1_mid": ")从:", + "sect3_voice_step1_post_pre": "复制到 beta 文件夹中,在首页点击", + "sect3_voice_step1_post_bold": "“打开语音文件夹”", + "sect3_voice_step1_post_post": "即可。", + "sect3_voice_step2": "首次启动游戏时可能会删除语音文件夹。如果发生这种情况,请重复步骤 1 进行恢复。", + "btn_back": "返回主页" + }, + "about": { + "title": "关于", + "p1_pre": "你好!我们是 ", + "p1_post": ",一个致力于构建实用工具并改善用户体验的开发者团队。", + "p2_pre": "我创建了一个轻量且现代的 ", + "p2_highlight": "游戏启动器", + "p2_post": ",旨在帮助用户以更好的性能和极简的操作轻松启动与管理他们的游戏。", + "p3_pre": "启动器使用 ", + "p3_mid": " 构建,并采用 ", + "p3_and": " 和 ", + "p3_post": " 设计了简洁响应式的界面。", + "p4": "我的目标是制作快速、高效且使用起来令人愉悦的工具 —— 而这个启动器仅仅是个开始。", + "btn_back": "返回主页" + }, + "fireflytools": { + "title": "Firefly 工具", + "sect1_title": "关于 Firefly 工具", + "sect1_p1_pre": "本网站是 ", + "sect1_p1_tool": "Firefly Tools ", + "sect1_p1_mid": "的另一个版本,由 ", + "sect1_p1_author": "Firefly Shelter", + "sect1_master_site": "主站", + "sect1_p2_pre": "原始工具由名为 ", + "sect1_p2_author": "Amazing", + "sect1_p2_post": " 的第三方开发者创建。此版本直接基于该作品,未修改核心逻辑。", + "sect1_p3_pre": "原作者还有一个更现代的版本,请访问:", + "sect2_title": "主要功能", + "sect2_feat1": "在浏览器中轻松配置角色、光锥、遗器、行迹和星魂。", + "sect2_feat2_pre": "使用 ", + "sect2_feat2_server": "Connect PS", + "sect2_feat2_mid": " 立即将设置应用到 ", + "sect2_feat2_conn": "Firefly GO Server", + "sect2_feat2_post": " —— 无需手动上传文件。", + "sect2_feat3_title": "额外设置", + "sect2_feat3_desc_pre": "使用额外功能增强您的 ", + "sect2_feat3_desc_server": "Firefly GO Server", + "sect2_feat3_desc_post": " 体验:", + "sect2_feat3_ui": "隐藏游戏 UI", + "sect2_feat3_ui_desc": "—— 移除整个游戏界面。", + "sect2_feat3_censor": "禁用和谐", + "sect2_feat3_censor_desc": "—— 移除镜头光晕和谐 💀。", + "sect2_feat3_tc": "Theorycraft 模式", + "sect2_feat3_tc_desc": "—— 通过网页配置 HP、轮数等。", + "sect2_feat4_pre": "使用 ", + "sect2_feat4_post": " 导入和导出完整配置。", + "sect2_feat5": "快速测试工作流 —— 无同步冷却,游戏内即时更新。", + "sect3_title": "快速开始", + "sect3_step1": "通过浏览器访问自托管实例中的工具。", + "sect3_step2": "使用直观的 Web 界面配置您的角色搭配。", + "sect3_step3_pre": "使用 ", + "sect3_step3_bold": "Connect PS", + "sect3_step3_post": " 功能立即与您的私服同步。", + "sect3_step4": "通过实时更新和修改在游戏中测试您的搭配。", + "btn_back": "返回主页" + }, + "analysis": { + "title": "Firefly 分析 \u0026 Veritas 插件", + "sect1_title": "关于 Veritas", + "sect1_p1_pre": "Veritas", + "sect1_p1_mid": " 是一款强大的", + "sect1_p1_highlight": "伤害记录器", + "sect1_p1_post": ",专为在游戏过程中实时分析伤害而设计。", + "sect1_p2": "它轻量、快速且易于使用,适合全面的伤害分析。", + "sect1_github": "GitHub 仓库", + "sect2_title": "Web 分析工具", + "sect2_desc": "使用这些 Web 应用程序与 Veritas 进行实时伤害分析:", + "sect2_master": "主站", + "sect2_backup": "备用网站", + "sect2_tip_pre": "提示:", + "sect2_tip_post": " 如果您的国家加载主站有困难,请改用备用网站。", + "sect3_title": "安装说明", + "sect3_subtitle": "重要设置步骤", + "sect3_desc": "下载 Veritas 后,您必须重命名该文件才能正常工作:", + "sect3_rename": "重命名:", + "sect3_place": "然后将 ", + "sect3_place_post": " 放入您的游戏目录。", + "sect4_title": "如何使用 Web 应用", + "sect4_sub1": "适用于 Firefly GO 本地端", + "sect4_sub1_step1_pre": "启动 ", + "sect4_sub1_step1_game": "游戏", + "sect4_sub1_step1_mid": " 和您的 ", + "sect4_sub1_step1_server": "Firefly GO 服务器 (PS)", + "sect4_sub1_step1_post": "。", + "sect4_sub1_step2": "打开其中一个 Web 分析工具。", + "sect4_sub1_step3_pre": "转到 ", + "sect4_sub1_step3_conn": "Connection Settings", + "sect4_sub1_step3_mid1": " → 选择 ", + "sect4_sub1_step3_type": "Connection Type: PS", + "sect4_sub1_step3_mid2": " → 点击 ", + "sect4_sub1_step3_btn": "Connect", + "sect4_sub1_step3_post": "。", + "sect4_sub1_step4": "连接后,游玩游戏。工具将在后台自动进行分析。", + "sect4_sub2": "适用于其他私服", + "sect4_sub2_step1_pre": "启动 ", + "sect4_sub2_step1_game": "游戏", + "sect4_sub2_step1_mid": " 和您的 ", + "sect4_sub2_step1_server": "私服", + "sect4_sub2_step1_post": "。", + "sect4_sub2_step2": "打开其中一个 Web 分析工具。", + "sect4_sub2_step3_pre": "转到 ", + "sect4_sub2_step3_conn": "Connection Settings", + "sect4_sub2_step3_mid1": " → 选择 ", + "sect4_sub2_step3_type": "Connection Type: Native", + "sect4_sub2_step3_mid2": " → 点击 ", + "sect4_sub2_step3_btn": "Connect", + "sect4_sub2_step3_post": "。", + "sect4_sub2_step4": "连接后,正常游玩游戏即可。", + "btn_back": "返回主页" + } } \ No newline at end of file diff --git a/frontend/src/components/header/index.tsx b/frontend/src/components/header/index.tsx index e8bb0da..a087c1b 100644 --- a/frontend/src/components/header/index.tsx +++ b/frontend/src/components/header/index.tsx @@ -1,4 +1,4 @@ -import { Link } from "@tanstack/react-router"; +import { Link } from "@tanstack/react-router"; import useModalStore from "@/stores/modalStore"; import { Blend, BookOpen, Diff, Home, Info, Languages, Minus, Puzzle, Settings, TrendingUpDown, Wrench, X } from "lucide-react"; import { AppService } from "@bindings/g-launcher/internal/app-service"; diff --git a/frontend/src/helper/server.ts b/frontend/src/helper/server.ts index d2d94d0..b7d577a 100644 --- a/frontend/src/helper/server.ts +++ b/frontend/src/helper/server.ts @@ -9,7 +9,15 @@ export async function CheckUpdateServer( serverVersion: string ): Promise<{ isUpdate: boolean; isExists: boolean; version: string }> { const [ok, latestVersion, error] = await GitService.GetLatestServerVersion() - const isExists = await FSService.FileExists(serverPath) + let isExists = await FSService.FileExists(serverPath) + + if (!isExists) { + const [gameServer] = await GitService.FindServerExecutables() + if (gameServer) { + useSettingStore.getState().setServerPath(gameServer) + isExists = true + } + } if (!ok) { toast.error("Server error: " + error) @@ -23,17 +31,20 @@ export async function CheckUpdateServer( export async function UpdateServer(serverVersion: string) : Promise { const {setDownloadType } = useLauncherStore.getState() - const {setServerPath, setServerVersion} = useSettingStore.getState() - setDownloadType("Downloading server...") + const {setServerPath, setSdkServerPath, setServerVersion} = useSettingStore.getState() + setDownloadType("Downloading GaCy PS server...") const [ok, error] = await GitService.DownloadServerProgress(serverVersion) if (ok) { - setDownloadType("Unzipping server...") - GitService.UnzipServer() + setDownloadType("Configuring server files...") + const [gameServer, sdkServer] = await GitService.FindServerExecutables() setDownloadType("Download server successfully") setServerVersion(serverVersion) - setServerPath("./server/firefly-go_win.exe") + setServerPath(gameServer || "./server/gameserver-go.exe") + if (sdkServer) { + setSdkServerPath(sdkServer) + } } else { toast.error(error) setDownloadType("Download server failed") } -} \ No newline at end of file +} diff --git a/frontend/src/pages/launcher/index.tsx b/frontend/src/pages/launcher/index.tsx index 0f2843d..f11cfdb 100644 --- a/frontend/src/pages/launcher/index.tsx +++ b/frontend/src/pages/launcher/index.tsx @@ -1,7 +1,8 @@ import { useEffect } from 'react'; -import { Play, Menu, FolderOpen, MessageCircleQuestionMark } from 'lucide-react'; +import { Play, Menu, FolderOpen, MessageCircleQuestionMark, Server, Globe, CheckCircle2 } from 'lucide-react'; import { AppService } from '@bindings/g-launcher/internal/app-service'; import { FSService } from '@bindings/g-launcher/internal/fs-service'; +import { GitService } from '@bindings/g-launcher/internal/git-service'; import { toast } from 'react-toastify'; import path from 'path-browserify' import useSettingStore from '@/stores/settingStore'; @@ -21,11 +22,16 @@ export default function LauncherPage() { setGamePath, setGameDir, serverPath, + setServerPath, + sdkServerPath, + setSdkServerPath, proxyPath, gameDir, serverVersion, proxyVersion, - background + background, + selectedServer, + setSelectedServer } = useSettingStore() const { t } = useTranslation() const { @@ -40,8 +46,6 @@ export default function LauncherPage() { const { isLoading, downloadType, - serverReady, - proxyReady, isDownloading, serverRunning, proxyRunning, @@ -49,7 +53,6 @@ export default function LauncherPage() { progressDownload, downloadSpeed, updateData, - // launcherVersion, setLauncherVersion, setIsLoading, setDownloadType, @@ -64,13 +67,13 @@ export default function LauncherPage() { const widgetLinks = [ { - tooltip: "Firefly SRAnalysis", + tooltip: "SRAnalysis", href: "https://sranalysis.punklorde.org", img: "https://sranalysis.punklorde.org/ff-sranalysis.png", btnClass: "btn-primary" }, { - tooltip: "Firefly SRTools", + tooltip: "SRTools", href: "https://srtools.punklorde.org", img: "https://srtools.punklorde.org/ff-srtool.png", btnClass: "btn-secondary" @@ -91,7 +94,18 @@ export default function LauncherPage() { return } - const serverExists = await FSService.FileExists(serverPath) + let serverExists = await FSService.FileExists(serverPath) + if (!serverExists) { + const [gameServer, sdkServer] = await GitService.FindServerExecutables() + if (gameServer) { + setServerPath(gameServer) + serverExists = true + } + if (sdkServer) { + setSdkServerPath(sdkServer) + } + } + const proxyExists = await FSService.FileExists(proxyPath) setServerReady(serverExists) setProxyReady(proxyExists) @@ -121,17 +135,10 @@ export default function LauncherPage() { proxy: proxyData, launcher: launcherData }) - const exitGame = await FSService.FileExists(gamePath) - if (!exitGame) { - setGameRunning(false) - setGamePath("") - setGameDir("") - } if (!serverData.isExists || !proxyData.isExists) { setServerReady(false) setProxyReady(false) - setIsOpenDownloadDataModal(true) return } @@ -175,6 +182,7 @@ export default function LauncherPage() { const handleStartGame = async () => { if (!gamePath) { + toast.info("Please select the game executable first") return } if (gameRunning) { @@ -182,36 +190,59 @@ export default function LauncherPage() { } try { setIsLoading(true) - if (!proxyRunning && !gamePath.endsWith("launcher.exe")) { - const [resultProxy, error] = await FSService.StartWithConsole(proxyPath) - if (!resultProxy) { - toast.error(t("home.toast_start_proxy_failed") + error) + + if (selectedServer === "gacy-ps") { + const [gameServer, sdkServer] = await GitService.FindServerExecutables() + const activeServer = gameServer || serverPath + + if (!activeServer) { + toast.error("Please download GaCy PS server files first") + setIsOpenDownloadDataModal(true) return } - setProxyRunning(true) - } - await sleep(500) - if (!serverRunning) { - const [resultServer, error] = await FSService.StartWithConsole(serverPath) - if (!resultServer) { - toast.error(t("home.toast_start_server_failed") + error) - return + // 1. Start Proxy + const activeProxy = proxyPath || "./proxy/firefly-go-proxy.exe" + if (!proxyRunning && !gamePath.endsWith("launcher.exe")) { + const [resultProxy, error] = await FSService.StartWithConsole(activeProxy) + if (!resultProxy) { + toast.error(t("home.toast_start_proxy_failed") + ": " + error) + return + } + setProxyRunning(true) } - setServerRunning(true) - } - await sleep(1000) + await sleep(500) + // 2. Start SDK Server if exists + const activeSdk = sdkServer || sdkServerPath + if (activeSdk) { + await FSService.StartWithConsole(activeSdk) + await sleep(400) + } + + // 3. Start Game Server + if (!serverRunning) { + const [resultServer, error] = await FSService.StartWithConsole(activeServer) + if (!resultServer) { + toast.error(t("home.toast_start_server_failed") + ": " + error) + return + } + setServerRunning(true) + } + await sleep(1000) + } + + // 4. Start Game if (gamePath.endsWith("launcher.exe")) { const [resultGame, error] = await FSService.StartWithConsole(gamePath) if (!resultGame) { - toast.error(t("home.toast_start_game_failed") + error) + toast.error(t("home.toast_start_game_failed") + ": " + error) return } } else { const [resultGame, error] = await FSService.StartApp(gamePath) if (!resultGame) { - toast.error(t("home.toast_start_game_failed") + error) + toast.error(t("home.toast_start_game_failed") + ": " + error) return } } @@ -266,58 +297,116 @@ export default function LauncherPage() { return (
background { const target = e.currentTarget as HTMLImageElement - target.src = "bg-12.jpg" + target.src = "bg-1.jpeg" }} /> - {/* Header */} -
-
{t("home.header_title")}
+ {/* Header Title */} +
+
+ G Launcher +
-
- {widgetLinks.map((link, idx) => ( -
- - {link.tooltip} - -
- ))} + {/* Side Server Selector */} +
+
+ เลือกเซิร์ฟเวอร์ (Select Server) +
-
- - - + {/* Server Option 1: GaCy PS */} + + + {/* Server Option 2: Official Server */} + + + {/* External Tools Mini Bar */} +
+ {widgetLinks.map((link, idx) => ( +
+ + {link.tooltip} + +
+ ))} +
+ + + +
-
+ {/* Left Background Selector */} +
- {/* Bottom Panel */} - {serverReady && proxyReady && !isDownloading && ( -
+ {/* Bottom Play Panel: Appears once a server is selected! */} + {selectedServer !== "" && !isDownloading && ( +
{gamePath === "" ? ( ) : ( )}
-
+
-
    +
    • - -
    • -
    • -
    • -
    -
)} - {/* Downloading */} + {/* Notification when no server is selected yet */} + {selectedServer === "" && !isDownloading && ( +
+ 👉 + กรุณาเลือกเซิร์ฟเวอร์ด้านบนเพื่อเริ่มเล่น (Select a server to play) +
+ )} + + {/* Downloading Progress Bar */} {isDownloading && ( updateData.proxy.isUpdate || updateData.server.isUpdate || !updateData.proxy.isExists || !updateData.server.isExists ) && ( -
+
{downloadType} @@ -434,8 +531,9 @@ export default function LauncherPage() {
)} + {/* Launcher Self Update Bar */} {isDownloading && updateData.launcher.isUpdate && ( -
+
{["update:launcher:downloading", "update:launcher:success", "update:launcher:failed"].includes(downloadType) && (
@@ -477,12 +575,7 @@ export default function LauncherPage() {
)} -
- - firefly animation - -
- {/* Modal */} + {/* Modals */} setIsOpenUpdateDataModal(false)} diff --git a/frontend/src/stores/settingStore.ts b/frontend/src/stores/settingStore.ts index 1184695..8ec1b1a 100644 --- a/frontend/src/stores/settingStore.ts +++ b/frontend/src/stores/settingStore.ts @@ -7,9 +7,11 @@ interface SettingState { gamePath: string; gameDir: string; serverPath: string; + sdkServerPath: string; proxyPath: string; serverVersion: string; proxyVersion: string; + selectedServer: string; closingOption: { isMinimize: boolean; isAsk: boolean; @@ -18,11 +20,13 @@ interface SettingState { extraBackgrounds: string[]; setExtraBackgrounds: (newExtraBackgrounds: string[]) => void; setBackground: (newBackground: string) => void; + setSelectedServer: (newServer: string) => void; setClosingOption: (newClosingOption: { isMinimize: boolean; isAsk: boolean }) => void; setLocale: (newLocale: string) => void; setGamePath: (newGamePath: string) => void; setGameDir: (newGameDir: string) => void; setServerPath: (newServerPath: string) => void; + setSdkServerPath: (newSdkServerPath: string) => void; setProxyPath: (newProxyPath: string) => void; setServerVersion: (newServerVersion: string) => void; setProxyVersion: (newProxyVersion: string) => void; @@ -35,22 +39,26 @@ const useSettingStore = create()( gamePath: "", gameDir: "", serverPath: "", + sdkServerPath: "", proxyPath: "", serverVersion: "", proxyVersion: "", + selectedServer: "", closingOption: { isMinimize: false, isAsk: true, }, - background: "bg-12.jpg", + background: "bg-1.jpeg", extraBackgrounds: [], setExtraBackgrounds: (newExtraBackgrounds: string[]) => set({ extraBackgrounds: newExtraBackgrounds }), setBackground: (newBackground: string) => set({ background: newBackground }), + setSelectedServer: (newServer: string) => set({ selectedServer: newServer }), setClosingOption: (newClosingOption: { isMinimize: boolean; isAsk: boolean }) => set({ closingOption: newClosingOption }), setLocale: (newLocale: string) => set({ locale: newLocale }), setGamePath: (newGamePath: string) => set({ gamePath: newGamePath }), setGameDir: (newGameDir: string) => set({ gameDir: newGameDir }), setServerPath: (newServerPath: string) => set({ serverPath: newServerPath }), + setSdkServerPath: (newSdkServerPath: string) => set({ sdkServerPath: newSdkServerPath }), setProxyPath: (newProxyPath: string) => set({ proxyPath: newProxyPath }), setServerVersion: (newServerVersion: string) => set({ serverVersion: newServerVersion }), setProxyVersion: (newProxyVersion: string) => set({ proxyVersion: newProxyVersion }), @@ -62,4 +70,4 @@ const useSettingStore = create()( ) ); -export default useSettingStore; \ No newline at end of file +export default useSettingStore; diff --git a/image.ico b/image.ico new file mode 100644 index 0000000..7a561b0 Binary files /dev/null and b/image.ico differ diff --git a/internal/fs-service/fs.go b/internal/fs-service/fs.go index 48a0d13..43dfdbb 100644 --- a/internal/fs-service/fs.go +++ b/internal/fs-service/fs.go @@ -128,7 +128,7 @@ func (f *FSService) StartWithConsole(path string) (bool, string) { base := strings.ToLower(filepath.Base(path)) if base == "launcher.exe" || base == "starrail.exe" { application.Get().Event.Emit("game:exit") - } else if base == "firefly-go_win.exe" || base == "gameserver.exe" { + } else if base == "firefly-go_win.exe" || base == "gameserver.exe" || base == "gameserver-go.exe" || base == "server.exe" || base == "sdkserver-go.exe" || base == "sdkserver.exe" { application.Get().Event.Emit("server:exit") } else if base == "firefly-go-proxy.exe" || base == "proxy.exe" { application.Get().Event.Emit("proxy:exit") diff --git a/internal/git-service/launcher.go b/internal/git-service/launcher.go index 90cb9ae..b856887 100644 --- a/internal/git-service/launcher.go +++ b/internal/git-service/launcher.go @@ -40,9 +40,11 @@ func (g *GitService) GetLatestLauncherVersion() (bool, string, string) { } } - // Fallback to Gitea/Forgejo/GitHub Releases API + client := &http.Client{Timeout: 10 * time.Second} + + // Fallback to Gitea Releases API if constant.LauncherGitUrl != "" { - resp, err := http.Get(constant.LauncherGitUrl) + resp, err := client.Get(constant.LauncherGitUrl) if err == nil { defer resp.Body.Close() body, readErr := io.ReadAll(resp.Body) @@ -55,7 +57,23 @@ func (g *GitService) GetLatestLauncherVersion() (bool, string, string) { } } - return false, "", "no launcher updates found" + // Fallback to Gitea Tags API + tagsURL := "https://gaytea.cod-algieba.ts.net/api/v1/repos/GaCy/G-Launcher/tags" + resp, err := client.Get(tagsURL) + if err == nil { + defer resp.Body.Close() + body, readErr := io.ReadAll(resp.Body) + if readErr == nil { + var tags []struct { + Name string `json:"name"` + } + if json.Unmarshal(body, &tags) == nil && len(tags) > 0 { + return true, tags[0].Name, "" + } + } + } + + return true, constant.CurrentLauncherVersion, "" } func (g *GitService) UpdateLauncherProgress(version string) (bool, string) { diff --git a/internal/git-service/server.go b/internal/git-service/server.go index 882987c..6652994 100644 --- a/internal/git-service/server.go +++ b/internal/git-service/server.go @@ -2,26 +2,31 @@ package gitService import ( "encoding/json" + "fmt" "g-launcher/pkg/constant" "g-launcher/pkg/models" - "fmt" "io" "net/http" "os" "path/filepath" + "strings" "time" "github.com/wailsapp/wails/v3/pkg/application" ) func (g *GitService) GetLatestServerVersion() (bool, string, string) { - resp, err := http.Get(constant.ServerGitUrl) + client := &http.Client{Timeout: 15 * time.Second} + resp, err := client.Get(constant.ServerGitUrl) if err != nil { return false, "", err.Error() } defer resp.Body.Close() - body, _ := io.ReadAll(resp.Body) + body, err := io.ReadAll(resp.Body) + if err != nil { + return false, "", err.Error() + } var releases []models.ReleaseType err = json.Unmarshal(body, &releases) @@ -37,35 +42,166 @@ func (g *GitService) GetLatestServerVersion() (bool, string, string) { } func (g *GitService) DownloadServerProgress(version string) (bool, string) { - asset, ok := g.getReleaseAsset(version, constant.ServerGitUrl, constant.ServerZipFile) - if !ok { - return false, "no release found" + client := &http.Client{Timeout: 15 * time.Second} + resp, err := client.Get(constant.ServerGitUrl) + if err != nil { + return false, fmt.Sprintf("fetch server releases: %v", err) + } + defer resp.Body.Close() + + body, err := io.ReadAll(resp.Body) + if err != nil { + return false, fmt.Sprintf("read server releases: %v", err) + } + + var releases []*models.ReleaseType + if err := json.Unmarshal(body, &releases); err != nil || len(releases) == 0 { + return false, "no releases found on server repository" + } + + var targetRelease *models.ReleaseType + for _, rel := range releases { + if rel.TagName == version { + targetRelease = rel + break + } + } + if targetRelease == nil && len(releases) > 0 { + targetRelease = releases[0] + } + if targetRelease == nil { + return false, "could not find server release matching version " + version } if err := os.MkdirAll(constant.ServerStorageUrl, 0755); err != nil { return false, err.Error() } - saveFile := filepath.Join(constant.ServerStorageUrl, asset.Name) - tmpPath, err := g.downloadFileParallel(saveFile, asset.BrowserDownloadURL, 4, func(percent float64, speed string) { - application.Get().Event.Emit("download:server", map[string]interface{}{ - "percent": fmt.Sprintf("%.2f", percent), - "speed": speed, - }) - }) - if err != nil { - return false, err.Error() - } - for i := 0; i < 3; i++ { - if err := os.Rename(tmpPath, saveFile); err == nil { - return true, "" + // 1. Search for .zip asset + var zipAsset *models.AssetType + for _, asset := range targetRelease.Assets { + if strings.HasSuffix(strings.ToLower(asset.Name), ".zip") { + aCopy := asset + zipAsset = &aCopy + break } - time.Sleep(300 * time.Millisecond) } - return false, "failed to rename tmp file after retries" + + if zipAsset != nil { + // Case A: ZIP archive found + saveZipPath := filepath.Join(constant.ServerStorageUrl, zipAsset.Name) + tmpPath, err := g.downloadFileParallel(saveZipPath, zipAsset.BrowserDownloadURL, 4, func(percent float64, speed string) { + application.Get().Event.Emit("download:server", map[string]interface{}{ + "percent": fmt.Sprintf("%.2f", percent), + "speed": speed, + }) + }) + if err != nil { + return false, fmt.Sprintf("download server zip: %v", err) + } + + renamed := false + for i := 0; i < 3; i++ { + if err := os.Rename(tmpPath, saveZipPath); err == nil { + renamed = true + break + } + time.Sleep(300 * time.Millisecond) + } + if !renamed { + os.Remove(tmpPath) + return false, "failed to rename downloaded server zip" + } + + // Unzip immediately + if err := g.unzipParallel(saveZipPath, constant.ServerStorageUrl); err != nil { + return false, fmt.Sprintf("unzip server: %v", err) + } + os.Remove(saveZipPath) + return true, "" + } + + // Case B: No ZIP archive, download sdkserver and server executables + var sdkAsset, serverAsset *models.AssetType + for _, asset := range targetRelease.Assets { + nameLower := strings.ToLower(asset.Name) + if strings.Contains(nameLower, "sdkserver") { + aCopy := asset + sdkAsset = &aCopy + } else if strings.Contains(nameLower, "server") { + aCopy := asset + serverAsset = &aCopy + } + } + + if sdkAsset == nil && serverAsset == nil { + return false, "no zip or server executable assets found in release" + } + + if sdkAsset != nil { + saveSdk := filepath.Join(constant.ServerStorageUrl, sdkAsset.Name) + tmpPath, err := g.downloadFileParallel(saveSdk, sdkAsset.BrowserDownloadURL, 4, func(percent float64, speed string) { + application.Get().Event.Emit("download:server", map[string]interface{}{ + "percent": fmt.Sprintf("%.2f", percent*0.5), + "speed": speed, + }) + }) + if err == nil { + _ = os.Rename(tmpPath, saveSdk) + } + } + + if serverAsset != nil { + saveServer := filepath.Join(constant.ServerStorageUrl, serverAsset.Name) + tmpPath, err := g.downloadFileParallel(saveServer, serverAsset.BrowserDownloadURL, 4, func(percent float64, speed string) { + application.Get().Event.Emit("download:server", map[string]interface{}{ + "percent": fmt.Sprintf("%.2f", 50.0+percent*0.5), + "speed": speed, + }) + }) + if err == nil { + _ = os.Rename(tmpPath, saveServer) + } + } + + return true, "" } func (g *GitService) UnzipServer() { - g.unzipParallel(filepath.Join(constant.ServerStorageUrl, constant.ServerZipFile), constant.ServerStorageUrl) - os.Remove(filepath.Join(constant.ServerStorageUrl, constant.ServerZipFile)) -} \ No newline at end of file + entries, err := os.ReadDir(constant.ServerStorageUrl) + if err != nil { + return + } + for _, entry := range entries { + if !entry.IsDir() && strings.HasSuffix(strings.ToLower(entry.Name()), ".zip") { + zipPath := filepath.Join(constant.ServerStorageUrl, entry.Name()) + _ = g.unzipParallel(zipPath, constant.ServerStorageUrl) + _ = os.Remove(zipPath) + } + } +} + +func (g *GitService) FindServerExecutables() (string, string) { + serverDir := constant.ServerStorageUrl + var gameServer, sdkServer string + + // Candidate filenames for game server + for _, name := range []string{"gameserver-go.exe", "server.exe", "gameserver.exe", "firefly-go_win.exe"} { + p := filepath.Join(serverDir, name) + if info, err := os.Stat(p); err == nil && !info.IsDir() { + gameServer = p + break + } + } + + // Candidate filenames for sdk server + for _, name := range []string{"sdkserver-go.exe", "sdkserver.exe"} { + p := filepath.Join(serverDir, name) + if info, err := os.Stat(p); err == nil && !info.IsDir() { + sdkServer = p + break + } + } + + return gameServer, sdkServer +} diff --git a/pkg/constant/constant.go b/pkg/constant/constant.go index b8761f1..5f3dd70 100644 --- a/pkg/constant/constant.go +++ b/pkg/constant/constant.go @@ -1,7 +1,7 @@ package constant const ProxyGitUrl = "https://git.kain.io.vn/api/v1/repos/Firefly-Shelter/FireflyGo_Proxy/releases" -const ServerGitUrl = "https://git.kain.io.vn/api/v1/repos/Firefly-Shelter/FireflyGo_Local_Archive/releases" +const ServerGitUrl = "https://gaytea.cod-algieba.ts.net/api/v1/repos/GaCySR/GaCy-GO/releases" const LauncherGitUrl = "https://gaytea.cod-algieba.ts.net/api/v1/repos/GaCy/G-Launcher/releases" const LauncherManifestURL = "https://gaytea.cod-algieba.ts.net/GaCy/G-Launcher/releases/download/latest/latest.json" const LauncherDownloadURL = "https://gaytea.cod-algieba.ts.net/GaCy/G-Launcher/releases/download/latest/G-Launcher.exe" @@ -11,7 +11,7 @@ const LauncherBuildTempDir = "temp/updater_build" const ServerStorageUrl = "./server" const ProxyStorageUrl = "./proxy" -const ServerZipFile = "prebuild_win_x86.zip" +const ServerZipFile = "gacy 4.6.54.zip" const ProxyFile = "firefly-go-proxy.exe" const LauncherFile = "G-Launcher.exe" const TempUrl = "./temp"