diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java index e5e935eb1a..8a80a0ba1b 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java @@ -40,6 +40,7 @@ import org.jackhuang.hmcl.ui.wizard.WizardController; import org.jackhuang.hmcl.ui.wizard.WizardPage; +import java.nio.charset.StandardCharsets; import java.util.Map; import static javafx.beans.binding.Bindings.createBooleanBinding; @@ -121,8 +122,25 @@ public void cleanup(Map settings) { } protected void onInstall() { - controller.getSettings().put("name", txtName.getText()); - controller.onFinish(); + String name = txtName.getText(); + + // Check for non-ASCII characters. + if (!StandardCharsets.US_ASCII.newEncoder().canEncode(name)) { + Controllers.dialog(new MessageDialogPane.Builder( + i18n("install.name.invalid"), + i18n("message.warning"), + MessageDialogPane.MessageType.QUESTION) + .yesOrNo(() -> { + controller.getSettings().put("name", name); + controller.onFinish(); + }, () -> { + // The user selects Cancel and does nothing. + }) + .build()); + } else { + controller.getSettings().put("name", name); + controller.onFinish(); + } } @Override diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/LocalModpackPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/LocalModpackPage.java index eb9e3f441a..9c3b4fab2e 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/LocalModpackPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/LocalModpackPage.java @@ -42,6 +42,7 @@ import java.io.File; import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.util.Map; import java.util.Optional; @@ -149,10 +150,27 @@ public void cleanup(Map settings) { } protected void onInstall() { - if (!txtModpackName.validate()) return; - controller.getSettings().put(MODPACK_NAME, txtModpackName.getText()); - controller.getSettings().put(MODPACK_CHARSET, charset); - controller.onFinish(); + String name = txtModpackName.getText(); + + // Check for non-ASCII characters. + if (!StandardCharsets.US_ASCII.newEncoder().canEncode(name)) { + Controllers.dialog(new MessageDialogPane.Builder( + i18n("install.name.invalid"), + i18n("message.warning"), + MessageDialogPane.MessageType.QUESTION) + .yesOrNo(() -> { + controller.getSettings().put(MODPACK_NAME, name); + controller.getSettings().put(MODPACK_CHARSET, charset); + controller.onFinish(); + }, () -> { + // The user selects Cancel and does nothing. + }) + .build()); + } else { + controller.getSettings().put(MODPACK_NAME, name); + controller.getSettings().put(MODPACK_CHARSET, charset); + controller.onFinish(); + } } protected void onDescribe() { diff --git a/HMCL/src/main/resources/assets/lang/I18N.properties b/HMCL/src/main/resources/assets/lang/I18N.properties index 79f5b8394b..03edcab3cb 100644 --- a/HMCL/src/main/resources/assets/lang/I18N.properties +++ b/HMCL/src/main/resources/assets/lang/I18N.properties @@ -696,6 +696,7 @@ install.installer.quilt-api=QSL/QFAPI install.installer.version=%s install.installer.external_version=%s (Installed by external process, which cannot be configured) install.modpack=Install Modpack +install.name.invalid=The name contains non-ASCII characters (such as emoji or CJK characters).\nIt is recommended to modify the name to include only English letters, numbers and underscores to avoid potential issues when launching the game. \nDo you want to proceed with the installation? install.new_game=Install Instance install.new_game.already_exists=This instance name already exists. Please use another name. install.new_game.current_game_version=Current Instance Version diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh.properties b/HMCL/src/main/resources/assets/lang/I18N_zh.properties index 4058fadbfb..f6bcc77c28 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh.properties @@ -510,6 +510,7 @@ install.installer.quilt-api=QSL/QFAPI install.installer.version=%s install.installer.external_version=%s [由外部安裝的版本,無法解除安裝或更換] install.modpack=安裝模組包 +install.name.invalid=名稱中包含非 ASCII 字元(如 Emoji 表情或中文字元)。\n建議修改名稱,名稱建議僅包含英文字母、數字和底線,以防啟動遊戲時出現問題。是否繼續安裝? install.new_game=安裝新實例 install.new_game.already_exists=此實例已經存在,請重新命名 install.new_game.current_game_version=目前遊戲版本 diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties index a521d602fd..e516c160d9 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties @@ -521,6 +521,7 @@ install.installer.quilt-api=QSL/QFAPI install.installer.version=%s install.installer.external_version=%s (由外部安装的版本,无法卸载或更换) install.modpack=安装整合包 +install.name.invalid=名称中包含非 ASCII 字符(如 Emoji 表情或中文字符)。\n建议修改名称,名称建议仅包含英文字母、数字和下划线,以防启动游戏时出现问题。是否继续安装? install.new_game=安装新游戏 install.new_game.already_exists=此版本已经存在,请换一个名字 install.new_game.current_game_version=当前游戏版本