From 211770a99643807819b22adc6e2794b41d95bc3e Mon Sep 17 00:00:00 2001 From: Daria Tiurina Date: Tue, 22 Jul 2025 11:54:07 +0200 Subject: [PATCH 1/8] Added CultureUI import --- .../src/Hosting/WebAssemblyCultureProvider.cs | 3 ++- .../Tests/WebAssemblyLocalizationTest.cs | 19 +++++++++++++++++++ .../BasicTestApp/LocalizedText.razor | 1 + .../test/testassets/BasicTestApp/Program.cs | 9 ++++++++- 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyCultureProvider.cs b/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyCultureProvider.cs index 060bd827b93f..13f0bf4d5e2e 100644 --- a/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyCultureProvider.cs +++ b/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyCultureProvider.cs @@ -3,6 +3,7 @@ using System.Diagnostics.CodeAnalysis; using System.Globalization; +using System.Linq; using System.Runtime.InteropServices.JavaScript; namespace Microsoft.AspNetCore.Components.WebAssembly.Hosting; @@ -62,7 +63,7 @@ public virtual async ValueTask LoadCurrentCultureResourcesAsync() throw new PlatformNotSupportedException("This method is only supported in the browser."); } - var culturesToLoad = GetCultures(CultureInfo.CurrentCulture); + var culturesToLoad = GetCultures(CultureInfo.CurrentCulture).Union(GetCultures(CultureInfo.CurrentUICulture)).ToArray(); if (culturesToLoad.Length == 0) { diff --git a/src/Components/test/E2ETest/Tests/WebAssemblyLocalizationTest.cs b/src/Components/test/E2ETest/Tests/WebAssemblyLocalizationTest.cs index 2265de49da5f..0f04220d02a2 100644 --- a/src/Components/test/E2ETest/Tests/WebAssemblyLocalizationTest.cs +++ b/src/Components/test/E2ETest/Tests/WebAssemblyLocalizationTest.cs @@ -35,4 +35,23 @@ public void CanSetCultureAndReadLocalizedResources(string culture, string messag var messageDisplay = Browser.Exists(By.Id("message-display")); Assert.Equal(message, messageDisplay.Text); } + + [Theory] + [InlineData("en-US", "fr-FR", "Bonjour!")] + [InlineData("fr-FR", "en-US", "Hello!")] + public void CanSetCultureAndDifferentiateBetweenCurrentAndUICulture(string culture, string cultureUI, string message) + { + Navigate($"{ServerPathBase}/?culture={culture}&cultureUI={cultureUI}"); + + Browser.MountTestComponent(); + + var cultureDisplay = Browser.Exists(By.Id("culture-name-display")); + Assert.Equal($"Culture is: {culture}", cultureDisplay.Text); + + var cultureUIDisplay = Browser.Exists(By.Id("culture-ui-display")); + Assert.Equal($"CultureUI is: {cultureUI}", cultureUIDisplay.Text); + + var messageDisplay = Browser.Exists(By.Id("message-display")); + Assert.Equal(message, messageDisplay.Text); + } } diff --git a/src/Components/test/testassets/BasicTestApp/LocalizedText.razor b/src/Components/test/testassets/BasicTestApp/LocalizedText.razor index a86579e3c975..79ac237568b7 100644 --- a/src/Components/test/testassets/BasicTestApp/LocalizedText.razor +++ b/src/Components/test/testassets/BasicTestApp/LocalizedText.razor @@ -1,2 +1,3 @@ 

Culture is: @System.Globalization.CultureInfo.CurrentCulture.Name

+

CultureUI is: @System.Globalization.CultureInfo.CurrentUICulture.Name

@Resources.Message

