Remplacement de CultureInfo.GetCultures dans les applications .NET Windows Store

CultureInfo.GetCultures n’existe pas dans l’API .NET pour les applications du Windows Store. Comment pourrions-nous lire toutes les cultures disponibles à la place?

Je connais la liste des langues et la langue principale de l’application. Je pourrais lire toutes les langues disponibles pour l’application de cette façon. Mais je dois lire toutes les cultures (langues) disponibles sur le système. Auparavant, il était facile d’utiliser CultureInfo.GetCultures.

Le commentaire de James m’a orienté dans la bonne direction. Voici le code que j’ai développé. J’ai vérifié le code en utilisant un test unitaire pour vérifier que les cultures neutres, spécifiques et de toutes les cultures sont identiques aux cultures CultureInfo.GetCultures (et ce sont bien :-)).

 public class LocalesResortingevalException : Exception { public LocalesResortingevalException(ssortingng message) : base(message) { } } public static class CultureHelper { #region Windows API private delegate bool EnumLocalesProcExDelegate( [MarshalAs(UnmanagedType.LPWStr)]Ssortingng lpLocaleSsortingng, 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 LocalesResortingevalException("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); } }