feat: add language switch. remove lazying loading dictionary. format code. Remove useless fields.
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
using System.Globalization;
|
||||
using Avalonia;
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Markup.Xaml;
|
||||
using Avalonia.Styling;
|
||||
@@ -9,30 +10,28 @@ 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
|
||||
{
|
||||
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<Dictionary<CultureInfo, ResourceDictionary>> _localeToResource = new Lazy<Dictionary<CultureInfo, ResourceDictionary>>(
|
||||
() => new Dictionary<CultureInfo, ResourceDictionary>
|
||||
private static readonly Dictionary<CultureInfo, ResourceDictionary> _localeToResource = new()
|
||||
{
|
||||
{ new CultureInfo("zh-CN"), new zh_cn() },
|
||||
{ new CultureInfo("en-US"), new en_us() },
|
||||
});
|
||||
{ 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 (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")];
|
||||
}
|
||||
if (locale is null)
|
||||
|
||||
public static void OverrideLocaleResources(Application application, CultureInfo? culture)
|
||||
{
|
||||
return _localeToResource.Value[new CultureInfo("zh-CN")];
|
||||
if (culture is null) return;
|
||||
if (!_localeToResource.TryGetValue(culture, out var resources)) return;
|
||||
foreach (var kv in resources) application.Resources[kv.Key] = kv.Value;
|
||||
}
|
||||
if (_localeToResource.Value.TryGetValue(locale, out var resource))
|
||||
|
||||
public static void OverrideLocaleResources(StyledElement element, CultureInfo? culture)
|
||||
{
|
||||
return resource;
|
||||
}
|
||||
return _localeToResource.Value[new CultureInfo("zh-CN")];
|
||||
if (culture is null) return;
|
||||
if (!_localeToResource.TryGetValue(culture, out var resources)) return;
|
||||
foreach (var kv in resources) element.Resources[kv.Key] = kv.Value;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user