在.NET Windowsapp store应用中替换CultureInfo.GetCultures

.NET API for Windows Store应用程序中不存在CultureInfo.GetCultures。 我们怎样才能阅读所有可用的文化呢?

我知道语言列表和主要的应用程序语言。 我可以通过这种方式阅读应用程序可用的所有语言。 但我需要阅读系统上可用的所有文化(语言)。 以前使用CultureInfo.GetCultures很容易。

詹姆斯的评论指出了我正确的方向。 这是我开发的代码。 我使用unit testing检查了代码,以确保返回的中性,特定和所有文化与CultureInfo.GetCultures返回的文化相同(并且它们确实是:-))。

 public class LocalesRetrievalException : Exception { public LocalesRetrievalException(string message) : base(message) { } } public static class CultureHelper { #region Windows API private delegate bool EnumLocalesProcExDelegate( [MarshalAs(UnmanagedType.LPWStr)]String lpLocaleString, LocaleType dwFlags, int lParam); [DllImport(@"kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)] private static extern bool EnumSystemLocalesEx(EnumLocalesProcExDelegate pEnumProcEx, LocaleType dwFlags, int lParam, IntPtr lpReserved); private enum LocaleType : uint { LocaleAll = 0x00000000, // Enumerate all named based locales LocaleWindows = 0x00000001, // Shipped locales and/or replacements for them LocaleSupplemental = 0x00000002, // Supplemental locales only LocaleAlternateSorts = 0x00000004, // Alternate sort locales LocaleNeutralData = 0x00000010, // Locales that are "neutral" (language only, region data is default) LocaleSpecificData = 0x00000020, // Locales that contain language and region data } #endregion public enum CultureTypes : uint { SpecificCultures = LocaleType.LocaleSpecificData, NeutralCultures = LocaleType.LocaleNeutralData, AllCultures = LocaleType.LocaleWindows } public static IReadOnlyCollection GetCultures( CultureTypes cultureTypes) { List cultures = new List(); EnumLocalesProcExDelegate enumCallback = (locale, flags, lParam) => { try { cultures.Add(new CultureInfo(locale)); } catch (CultureNotFoundException) { // This culture is not supported by .NET (not happened so far) // Must be ignored. } return true; }; if (EnumSystemLocalesEx(enumCallback, (LocaleType)cultureTypes, 0, (IntPtr)0) == false) { int errorCode = Marshal.GetLastWin32Error(); throw new LocalesRetrievalException("Win32 error " + errorCode + " while trying to get the Windows locales"); } // Add the two neutral cultures that Windows misses // (CultureInfo.GetCultures adds them also): if (cultureTypes == CultureTypes.NeutralCultures || cultureTypes == CultureTypes.AllCultures) { cultures.Add(new CultureInfo("zh-CHS")); cultures.Add(new CultureInfo("zh-CHT")); } return new ReadOnlyCollection(cultures); } }