feat: add language switch. remove lazying loading dictionary. format code. Remove useless fields.

This commit is contained in:
Dong Bin
2025-01-17 16:48:58 +08:00
parent 2ab46bd77e
commit f7ebec093e

View File

@@ -1,4 +1,5 @@
using System.Globalization; using System.Globalization;
using Avalonia;
using Avalonia.Controls; using Avalonia.Controls;
using Avalonia.Markup.Xaml; using Avalonia.Markup.Xaml;
using Avalonia.Styling; using Avalonia.Styling;
@@ -7,32 +8,30 @@ using Ursa.Themes.Semi.Locale;
namespace Ursa.Themes.Semi; namespace Ursa.Themes.Semi;
/// <summary> /// <summary>
/// Notice: Don't set Locale if your app is in InvariantGlobalization mode. /// Notice: Don't set Locale if your app is in InvariantGlobalization mode.
/// </summary> /// </summary>
public class SemiTheme: Styles public class SemiTheme : Styles
{ {
public static ThemeVariant Aquatic => new ThemeVariant(nameof(Aquatic), ThemeVariant.Dark); private static readonly Dictionary<CultureInfo, ResourceDictionary> _localeToResource = new()
public static ThemeVariant Desert => new ThemeVariant(nameof(Desert), ThemeVariant.Light); {
public static ThemeVariant Dusk => new ThemeVariant(nameof(Dusk), ThemeVariant.Dark); { new CultureInfo("zh-CN"), new zh_cn() },
public static ThemeVariant NightSky => new ThemeVariant(nameof(NightSky), ThemeVariant.Dark); { new CultureInfo("en-US"), new en_us() }
};
private static readonly Lazy<Dictionary<CultureInfo, ResourceDictionary>> _localeToResource = new Lazy<Dictionary<CultureInfo, ResourceDictionary>>(
() => new Dictionary<CultureInfo, ResourceDictionary>
{
{ new CultureInfo("zh-CN"), new zh_cn() },
{ new CultureInfo("en-US"), new en_us() },
});
private static readonly ResourceDictionary _defaultResource = new zh_cn(); private static readonly ResourceDictionary _defaultResource = new zh_cn();
private readonly IServiceProvider? _sp; private CultureInfo? _locale;
public SemiTheme(IServiceProvider? provider = null) public SemiTheme(IServiceProvider? provider = null)
{ {
_sp = provider;
AvaloniaXamlLoader.Load(provider, this); AvaloniaXamlLoader.Load(provider, this);
} }
private CultureInfo? _locale; public static ThemeVariant Aquatic => new(nameof(Aquatic), ThemeVariant.Dark);
public static ThemeVariant Desert => new(nameof(Desert), ThemeVariant.Light);
public static ThemeVariant Dusk => new(nameof(Dusk), ThemeVariant.Dark);
public static ThemeVariant NightSky => new(nameof(NightSky), ThemeVariant.Dark);
public CultureInfo? Locale public CultureInfo? Locale
{ {
get => _locale; get => _locale;
@@ -43,33 +42,34 @@ public class SemiTheme: Styles
_locale = value; _locale = value;
var resource = TryGetLocaleResource(value); var resource = TryGetLocaleResource(value);
if (resource is null) return; if (resource is null) return;
foreach (var kv in resource) foreach (var kv in resource) Resources.Add(kv);
{
this.Resources.Add(kv);
}
} }
catch catch
{ {
_locale = CultureInfo.InvariantCulture; _locale = CultureInfo.InvariantCulture;
} }
} }
} }
private static ResourceDictionary? TryGetLocaleResource(CultureInfo? locale) private static ResourceDictionary? TryGetLocaleResource(CultureInfo? locale)
{ {
if (Equals(locale, CultureInfo.InvariantCulture)) if (Equals(locale, CultureInfo.InvariantCulture)) return _defaultResource;
{ if (locale is null) return _localeToResource[new CultureInfo("zh-CN")];
return _defaultResource; if (_localeToResource.TryGetValue(locale, out var resource)) return resource;
} return _localeToResource[new CultureInfo("zh-CN")];
if (locale is null) }
{
return _localeToResource.Value[new CultureInfo("zh-CN")]; public static void OverrideLocaleResources(Application application, CultureInfo? culture)
} {
if (_localeToResource.Value.TryGetValue(locale, out var resource)) if (culture is null) return;
{ if (!_localeToResource.TryGetValue(culture, out var resources)) return;
return resource; foreach (var kv in resources) application.Resources[kv.Key] = kv.Value;
} }
return _localeToResource.Value[new CultureInfo("zh-CN")];
public static void OverrideLocaleResources(StyledElement element, CultureInfo? culture)
{
if (culture is null) return;
if (!_localeToResource.TryGetValue(culture, out var resources)) return;
foreach (var kv in resources) element.Resources[kv.Key] = kv.Value;
} }
} }