diff --git a/src/Components/test/testassets/BasicTestApp/Program.cs b/src/Components/test/testassets/BasicTestApp/Program.cs index 554e65ba1ffe..0332b3915c88 100644 --- a/src/Components/test/testassets/BasicTestApp/Program.cs +++ b/src/Components/test/testassets/BasicTestApp/Program.cs @@ -63,6 +63,7 @@ private static void ConfigureCulture(WebAssemblyHost host) { // In the absence of a specified value, we want the culture to be en-US so that the tests for bind can work consistently. var culture = new CultureInfo("en-US"); + var cultureUI = new CultureInfo("en-US"); Uri uri = null; try @@ -77,12 +78,18 @@ private static void ConfigureCulture(WebAssemblyHost host) if (uri != null && HttpUtility.ParseQueryString(uri.Query)["culture"] is string cultureName) { culture = new CultureInfo(cultureName); + cultureUI = culture; // Default to the same culture for UI if not specified + } + + if (uri != null && HttpUtility.ParseQueryString(uri.Query)["cultureUI"] is string cultureUIName) + { + cultureUI = new CultureInfo(cultureUIName); } // CultureInfo.CurrentCulture is async-scoped and will not affect the culture in sibling scopes. // Use CultureInfo.DefaultThreadCurrentCulture instead to modify the application's default scope. CultureInfo.DefaultThreadCurrentCulture = culture; - CultureInfo.DefaultThreadCurrentUICulture = culture; + CultureInfo.DefaultThreadCurrentUICulture = cultureUI; } // Supports E2E tests in StartupErrorNotificationTest From 3434e4d0c75eb9fc428a8f6d6fd6335f59559460 Mon Sep 17 00:00:00 2001 From: Daria Tiurina Date: Thu, 24 Jul 2025 16:34:17 +0200 Subject: [PATCH 2/8] Test and feedback --- .../src/Hosting/WebAssemblyCultureProvider.cs | 24 ++++++++++++------- .../Hosting/WebAssemblyCultureProviderTest.cs | 13 ++++++++++ 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyCultureProvider.cs b/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyCultureProvider.cs index 13f0bf4d5e2e..b8583e9c836a 100644 --- a/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyCultureProvider.cs +++ b/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyCultureProvider.cs @@ -3,7 +3,6 @@ using System.Diagnostics.CodeAnalysis; using System.Globalization; -using System.Linq; using System.Runtime.InteropServices.JavaScript; namespace Microsoft.AspNetCore.Components.WebAssembly.Hosting; @@ -63,7 +62,7 @@ public virtual async ValueTask LoadCurrentCultureResourcesAsync() throw new PlatformNotSupportedException("This method is only supported in the browser."); } - var culturesToLoad = GetCultures(CultureInfo.CurrentCulture).Union(GetCultures(CultureInfo.CurrentUICulture)).ToArray(); + var culturesToLoad = GetCultures(CultureInfo.CurrentCulture, CultureInfo.CurrentUICulture); if (culturesToLoad.Length == 0) { @@ -73,25 +72,34 @@ public virtual async ValueTask LoadCurrentCultureResourcesAsync() await WebAssemblyCultureProviderInterop.LoadSatelliteAssemblies(culturesToLoad); } - internal static string[] GetCultures(CultureInfo cultureInfo) + internal static string[] GetCultures(CultureInfo? cultureInfo, CultureInfo? uiCultureInfo = null) { var culturesToLoad = new List(); + if (uiCultureInfo == null) + { + uiCultureInfo = cultureInfo; + } + // Once WASM is ready, we have to use .NET's assembly loading to load additional assemblies. // First calculate all possible cultures that the application might want to load. We do this by // starting from the current culture and walking up the graph of parents. // At the end of the the walk, we'll have a list of culture names that look like // [ "fr-FR", "fr" ] - while (cultureInfo != null && cultureInfo != CultureInfo.InvariantCulture) + while ((cultureInfo != null && cultureInfo != CultureInfo.InvariantCulture) || (uiCultureInfo != null && uiCultureInfo != CultureInfo.InvariantCulture)) { - culturesToLoad.Add(cultureInfo.Name); + if (cultureInfo != null && cultureInfo != CultureInfo.InvariantCulture) + { + culturesToLoad.Add(cultureInfo.Name); + } - if (cultureInfo.Parent == cultureInfo) + if (uiCultureInfo?.Name != cultureInfo?.Name && uiCultureInfo != null && uiCultureInfo != CultureInfo.InvariantCulture) { - break; + culturesToLoad.Add(uiCultureInfo.Name); } - cultureInfo = cultureInfo.Parent; + cultureInfo = cultureInfo?.Parent; + uiCultureInfo = uiCultureInfo?.Parent; } return culturesToLoad.ToArray(); diff --git a/src/Components/WebAssembly/WebAssembly/test/Hosting/WebAssemblyCultureProviderTest.cs b/src/Components/WebAssembly/WebAssembly/test/Hosting/WebAssemblyCultureProviderTest.cs index 4e4d0dc943ee..5efa328b6f4c 100644 --- a/src/Components/WebAssembly/WebAssembly/test/Hosting/WebAssemblyCultureProviderTest.cs +++ b/src/Components/WebAssembly/WebAssembly/test/Hosting/WebAssemblyCultureProviderTest.cs @@ -24,6 +24,19 @@ public void GetCultures_ReturnsCultureClosure(string cultureName, string[] expec Assert.Equal(expected, actual); } + [Theory] + [InlineData("fr-FR", "tzm-Latn-DZ", new[] { "fr-FR", "tzm-Latn-DZ", "fr", "tzm-Latn", "tzm" })] + public void GetCultures_ReturnCultureClosureWithUICulture(string cultureName, string uiCultureName, string[] expected) + { + // Arrange + var culture = new CultureInfo(cultureName); + var uiCulture = new CultureInfo(uiCultureName); + // Act + var actual = WebAssemblyCultureProvider.GetCultures(culture, uiCulture); + // Assert + Assert.Equal(expected, actual); + } + [Fact] public void ThrowIfCultureChangeIsUnsupported_ThrowsIfCulturesAreDifferentAndICUShardingIsUsed() { From b86de6f8ba9975995560e842f6244e4b027884f9 Mon Sep 17 00:00:00 2001 From: Daria Tiurina Date: Fri, 25 Jul 2025 11:09:40 +0200 Subject: [PATCH 3/8] Improvements --- .../src/Hosting/WebAssemblyCultureProvider.cs | 9 ++------- .../test/Hosting/WebAssemblyCultureProviderTest.cs | 6 ++++-- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyCultureProvider.cs b/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyCultureProvider.cs index b8583e9c836a..39ac5daff773 100644 --- a/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyCultureProvider.cs +++ b/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyCultureProvider.cs @@ -76,11 +76,6 @@ internal static string[] GetCultures(CultureInfo? cultureInfo, CultureInfo? uiCu { var culturesToLoad = new List(); - if (uiCultureInfo == null) - { - uiCultureInfo = cultureInfo; - } - // Once WASM is ready, we have to use .NET's assembly loading to load additional assemblies. // First calculate all possible cultures that the application might want to load. We do this by // starting from the current culture and walking up the graph of parents. @@ -98,8 +93,8 @@ internal static string[] GetCultures(CultureInfo? cultureInfo, CultureInfo? uiCu culturesToLoad.Add(uiCultureInfo.Name); } - cultureInfo = cultureInfo?.Parent; - uiCultureInfo = uiCultureInfo?.Parent; + cultureInfo = (cultureInfo?.Parent == cultureInfo) ? null : cultureInfo?.Parent; + uiCultureInfo = (uiCultureInfo?.Parent == uiCultureInfo) ? null : uiCultureInfo?.Parent; } return culturesToLoad.ToArray(); diff --git a/src/Components/WebAssembly/WebAssembly/test/Hosting/WebAssemblyCultureProviderTest.cs b/src/Components/WebAssembly/WebAssembly/test/Hosting/WebAssemblyCultureProviderTest.cs index 5efa328b6f4c..bdf0a69b4991 100644 --- a/src/Components/WebAssembly/WebAssembly/test/Hosting/WebAssemblyCultureProviderTest.cs +++ b/src/Components/WebAssembly/WebAssembly/test/Hosting/WebAssemblyCultureProviderTest.cs @@ -26,11 +26,13 @@ public void GetCultures_ReturnsCultureClosure(string cultureName, string[] expec [Theory] [InlineData("fr-FR", "tzm-Latn-DZ", new[] { "fr-FR", "tzm-Latn-DZ", "fr", "tzm-Latn", "tzm" })] + [InlineData("fr-FR", null, new[] { "fr-FR", "fr" })] + [InlineData(null, null, new string[0])] public void GetCultures_ReturnCultureClosureWithUICulture(string cultureName, string uiCultureName, string[] expected) { // Arrange - var culture = new CultureInfo(cultureName); - var uiCulture = new CultureInfo(uiCultureName); + var culture = cultureName != null ? new CultureInfo(cultureName) : null; + var uiCulture = uiCultureName != null ? new CultureInfo(uiCultureName) : null; // Act var actual = WebAssemblyCultureProvider.GetCultures(culture, uiCulture); // Assert From c6a0829583f28bb13b0fe622f66003a41f96b70d Mon Sep 17 00:00:00 2001 From: Daria Tiurina Date: Mon, 28 Jul 2025 10:03:29 +0200 Subject: [PATCH 4/8] feedback --- .../WebAssembly/src/Hosting/WebAssemblyCultureProvider.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyCultureProvider.cs b/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyCultureProvider.cs index 39ac5daff773..880977b7908b 100644 --- a/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyCultureProvider.cs +++ b/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyCultureProvider.cs @@ -88,7 +88,7 @@ internal static string[] GetCultures(CultureInfo? cultureInfo, CultureInfo? uiCu culturesToLoad.Add(cultureInfo.Name); } - if (uiCultureInfo?.Name != cultureInfo?.Name && uiCultureInfo != null && uiCultureInfo != CultureInfo.InvariantCulture) + if (uiCultureInfo != null && uiCultureInfo.Name != cultureInfo?.Name && uiCultureInfo != CultureInfo.InvariantCulture) { culturesToLoad.Add(uiCultureInfo.Name); } From 2aa7e02b850917dc5d6050a19d35b92ab7a661fb Mon Sep 17 00:00:00 2001 From: Daria Tiurina Date: Mon, 28 Jul 2025 15:44:10 +0200 Subject: [PATCH 5/8] feedback --- .../WebAssembly/src/Hosting/WebAssemblyCultureProvider.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyCultureProvider.cs b/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyCultureProvider.cs index 880977b7908b..f03a31844999 100644 --- a/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyCultureProvider.cs +++ b/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyCultureProvider.cs @@ -81,7 +81,7 @@ internal static string[] GetCultures(CultureInfo? cultureInfo, CultureInfo? uiCu // starting from the current culture and walking up the graph of parents. // At the end of the the walk, we'll have a list of culture names that look like // [ "fr-FR", "fr" ] - while ((cultureInfo != null && cultureInfo != CultureInfo.InvariantCulture) || (uiCultureInfo != null && uiCultureInfo != CultureInfo.InvariantCulture)) + while (cultureInfo != null || uiCultureInfo != null) { if (cultureInfo != null && cultureInfo != CultureInfo.InvariantCulture) { @@ -93,8 +93,8 @@ internal static string[] GetCultures(CultureInfo? cultureInfo, CultureInfo? uiCu culturesToLoad.Add(uiCultureInfo.Name); } - cultureInfo = (cultureInfo?.Parent == cultureInfo) ? null : cultureInfo?.Parent; - uiCultureInfo = (uiCultureInfo?.Parent == uiCultureInfo) ? null : uiCultureInfo?.Parent; + cultureInfo = (cultureInfo?.Parent == cultureInfo || cultureInfo == CultureInfo.InvariantCulture) ? null : cultureInfo?.Parent; + uiCultureInfo = (uiCultureInfo?.Parent == uiCultureInfo || uiCultureInfo == CultureInfo.InvariantCulture) ? null : uiCultureInfo?.Parent; } return culturesToLoad.ToArray(); From 8ee95fd49cc94d90302ed22eebc347bda765d8bf Mon Sep 17 00:00:00 2001 From: Daria Tiurina Date: Mon, 28 Jul 2025 16:24:01 +0200 Subject: [PATCH 6/8] feedback --- .../WebAssembly/src/Hosting/WebAssemblyCultureProvider.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyCultureProvider.cs b/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyCultureProvider.cs index f03a31844999..d8c0da9db0ff 100644 --- a/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyCultureProvider.cs +++ b/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyCultureProvider.cs @@ -3,6 +3,7 @@ using System.Diagnostics.CodeAnalysis; using System.Globalization; +using System.Linq; using System.Runtime.InteropServices.JavaScript; namespace Microsoft.AspNetCore.Components.WebAssembly.Hosting; @@ -74,7 +75,7 @@ public virtual async ValueTask LoadCurrentCultureResourcesAsync() internal static string[] GetCultures(CultureInfo? cultureInfo, CultureInfo? uiCultureInfo = null) { - var culturesToLoad = new List(); + var culturesToLoad = new HashSet(); // Once WASM is ready, we have to use .NET's assembly loading to load additional assemblies. // First calculate all possible cultures that the application might want to load. We do this by @@ -97,7 +98,7 @@ internal static string[] GetCultures(CultureInfo? cultureInfo, CultureInfo? uiCu uiCultureInfo = (uiCultureInfo?.Parent == uiCultureInfo || uiCultureInfo == CultureInfo.InvariantCulture) ? null : uiCultureInfo?.Parent; } - return culturesToLoad.ToArray(); + return culturesToLoad.ToList().ToArray(); } private partial class WebAssemblyCultureProviderInterop From a82ca3fa307305ba7843c530d12069386dcaad18 Mon Sep 17 00:00:00 2001 From: Daria Tiurina Date: Wed, 30 Jul 2025 16:46:41 +0200 Subject: [PATCH 7/8] Feedback --- .../src/Hosting/WebAssemblyCultureProvider.cs | 39 ++++++++++++------- .../Hosting/WebAssemblyCultureProviderTest.cs | 3 +- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyCultureProvider.cs b/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyCultureProvider.cs index d8c0da9db0ff..99d1476dc10d 100644 --- a/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyCultureProvider.cs +++ b/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyCultureProvider.cs @@ -73,32 +73,45 @@ public virtual async ValueTask LoadCurrentCultureResourcesAsync() await WebAssemblyCultureProviderInterop.LoadSatelliteAssemblies(culturesToLoad); } - internal static string[] GetCultures(CultureInfo? cultureInfo, CultureInfo? uiCultureInfo = null) + internal static string[] GetCultures(CultureInfo cultureInfo, CultureInfo? uiCultureInfo = null) { - var culturesToLoad = new HashSet(); - // Once WASM is ready, we have to use .NET's assembly loading to load additional assemblies. // First calculate all possible cultures that the application might want to load. We do this by // starting from the current culture and walking up the graph of parents. // At the end of the the walk, we'll have a list of culture names that look like // [ "fr-FR", "fr" ] - while (cultureInfo != null || uiCultureInfo != null) + + var culturesToLoad = GetCultureHierarchy(cultureInfo); + if (cultureInfo != uiCultureInfo) { - if (cultureInfo != null && cultureInfo != CultureInfo.InvariantCulture) + foreach (var culture in GetCultureHierarchy(uiCultureInfo)) { - culturesToLoad.Add(cultureInfo.Name); + if (!culturesToLoad.Contains(culture)) + { + culturesToLoad = culturesToLoad.Append(culture); + } + // If the culture is in the list, we can break because we found the common parent. + else + { + break; + } } + } + + return culturesToLoad.ToArray(); + } - if (uiCultureInfo != null && uiCultureInfo.Name != cultureInfo?.Name && uiCultureInfo != CultureInfo.InvariantCulture) + private static IEnumerable GetCultureHierarchy(CultureInfo? culture) + { + while (culture != CultureInfo.InvariantCulture && culture != null) + { + yield return culture.Name; + if (culture == culture.Parent) { - culturesToLoad.Add(uiCultureInfo.Name); + break; } - - cultureInfo = (cultureInfo?.Parent == cultureInfo || cultureInfo == CultureInfo.InvariantCulture) ? null : cultureInfo?.Parent; - uiCultureInfo = (uiCultureInfo?.Parent == uiCultureInfo || uiCultureInfo == CultureInfo.InvariantCulture) ? null : uiCultureInfo?.Parent; + culture = culture.Parent; } - - return culturesToLoad.ToList().ToArray(); } private partial class WebAssemblyCultureProviderInterop diff --git a/src/Components/WebAssembly/WebAssembly/test/Hosting/WebAssemblyCultureProviderTest.cs b/src/Components/WebAssembly/WebAssembly/test/Hosting/WebAssemblyCultureProviderTest.cs index bdf0a69b4991..2f1989330b1e 100644 --- a/src/Components/WebAssembly/WebAssembly/test/Hosting/WebAssemblyCultureProviderTest.cs +++ b/src/Components/WebAssembly/WebAssembly/test/Hosting/WebAssemblyCultureProviderTest.cs @@ -25,7 +25,8 @@ public void GetCultures_ReturnsCultureClosure(string cultureName, string[] expec } [Theory] - [InlineData("fr-FR", "tzm-Latn-DZ", new[] { "fr-FR", "tzm-Latn-DZ", "fr", "tzm-Latn", "tzm" })] + [InlineData("fr-FR", "tzm-Latn-DZ", new[] { "fr-FR", "fr", "tzm-Latn-DZ", "tzm-Latn", "tzm" })] + [InlineData("en-US", "en-GB", new[] { "en-US", "en", "en-GB" })] [InlineData("fr-FR", null, new[] { "fr-FR", "fr" })] [InlineData(null, null, new string[0])] public void GetCultures_ReturnCultureClosureWithUICulture(string cultureName, string uiCultureName, string[] expected) From 3801203e0cd7ba5fcb4c7bd3ea9b99b1590e9b2d Mon Sep 17 00:00:00 2001 From: Daria Tiurina Date: Thu, 31 Jul 2025 09:46:29 +0200 Subject: [PATCH 8/8] Change in test --- .../WebAssembly/test/Hosting/WebAssemblyCultureProviderTest.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Components/WebAssembly/WebAssembly/test/Hosting/WebAssemblyCultureProviderTest.cs b/src/Components/WebAssembly/WebAssembly/test/Hosting/WebAssemblyCultureProviderTest.cs index 2f1989330b1e..22ad7d18fffc 100644 --- a/src/Components/WebAssembly/WebAssembly/test/Hosting/WebAssemblyCultureProviderTest.cs +++ b/src/Components/WebAssembly/WebAssembly/test/Hosting/WebAssemblyCultureProviderTest.cs @@ -28,7 +28,6 @@ public void GetCultures_ReturnsCultureClosure(string cultureName, string[] expec [InlineData("fr-FR", "tzm-Latn-DZ", new[] { "fr-FR", "fr", "tzm-Latn-DZ", "tzm-Latn", "tzm" })] [InlineData("en-US", "en-GB", new[] { "en-US", "en", "en-GB" })] [InlineData("fr-FR", null, new[] { "fr-FR", "fr" })] - [InlineData(null, null, new string[0])] public void GetCultures_ReturnCultureClosureWithUICulture(string cultureName, string uiCultureName, string[] expected) { // Arrange