From 6c8f3a4772a478beacd85f7db16ffa60aa7222be Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 28 Jul 2025 15:18:47 +0000 Subject: [PATCH] Implement parent culture fallback for OverrideLocaleResources Co-authored-by: rabbitism <14807942+rabbitism@users.noreply.github.com> --- src/Semi.Avalonia/SemiTheme.axaml.cs | 53 ++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 3 deletions(-) diff --git a/src/Semi.Avalonia/SemiTheme.axaml.cs b/src/Semi.Avalonia/SemiTheme.axaml.cs index cf7eee9..1bbb43f 100644 --- a/src/Semi.Avalonia/SemiTheme.axaml.cs +++ b/src/Semi.Avalonia/SemiTheme.axaml.cs @@ -46,7 +46,7 @@ public class SemiTheme : Styles { try { - if (TryGetLocaleResource(value, out var resource) && resource is not null) + if (TryGetLocaleResource(value, false, out var resource) && resource is not null) { _locale = value; foreach (var kv in resource) Resources[kv.Key] = kv.Value; @@ -65,6 +65,11 @@ public class SemiTheme : Styles } private static bool TryGetLocaleResource(CultureInfo? locale, out ResourceDictionary? resourceDictionary) + { + return TryGetLocaleResource(locale, false, out resourceDictionary); + } + + private static bool TryGetLocaleResource(CultureInfo? locale, bool enableParentCultureFallback, out ResourceDictionary? resourceDictionary) { if (Equals(locale, CultureInfo.InvariantCulture)) { @@ -78,20 +83,56 @@ public class SemiTheme : Styles return false; } + // Try exact match first if (_localeToResource.TryGetValue(locale, out var resource)) { resourceDictionary = resource; return true; } + // If enabled, try to find a culture that has this locale as parent or that shares the same parent + if (enableParentCultureFallback) + { + // Look for any supported culture that has this locale as its parent + foreach (var supportedCulture in _localeToResource.Keys) + { + if (Equals(supportedCulture.Parent, locale)) + { + resourceDictionary = _localeToResource[supportedCulture]; + return true; + } + } + + // If this locale has a parent (and it's not invariant), try to find + // a supported culture that shares the same parent + var targetParent = locale.Parent; + if (!Equals(targetParent, CultureInfo.InvariantCulture)) + { + foreach (var supportedCulture in _localeToResource.Keys) + { + if (Equals(supportedCulture.Parent, targetParent)) + { + resourceDictionary = _localeToResource[supportedCulture]; + return true; + } + } + } + } + resourceDictionary = _defaultResource; return false; } public static void OverrideLocaleResources(Application application, CultureInfo? culture) + { + OverrideLocaleResources(application, culture, false); + } + + public static void OverrideLocaleResources(Application application, CultureInfo? culture, bool enableParentCultureFallback) { if (culture is null) return; - if (!_localeToResource.TryGetValue(culture, out var resources)) return; + if (!TryGetLocaleResource(culture, enableParentCultureFallback, out var resources)) return; + if (resources is null) return; foreach (var kv in resources) { application.Resources[kv.Key] = kv.Value; @@ -99,9 +140,15 @@ public class SemiTheme : Styles } public static void OverrideLocaleResources(StyledElement element, CultureInfo? culture) + { + OverrideLocaleResources(element, culture, false); + } + + public static void OverrideLocaleResources(StyledElement element, CultureInfo? culture, bool enableParentCultureFallback) { if (culture is null) return; - if (!_localeToResource.TryGetValue(culture, out var resources)) return; + if (!TryGetLocaleResource(culture, enableParentCultureFallback, out var resources)) return; + if (resources is null) return; foreach (var kv in resources) { element.Resources[kv.Key] = kv.Value;