1 diff --git a/src/Tasks/CultureInfoCache.cs b/src/Tasks/CultureInfoCache.cs
2 index 617331138..88992cb07 100644
3 --- a/src/Tasks/CultureInfoCache.cs
4 +++ b/src/Tasks/CultureInfoCache.cs
5 @@ -19,47 +19,8 @@ namespace Microsoft.Build.Tasks
7 internal static class CultureInfoCache
9 - private static readonly HashSet<string> ValidCultureNames = InitializeValidCultureNames();
11 - static HashSet<string> InitializeValidCultureNames()
13 -#if !FEATURE_CULTUREINFO_GETCULTURES
14 - if (!AssemblyUtilities.CultureInfoHasGetCultures())
16 - return HardcodedCultureNames;
19 - HashSet<string> validCultureNames = new(StringComparer.OrdinalIgnoreCase);
20 - foreach (CultureInfo cultureName in AssemblyUtilities.GetAllCultures())
22 - validCultureNames.Add(cultureName.Name);
25 - // https://docs.microsoft.com/en-gb/windows/desktop/Intl/using-pseudo-locales-for-localization-testing
26 - // These pseudo-locales are available in versions of Windows from Vista and later.
27 - // However, from Windows 10, version 1803, they are not returned when enumerating the
28 - // installed cultures, even if the registry keys are set. Therefore, add them to the list manually.
29 - string[] pseudoLocales = new[] { "qps-ploc", "qps-ploca", "qps-plocm", "qps-Latn-x-sh" };
31 - foreach (string pseudoLocale in pseudoLocales)
33 - validCultureNames.Add(pseudoLocale);
36 - return validCultureNames;
40 - /// Determine if a culture string represents a valid <see cref="CultureInfo"/> instance.
42 - /// <param name="name">The culture name.</param>
43 - /// <returns>True if the culture is determined to be valid.</returns>
44 - internal static bool IsValidCultureString(string name)
46 - return ValidCultureNames.Contains(name);
49 -#if !FEATURE_CULTUREINFO_GETCULTURES
50 + #if !FEATURE_CULTUREINFO_GETCULTURES
51 // Copied from https://github.com/aspnet/Localization/blob/5e1fb16071affd15f15b9c732833f3ae2ac46e10/src/Microsoft.Framework.Globalization.CultureInfoCache/CultureInfoList.cs
52 // Regenerated using the tool (removed by https://github.com/aspnet/Localization/pull/130)
53 // * Removed the empty string from the list
54 @@ -919,5 +880,57 @@ namespace Microsoft.Build.Tasks
59 + private static readonly HashSet<string> ValidCultureNames = InitializeValidCultureNames();
61 + static HashSet<string> InitializeValidCultureNames()
63 +#if !FEATURE_CULTUREINFO_GETCULTURES
64 + if (!AssemblyUtilities.CultureInfoHasGetCultures())
66 + return HardcodedCultureNames;
70 + var HardcodedCultureNamesWithTizen = new HashSet<string>(HardcodedCultureNames, StringComparer.OrdinalIgnoreCase);
71 + var tizenLocales = new HashSet<string>(StringComparer.OrdinalIgnoreCase) {
72 + "bh-IN", "bhb-IN", "ckb-IQ", "ks-IN", "ku-Arab-IN", "mai-IN", "sat-IN", "sd-IN", "tcy-IN", "tu-IN", "tl-PH"};
73 + foreach (string tizenLocale in tizenLocales)
75 + HardcodedCultureNamesWithTizen.Add(tizenLocale);
77 + return HardcodedCultureNamesWithTizen;
81 + HashSet<string> validCultureNames = new(StringComparer.OrdinalIgnoreCase);
82 + foreach (CultureInfo cultureName in AssemblyUtilities.GetAllCultures())
84 + validCultureNames.Add(cultureName.Name);
87 + // https://docs.microsoft.com/en-gb/windows/desktop/Intl/using-pseudo-locales-for-localization-testing
88 + // These pseudo-locales are available in versions of Windows from Vista and later.
89 + // However, from Windows 10, version 1803, they are not returned when enumerating the
90 + // installed cultures, even if the registry keys are set. Therefore, add them to the list manually.
91 + string[] pseudoLocales = new[] { "qps-ploc", "qps-ploca", "qps-plocm", "qps-Latn-x-sh" };
93 + foreach (string pseudoLocale in pseudoLocales)
95 + validCultureNames.Add(pseudoLocale);
98 + return validCultureNames;
102 + /// Determine if a culture string represents a valid <see cref="CultureInfo"/> instance.
104 + /// <param name="name">The culture name.</param>
105 + /// <returns>True if the culture is determined to be valid.</returns>
106 + internal static bool IsValidCultureString(string name)
108 + return ValidCultureNames.Contains(name);