public static List <CultureInfo> GetCultures(CultureTypes cultureTypes) { List <CultureInfo> cultures = new List <CultureInfo>(); 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("en-US")); //cultures.Add(new CultureInfo("zh-CHS")); //cultures.Add(new CultureInfo("zh-CHT")); } return(cultures); }
private static extern bool EnumSystemLocalesEx(EnumLocalesProcExDelegate pEnumProcEx, LocaleType dwFlags, int lParam, IntPtr lpReserved);
public static extern bool EnumSystemLocalesEx( EnumLocalesProcExDelegate pEnumProcEx, LOCALETYPE dwFlags, int lParam, IntPtr lpReserved);