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