enumsystemlocales (kernel32)
Last changed: -84.149.92.161

.
Summary
TODO - a short description

C# Signature:

    public delegate bool EnumLocalesProcExDelegate([MarshalAs(UnmanagedType.LPWStr)]String lpLocaleString, LOCALETYPE dwFlags, int lParam);

    [DllImport(@"kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    public static extern bool EnumSystemLocalesEx(EnumLocalesProcExDelegate pEnumProcEx, LOCALETYPE dwFlags, int lParam, IntPtr lpReserved);

    public enum LOCALETYPE:uint
    {
    LOCALE_ALL          = 0x00000000, // enumerate all named based locales
    LOCALE_WINDOWS          = 0x00000001, // shipped locales and/or replacements for them
    LOCALE_SUPPLEMENTAL     = 0x00000002, // supplemental locales only
    LOCALE_ALTERNATE_SORTS      = 0x00000004, // alternate sort locales
    LOCALE_NEUTRALDATA      = 0x00000010, // Locales that are "neutral" (language only, region data is default)
    LOCALE_SPECIFICDATA     = 0x00000020, // Locales that contain language and region data
    }

VB Signature:

Declare Function EnumSystemLocalesEx Lib "kernel32.dll" (TODO) As TODO

User-Defined Types:

None.

VBA Signature:

    #If VBA7 Then
      Private Declare PtrSafe Function EnumSystemLocalesEx Lib "kernel32.dll" ( _
        ByVal lpLocaleEnumProcEx As Long, _
        ByVal dwFlags As Long, _
        ByVal lParam As Long, _
        ByVal lpReserved As Long) As Long
    #Else
      Private Declare Function EnumSystemLocalesEx Lib "kernel32.dll" ( _
        ByVal lpLocaleEnumProcEx As Long, _
        ByVal dwFlags As Long, _
        ByVal lParam As Long, _
        ByVal lpReserved As Long) As Long
    #End If

Alternative Managed API:

Do you know one? Please contribute it!

Notes:

None.

Tips & Tricks:

Please add some!

Sample Code:

// provided as-is

    using System;
    using System.Text;
    using System.Globalization;
    using System.Runtime.InteropServices;


    class Test
    {
    static void Main()
        {
        // Try GetLocaleInfoEx
        Console.WriteLine("GetLocaleInfoEx()");
        DoGetLocaleInfo("", LCTYPE.LOCALE_SENGLISHDISPLAYNAME);
        DoGetLocaleInfo(null, LCTYPE.LOCALE_SENGLISHDISPLAYNAME);
        DoGetLocaleInfo("en-US", LCTYPE.LOCALE_SENGLISHDISPLAYNAME);
        DoGetLocaleInfo("tlh-piqad", LCTYPE.LOCALE_SENGLISHDISPLAYNAME);
        DoGetLocaleInfo("fj-FJ", LCTYPE.LOCALE_SENGLISHDISPLAYNAME);
        DoGetLocaleInfo("fj", LCTYPE.LOCALE_SENGLISHDISPLAYNAME);
        DoGetLocaleInfo("haw-US", LCTYPE.LOCALE_SENGLISHDISPLAYNAME);
        DoGetLocaleInfo("hasdfasdf", LCTYPE.LOCALE_SENGLISHDISPLAYNAME);

        // Try lcid->name
        Console.WriteLine("\nLCIDToLocaleName()");
        DoLCIDToLocaleName(0x0409);
        DoLCIDToLocaleName(0x0c0a);
        DoLCIDToLocaleName(0x0c00);
        DoLCIDToLocaleName(0x0400);
        DoLCIDToLocaleName(0x1234);

        // Try enumSystemLocalesEx
        Console.WriteLine("\nEnumSystemLocalesEx()");
        Console.WriteLine("LOCALE_ALL");
        DoEnumSystemLocalesEx(LOCALETYPE.LOCALE_ALL);

    }

    static void DoGetLocaleInfo(string locale, LCTYPE lctype)
    {
        StringBuilder data = new StringBuilder(500);
        int result;

        result = LocaleFunctions.GetLocaleInfoEx(locale, lctype, data, 500);

        if (result != 0)
        Console.WriteLine(data);
        else
        ShowError();
    }

    static void DoLCIDToLocaleName(uint lcid)
    {
        StringBuilder data = new StringBuilder(500);
        int result;

        result = LocaleFunctions.LCIDToLocaleName(lcid, data, 500, 0);

        if (result != 0)
        Console.WriteLine(data);
        else
        ShowError();
    }

    static void DoEnumSystemLocalesEx(LOCALETYPE dwFlags)
    {
        LocaleFunctions.EnumLocalesProcExDelegate enumCallback =
        new LocaleFunctions.EnumLocalesProcExDelegate(Test.EnumLocalesProcEx);

        if (!LocaleFunctions.EnumSystemLocalesEx(enumCallback, dwFlags, 0, (IntPtr)0))
        ShowError();
    }

    public static bool EnumLocalesProcEx(String locale, LOCALETYPE flags, int lParam)
    {
        Console.WriteLine("    {0,-12} {1:F}", locale, flags);

        return true;
    }

    static void ShowError()
    {
        int err = Marshal.GetLastWin32Error();
        string strErr = err.ToString();

        switch (err)
        {
        case 87:
            strErr = "ERROR_INVALID_PARAMETER";
            break;
        }

        Console.WriteLine("ERROR: {0} {1}", err, strErr);
    }

    }

    class LocaleFunctions
    {
    // pInvoke declarations
    [DllImport(@"kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    public static extern int GetLocaleInfoEx(String lpLocaleName, LCTYPE LCType, StringBuilder lpLCData, int cchData);

    [DllImport(@"kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    public static extern int LCIDToLocaleName(uint Locale, StringBuilder lpName, int cchName, int dwFlags);

    public delegate bool EnumLocalesProcExDelegate([MarshalAs(UnmanagedType.LPWStr)]String lpLocaleString, LOCALETYPE dwFlags, int lParam);

    [DllImport(@"kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    public static extern bool EnumSystemLocalesEx(EnumLocalesProcExDelegate pEnumProcEx, LOCALETYPE dwFlags, int lParam, IntPtr lpReserved);
    }

    public enum LOCALETYPE:uint
    {
    LOCALE_ALL          = 0x00000000, // enumerate all named based locales
    LOCALE_WINDOWS          = 0x00000001, // shipped locales and/or replacements for them
    LOCALE_SUPPLEMENTAL     = 0x00000002, // supplemental locales only
    LOCALE_ALTERNATE_SORTS      = 0x00000004, // alternate sort locales
    LOCALE_NEUTRALDATA      = 0x00000010, // Locales that are "neutral" (language only, region data is default)
    LOCALE_SPECIFICDATA     = 0x00000020, // Locales that contain language and region data
    }

    public enum LCTYPE:uint
    {
    LOCALE_NOUSEROVERRIDE     =0x80000000,   // do not use user overrides
    LOCALE_RETURN_NUMBER      =0x20000000,   // return number instead of string

    // Modifier for genitive names
    LOCALE_RETURN_GENITIVE_NAMES  =0x10000000,   //Flag to return the Genitive forms of month names

    //
    //  The following LCTypes are mutually exclusive in that they may NOT
    //  be used in combination with each other.
    //

    //
    // These are the various forms of the name of the locale:
    //
    LOCALE_SLOCALIZEDDISPLAYNAME  =0x00000002,   // localized name of locale, eg "German (Germany)" in UI language
    LOCALE_SENGLISHDISPLAYNAME    =0x00000072,   // Display name (language + country usually) in English, eg "German (Germany)"
    LOCALE_SNATIVEDISPLAYNAME     =0x00000073,   // Display name in native locale language, eg "Deutsch (Deutschland)

    LOCALE_SLOCALIZEDLANGUAGENAME =0x0000006f,   // Language Display Name for a language, eg "German" in UI language
    LOCALE_SENGLISHLANGUAGENAME   =0x00001001,   // English name of language, eg "German"
    LOCALE_SNATIVELANGUAGENAME    =0x00000004,   // native name of language, eg "Deutsch"

    LOCALE_SLOCALIZEDCOUNTRYNAME  =0x00000006,   // localized name of country, eg "Germany" in UI language
    LOCALE_SENGLISHCOUNTRYNAME    =0x00001002,   // English name of country, eg "Germany"
    LOCALE_SNATIVECOUNTRYNAME     =0x00000008,   // native name of country, eg "Deutschland"

    // Additional LCTYPEs
    LOCALE_SABBREVLANGNAME    =0x00000003,   // abbreviated language name

    LOCALE_ICOUNTRY           =0x00000005,   // country code
    LOCALE_SABBREVCTRYNAME    =0x00000007,   // abbreviated country name
    LOCALE_IGEOID         =0x0000005B,   // geographical location id

    LOCALE_IDEFAULTLANGUAGE       =0x00000009,   // default language id
    LOCALE_IDEFAULTCOUNTRY    =0x0000000A,   // default country code
    LOCALE_IDEFAULTCODEPAGE       =0x0000000B,   // default oem code page
    LOCALE_IDEFAULTANSICODEPAGE   =0x00001004,   // default ansi code page
    LOCALE_IDEFAULTMACCODEPAGE    =0x00001011,   // default mac code page

    LOCALE_SLIST          =0x0000000C,   // list item separator
    LOCALE_IMEASURE           =0x0000000D,   // 0 = metric, 1 = US

    LOCALE_SDECIMAL           =0x0000000E,   // decimal separator
    LOCALE_STHOUSAND          =0x0000000F,   // thousand separator
    LOCALE_SGROUPING          =0x00000010,   // digit grouping
    LOCALE_IDIGITS        =0x00000011,   // number of fractional digits
    LOCALE_ILZERO         =0x00000012,   // leading zeros for decimal
    LOCALE_INEGNUMBER         =0x00001010,   // negative number mode
    LOCALE_SNATIVEDIGITS      =0x00000013,   // native digits for 0-9

    LOCALE_SCURRENCY          =0x00000014,   // local monetary symbol
    LOCALE_SINTLSYMBOL        =0x00000015,   // uintl monetary symbol
    LOCALE_SMONDECIMALSEP     =0x00000016,   // monetary decimal separator
    LOCALE_SMONTHOUSANDSEP    =0x00000017,   // monetary thousand separator
    LOCALE_SMONGROUPING       =0x00000018,   // monetary grouping
    LOCALE_ICURRDIGITS        =0x00000019,   // # local monetary digits
    LOCALE_IINTLCURRDIGITS    =0x0000001A,   // # uintl monetary digits
    LOCALE_ICURRENCY          =0x0000001B,   // positive currency mode
    LOCALE_INEGCURR           =0x0000001C,   // negative currency mode

    LOCALE_SDATE          =0x0000001D,   // date separator (derived from LOCALE_SSHORTDATE, use that instead)
    LOCALE_STIME          =0x0000001E,   // time separator (derived from LOCALE_STIMEFORMAT, use that instead)
    LOCALE_SSHORTDATE         =0x0000001F,   // short date format string
    LOCALE_SLONGDATE          =0x00000020,   // long date format string
    LOCALE_STIMEFORMAT        =0x00001003,   // time format string
    LOCALE_IDATE          =0x00000021,   // short date format ordering (derived from LOCALE_SSHORTDATE, use that instead)
    LOCALE_ILDATE         =0x00000022,   // long date format ordering (derived from LOCALE_SLONGDATE, use that instead)
    LOCALE_ITIME          =0x00000023,   // time format specifier (derived from LOCALE_STIMEFORMAT, use that instead)
    LOCALE_ITIMEMARKPOSN      =0x00001005,   // time marker position (derived from LOCALE_STIMEFORMAT, use that instead)
    LOCALE_ICENTURY           =0x00000024,   // century format specifier (short date, LOCALE_SSHORTDATE is preferred)
    LOCALE_ITLZERO        =0x00000025,   // leading zeros in time field (derived from LOCALE_STIMEFORMAT, use that instead)
    LOCALE_IDAYLZERO          =0x00000026,   // leading zeros in day field (short date, LOCALE_SSHORTDATE is preferred)
    LOCALE_IMONLZERO          =0x00000027,   // leading zeros in month field (short date, LOCALE_SSHORTDATE is preferred)
    LOCALE_S1159          =0x00000028,   // AM designator
    LOCALE_S2359          =0x00000029,   // PM designator

    LOCALE_ICALENDARTYPE      =0x00001009,   // type of calendar specifier
    LOCALE_IOPTIONALCALENDAR      =0x0000100B,   // additional calendar types specifier
    LOCALE_IFIRSTDAYOFWEEK    =0x0000100C,   // first day of week specifier
    LOCALE_IFIRSTWEEKOFYEAR       =0x0000100D,   // first week of year specifier

    LOCALE_SDAYNAME1          =0x0000002A,   // long name for Monday
    LOCALE_SDAYNAME2          =0x0000002B,   // long name for Tuesday
    LOCALE_SDAYNAME3          =0x0000002C,   // long name for Wednesday
    LOCALE_SDAYNAME4          =0x0000002D,   // long name for Thursday
    LOCALE_SDAYNAME5          =0x0000002E,   // long name for Friday
    LOCALE_SDAYNAME6          =0x0000002F,   // long name for Saturday
    LOCALE_SDAYNAME7          =0x00000030,   // long name for Sunday
    LOCALE_SABBREVDAYNAME1    =0x00000031,   // abbreviated name for Monday
    LOCALE_SABBREVDAYNAME2    =0x00000032,   // abbreviated name for Tuesday
    LOCALE_SABBREVDAYNAME3    =0x00000033,   // abbreviated name for Wednesday
    LOCALE_SABBREVDAYNAME4    =0x00000034,   // abbreviated name for Thursday
    LOCALE_SABBREVDAYNAME5    =0x00000035,   // abbreviated name for Friday
    LOCALE_SABBREVDAYNAME6    =0x00000036,   // abbreviated name for Saturday
    LOCALE_SABBREVDAYNAME7    =0x00000037,   // abbreviated name for Sunday
    LOCALE_SMONTHNAME1        =0x00000038,   // long name for January
    LOCALE_SMONTHNAME2        =0x00000039,   // long name for February
    LOCALE_SMONTHNAME3        =0x0000003A,   // long name for March
    LOCALE_SMONTHNAME4        =0x0000003B,   // long name for April
    LOCALE_SMONTHNAME5        =0x0000003C,   // long name for May
    LOCALE_SMONTHNAME6        =0x0000003D,   // long name for June
    LOCALE_SMONTHNAME7        =0x0000003E,   // long name for July
    LOCALE_SMONTHNAME8        =0x0000003F,   // long name for August
    LOCALE_SMONTHNAME9        =0x00000040,   // long name for September
    LOCALE_SMONTHNAME10       =0x00000041,   // long name for October
    LOCALE_SMONTHNAME11       =0x00000042,   // long name for November
    LOCALE_SMONTHNAME12       =0x00000043,   // long name for December
    LOCALE_SMONTHNAME13       =0x0000100E,   // long name for 13th month (if exists)
    LOCALE_SABBREVMONTHNAME1      =0x00000044,   // abbreviated name for January
    LOCALE_SABBREVMONTHNAME2      =0x00000045,   // abbreviated name for February
    LOCALE_SABBREVMONTHNAME3      =0x00000046,   // abbreviated name for March
    LOCALE_SABBREVMONTHNAME4      =0x00000047,   // abbreviated name for April
    LOCALE_SABBREVMONTHNAME5      =0x00000048,   // abbreviated name for May
    LOCALE_SABBREVMONTHNAME6      =0x00000049,   // abbreviated name for June
    LOCALE_SABBREVMONTHNAME7      =0x0000004A,   // abbreviated name for July
    LOCALE_SABBREVMONTHNAME8      =0x0000004B,   // abbreviated name for August
    LOCALE_SABBREVMONTHNAME9      =0x0000004C,   // abbreviated name for September
    LOCALE_SABBREVMONTHNAME10     =0x0000004D,   // abbreviated name for October
    LOCALE_SABBREVMONTHNAME11     =0x0000004E,   // abbreviated name for November
    LOCALE_SABBREVMONTHNAME12     =0x0000004F,   // abbreviated name for December
    LOCALE_SABBREVMONTHNAME13     =0x0000100F,   // abbreviated name for 13th month (if exists)

    LOCALE_SPOSITIVESIGN      =0x00000050,   // positive sign
    LOCALE_SNEGATIVESIGN      =0x00000051,   // negative sign
    LOCALE_IPOSSIGNPOSN       =0x00000052,   // positive sign position (derived from INEGCURR)
    LOCALE_INEGSIGNPOSN       =0x00000053,   // negative sign position (derived from INEGCURR)
    LOCALE_IPOSSYMPRECEDES    =0x00000054,   // mon sym precedes pos amt (derived from ICURRENCY)
    LOCALE_IPOSSEPBYSPACE     =0x00000055,   // mon sym sep by space from pos amt (derived from ICURRENCY)
    LOCALE_INEGSYMPRECEDES    =0x00000056,   // mon sym precedes neg amt (derived from INEGCURR)
    LOCALE_INEGSEPBYSPACE     =0x00000057,   // mon sym sep by space from neg amt (derived from INEGCURR)

    LOCALE_FONTSIGNATURE      =0x00000058,   // font signature
    LOCALE_SISO639LANGNAME    =0x00000059,   // ISO abbreviated language name
    LOCALE_SISO3166CTRYNAME       =0x0000005A,   // ISO abbreviated country name

    LOCALE_IDEFAULTEBCDICCODEPAGE =0x00001012,   // default ebcdic code page
    LOCALE_IPAPERSIZE         =0x0000100A,   // 1 = letter, 5 = legal, 8 = a3, 9 = a4
    LOCALE_SENGCURRNAME       =0x00001007,   // english name of currency
    LOCALE_SNATIVECURRNAME    =0x00001008,   // native name of currency
    LOCALE_SYEARMONTH         =0x00001006,   // year month format string
    LOCALE_SSORTNAME          =0x00001013,   // sort name
    LOCALE_IDIGITSUBSTITUTION     =0x00001014,   // 0 = context, 1 = none, 2 = national

    LOCALE_SNAME          =0x0000005c,   // locale name (with sort info) (ie: de-DE_phoneb)
    LOCALE_SDURATION          =0x0000005d,   // time duration format
    LOCALE_SKEYBOARDSTOINSTALL    =0x0000005e,   // (windows only) keyboards to install
    LOCALE_SSHORTESTDAYNAME1      =0x00000060,   // Shortest day name for Monday
    LOCALE_SSHORTESTDAYNAME2      =0x00000061,   // Shortest day name for Tuesday
    LOCALE_SSHORTESTDAYNAME3      =0x00000062,   // Shortest day name for Wednesday
    LOCALE_SSHORTESTDAYNAME4      =0x00000063,   // Shortest day name for Thursday
    LOCALE_SSHORTESTDAYNAME5      =0x00000064,   // Shortest day name for Friday
    LOCALE_SSHORTESTDAYNAME6      =0x00000065,   // Shortest day name for Saturday
    LOCALE_SSHORTESTDAYNAME7      =0x00000066,   // Shortest day name for Sunday
    LOCALE_SISO639LANGNAME2       =0x00000067,   // 3 character ISO abbreviated language name
    LOCALE_SISO3166CTRYNAME2      =0x00000068,   // 3 character ISO country name
    LOCALE_SNAN           =0x00000069,   // Not a Number
    LOCALE_SPOSINFINITY       =0x0000006a,   // + Infinity
    LOCALE_SNEGINFINITY       =0x0000006b,   // - Infinity
    LOCALE_SSCRIPTS           =0x0000006c,   // Typical scripts in the locale
    LOCALE_SPARENT        =0x0000006d,   // Fallback name for resources
    LOCALE_SCONSOLEFALLBACKNAME   =0x0000006e,   // Fallback name for within the console
    }

Documentation