diff --git a/Models/HumanLanguageCatalog.cs b/Models/HumanLanguageCatalog.cs index 8ed2b33..ab913d3 100644 --- a/Models/HumanLanguageCatalog.cs +++ b/Models/HumanLanguageCatalog.cs @@ -103,6 +103,20 @@ public static class HumanLanguageCatalog map.TryAdd(normalizedAlias, normalizedCanonical); } + // Force an alias to a canonical, overriding whatever culture enumeration inserted for that + // key. TryAdd is not enough here: on a host whose ICU data carries a "Norwegian Nynorsk" + // culture, the enumeration below claims the key "nynorsk" -> "Norwegian Nynorsk" first, and a + // later TryAdd("nynorsk", "Norwegian") silently loses. That made "nynorsk" resolve to + // "Norwegian Nynorsk" on the CI runner but "Norwegian" locally — the same host-ICU dependence + // this seeding exists to remove. Overrides must win regardless of insertion order. + void Override(string alias, string canonical) + { + var normalizedAlias = NormalizeKey(alias); + var normalizedCanonical = NormalizeDisplayName(canonical); + if (string.IsNullOrWhiteSpace(normalizedAlias) || string.IsNullOrWhiteSpace(normalizedCanonical)) return; + map[normalizedAlias] = normalizedCanonical; + } + // Seeded FIRST, and deliberately not derived from the host. // // This table used to come only from CultureInfo.GetCultures, which returns whatever @@ -145,14 +159,20 @@ public static class HumanLanguageCatalog Add(native, english); } - Add("norsk", "Norwegian"); - Add("bokmal", "Norwegian"); - Add("bokmål", "Norwegian"); - Add("nynorsk", "Norwegian"); - Add("mandarin", "Chinese"); - Add("cantonese", "Chinese"); - Add("farsi", "Persian"); - Add("persian", "Persian"); + // These collapse regional/script variants and common exonyms to the umbrella language a CV + // means. They must beat culture enumeration (see Override), because ICU carries "Norwegian + // Bokmål"/"Norwegian Nynorsk" and "Chinese (Simplified/Traditional)" as their own cultures. + Override("norsk", "Norwegian"); + Override("bokmal", "Norwegian"); + Override("bokmål", "Norwegian"); + Override("nynorsk", "Norwegian"); + Override("norwegian bokmal", "Norwegian"); + Override("norwegian bokmål", "Norwegian"); + Override("norwegian nynorsk", "Norwegian"); + Override("mandarin", "Chinese"); + Override("cantonese", "Chinese"); + Override("farsi", "Persian"); + Override("persian", "Persian"); return map; }