Repository: HMCL-dev/HMCL (language: java)

Issue:
[Bug] HMCL 游戏崩溃窗口的崩溃原因分析显示出错
### 平台 | Platform

-

### 问题描述 | Problem Description

![image](https://github.com/HMCL-dev/HMCL/assets/64117916/bf0b1d24-7921-405e-b6f9-e1aa40aacf67)

初步怀疑是因为显示多条原因那块出现问题（我见到很多图都是有多条原因时出错）

### 启动器崩溃报告 / 启动器日志文件 | Launcher Crash Report / Launcher Log File

-


Discussion / hints:
![003](https://github.com/HMCL-dev/HMCL/assets/64117916/0f839661-ccef-409e-be39-8521ed393e77)
![001](https://github.com/HMCL-dev/HMCL/assets/64117916/8df4ec00-3039-4ea1-a5aa-51f8c96c9497)
![002](https://github.com/HMCL-dev/HMCL/assets/64117916/ee765732-aef8-4542-a585-4a7e3935f4e2)

经测试可能是 https://github.com/HMCL-dev/HMCL/commit/ffeabbf1f144ba14462e27c2ac9d46e231c1482e 引进的
![image](https://github.com/HMCL-dev/HMCL/assets/64117916/b37cb7a5-cd23-4c19-b88c-bc4ea29603a6)

难道是不支持解析这个？
![image](https://github.com/HMCL-dev/HMCL/assets/64117916/b24a318c-c301-4b39-ac2d-73a296cedf4a)

不对劲

Fix patch:
diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java
index a00b8ee9a6..94fc650fe1 100644
--- a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java
+++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java
@@ -835,7 +835,7 @@ public void onLog(String log, boolean isErrorStream) {
         @Override
         public void onExit(int exitCode, ExitType exitType) {
             if (showLogs) {
-                Platform.runLater(() -> logWindow.logLine(String.format("[HMCL ProcessListener] Minecraft exit with code %d(0x%x).", exitCode, exitCode), Log4jLevel.INFO));
+                Platform.runLater(() -> logWindow.logLine(String.format("[HMCL ProcessListener] Minecraft exit with code %d(0x%x), type is %s.", exitCode, exitCode, exitType), Log4jLevel.INFO));
             }
 
             launchingLatch.countDown();
diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/LogExporter.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/LogExporter.java
index 74d8b53876..f5de090624 100644
--- a/HMCL/src/main/java/org/jackhuang/hmcl/game/LogExporter.java
+++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/LogExporter.java
@@ -94,8 +94,12 @@ private static void processLogs(Path directory, String fileExtension, String log
                 if (Files.isRegularFile(file)) {
                     FileTime time = Files.readAttributes(file, BasicFileAttributes.class).lastModifiedTime();
                     if (time.toMillis() >= processStartTime) {
-                        String crashLog = Logging.filterForbiddenToken(FileUtils.readText(file, OperatingSystem.NATIVE_CHARSET));
-                        zipper.putTextFile(crashLog, file.getFileName().toString());
+                        try {
+                            String crashLog = Logging.filterForbiddenToken(FileUtils.readText(file, OperatingSystem.NATIVE_CHARSET));
+                            zipper.putTextFile(crashLog, file.getFileName().toString());
+                        } catch (IOException e) {
+                            LOG.log(Level.WARNING, "Failed to read log file: " + file, e);
+                        }
                     }
                 }
             }
diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java
index 1db2b3b231..caf7d834de 100644
--- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java
+++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java
@@ -78,6 +78,7 @@
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Method;
 import java.net.URI;
+import java.net.URISyntaxException;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.List;
@@ -932,7 +933,14 @@ public static List<Node> parseSegment(String segment, Consumer<String> hyperlink
                     if ("a".equals(element.getTagName())) {
                         String href = element.getAttribute("href");
                         JFXHyperlink hyperlink = new JFXHyperlink(element.getTextContent());
-                        hyperlink.setOnAction(e -> hyperlinkAction.accept(href));
+                        hyperlink.setOnAction(e -> {
+                            String link = href;
+                            try {
+                                link = new URI(href).toASCIIString();
+                            } catch (URISyntaxException ignored) {
+                            }
+                            hyperlinkAction.accept(link);
+                        });
                         texts.add(hyperlink);
                     } else if ("b".equals(element.getTagName())) {
                         Text text = new Text(element.getTextContent());
diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameCrashWindow.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameCrashWindow.java
index 9b719766c0..a43796177b 100644
--- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameCrashWindow.java
+++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameCrashWindow.java
@@ -46,6 +46,7 @@
 import org.jackhuang.hmcl.util.Log4jLevel;
 import org.jackhuang.hmcl.util.Logging;
 import org.jackhuang.hmcl.util.Pair;
+import org.jackhuang.hmcl.util.StringUtils;
 import org.jackhuang.hmcl.util.io.FileUtils;
 import org.jackhuang.hmcl.util.platform.Architecture;
 import org.jackhuang.hmcl.util.platform.CommandBuilder;
@@ -103,7 +104,7 @@ public GameCrashWindow(ManagedProcess managedProcess, ProcessListener.ExitType e
 
         memory = Optional.ofNullable(launchOptions.getMaxMemory()).map(i -> i + " MB").orElse("-");
 
-        total_memory = Optional.ofNullable(OperatingSystem.TOTAL_MEMORY).map(i -> i + " MB").orElse("-");
+        total_memory = OperatingSystem.TOTAL_MEMORY + " MB";
 
         this.java = launchOptions.getJava().getArchitecture() == Architecture.SYSTEM_ARCH
                 ? launchOptions.getJava().getVersion()
@@ -170,56 +171,51 @@ private void analyzeCrashReport() {
                     keywords.addAll(pair.getValue());
                 }
 
-                List<Node> segments = new ArrayList<>();
+                List<Node> segments = new ArrayList<>(FXUtils.parseSegment(i18n("game.crash.feedback"), Controllers::onHyperlinkAction));
 
-                boolean hasMultipleRules = results.keySet().stream().distinct().count() > 1;
-                if (hasMultipleRules) {
-                    segments.addAll(FXUtils.parseSegment(i18n("game.crash.feedback"), Controllers::onHyperlinkAction));
+                LOG.log(Level.INFO, "Number of reasons: " + results.size());
+                if (results.size() > 1) {
                     segments.add(new Text("\n"));
                     segments.addAll(FXUtils.parseSegment(i18n("game.crash.reason.multiple"), Controllers::onHyperlinkAction));
-                    LOG.log(Level.INFO, "Multiple reasons detected");
+                } else {
+                    segments.add(new Text("\n\n"));
                 }
 
                 for (CrashReportAnalyzer.Result result : results.values()) {
+                    String message;
                     switch (result.getRule()) {
                         case TOO_OLD_JAVA:
-                            segments.addAll(FXUtils.parseSegment(i18n("game.crash.reason.too_old_java",
-                                    CrashReportAnalyzer.getJavaVersionFromMajorVersion(Integer.parseInt(result.getMatcher().group("expected")))), Controllers::onHyperlinkAction));
+                            message = i18n("game.crash.reason.too_old_java", CrashReportAnalyzer.getJavaVersionFromMajorVersion(Integer.parseInt(result.getMatcher().group("expected"))));
                             break;
                         case MOD_RESOLUTION_CONFLICT:
                         case MOD_RESOLUTION_MISSING:
                         case MOD_RESOLUTION_COLLECTION:
-                            segments.addAll(FXUtils.parseSegment(i18n("game.crash.reason." + result.getRule().name().toLowerCase(Locale.ROOT),
+                            message = i18n("game.crash.reason." + result.getRule().name().toLowerCase(Locale.ROOT),
                                     translateFabricModId(result.getMatcher().group("sourcemod")),
                                     parseFabricModId(result.getMatcher().group("destmod")),
-                                    parseFabricModId(result.getMatcher().group("destmod"))), Controllers::onHyperlinkAction));
+                                    parseFabricModId(result.getMatcher().group("destmod")));
                             break;
                         case MOD_RESOLUTION_MISSING_MINECRAFT:
-                            segments.addAll(FXUtils.parseSegment(i18n("game.crash.reason." + result.getRule().name().toLowerCase(Locale.ROOT),
+                            message = i18n("game.crash.reason." + result.getRule().name().toLowerCase(Locale.ROOT),
                                     translateFabricModId(result.getMatcher().group("mod")),
-                                    result.getMatcher().group("version")), Controllers::onHyperlinkAction));
+                                    result.getMatcher().group("version"));
                             break;
                         case MOD_FOREST_OPTIFINE:
                         case TWILIGHT_FOREST_OPTIFINE:
                         case PERFORMANT_FOREST_OPTIFINE:
                         case JADE_FOREST_OPTIFINE:
-                            segments.addAll(FXUtils.parseSegment(i18n("game.crash.reason.mod", "OptiFine"), Controllers::onHyperlinkAction));
+                            message = i18n("game.crash.reason.mod", "OptiFine");
+                            LOG.log(Level.INFO, "Crash cause: " + result.getRule() + ": " + i18n("game.crash.reason.mod", "OptiFine"));
                             break;
                         default:
-                            segments.addAll(FXUtils.parseSegment(i18n("game.crash.reason." + result.getRule().name().toLowerCase(Locale.ROOT),
+                            message = i18n("game.crash.reason." + result.getRule().name().toLowerCase(Locale.ROOT),
                                     Arrays.stream(result.getRule().getGroupNames()).map(groupName -> result.getMatcher().group(groupName))
-                                            .toArray()), Controllers::onHyperlinkAction));
+                                            .toArray());
                             break;
                     }
-                    segments.add(new Text("\n"));
-                    if (hasMultipleRules) {
-                        segments.add(new Text("\n"));
-                    } else {
-                        segments.add(new Text("\n"));
-                        segments.addAll(FXUtils.parseSegment(i18n("game.crash.feedback"), Controllers::onHyperlinkAction));
-                        segments.add(new Text("\n"));
-                    }
-                    LOG.log(Level.INFO, "Crash cause: " + result.getRule());
+                    LOG.log(Level.INFO, "Crash cause: " + result.getRule() + ": " + message);
+                    segments.addAll(FXUtils.parseSegment(message, Controllers::onHyperlinkAction));
+                    segments.add(new Text("\n\n"));
                 }
                 if (results.isEmpty()) {
                     if (!keywords.isEmpty()) {
@@ -285,15 +281,20 @@ private void exportGameCrashInfo() {
                         logs.stream().map(Pair::getKey).collect(Collectors.joining(OperatingSystem.LINE_SEPARATOR)))
                 .thenComposeAsync(logs ->
                         LogExporter.exportLogs(logFile, repository, launchOptions.getVersionName(), logs, new CommandBuilder().addAll(managedProcess.getCommands()).toString()))
-                .thenRunAsync(() -> {
-                    FXUtils.showFileInExplorer(logFile);
+                .handleAsync((result, exception) -> {
+                    Alert alert;
+
+                    if (exception == null) {
+                        FXUtils.showFileInExplorer(logFile);
+                        alert = new Alert(Alert.AlertType.INFORMATION, i18n("settings.launcher.launcher_log.export.success", logFile));
+                    } else {
+                        LOG.log(Level.WARNING, "Failed to export game crash info", exception);
+                        alert = new Alert(Alert.AlertType.WARNING, i18n("settings.launcher.launcher_log.export.failed") + "\n" + StringUtils.getStackTrace(exception));
+                    }
 
-                    Alert alert = new Alert(Alert.AlertType.INFORMATION, i18n("settings.launcher.launcher_log.export.success", logFile));
                     alert.setTitle(i18n("settings.launcher.launcher_log.export"));
                     alert.showAndWait();
-                }, Schedulers.javafx())
-                .exceptionally(e -> {
-                    LOG.log(Level.WARNING, "Failed to export game crash info", e);
+
                     return null;
                 });
     }
diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/SettingsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/SettingsPage.java
index b534709448..eec120bb19 100644
--- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/SettingsPage.java
+++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/SettingsPage.java
@@ -32,6 +32,7 @@
 import org.jackhuang.hmcl.upgrade.UpdateChecker;
 import org.jackhuang.hmcl.upgrade.UpdateHandler;
 import org.jackhuang.hmcl.util.Logging;
+import org.jackhuang.hmcl.util.StringUtils;
 import org.jackhuang.hmcl.util.i18n.Locales;
 import org.jackhuang.hmcl.util.io.FileUtils;
 
@@ -132,7 +133,7 @@ protected void onExportLogs() {
             try {
                 Files.write(logFile, Logging.getRawLogs());
             } catch (IOException e) {
-                Platform.runLater(() -> Controllers.dialog(i18n("settings.launcher.launcher_log.export.failed") + "\n" + e, null, MessageType.ERROR));
+                Platform.runLater(() -> Controllers.dialog(i18n("settings.launcher.launcher_log.export.failed") + "\n" + StringUtils.getStackTrace(e), null, MessageType.ERROR));
                 LOG.log(Level.WARNING, "Failed to export logs", e);
                 return;
             }
diff --git a/HMCL/src/main/resources/assets/lang/I18N_es.properties b/HMCL/src/main/resources/assets/lang/I18N_es.properties
index 1e29dc952a..d89a2a4fd4 100644
--- a/HMCL/src/main/resources/assets/lang/I18N_es.properties
+++ b/HMCL/src/main/resources/assets/lang/I18N_es.properties
@@ -490,7 +490,7 @@ game.crash.reason.mod_profile_causes_game_crash=El juego actual no puede seguir
 game.crash.reason.fabric_reports_an_error_and_gives_a_solution=Forge puede haber dado un mensaje de error.\nPuede ver el registro y realizar las acciones correspondientes de acuerdo con la información de registro en el informe de errores.\nSi no ve un mensaje de error, puede consultar el informe de errores para saber cómo ocurrió el error.
 game.crash.reason.java_version_is_too_high=El juego actual se bloqueó porque la versión de Java es demasiado alta y no puede seguir ejecutándose.\nCambie a una versión anterior de Java en la pestaña Java Path de Configuración global del juego o Configuración específica del juego antes de iniciar el juego.\nSi no es así, puede descargarlo desde <a href="https://www.java.com/download/">java.com (Java8)</a> o <a href="https://bell-sw.com/pages/downloads/#downloads">BellSoft Liberica Full JRE (Java17)</a> y otras plataformas para descargar e instalar una (reinicie el iniciador después de la instalación).
 game.crash.reason.mod_name=El juego actual no puede continuar ejecutándose debido a un problema con el nombre del archivo mod. El nombre del archivo de\nMod solo debe usar mayúsculas y minúsculas (Aa ~ Zz), números (0 ~ 9), líneas horizontales (-), subrayado (_) y puntos (.) en toda la mitad del inglés.\n Por favor, vaya a la carpeta mod para agregar un carácter de Cumplimiento anterior a todos los nombres de archivo mod que no cumplan.
-game.crash.reason.incomplete_forge_installation=O jogo atual não pode continuar devido a uma instalação incompleta do Forge / NeoForge.\nDesinstale e reinstale o Forge em Configurações de versão - Instalação automática.
+game.crash.reason.incomplete_forge_installation=O jogo atual não pode continuar devido a uma instalação incompleta do Forge / NeoForge.\nDesinstale e reinstale o Forge / NeoForge em Configurações de versão - Instalação automática.
 game.crash.reason.forge_error=Forge puede haber proporcionado un mensaje de error. \nPuede ver el registro y realizar las acciones correspondientes de acuerdo con la información de registro en el informe de errores. \nSi no ve un mensaje de error, puede consultar el informe de errores para saber cómo ocurrió el error.\n%1$s
 game.crash.reason.mod_solution0=El juego actual no puede seguir ejecutándose debido a algunos problemas de modificación. \nPuede consultar el registro para ver si hay un mod incorrecto.
 game.crash.reason.mod_profile_causes_game_crash=El juego actual no puede seguir ejecutándose debido a un problema con el perfil de mod. \nPuede consultar el registro del mod defectuoso y su archivo de configuración.
diff --git a/HMCL/src/main/resources/assets/lang/I18N_ja.properties b/HMCL/src/main/resources/assets/lang/I18N_ja.properties
index 902ab15d61..cb158a8be4 100644
--- a/HMCL/src/main/resources/assets/lang/I18N_ja.properties
+++ b/HMCL/src/main/resources/assets/lang/I18N_ja.properties
@@ -364,7 +364,7 @@ game.crash.reason.mod_profile_causes_game_crash=mod プロファイルに問題
 game.crash.reason.fabric_reports_an_error_and_gives_a_solution=Forge がエラー メッセージを表示した可能性があります。 \nログを表示し、エラー レポートのログ情報に従って対応するアクションを実行できます。 \nエラー メッセージが表示されない場合は、エラー レポートをチェックして、エラーがどのように発生したかを知ることができます。
 game.crash.reason.java_version_is_too_high=Java のバージョンが高すぎて実行を継続できないため、現在のゲームがクラッシュしました。 \nゲームを起動する前に、グローバル ゲーム設定またはゲーム固有の設定の Java パス タブで Java の以前のバージョンに切り替えてください。 \nそうでない場合は、<a href="https://www.java.com/download/">java.com (Java8)</a> または <a href="https://bell-sw.com/pages/downloads/#downloads">BellSoft Liberica Full JRE (Java17)</a> およびその他のプラットフォームをダウンロードしてインストールします (インストール後にランチャーを再起動します)。
 game.crash.reason.mod_name=現在のゲームはModファイル名の問題で続行できません。\nModファイル名は、英文の全半角の大文字と小文字（Aa ~ Zz）、数字（0 ~ 9）、横線（-）、アンダースコア（_）、点（.）のみを使用してください。\n上記のコンプライアンス文字をModフォルダに追加してください。
-game.crash.reason.incomplete_forge_installation=Forge / NeoForge のインストールが不完全なため、現在のゲームを続行できません。\nバージョン設定 - 自動インストールで Forge をアンインストールしてから再インストールしてください。
+game.crash.reason.incomplete_forge_installation=Forge / NeoForge のインストールが不完全なため、現在のゲームを続行できません。\nバージョン設定 - 自動インストールで Forge / NeoForge をアンインストールしてから再インストールしてください。
 game.crash.reason.file_already_exists=ファイル %1$s が既に存在するので、現在のゲームは続行できません。\このファイルを削除してもよいと思われる場合は、このファイルをバックアップして、ゲームを再起動してから削除してみてください。
 game.crash.reason.need_jdk11=Java 仮想マシンのバージョンが不適切なため、現在のゲームは実行を続行できません。\nJava 11 をダウンロードしてインストールし、グローバル (特定) ゲーム設定で Java を 11 で始まるバージョンに設定する必要があります。
 game.crash.reason.file_changed=ファイルのチェックサムに失敗したため、現在のゲームを続行できません。\nMinecraft.jar ファイルを手動で変更した場合、変更をロールバックするか、ゲームを再度ダウンロードする必要があります。
diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh.properties b/HMCL/src/main/resources/assets/lang/I18N_zh.properties
index 63b5fc5dc2..8e644eebec 100644
--- a/HMCL/src/main/resources/assets/lang/I18N_zh.properties
+++ b/HMCL/src/main/resources/assets/lang/I18N_zh.properties
@@ -476,7 +476,6 @@ game.crash.reason.too_old_java=當前遊戲因為 Java 虛擬機版本過低，
 game.crash.reason.unknown=原因未知，請點擊日誌按鈕查看詳細訊息。
 game.crash.reason.unsatisfied_link_error=當前遊戲因為缺少本地庫，無法繼續運行。\n這些本地庫缺失：%1$s。\n如果你在全局（特定）遊戲設置中修改了本地庫路徑選項，請你修改回預設模式。\n如果已經在預設模式下，請檢查本地庫缺失是否是 Mod 引起的，或由 HMCL 引起的。如果你確定是 HMCL 引起的，建議你向我們反饋。\n<b>或將游戲路徑中的所有非英文字符的名稱修改為英文字符（例如中文，空格等）</b>\n如果你確實需要自定義本地庫路徑，你需要保證其中包含缺失的本地庫！
 game.crash.reason.failed_to_load_a_library=當前遊戲因為加載本地庫失敗，無法繼續運行。\n如果你在全局（特定）遊戲設置中修改了本地庫路徑選項，請你修改回預設模式。\n如果已經在預設模式下，請檢查本地庫缺失是否是 Mod 引起的，或由 HMCL 引起的。如果你確定是 HMCL 引起的，建議你向我們反饋。\n<b>或將游戲路徑中的所有非英文字符的名稱修改為英文字符（例如中文，空格等）</b>\n如果你確實需要自定義本地庫路徑，你需要保證其中包含缺失的本地庫！
-game.crash.reason.unsatisfied_link_error=當前遊戲因為缺少本地庫，無法繼續運行。\n這些本地庫缺失：%1$s。\n如果你在遊戲設置中修改了本地庫路徑選項，請你修改回預設模式。\n如果您正在使用預設模式，請檢查遊戲路徑是否僅包含英文字母（大寫和小寫）、數字和底線。\n如果是，則請調查是由於 Mod 或者 HMCL 導致了本地庫缺失的問題。如果你確定是 HMCL 引起的，建議你向我們回饋。\n如果你確實需要自訂本地庫路徑，你需要保證其中包含缺失的本地庫。
 game.crash.title=遊戲意外退出
 game.directory=遊戲路徑
 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 abcf2d6e09..5ebb851f68 100644
--- a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties
+++ b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties
@@ -417,13 +417,13 @@ game.crash.reason.multiple=检测到多个原因：\n\n
 game.crash.reason.debug_crash=当前游戏因为手动触发崩溃，无法继续运行。\n事实上游戏并没有问题，问题都是你造成的！
 game.crash.reason.duplicated_mod=当前游戏因为模组 %1$s 重复安装，无法继续运行。\n%2$s\n每种模组只能安装一个，请你删除多余的模组再试。
 game.crash.reason.entity=当前游戏因为某个实体不能正常工作，无法继续运行。\n你可以尝试通过 <a href="https://www.mcedit.net">MCEdit</a> 工具编辑存档删除该实体，或者直接删除相应的模组。\n实体类型：%1$s\n实体坐标：%2$s 
-game.crash.reason.fabric_version_0_12=Fabric 0.12 及以上版本与当前已经安装的模组可能不兼容，你需要将 Fabric 降级至 0.11.7。 
-game.crash.reason.fabric_warnings=Fabric 提供了一些警告信息：\n%1$s 
-game.crash.reason.file_already_exists=当前游戏因为文件 %1$s 已经存在，无法继续运行。\n如果你认为这个文件可以删除，你可以在备份这个文件后尝试删除它，并重新启动游戏。 
-game.crash.reason.file_changed=当前游戏因为文件校验失败，无法继续运行。\n如果你手动修改了 Minecraft.jar 文件，你需要回退修改，或者重新下载游戏。 
-game.crash.reason.gl_operation_failure=当前游戏因为你使用的某些模组、光影包、材质包，无法继续运行。\n请先尝试禁用你所使用的模组/光影包/材质包再试。 
+game.crash.reason.fabric_version_0_12=Fabric 0.12 及以上版本与当前已经安装的模组可能不兼容，你需要将 Fabric 降级至 0.11.7。
+game.crash.reason.fabric_warnings=Fabric 提供了一些警告信息：\n%1$s
+game.crash.reason.file_already_exists=当前游戏因为文件 %1$s 已经存在，无法继续运行。\n如果你认为这个文件可以删除，你可以在备份这个文件后尝试删除它，并重新启动游戏。
+game.crash.reason.file_changed=当前游戏因为文件校验失败，无法继续运行。\n如果你手动修改了 Minecraft.jar 文件，你需要回退修改，或者重新下载游戏。
+game.crash.reason.gl_operation_failure=当前游戏因为你使用的某些模组、光影包、材质包，无法继续运行。\n请先尝试禁用你所使用的模组/光影包/材质包再试。
 game.crash.reason.graphics_driver=当前游戏因为显卡驱动问题而崩溃，请尝试以下操作：\n\
-  - 如果你的电脑存在独立显卡，请尝试使用 独立显卡 而非 Intel 核显启动 HMCL 与游戏 <a href="https://www.bing.com/search?q=%E4%BD%BF%E7%94%A8%E7%8B%AC%E7%AB%8B%E6%98%BE%E5%8D%A1%E8%BF%90%E8%A1%8CMinecraft">详情</a>；\n\
+  - 如果你的电脑存在独立显卡，请尝试使用 独立显卡 而非 Intel 核显启动 HMCL 与游戏 <a href="https://www.bing.com/search?q=使用独立显卡运行Minecraft">详情</a> ；\n\
   - <a href="https://minecrafthopper.net/help/pixel-format-not-accelerated/">尝试升级你的 显卡驱动 到最新版本</a>，或回退到出厂版本；\n\
   - 如果你确实需要使用核芯显卡，请检查你的电脑的 CPU 是否是 Intel(R) Core(TM) 3000 系列或更旧的处理器，如果是，对于 Minecraft 1.16.5 及更旧版本，请你将游戏所使用的 Java 版本降级至 1.8.0_51 及以下版本 <a href="https://github.com/frekele/oracle-java/releases/8u51-b16">Java 1.8.0 历史版本</a> ，否则请跳过；\n\
   - 在全局（特定）游戏设置，高级设置中打开“使用 OpenGL 软渲染器”（开启此选项后帧数会显著降低，仅推荐在以调试为目的或应急时开启）。\n\
@@ -435,7 +435,7 @@ game.crash.reason.jdk_9=当前游戏因为 Java 版本过高，无法继续运
 game.crash.reason.jvm_32bit=当前游戏因为内存分配过大，超过了 32 位 Java 内存限制，无法继续运行。\n如果你的电脑是 64 位系统，请下载安装并更换 64 位 Java。<a href="https://bell-sw.com/pages/downloads/#downloads">下载 Java</a>\n如果你的电脑是 32 位系统，你或许可以重新安装 64 位系统，或换一台新电脑。\n或者，你可以关闭游戏内存的自动分配，并且把内存限制调节为 1024 MB 或以下。
 game.crash.reason.loading_crashed_forge=当前游戏因为模组 %1$s (%2$s) 错误，无法继续运行。\n你可以尝试删除或更新该模组以解决问题。
 game.crash.reason.loading_crashed_fabric=当前游戏因为模组 %1$s 错误，无法继续运行。\n你可以尝试删除或更新该模组以解决问题。
-game.crash.reason.memory_exceeded=当前游戏因为分配的内存过大，无法继续运行。\n该问题是由于系统页面文件太小导致的。\n你需要在全局（特定）游戏设置中关闭游戏内存的自动分配，并将游戏内存调低至游戏能正常启动为止。\n你还可以尝试将 虚拟内存 设置调整至「自动管理所有驱动器分页文件大小」，<a href="https://docs.hmcl.net/assets/img/hmcl/%E8%87%AA%E5%8A%A8%E7%AE%A1%E7%90%86%E6%89%80%E6%9C%89%E9%A9%B1%E5%8A%A8%E5%99%A8%E5%88%86%E9%A1%B5%E6%96%87%E4%BB%B6%E5%A4%A7%E5%B0%8F.webp">详情</a>。
+game.crash.reason.memory_exceeded=当前游戏因为分配的内存过大，无法继续运行。\n该问题是由于系统页面文件太小导致的。\n你需要在全局（特定）游戏设置中关闭游戏内存的自动分配，并将游戏内存调低至游戏能正常启动为止。\n你还可以尝试将 虚拟内存 设置调整至「自动管理所有驱动器分页文件大小」，<a href="https://docs.hmcl.net/assets/img/hmcl/自动管理所有驱动器分页文件大小.webp">详情</a>。
 game.crash.reason.mac_jdk_8u261=当前游戏因为你所使用的 Forge 或 OptiFine 与 Java 冲突崩溃。\n请尝试更新 Forge 和 OptiFine，或使用 Java 8u251 及更早版本启动。
 game.crash.reason.mod=当前游戏因为 %1$s 的问题，无法继续运行。\n你可以更新或删除已经安装的 %1$s 再试。
 game.crash.reason.mod_resolution=当前游戏因为 Mod 依赖问题，无法继续运行。Fabric 提供了如下信息：\n%1$s 
@@ -447,17 +447,8 @@ game.crash.reason.mod_resolution_mod_version=%1$s (版本号 %2$s)
 game.crash.reason.mod_resolution_mod_version.any=%1$s (任意版本)
 game.crash.reason.forge_repeat_installation=当前游戏因为 Forge 重复安装，无法继续运行。<a href="https://github.com/HMCL-dev/HMCL/issues/1880">此为已知问题</a>\n建议将日志上传反馈至 GitHub ，以便我们找到更多线索并修复此问题。\n目前你可以到 自动安装 里头卸载 Forge 并重新安装。
 game.crash.reason.optifine_repeat_installation=当前游戏因为 Optifine 重复安装，无法继续运行。\n请删除 Mod 文件夹下的 Optifine 或前往 游戏管理-自动安装 卸载自动安装的 Optifine。
-game.crash.reason.mod_resolution=当前游戏因为模组依赖问题，无法继续运行。Fabric 提供了如下信息：\n%1$s 
 game.crash.reason.forgemod_resolution=当前游戏因为模组依赖问题，无法继续运行。Forge 提供了如下信息：\n%1$s 
 game.crash.reason.forge_found_duplicate_mods=当前游戏因为模组重复问题，无法继续运行。Forge 提供了如下信息：\n%1$s 
-game.crash.reason.mod_resolution_collection=当前游戏因为前置模组版本不匹配，无法继续运行。\n%1$s 需要前置模组：%2$s 才能继续运行。\n这表示你需要更新或降级前置。你可以到下载页的模组下载，或到网上下载 %3$s。 
-game.crash.reason.mod_resolution_conflict=当前游戏因为模组冲突，无法继续运行。\n%1$s 与 %2$s 不能兼容。 
-game.crash.reason.mod_resolution_missing=当前游戏因为缺少模组前置，无法继续运行。\n%1$s 需要前置模组：%2$s 才能继续运行。\n这表示你少安装了模组，或该模组版本不够。你可以到下载页的模组下载，或到网上下载 %3$s。 
-game.crash.reason.mod_resolution_missing_minecraft=当前游戏因为模组和 Minecraft 游戏版本不匹配，无法继续运行。\n%1$s 需要 Minecraft %2$s 才能运行。\n如果你要继续使用你已经安装的模组，你可以选择安装对应的 Minecraft 版本；如果你要继续使用当前 Minecraft 版本，你需要安装对应版本的模组。 
-game.crash.reason.mod_resolution_mod_version=%1$s (版本号 %2$s)
-game.crash.reason.mod_resolution_mod_version.any=%1$s (任意版本)
-game.crash.reason.forge_repeat_installation=当前游戏因为 Forge 重复安装，无法继续运行。<a href="https://github.com/HMCL-dev/HMCL/issues/1880">此为已知问题</a>\n建议将日志上传反馈至 GitHub ，以便我们找到更多线索并修复此问题。\n目前你可以到 自动安装 里头卸载 Forge 并重新安装。
-game.crash.reason.optifine_repeat_installation=当前游戏因为 OptiFine 重复安装，无法继续运行。\n请删除 Mod 文件夹下的 OptiFine 或前往 游戏管理-自动安装 卸载自动安装的 OptiFine。
 game.crash.reason.modmixin_failure=当前游戏因为某些 Mod 注入失败，无法继续运行。\n这一般代表着该 Mod 存在 Bug，或与当前环境不兼容。\n你可以查看日志寻找出错模组。
 game.crash.reason.night_config_fixes=当前游戏因为 Night Config 库的一些问题，无法继续运行。\n你可以尝试安装 <a href="https://www.curseforge.com/minecraft/mc-mods/night-config-fixes">Night Config Fixes</a> 模组，这或许能帮助你解决这个问题。\n了解更多，可访问该模组的 <a href="https://www.github.com/Fuzss/nightconfigfixes">GitHub 仓库</a>。
 game.crash.reason.forge_error=Forge 可能已经提供了错误信息。\n你可以查看日志，并根据错误报告中的日志信息进行对应处。\n如果没有看到报错信息，可以查看错误报告了解错误具体是如何发生的。\n%1$s
@@ -465,14 +456,14 @@ game.crash.reason.mod_resolution0=当前游戏因为一些模组出现问题，
 game.crash.reason.fabric_reports_an_error_and_gives_a_solution=Fabric 可能已经提供了错误信息。\n你可以查看日志，并根据错误报告中的日志信息进行对应处。\n如果没有看到报错信息，可以查看错误报告了解错误具体是如何发生的。
 game.crash.reason.java_version_is_too_high=当前游戏因为 Java 虚拟机版本过高，无法继续运行。\n请在全局（特定）游戏设置的 Java 路径选项卡中改用较低版本的 Java，然后再启动游戏。\n如果没有，可以从 <a href="https://www.java.com/download/">java.com（Java8）</a> 或 <a href="https://bell-sw.com/pages/downloads/#downloads">BellSoft Liberica Full JRE（Java17）</a> 等平台下载、安装一个（安装完后需重启启动器）。
 game.crash.reason.mod_name=当前游戏因为模组文件名称问题，无法继续运行。\n模组文件名称应只使用英文全半角的大小写字母（Aa~Zz）、数字（0~9）、横线（-）、下划线（_）和点（.）。\n请到模组文件夹中将所有不合规的模组文件名称添加一个上述的合规的字符。
-game.crash.reason.incomplete_forge_installation=当前游戏因为 Forge 安装不完整，无法继续运行。\n请在 版本设置 - 自动安装 中卸载 Forge 并重新安装。
+game.crash.reason.incomplete_forge_installation=当前游戏因为 Forge / NeoForge 安装不完整，无法继续运行。\n请在 版本设置 - 自动安装 中卸载 Forge 并重新安装。
 game.crash.reason.optifine_is_not_compatible_with_forge=当前游戏因为 OptiFine 与当前版本的 Forge 不兼容，导致了游戏崩溃。\n点击 <a href="https://zkitefly.github.io/optifine-forge-support-list">此处</a> 查看 OptiFine 所兼容的 Forge 版本，并严格按照对应版本重新安装游戏或在 版本设置 - 自动安装 中更换版本。\n经测试，Forge 版本过高或过低都可能导致崩溃。 
 game.crash.reason.mod_files_are_decompressed=当前游戏因为模组文件被解压了，无法继续运行。\n请直接把整个模组文件放进模组文件夹中即可。\n解压模组会导致游戏出错，请删除模组文件夹中已被解压的模组，然后再启动游戏。 
 game.crash.reason.shaders_mod=当前游戏因为同时安装了 OptiFine 和 Shaders 模组，无法继续运行。\n因为 OptiFine 已集成 Shaders 模组的功能，只需删除 Shaders 模组即可。
 game.crash.reason.rtss_forest_sodium=当前游戏因为 RivaTuner Statistics Server (RTSS) 与 Sodium 不兼容，导致了游戏崩溃。\n点击 <a href="https://github.com/CaffeineMC/sodium-fabric/wiki/Known-Issues#rtss-incompatible">此处</a> 查看详情。
-game.crash.reason.too_many_mods_lead_to_exceeding_the_id_limit=当前游戏因为您所安装的模组过多，超出了游戏的 ID 限制，无法继续运行。\n请尝试安装 <a href="https://www.curseforge.com/minecraft/mc-mods/jeid">JEID</a> 等修复模组，或删除部分大型模组。 
+game.crash.reason.too_many_mods_lead_to_exceeding_the_id_limit=当前游戏因为您所安装的模组过多，超出了游戏的 ID 限制，无法继续运行。\n请尝试安装 <a href="https://www.curseforge.com/minecraft/mc-mods/jeid">JEID</a> 等修复模组，或删除部分大型模组。
 game.crash.reason.optifine_causes_the_world_to_fail_to_load=当前游戏可能因为 OptiFine ，无法继续运行。\n该问题只在特定 OptiFine 版本中出现，你可以尝试在 版本设置 - 自动安装 中更换 OptiFine 的版本。 
-game.crash.reason.modlauncher_8=当前游戏因为您所使用的 Forge 版本与当前使用的 Java 冲突崩溃，请尝试更新 Forge 到 36.2.26 或更高版本或换用版本低于 1.8.0.320 的 Java，<a href="https://github.com/bell-sw/Liberica/releases/8u312%2B7">Liberica JDK 8u312+7</a>。
+game.crash.reason.modlauncher_8=当前游戏因为您所使用的 Forge 版本与当前使用的 Java 冲突崩溃，请尝试更新 Forge 到 36.2.26 或更高版本或换用版本低于 1.8.0.320 的 Java，<a href="https://bell-sw.com/pages/downloads/?version=java-8&package=jre-full">Liberica JDK 8u312+7</a>。
 game.crash.reason.no_class_def_found_error=当前游戏因为代码不完整，无法继续运行。\n你的游戏可能缺失了某个模组，或者某些模组文件不完整，或者模组与游戏的版本不匹配。\n你可能需要重新安装游戏和模组，或请求他人帮助。\n缺失：\n%1$s 
 game.crash.reason.no_such_method_error=当前游戏因为代码不完整，无法继续运行。\n你的游戏可能缺失了某个模组，或者某些模组文件不完整，或者模组与游戏的版本不匹配。\n你可能需要重新安装游戏和模组，或请求他人帮助。 
 game.crash.reason.opengl_not_supported=当前游戏因为你的显卡驱动存在问题，无法继续运行。\n原因是 OpenGL 不受支持，你现在是否在远程桌面或者串流模式下？如果是，请直接使用原电脑启动游戏。\n或者尝试升级你的显卡驱动到最新版本后再尝试启动游戏。如果你的电脑存在独立显卡，你需要检查游戏是否使用集成/核心显卡启动，如果是，请尝试使用独立显卡启动 HMCL 与游戏。如果仍有问题，你可能需要考虑换一个新显卡或新电脑。 
@@ -564,7 +555,7 @@ launch.advice.too_large_memory_for_32bit=您设置的内存大小过大，由于
 launch.advice.vanilla_linux_java_8=对于 Linux x86-64 平台，Minecraft 1.12.2 及以下版本与 Java 9+ 不兼容，请使用 Java 8 启动游戏。\n如遇到问题，你可以点击右上角帮助按钮进行求助。
 launch.advice.vanilla_x86.translation=Minecraft 尚未为您的平台提供完善支持，所以可能影响游戏体验或无法启动游戏。\n你可以在 <a href="https://docs.microsoft.com/java/openjdk/download"> 这里 </a> 下载 <b> X86-64 </b> 架构的 Java 以获得更完整的体验。
 launch.failed=启动失败
-launch.failed.cannot_create_jvm=截获到无法创建 Java 虚拟机，可能是 Java 参数有问题，可以在设置中开启无参数模式启动。\n你可以点击右上角帮助按钮进行求助。
+launch.failed.cannot_create_jvm=截获到无法创建 Java 虚拟机，可能是 Java 参数有问题，可以在设置中开启无参数模式启动。
 launch.failed.creating_process=启动失败，在创建新进程时发生错误，可能是 Java 路径错误。
 launch.failed.command_too_long=命令长度超过限制，无法创建 bat 脚本，请导出为 PowerShell 脚本。
 launch.failed.decompressing_natives=未能解压游戏本地库。


Test patch: