Skip to content

Commit 67a567f

Browse files
tarekghCopilot
andauthored
Fix Creating Undermined Culture (#115919)
* Fix Creating Undermined Culture * Update src/libraries/System.Private.CoreLib/src/System/Globalization/CultureData.cs Co-authored-by: Copilot <[email protected]> * Update to work on OSX * restore removed empty line * Feedback --------- Co-authored-by: Copilot <[email protected]>
1 parent 2765f18 commit 67a567f

File tree

3 files changed

+18
-2
lines changed

3 files changed

+18
-2
lines changed

src/libraries/System.Private.CoreLib/src/System/Globalization/CultureData.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -667,8 +667,11 @@ private static CultureData CreateCultureWithInvariantData()
667667

668668
internal static CultureData? GetCultureData(string? cultureName, bool useUserOverride)
669669
{
670+
// The undetermined culture name "und" is not a real culture, but it resolves to the invariant culture because ICU typically normalizes it to an empty string.
671+
const string UndeterminedCultureName = "und";
672+
670673
// First do a shortcut for Invariant
671-
if (string.IsNullOrEmpty(cultureName))
674+
if (string.IsNullOrEmpty(cultureName) || cultureName.Equals(UndeterminedCultureName, StringComparison.OrdinalIgnoreCase))
672675
{
673676
return Invariant;
674677
}

src/libraries/System.Private.CoreLib/src/System/Globalization/CultureInfo.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1052,7 +1052,8 @@ public static CultureInfo GetCultureInfo(string name)
10521052

10531053
lock (nameTable)
10541054
{
1055-
nameTable[name] = result;
1055+
// add only if it wasn't already added
1056+
nameTable.TryAdd(name, result);
10561057
}
10571058

10581059
return result;

src/libraries/System.Runtime/tests/System.Globalization.Tests/CultureInfo/CultureInfoCtor.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,18 @@ public void CtorUndeterminedLanguageTag(string cultureName, string expectedCultu
417417
Assert.Equal(expectedSortName, culture.CompareInfo.Name);
418418
}
419419

420+
[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsIcuGlobalization))]
421+
public void UndeterminedCultureTest()
422+
{
423+
CultureInfo invariant1 = CultureInfo.GetCultureInfo("");
424+
425+
CultureInfo undetermined1 = CultureInfo.GetCultureInfo("und");
426+
Assert.Equal("", undetermined1.Name);
427+
428+
CultureInfo invariant2 = CultureInfo.GetCultureInfo("");
429+
Assert.True(object.ReferenceEquals(invariant1, invariant2), "CultureInfo.GetCultureInfo(\"\") is not returning the previously cached instance");
430+
}
431+
420432
[Theory]
421433
[MemberData(nameof(Ctor_String_TestData))]
422434
public void Ctor_String(string name, string[] expectedNames)

0 commit comments

Comments
 (0)