diff --git a/src/Semi.Avalonia/SemiTheme.axaml.cs b/src/Semi.Avalonia/SemiTheme.axaml.cs index 48f80a7..deddf39 100644 --- a/src/Semi.Avalonia/SemiTheme.axaml.cs +++ b/src/Semi.Avalonia/SemiTheme.axaml.cs @@ -16,6 +16,8 @@ public class SemiTheme : Styles public static ThemeVariant Dusk => new ThemeVariant(nameof(Dusk), ThemeVariant.Dark); public static ThemeVariant NightSky => new ThemeVariant(nameof(NightSky), ThemeVariant.Dark); + private static readonly ResourceDictionary _defaultResource = new zh_cn(); + private static readonly Dictionary _localeToResource = new() { { new CultureInfo("zh-cn"), new zh_cn() }, @@ -40,27 +42,48 @@ public class SemiTheme : Styles get => _locale; set { - _locale = value; - var resource = TryGetLocaleResource(value); - if (resource is null) return; - foreach (var kv in resource) + try { - this.Resources.Add(kv); + if (TryGetLocaleResource(value, out var resource) && resource is not null) + { + _locale = value; + foreach (var kv in resource) Resources[kv.Key] = kv.Value; + } + else + { + _locale = new CultureInfo("zh-CN"); + foreach (var kv in _defaultResource) Resources[kv.Key] = kv.Value; + } + } + catch + { + _locale = CultureInfo.InvariantCulture; } } } - private static ResourceDictionary? TryGetLocaleResource(CultureInfo? locale) + private static bool TryGetLocaleResource(CultureInfo? locale, out ResourceDictionary? resourceDictionary) { + if (Equals(locale, CultureInfo.InvariantCulture)) + { + resourceDictionary = _defaultResource; + return true; + } + if (locale is null) { - return _localeToResource[new CultureInfo("zh-cn")]; + resourceDictionary = _defaultResource; + return false; } + if (_localeToResource.TryGetValue(locale, out var resource)) { - return resource; + resourceDictionary = resource; + return true; } - return _localeToResource[new CultureInfo("zh-cn")]; + + resourceDictionary = _defaultResource; + return false; } public static void OverrideLocaleResources(Application application, CultureInfo? culture)