|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Visual Basic Locale/Regionalization Routines GetLocaleInfo: Regional Locale Date Settings |
|
Posted: | Saturday May 15, 1999 |
Updated: | Monday December 26, 2011 |
Applies to: | VB4-32, VB5, VB6 |
Developed with: | VB6, Windows NT4 |
OS restrictions: | None |
Author: | VBnet - Randy Birch |
Related: |
SetLocaleInfo: Change System Long and Short Date Formats WM_TIMECHANGE: Detect System Changes to the Date/Time EnumDateFormats: Regional Locale Date Settings EnumTimeFormats: Regional Locale Time Settings GetLocaleInfo: Regional Locale Date Settings |
Prerequisites |
None. |
|
The
national language support functions let applications set the locale for the user, identifying the language in which the user carries out work
and retrieves strings, representing times, dates, and other information, that are correctly formatted for the given language and location of
the world. National language support also includes support for keyboard layouts and language-specific fonts.
A locale is a collection of language-related, user-preference information represented as a list of values. Each system has at least one installed locale and often has many locales from which the user may choose. The system assigns a locale to each thread. Initially, the system assigns the system default locale to the thread. This default locale is set by the user when the system is installed or through the Regional Settings program of Control Panel. If a thread is run in a process belonging to a user, the system assigns the user-default locale to the thread. An application can override either default by using the SetThreadLocale function to explicitly set the locale for a thread. There are predefined locale identifiers:
The LOCALE_NEUTRAL identifier is the same as LOCALE_USER_DEFAULT. An application can retrieve the current locale identifiers by using the GetSystemDefaultLCID and GetUserDefaultLCID functions. By using the GetSystemDefaultLCID (or GetThreadLocale) together with GetLocaleInfo(), Visual Basic developers can tap into the user's Regional Settings to assure that dates and times are presented in the manner the user has specified. This demo utilizes only a small subset of the available LOCALE_* values possible, specifically those dealing with returning Date information. Thanks go out to the CCRP gang for helping me piece this together. |
BAS Module Code |
The BAS module presented contains all the possible locale constants that you can use against GetLocaleInfo. Save this module as a template (ie locales.bas); other VBnet projects in development will refer to this file. This file is wider than most to accommodate the necessary comments against the constants. |
|
Option Explicit '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Copyright ©1996-2011 VBnet/Randy Birch, All Rights Reserved. ' Some pages may also contain other copyrights by the author. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Distribution: You can freely use this code in your own ' applications, but you may not reproduce ' or publish this code on any web site, ' online service, or distribute as source ' on any media without express permission. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Public Const LOCALE_ILANGUAGE As Long = &H1 'language id Public Const LOCALE_SLANGUAGE As Long = &H2 'localized name of language Public Const LOCALE_SENGLANGUAGE As Long = &H1001 'English name of language Public Const LOCALE_SABBREVLANGNAME As Long = &H3 'abbreviated language name Public Const LOCALE_SNATIVELANGNAME As Long = &H4 'native name of language Public Const LOCALE_ICOUNTRY As Long = &H5 'country code Public Const LOCALE_SCOUNTRY As Long = &H6 'localized name of country Public Const LOCALE_SENGCOUNTRY As Long = &H1002 'English name of country Public Const LOCALE_SABBREVCTRYNAME As Long = &H7 'abbreviated country name Public Const LOCALE_SNATIVECTRYNAME As Long = &H8 'native name of country Public Const LOCALE_IDEFAULTLANGUAGE As Long = &H9 'default language id Public Const LOCALE_IDEFAULTCOUNTRY As Long = &HA 'default country code Public Const LOCALE_IDEFAULTCODEPAGE As Long = &HB 'default oem code page Public Const LOCALE_IDEFAULTANSICODEPAGE As Long = &H1004 'default ansi code page Public Const LOCALE_IDEFAULTMACCODEPAGE As Long = &H1011 'default mac code page Public Const LOCALE_SLIST As Long = &HC 'list item separator Public Const LOCALE_IMEASURE As Long = &HD '0 = metric, 1 = US Public Const LOCALE_SDECIMAL As Long = &HE 'decimal separator Public Const LOCALE_STHOUSAND As Long = &HF 'thousand separator Public Const LOCALE_SGROUPING As Long = &H10 'digit grouping Public Const LOCALE_IDIGITS As Long = &H11 'number of fractional digits Public Const LOCALE_ILZERO As Long = &H12 'leading zeros for decimal Public Const LOCALE_INEGNUMBER As Long = &H1010 'negative number mode Public Const LOCALE_SNATIVEDIGITS As Long = &H13 'native ascii 0-9 Public Const LOCALE_SCURRENCY As Long = &H14 'local monetary symbol Public Const LOCALE_SINTLSYMBOL As Long = &H15 'intl monetary symbol Public Const LOCALE_SMONDECIMALSEP As Long = &H16 'monetary decimal separator Public Const LOCALE_SMONTHOUSANDSEP As Long = &H17 'monetary thousand separator Public Const LOCALE_SMONGROUPING As Long = &H18 'monetary grouping Public Const LOCALE_ICURRDIGITS As Long = &H19 '# local monetary digits Public Const LOCALE_IINTLCURRDIGITS As Long = &H1A '# intl monetary digits Public Const LOCALE_ICURRENCY As Long = &H1B 'positive currency mode Public Const LOCALE_INEGCURR As Long = &H1C 'negative currency mode Public Const LOCALE_SDATE As Long = &H1D 'date separator Public Const LOCALE_STIME As Long = &H1E 'time separator Public Const LOCALE_SSHORTDATE As Long = &H1F 'short date format string Public Const LOCALE_SLONGDATE As Long = &H20 'long date format string Public Const LOCALE_STIMEFORMAT As Long = &H1003 'time format string Public Const LOCALE_IDATE As Long = &H21 'short date format ordering Public Const LOCALE_ILDATE As Long = &H22 'long date format ordering Public Const LOCALE_ITIME As Long = &H23 'time format specifier Public Const LOCALE_ITIMEMARKPOSN As Long = &H1005 'time marker position Public Const LOCALE_ICENTURY As Long = &H24 'century format specifier (short date) Public Const LOCALE_ITLZERO As Long = &H25 'leading zeros in time field Public Const LOCALE_IDAYLZERO As Long = &H26 'leading zeros in day field (short date) Public Const LOCALE_IMONLZERO As Long = &H27 'leading zeros in month field (short date) Public Const LOCALE_S1159 As Long = &H28 'AM designator Public Const LOCALE_S2359 As Long = &H29 'PM designator Public Const LOCALE_ICALENDARTYPE As Long = &H1009 'type of calendar specifier Public Const LOCALE_IOPTIONALCALENDAR As Long = &H100B 'additional calendar types specifier Public Const LOCALE_IFIRSTDAYOFWEEK As Long = &H100C 'first day of week specifier Public Const LOCALE_IFIRSTWEEKOFYEAR As Long = &H100D 'first week of year specifier Public Const LOCALE_SDAYNAME1 As Long = &H2A 'long name for Monday Public Const LOCALE_SDAYNAME2 As Long = &H2B 'long name for Tuesday Public Const LOCALE_SDAYNAME3 As Long = &H2C 'long name for Wednesday Public Const LOCALE_SDAYNAME4 As Long = &H2D 'long name for Thursday Public Const LOCALE_SDAYNAME5 As Long = &H2E 'long name for Friday Public Const LOCALE_SDAYNAME6 As Long = &H2F 'long name for Saturday Public Const LOCALE_SDAYNAME7 As Long = &H30 'long name for Sunday Public Const LOCALE_SABBREVDAYNAME1 As Long = &H31 'abbreviated name for Monday Public Const LOCALE_SABBREVDAYNAME2 As Long = &H32 'abbreviated name for Tuesday Public Const LOCALE_SABBREVDAYNAME3 As Long = &H33 'abbreviated name for Wednesday Public Const LOCALE_SABBREVDAYNAME4 As Long = &H34 'abbreviated name for Thursday Public Const LOCALE_SABBREVDAYNAME5 As Long = &H35 'abbreviated name for Friday Public Const LOCALE_SABBREVDAYNAME6 As Long = &H36 'abbreviated name for Saturday Public Const LOCALE_SABBREVDAYNAME7 As Long = &H37 'abbreviated name for Sunday Public Const LOCALE_SMONTHNAME1 As Long = &H38 'long name for January Public Const LOCALE_SMONTHNAME2 As Long = &H39 'long name for February Public Const LOCALE_SMONTHNAME3 As Long = &H3A 'long name for March Public Const LOCALE_SMONTHNAME4 As Long = &H3B 'long name for April Public Const LOCALE_SMONTHNAME5 As Long = &H3C 'long name for May Public Const LOCALE_SMONTHNAME6 As Long = &H3D 'long name for June Public Const LOCALE_SMONTHNAME7 As Long = &H3E 'long name for July Public Const LOCALE_SMONTHNAME8 As Long = &H3F 'long name for August Public Const LOCALE_SMONTHNAME9 As Long = &H40 'long name for September Public Const LOCALE_SMONTHNAME10 As Long = &H41 'long name for October Public Const LOCALE_SMONTHNAME11 As Long = &H42 'long name for November Public Const LOCALE_SMONTHNAME12 As Long = &H43 'long name for December Public Const LOCALE_SMONTHNAME13 As Long = &H100E 'long name for 13th month (if exists) Public Const LOCALE_SABBREVMONTHNAME1 As Long = &H44 'abbreviated name for January Public Const LOCALE_SABBREVMONTHNAME2 As Long = &H45 'abbreviated name for February Public Const LOCALE_SABBREVMONTHNAME3 As Long = &H46 'abbreviated name for March Public Const LOCALE_SABBREVMONTHNAME4 As Long = &H47 'abbreviated name for April Public Const LOCALE_SABBREVMONTHNAME5 As Long = &H48 'abbreviated name for May Public Const LOCALE_SABBREVMONTHNAME6 As Long = &H49 'abbreviated name for June Public Const LOCALE_SABBREVMONTHNAME7 As Long = &H4A 'abbreviated name for July Public Const LOCALE_SABBREVMONTHNAME8 As Long = &H4B 'abbreviated name for August Public Const LOCALE_SABBREVMONTHNAME9 As Long = &H4C 'abbreviated name for September Public Const LOCALE_SABBREVMONTHNAME10 As Long = &H4D 'abbreviated name for October Public Const LOCALE_SABBREVMONTHNAME11 As Long = &H4E 'abbreviated name for November Public Const LOCALE_SABBREVMONTHNAME12 As Long = &H4F 'abbreviated name for December Public Const LOCALE_SABBREVMONTHNAME13 As Long = &H100F 'abbreviated name for 13th month (if exists) Public Const LOCALE_SPOSITIVESIGN As Long = &H50 'positive sign Public Const LOCALE_SNEGATIVESIGN As Long = &H51 'negative sign Public Const LOCALE_IPOSSIGNPOSN As Long = &H52 'positive sign position Public Const LOCALE_INEGSIGNPOSN As Long = &H53 'negative sign position Public Const LOCALE_IPOSSYMPRECEDES As Long = &H54 'mon sym precedes pos amt Public Const LOCALE_IPOSSEPBYSPACE As Long = &H55 'mon sym sep by space from pos amt Public Const LOCALE_INEGSYMPRECEDES As Long = &H56 'mon sym precedes neg amt Public Const LOCALE_INEGSEPBYSPACE As Long = &H57 'mon sym sep by space from neg amt '#if(WINVER >= &H0400) Public Const LOCALE_FONTSIGNATURE As Long = &H58 'font signature Public Const LOCALE_SISO639LANGNAME As Long = &H59 'ISO abbreviated language name Public Const LOCALE_SISO3166CTRYNAME As Long = &H5A 'ISO abbreviated country name '#endif /* WINVER >= &H0400 */ '#if(WINVER >= &H0500) Public Const LOCALE_IDEFAULTEBCDICCODEPAGE As Long = &H1012 'default ebcdic code page Public Const LOCALE_IPAPERSIZE As Long = &H100A '0 = letter, 1 = a4, 2 = legal, 3 = a3 Public Const LOCALE_SENGCURRNAME As Long = &H1007 'english name of currency Public Const LOCALE_SNATIVECURRNAME As Long = &H1008 'native name of currency Public Const LOCALE_SYEARMONTH As Long = &H1006 'year month format string Public Const LOCALE_SSORTNAME As Long = &H1013 'sort name Public Const LOCALE_IDIGITSUBSTITUTION As Long = &H1014 '0 = none, 1 = context, 2 = native digit '#endif /* WINVER >= &H0500 */ Public Declare Function GetThreadLocale Lib "kernel32" () As Long Public Declare Function GetSystemDefaultLCID Lib "kernel32" () As Long Public Declare Function GetLocaleInfo Lib "kernel32" _ Alias "GetLocaleInfoA" _ (ByVal Locale As Long, _ ByVal LCType As Long, _ ByVal lpLCData As String, _ ByVal cchData As Long) As Long Public Function GetUserLocaleInfo(ByVal dwLocaleID As Long, ByVal dwLCType As Long) As String Dim sReturn As String Dim r As Long 'call the function passing the Locale type 'variable to retrieve the required size of 'the string buffer needed r = GetLocaleInfo(dwLocaleID, dwLCType, sReturn, Len(sReturn)) 'if successful.. If r Then 'pad the buffer with spaces sReturn = Space$(r) 'and call again passing the buffer r = GetLocaleInfo(dwLocaleID, dwLCType, sReturn, Len(sReturn)) 'if successful (r > 0) If r Then 'r holds the size of the string 'including the terminating null GetUserLocaleInfo = Left$(sReturn, r - 1) End If End If End Function |
Form Code |
Create a form containing 13 textboxes named Text0 through Text12 (not in a control array). Add labels as desired, and a command button (Command1). Add the following code to the form: |
|
Option Explicit Private Sub Command1_Click() Dim LCID As Long LCID = GetSystemDefaultLCID() 'language id Text0.Text = GetUserLocaleInfo(LCID, LOCALE_ILANGUAGE) 'localized name of language Text1.Text = GetUserLocaleInfo(LCID, LOCALE_SLANGUAGE) 'English name of language Text2.Text = GetUserLocaleInfo(LCID, LOCALE_SENGLANGUAGE) 'Long date format-ordering specifier Select Case GetUserLocaleInfo(LCID, LOCALE_ILDATE) Case "0": Text3.Text = "0 Month - Day - Year" Case "1": Text3.Text = "1 Day - Month - Year" Case "2": Text3.Text = "2 Year - Month - Day" End Select 'Long date format string Text4.Text = GetUserLocaleInfo(LCID, LOCALE_SLONGDATE) 'Long date format-ordering specifier Select Case GetUserLocaleInfo(LCID, LOCALE_IDATE) Case "0": Text5.Text = "0 Month - Day - Year" Case "1": Text5.Text = "1 Day - Month - Year" Case "2": Text5.Text = "2 Year - Month - Day" End Select 'Short date format string Text6.Text = GetUserLocaleInfo(LCID, LOCALE_SSHORTDATE) 'century format specifier - placement in 'the string of the year component (short date) Text7.Text = GetUserLocaleInfo(LCID, LOCALE_ICENTURY) 'Date separator chr Text8.Text = GetUserLocaleInfo(LCID, LOCALE_SDATE) 'Current calendar type Select Case GetUserLocaleInfo(LCID, LOCALE_ICALENDARTYPE) Case "1": Text9.Text = "1 Gregorian (localized) " Case "2": Text9.Text = "2 Gregorian (English strings always)" Case "3": Text9.Text = "3 Era: Year of the Emperor (Japan)" Case "4": Text9.Text = "4 Era: Year of Taiwan Region" Case "5": Text9.Text = "5 Tangun Era(Korea)" Case "6": Text9.Text = "6 Hijri (Arabic lunar)" Case "7": Text9.Text = "7 Thai" Case "8": Text9.Text = "8 Hebrew (Lunar)" Case "9": Text9.Text = "9 Gregorian Middle East French" Case "10": Text9.Text = "10 Gregorian Arabic calendar" Case "11": Text9.Text = "11 Gregorian Transliterated English" Case "12": Text9.Text = "12 Gregorian Transliterated French" End Select 'Additional calendar type Select Case GetUserLocaleInfo(LCID, LOCALE_IOPTIONALCALENDAR) Case "0": Text10.Text = "0 No additional types valid" Case "1": Text10.Text = "1 Gregorian (localized)" Case "2": Text10.Text = "2 Gregorian (English strings always)" Case "3": Text10.Text = "3 Era: Year of the Emperor (Japan)" Case "4": Text10.Text = "4 Era: Year of Taiwan Region" Case "5": Text10.Text = "5 Tangun Era(Korea)" Case "6": Text10.Text = "6 Hijri (Arabic lunar)" Case "7": Text10.Text = "7 Thai" Case "8": Text10.Text = "8 Hebrew (Lunar)" Case "9": Text10.Text = "9 Gregorian Middle East French" Case "10": Text10.Text = "10 Gregorian Arabic calendar" Case "11": Text10.Text = "11 Gregorian Transliterated English" Case "12": Text10.Text = "12 Gregorian Transliterated French" End Select 'Specifier for the first day in a week Select Case GetUserLocaleInfo(LCID, LOCALE_IFIRSTDAYOFWEEK) Case "0": Text11.Text = "0 LOCALE_SDAYNAME1" Case "1": Text11.Text = "1 LOCALE_SDAYNAME2" Case "2": Text11.Text = "2 LOCALE_SDAYNAME3" Case "3": Text11.Text = "3 LOCALE_SDAYNAME4" Case "4": Text11.Text = "4 LOCALE_SDAYNAME5" Case "5": Text11.Text = "5 LOCALE_SDAYNAME6" Case "6": Text11.Text = "6 LOCALE_SDAYNAME7" End Select 'Specifier for the first week of the year Select Case GetUserLocaleInfo(LCID, LOCALE_IFIRSTWEEKOFYEAR) Case "0": Text12.Text = _ "0 Week containing 1/1 is first week of that year" Case "1": Text12.Text = _ "1 First full week following 1/1 is first week of that year" Case "2": Text12.Text = _ "2 First week containing at least four days is first week of that year" End Select End Sub |
Comments |
Save the program and run. The values displayed should correspond to the Codepage and Regional Settings for your system. |
While the GetSystemDefaultLCID function retrieves the system default
locale identifier, this is often inappropriate or insufficient in a networked
environment or under an operating system where multiple locales have
been installed. For example, it is possible for a network admin rolling
out a standard image to have the user's default locale set to one
differing from the base OS installation, and thus the system default
locale. In this situation Windows' provides an alternate API you can use to obtain the LCID for the current user ... GetUserDefaultLCID. Defined identically to GetSystemDefaultLCID, GetUserDefaultLCID function retrieves the user default–locale identifier and is therefore the most appropriate API to use when it is the user's locale you are interested in, rather than that of the system. |
|
|
|
|||||
|
|||||
|
|||||
Copyright ©1996-2011 VBnet and Randy Birch. All Rights Reserved. |