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
}
Declare Function EnumSystemLocalesEx Lib "kernel32.dll" (TODO) As TODO
None.
#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
Do you know one? Please contribute it!
None.
Please add some!
// 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
}