fix: fix potential issue when assigning invalid culture at runtime.

This commit is contained in:
Dong Bin
2025-01-20 18:47:41 +08:00
parent 2514d919f1
commit 0eeba47e88

View File

@@ -16,6 +16,8 @@ public class SemiTheme : Styles
public static ThemeVariant Dusk => new ThemeVariant(nameof(Dusk), ThemeVariant.Dark); public static ThemeVariant Dusk => new ThemeVariant(nameof(Dusk), ThemeVariant.Dark);
public static ThemeVariant NightSky => new ThemeVariant(nameof(NightSky), ThemeVariant.Dark); public static ThemeVariant NightSky => new ThemeVariant(nameof(NightSky), ThemeVariant.Dark);
private static readonly ResourceDictionary _defaultResource = new zh_cn();
private static readonly Dictionary<CultureInfo, ResourceDictionary> _localeToResource = new() private static readonly Dictionary<CultureInfo, ResourceDictionary> _localeToResource = new()
{ {
{ new CultureInfo("zh-cn"), new zh_cn() }, { new CultureInfo("zh-cn"), new zh_cn() },
@@ -40,27 +42,48 @@ public class SemiTheme : Styles
get => _locale; get => _locale;
set set
{ {
_locale = value; try
var resource = TryGetLocaleResource(value);
if (resource is null) return;
foreach (var kv in resource)
{ {
this.Resources.Add(kv); if (TryGetLocaleResource(value, out var resource) && resource is not null)
{
_locale = value;
foreach (var kv in resource) Resources[kv.Key] = kv.Value;
}
else
{
_locale = new CultureInfo("zh-CN");
foreach (var kv in _defaultResource) Resources[kv.Key] = kv.Value;
}
}
catch
{
_locale = CultureInfo.InvariantCulture;
} }
} }
} }
private static ResourceDictionary? TryGetLocaleResource(CultureInfo? locale) private static bool TryGetLocaleResource(CultureInfo? locale, out ResourceDictionary? resourceDictionary)
{ {
if (Equals(locale, CultureInfo.InvariantCulture))
{
resourceDictionary = _defaultResource;
return true;
}
if (locale is null) if (locale is null)
{ {
return _localeToResource[new CultureInfo("zh-cn")]; resourceDictionary = _defaultResource;
return false;
} }
if (_localeToResource.TryGetValue(locale, out var resource)) if (_localeToResource.TryGetValue(locale, out var resource))
{ {
return resource; resourceDictionary = resource;
return true;
} }
return _localeToResource[new CultureInfo("zh-cn")];
resourceDictionary = _defaultResource;
return false;
} }
public static void OverrideLocaleResources(Application application, CultureInfo? culture) public static void OverrideLocaleResources(Application application, CultureInfo? culture)