feat(ui): rebrand to G Launcher, add side server selector, update wallpaper and app icon, integrate GaCy-GO PS

This commit is contained in:
CAtlas0784 committed 2026-10-30 22:33:21 +07:00
1 parent 023ae32b58
commit 25843372ad
21 files changed
+2414 -2140

No files matched your search

+1
View File
@@ -34,6 +34,7 @@
| **Thai Mod Engine (ExcelData)** | ✅ | ✅ | ✅ | ⚠️ รอเกมจริง | `internal/language-service/thai-patch.go` มีระบบ `.backup` | | **Thai Mod Engine (ExcelData)** | ✅ | ✅ | ✅ | ⚠️ รอเกมจริง | `internal/language-service/thai-patch.go` มีระบบ `.backup` |
| **Multi-Language (i18n)** | ✅ | ✅ | ✅ | ✅ | 6 ภาษา (`th`, `en`, `ja`, `ko`, `vi`, `zh`) ใน `frontend/public/locales/` | | **Multi-Language (i18n)** | ✅ | ✅ | ✅ | ✅ | 6 ภาษา (`th`, `en`, `ja`, `ko`, `vi`, `zh`) ใน `frontend/public/locales/` |
| **Standalone Tool Extraction** | ✅ | ✅ | ✅ | ✅ | แตกไฟล์ `assets/` (`7za.exe`, `hpatchz.exe`, `zift.exe`) ลง `bin/` | | **Standalone Tool Extraction** | ✅ | ✅ | ✅ | ✅ | แตกไฟล์ `assets/` (`7za.exe`, `hpatchz.exe`, `zift.exe`) ลง `bin/` |
| **Server Selection & GaCy PS** | ✅ | ✅ | ✅ | ✅ | ปุ่มเลือกเซิร์ฟเวอร์ด้านข้าง + ระบบดาวน์โหลด GaCy-GO (ZIP หรือ standalone sdk/server) |
--- ---
Binary file not shown.

Before

Width:  |  Height:  |  Size: 157 KiB

After

Width:  |  Height:  |  Size: 361 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 592 KiB

After

Width:  |  Height:  |  Size: 361 KiB

@@ -30,6 +30,13 @@ export function DownloadServerProgress(version) {
return $Call.ByID(1818966979, version); return $Call.ByID(1818966979, version);
} }
/**
* @returns {$CancellablePromise<[string, string]>}
*/
export function FindServerExecutables() {
return $Call.ByID(1413748964);
}
/** /**
* @returns {$CancellablePromise<[boolean, string, string]>} * @returns {$CancellablePromise<[boolean, string, string]>}
*/ */
Binary file not shown.

Before

Width:  |  Height:  |  Size: 305 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 KiB

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

After

Width:  |  Height:  |  Size: 361 KiB

+1 -1
View File
@@ -128,7 +128,7 @@ func (f *FSService) StartWithConsole(path string) (bool, string) {
base := strings.ToLower(filepath.Base(path)) base := strings.ToLower(filepath.Base(path))
if base == "launcher.exe" || base == "starrail.exe" { if base == "launcher.exe" || base == "starrail.exe" {
application.Get().Event.Emit("game:exit") 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") application.Get().Event.Emit("server:exit")
} else if base == "firefly-go-proxy.exe" || base == "proxy.exe" { } else if base == "firefly-go-proxy.exe" || base == "proxy.exe" {
application.Get().Event.Emit("proxy:exit") application.Get().Event.Emit("proxy:exit")
+21 -3
View File
@@ -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 != "" { if constant.LauncherGitUrl != "" {
resp, err := http.Get(constant.LauncherGitUrl) resp, err := client.Get(constant.LauncherGitUrl)
if err == nil { if err == nil {
defer resp.Body.Close() defer resp.Body.Close()
body, readErr := io.ReadAll(resp.Body) 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) { func (g *GitService) UpdateLauncherProgress(version string) (bool, string) {
+159 -23
View File
@@ -2,26 +2,31 @@ package gitService
import ( import (
"encoding/json" "encoding/json"
"fmt"
"g-launcher/pkg/constant" "g-launcher/pkg/constant"
"g-launcher/pkg/models" "g-launcher/pkg/models"
"fmt"
"io" "io"
"net/http" "net/http"
"os" "os"
"path/filepath" "path/filepath"
"strings"
"time" "time"
"github.com/wailsapp/wails/v3/pkg/application" "github.com/wailsapp/wails/v3/pkg/application"
) )
func (g *GitService) GetLatestServerVersion() (bool, string, string) { 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 { if err != nil {
return false, "", err.Error() return false, "", err.Error()
} }
defer resp.Body.Close() 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 var releases []models.ReleaseType
err = json.Unmarshal(body, &releases) err = json.Unmarshal(body, &releases)
@@ -37,35 +42,166 @@ func (g *GitService) GetLatestServerVersion() (bool, string, string) {
} }
func (g *GitService) DownloadServerProgress(version string) (bool, string) { func (g *GitService) DownloadServerProgress(version string) (bool, string) {
asset, ok := g.getReleaseAsset(version, constant.ServerGitUrl, constant.ServerZipFile) client := &http.Client{Timeout: 15 * time.Second}
if !ok { resp, err := client.Get(constant.ServerGitUrl)
return false, "no release found" 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 { if err := os.MkdirAll(constant.ServerStorageUrl, 0755); err != nil {
return false, err.Error() return false, err.Error()
} }
saveFile := filepath.Join(constant.ServerStorageUrl, asset.Name) // 1. Search for .zip asset
tmpPath, err := g.downloadFileParallel(saveFile, asset.BrowserDownloadURL, 4, func(percent float64, speed string) { var zipAsset *models.AssetType
application.Get().Event.Emit("download:server", map[string]interface{}{ for _, asset := range targetRelease.Assets {
"percent": fmt.Sprintf("%.2f", percent), if strings.HasSuffix(strings.ToLower(asset.Name), ".zip") {
"speed": speed, aCopy := asset
}) zipAsset = &aCopy
}) break
if err != nil {
return false, err.Error()
}
for i := 0; i < 3; i++ {
if err := os.Rename(tmpPath, saveFile); err == nil {
return true, ""
} }
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() { func (g *GitService) UnzipServer() {
g.unzipParallel(filepath.Join(constant.ServerStorageUrl, constant.ServerZipFile), constant.ServerStorageUrl) entries, err := os.ReadDir(constant.ServerStorageUrl)
os.Remove(filepath.Join(constant.ServerStorageUrl, constant.ServerZipFile)) 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
} }
+2 -2
View File
@@ -1,7 +1,7 @@
package constant package constant
const ProxyGitUrl = "https://git.kain.io.vn/api/v1/repos/Firefly-Shelter/FireflyGo_Proxy/releases" 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 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 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" 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 ServerStorageUrl = "./server"
const ProxyStorageUrl = "./proxy" const ProxyStorageUrl = "./proxy"
const ServerZipFile = "prebuild_win_x86.zip" const ServerZipFile = "gacy 4.6.54.zip"
const ProxyFile = "firefly-go-proxy.exe" const ProxyFile = "firefly-go-proxy.exe"
const LauncherFile = "G-Launcher.exe" const LauncherFile = "G-Launcher.exe"
const TempUrl = "./temp" const TempUrl = "./temp"