fix: make theme file more tolerant in InvariantGlobalization mode.

This commit is contained in:
rabbitism
2024-03-16 17:28:10 +08:00
parent 91e95e396a
commit 5cbfafff12

View File

@@ -1,21 +1,23 @@
using System.Globalization; using System.Globalization;
using System.Runtime.CompilerServices;
using Avalonia;
using Avalonia.Controls; using Avalonia.Controls;
using Avalonia.Markup.Xaml; using Avalonia.Markup.Xaml;
using Avalonia.Markup.Xaml.Styling;
using Avalonia.Platform;
using Avalonia.Styling; using Avalonia.Styling;
namespace Ursa.Themes.Semi; namespace Ursa.Themes.Semi;
/// <summary>
/// Notice: Don't set Locale if your app is in InvariantGlobalization mode.
/// </summary>
public class SemiTheme: Styles public class SemiTheme: Styles
{ {
private static readonly Dictionary<CultureInfo, string> _localeToResource = new() private static readonly Lazy<Dictionary<CultureInfo, string>> _localeToResource = new Lazy<Dictionary<CultureInfo, string>>(
{ () => new Dictionary<CultureInfo, string>
{ new CultureInfo("zh-CN"), "avares://Ursa.Themes.Semi/Locale/zh-CN.axaml" }, {
{ new CultureInfo("en-US"), "avares://Ursa.Themes.Semi/Locale/en-US.axaml" }, { 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; private readonly IServiceProvider? sp;
public SemiTheme(IServiceProvider? provider = null) public SemiTheme(IServiceProvider? provider = null)
@@ -30,28 +32,39 @@ public class SemiTheme: Styles
get => _locale; get => _locale;
set set
{ {
_locale = value; try
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); _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) private static string TryGetLocaleResource(CultureInfo? locale)
{ {
if (Equals(locale, CultureInfo.InvariantCulture))
{
return _defaultResource;
}
if (locale is null) if (locale is null)
{ {
return _localeToResource[new CultureInfo("zh-CN")]; return _localeToResource.Value[new CultureInfo("zh-CN")];
} }
if (_localeToResource.Value.TryGetValue(locale, out var resource))
if (_localeToResource.TryGetValue(locale, out var resource))
{ {
return resource; return resource;
} }
return _localeToResource[new CultureInfo("zh-CN")]; return _localeToResource.Value[new CultureInfo("zh-CN")];
} }
} }