From 5cbfafff12a5d6444879f51ef21ceff4e2b52fe4 Mon Sep 17 00:00:00 2001 From: rabbitism Date: Sat, 16 Mar 2024 17:28:10 +0800 Subject: [PATCH] fix: make theme file more tolerant in InvariantGlobalization mode. --- src/Ursa.Themes.Semi/Index.axaml.cs | 53 ++++++++++++++++++----------- 1 file changed, 33 insertions(+), 20 deletions(-) diff --git a/src/Ursa.Themes.Semi/Index.axaml.cs b/src/Ursa.Themes.Semi/Index.axaml.cs index a0eeea4..eec6fa7 100644 --- a/src/Ursa.Themes.Semi/Index.axaml.cs +++ b/src/Ursa.Themes.Semi/Index.axaml.cs @@ -1,21 +1,23 @@ using System.Globalization; -using System.Runtime.CompilerServices; -using Avalonia; using Avalonia.Controls; using Avalonia.Markup.Xaml; -using Avalonia.Markup.Xaml.Styling; -using Avalonia.Platform; using Avalonia.Styling; namespace Ursa.Themes.Semi; +/// +/// Notice: Don't set Locale if your app is in InvariantGlobalization mode. +/// public class SemiTheme: Styles { - private static readonly Dictionary _localeToResource = new() - { - { new CultureInfo("zh-CN"), "avares://Ursa.Themes.Semi/Locale/zh-CN.axaml" }, - { new CultureInfo("en-US"), "avares://Ursa.Themes.Semi/Locale/en-US.axaml" }, - }; + private static readonly Lazy> _localeToResource = new Lazy>( + () => new Dictionary + { + { new CultureInfo("zh-CN"), "avares://Ursa.Themes.Semi/Locale/zh-CN.axaml" }, + { new CultureInfo("en-US"), "avares://Ursa.Themes.Semi/Locale/en-US.axaml" }, + }); + + private static readonly string _defaultResource = "avares://Ursa.Themes.Semi/Locale/zh-CN.axaml"; private readonly IServiceProvider? sp; public SemiTheme(IServiceProvider? provider = null) @@ -29,29 +31,40 @@ public class SemiTheme: Styles { get => _locale; set - { - _locale = value; - var resource = TryGetLocaleResource(value); - var d = AvaloniaXamlLoader.Load(sp, new Uri(resource)) as ResourceDictionary; - if (d is null) return; - foreach (var kv in d) + { + try { - this.Resources.Add(kv); + _locale = value; + var resource = TryGetLocaleResource(value); + var d = AvaloniaXamlLoader.Load(sp, new Uri(resource)) as ResourceDictionary; + if (d is null) return; + foreach (var kv in d) + { + this.Resources.Add(kv); + } } + catch + { + _locale = CultureInfo.InvariantCulture; + } + } } private static string TryGetLocaleResource(CultureInfo? locale) { + if (Equals(locale, CultureInfo.InvariantCulture)) + { + return _defaultResource; + } if (locale is null) { - return _localeToResource[new CultureInfo("zh-CN")]; + return _localeToResource.Value[new CultureInfo("zh-CN")]; } - - if (_localeToResource.TryGetValue(locale, out var resource)) + if (_localeToResource.Value.TryGetValue(locale, out var resource)) { return resource; } - return _localeToResource[new CultureInfo("zh-CN")]; + return _localeToResource.Value[new CultureInfo("zh-CN")]; } } \ No newline at end of file