Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>James' comment pointed me in the right direction. Here is the code I developed. I checked the code using a unit test to ensure that the returned neutral, specific and all cultures are identical with the cultures CultureInfo.GetCultures returns (and they indeed are :-)).</p> <pre><code>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&lt;CultureInfo&gt; GetCultures( CultureTypes cultureTypes) { List&lt;CultureInfo&gt; cultures = new List&lt;CultureInfo&gt;(); EnumLocalesProcExDelegate enumCallback = (locale, flags, lParam) =&gt; { 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&lt;CultureInfo&gt;(cultures); } } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload