diff --git a/StarterNG.Tests/SettingsStoreTests.cs b/StarterNG.Tests/SettingsStoreTests.cs index 2403a0d..9b4c2b3 100644 --- a/StarterNG.Tests/SettingsStoreTests.cs +++ b/StarterNG.Tests/SettingsStoreTests.cs @@ -70,6 +70,18 @@ public class SettingsStoreTests Assert.Contains("lang en", installation.Files.ReadAllText(UserIni)); } + [Fact] + public void The_language_code_is_written_in_lower_case() + { + var installation = WithHome(); + installation.SettingsStore.Load(); + installation.SettingsStore.Settings.LanguageCode = "ZH"; + + installation.SettingsStore.Save(); + + Assert.Contains("lang zh", installation.Files.ReadAllText(UserIni)); + } + [Fact] public void A_first_run_falls_back_to_the_ini_shipped_with_the_installation() { diff --git a/StarterNG/App.axaml.cs b/StarterNG/App.axaml.cs index 6b363b2..52a2cad 100644 --- a/StarterNG/App.axaml.cs +++ b/StarterNG/App.axaml.cs @@ -44,7 +44,18 @@ public partial class App : Avalonia.Application }; AppServices.Current.Settings.Language = langName; + // What eu07.ini asked for, before the starter picks a language it can + // actually display. + string requestedCode = AppServices.Current.Settings.LanguageCode; + ApplyLanguage(langName); + + // The starter ships no translation for this code, so its own interface + // falls back - but the simulator has one and keeps it. Overwriting the key + // here would silently move eu07.exe to English on the next save. + if (!string.IsNullOrWhiteSpace(requestedCode) && + !string.Equals(requestedCode, Loc.CurrentLangCode, StringComparison.OrdinalIgnoreCase)) + AppServices.Current.Settings.LanguageCode = requestedCode; } public static void ApplyLanguage(string langNameOrCode) diff --git a/StarterNG/Infrastructure/Settings/SettingsSerializer.cs b/StarterNG/Infrastructure/Settings/SettingsSerializer.cs index 916e159..3ad6ccd 100644 --- a/StarterNG/Infrastructure/Settings/SettingsSerializer.cs +++ b/StarterNG/Infrastructure/Settings/SettingsSerializer.cs @@ -171,7 +171,10 @@ public sealed class SettingsSerializer foreach (string key in ObsoleteKeys) c.Remove(key); - c.Set("lang", string.IsNullOrWhiteSpace(s.LanguageCode) ? "en" : s.LanguageCode); + // Lower case, as the simulator expects and as the old starter wrote it. + c.Set("lang", string.IsNullOrWhiteSpace(s.LanguageCode) + ? "en" + : s.LanguageCode.Trim().ToLowerInvariant()); c.SetBool("fullscreen", s.Fullscreen); c.SetBool("inactivepause", s.PauseWhenInactive); c.SetBool("pause", s.PauseOnStart);