fix: make theme file more tolerant in InvariantGlobalization mode.
This commit is contained in:
@@ -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")];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user