diff --git a/MinecraftClient/Program.cs b/MinecraftClient/Program.cs index 7cda97c9..c0ad8e90 100644 --- a/MinecraftClient/Program.cs +++ b/MinecraftClient/Program.cs @@ -42,6 +42,7 @@ namespace MinecraftClient { private static McClient? client; public static string[]? startupargs; + public static readonly CultureInfo ActualCulture = CultureInfo.CurrentCulture; public const string Version = MCHighestVersion; public const string MCLowestVersion = "1.4.6"; @@ -57,6 +58,8 @@ namespace MinecraftClient /// static void Main(string[] args) { + InitCulture(); + Task.Run(() => { // "ToLower" require "CultureInfo" to be initialized on first run, which can take a lot of time. @@ -110,10 +113,10 @@ namespace MinecraftClient } //Process ini configuration file - bool needWriteDefaultSetting, newlyGenerated = false; + bool loadSucceed, needWriteDefaultSetting, newlyGenerated = false; if (args.Length >= 1 && File.Exists(args[0]) && Settings.ToLowerIfNeed(Path.GetExtension(args[0])) == ".ini") { - needWriteDefaultSetting = Settings.LoadFromFile(args[0]); + (loadSucceed, needWriteDefaultSetting) = Settings.LoadFromFile(args[0]); settingsIniPath = args[0]; //remove ini configuration file from arguments array @@ -123,19 +126,59 @@ namespace MinecraftClient } else if (File.Exists("MinecraftClient.ini")) { - needWriteDefaultSetting = Settings.LoadFromFile("MinecraftClient.ini"); + (loadSucceed, needWriteDefaultSetting) = Settings.LoadFromFile("MinecraftClient.ini"); } else { + loadSucceed = true; needWriteDefaultSetting = true; newlyGenerated = true; } - if (needWriteDefaultSetting) + if (!loadSucceed) + { + ConsoleInteractive.ConsoleReader.StopReadThread(); + string command = " "; + while (command.Length > 0) + { + ConsoleIO.WriteLine(string.Empty); + ConsoleIO.WriteLineFormatted(Translations.Get("mcc.invaild_config", Config.Main.Advanced.InternalCmdChar.ToLogString())); + Translations.WriteLineFormatted("mcc.press_exit"); + command = ConsoleInteractive.ConsoleReader.RequestImmediateInput().Trim(); + if (command.Length > 0) + { + if (Config.Main.Advanced.InternalCmdChar.ToChar() != ' ' + && command[0] == Config.Main.Advanced.InternalCmdChar.ToChar()) + command = command[1..]; + + if (command.StartsWith("exit") || command.StartsWith("quit")) + { + return; + } + else if (command.StartsWith("new")) + { + (string gameLanguage, string[] langList) = Translations.GetTranslationPriority(); + Config.Main.Advanced.Language = gameLanguage; + Translations.LoadTranslationFile(langList); + + WriteBackSettings(true); + ConsoleIO.WriteLineFormatted(Translations.Get("mcc.gen_new_config", settingsIniPath)); + return; + } + } + else + { + return; + } + } + return; + } + else if (needWriteDefaultSetting) { (string gameLanguage, string[] langList) = Translations.GetTranslationPriority(); Translations.LoadTranslationFile(langList); Config.Main.Advanced.Language = gameLanguage; + WriteBackSettings(false); if (newlyGenerated) ConsoleIO.WriteLineFormatted(Translations.TryGet("mcc.settings_generated")); @@ -618,7 +661,7 @@ namespace MinecraftClient /// public static void ReloadSettings() { - if(Settings.LoadFromFile(settingsIniPath)) + if(Settings.LoadFromFile(settingsIniPath).Item1) ConsoleIO.WriteLine(Translations.TryGet("config.loading", settingsIniPath)); } @@ -818,6 +861,15 @@ namespace MinecraftClient return assembly.GetTypes().Where(t => String.Equals(t.Namespace, nameSpace, StringComparison.Ordinal)).ToArray(); } + public static void InitCulture() + { + CultureInfo culture = CultureInfo.CreateSpecificCulture("en-US"); + CultureInfo.DefaultThreadCurrentCulture = culture; + CultureInfo.DefaultThreadCurrentUICulture = culture; + Thread.CurrentThread.CurrentCulture = culture; + Thread.CurrentThread.CurrentUICulture = culture; + } + /// /// Static initialization of build information, read from assembly information /// diff --git a/MinecraftClient/Resources/lang/en.ini b/MinecraftClient/Resources/lang/en.ini index 2113581a..18567123 100644 --- a/MinecraftClient/Resources/lang/en.ini +++ b/MinecraftClient/Resources/lang/en.ini @@ -50,6 +50,8 @@ mcc.realms_available=You have access to the following Realms worlds mcc.realms_join=Use realms: as server IP to join a Realms world mcc.generator.generating=Generating {0} palette using the dataset: {1} mcc.generator.done=Succesfully generated {0} palette using the dataset: {1} +mcc.invaild_config=Failed to parse the settings file, enter "{0}new" to generate a new configuration. +mcc.gen_new_config=New configuration file "{0}" is generated. [debug] # Messages from MCC Debug Mode diff --git a/MinecraftClient/Resources/lang/zh-Hans.ini b/MinecraftClient/Resources/lang/zh-Hans.ini index 7f1f7a4b..848c73e9 100644 --- a/MinecraftClient/Resources/lang/zh-Hans.ini +++ b/MinecraftClient/Resources/lang/zh-Hans.ini @@ -50,6 +50,8 @@ mcc.realms_available==您可以访问以下Realms世界 mcc.realms_join=请使用"realms:<序号>"作为服务器IP加入Realms世界 mcc.generator.generating=正在从 {1} 生成 {0} 信息。 mcc.generator.done=已完成从 {0} 信息生成,使用 {1} +mcc.invaild_config=解析配置文件失败,输入 "{0}new" 以生成一个新的配置。 +mcc.gen_new_config=已生成新的配置文件 "{0}" 。 [debug] # Messages from MCC Debug Mode diff --git a/MinecraftClient/Resources/lang/zh-Hant.ini b/MinecraftClient/Resources/lang/zh-Hant.ini index 3b2ebb94..f4d745ef 100644 --- a/MinecraftClient/Resources/lang/zh-Hant.ini +++ b/MinecraftClient/Resources/lang/zh-Hant.ini @@ -50,6 +50,8 @@ mcc.realms_available==您可以訪問以下Realms世界 mcc.realms_join=請使用"realms:<序號>"作為伺服器IP加入Realms世界 mcc.generator.generating=正在從 {1} 生成 {0} 資訊。 mcc.generator.done=已完成從 {0} 資訊生成,使用 {1} +mcc.invaild_config=解析配置檔案失敗,輸入 "{0}new" 以生成一個新的配置。 +mcc.gen_new_config=已生成新的配置檔案 "{0}" 。 [debug] # Messages from MCC Debug Mode diff --git a/MinecraftClient/Settings.cs b/MinecraftClient/Settings.cs index 1cd353c9..d90ba8b8 100644 --- a/MinecraftClient/Settings.cs +++ b/MinecraftClient/Settings.cs @@ -121,7 +121,7 @@ namespace MinecraftClient } - public static bool LoadFromFile(string filepath) + public static Tuple LoadFromFile(string filepath) { TomlDocument document; try @@ -141,16 +141,16 @@ namespace MinecraftClient File.Copy(filepath, newFilePath, true); ConsoleIO.WriteLineFormatted("§cPlease use the newly generated MinecraftClient.ini"); ConsoleIO.WriteLineFormatted("§cThe old MinecraftClient.ini has been backed up as " + newFilePath); - return true; + ConsoleIO.WriteLine(Translations.GetOrNull("mcc.run_with_default_settings") ?? "\nMCC is running with default settings."); + return new(false, true); } } catch { } ConsoleIO.WriteLineFormatted(Translations.GetOrNull("config.load.fail") ?? "§cFailed to load settings:§r"); - ConsoleIO.WriteLine(ex.Message); - ConsoleIO.WriteLine(Translations.GetOrNull("mcc.run_with_default_settings") ?? "\nMCC is running with default settings."); - return false; + ConsoleIO.WriteLine(ex.GetFullMessage()); + return new(false, false); } - return false; + return new(true, false); } public static void WriteToFile(string filepath, bool backupOldFile) @@ -1210,4 +1210,14 @@ namespace MinecraftClient }; } } + + public static class ExceptionExtensions + { + public static string GetFullMessage(this Exception ex) + { + return ex.InnerException == null + ? ex.Message + : ex.Message + "\n --> " + ex.InnerException.GetFullMessage(); + } + } } diff --git a/MinecraftClient/Translations.cs b/MinecraftClient/Translations.cs index b4a81024..0424a877 100644 --- a/MinecraftClient/Translations.cs +++ b/MinecraftClient/Translations.cs @@ -104,9 +104,9 @@ namespace MinecraftClient string gameLanguage = "en_gb"; List name = new(); - string systemLanguage = string.IsNullOrWhiteSpace(CultureInfo.CurrentCulture.Name) - ? CultureInfo.CurrentCulture.Parent.Name - : CultureInfo.CurrentCulture.Name; + string systemLanguage = string.IsNullOrWhiteSpace(Program.ActualCulture.Name) + ? Program.ActualCulture.Parent.Name + : Program.ActualCulture.Name; switch (systemLanguage) {