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 NightSky => new ThemeVariant(nameof(NightSky), ThemeVariant.Dark);
private static readonly ResourceDictionary _defaultResource = new zh_cn();
private static readonly Dictionary<CultureInfo, ResourceDictionary> _localeToResource = new()
{
{ new CultureInfo("zh-cn"), new zh_cn() },
@@ -40,27 +42,48 @@ public class SemiTheme : Styles
get => _locale;
set
{
_locale = value;
var resource = TryGetLocaleResource(value);
if (resource is null) return;
foreach (var kv in resource)
try
{
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)
{
return _localeToResource[new CultureInfo("zh-cn")];
resourceDictionary = _defaultResource;
return false;
}
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)