|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Visual Basic Locale/Regionalization Routines GetLocaleInfo: System Calendar Information |
|
Posted: | Sunday August 8, 1999 |
Updated: | Monday December 26, 2011 |
Applies to: | VB5, VB6 |
Developed with: | VB6, Windows NT4 |
OS restrictions: | None |
Author: | VBnet - Randy Birch |
Related: |
EnumSystemLocales: Enumerate Installed and Supported System Locales GetLocaleInfo: Regional Locale Country Settings GetLocaleInfo: System Calendar Information |
Prerequisites |
VB5 or VB6. |
|
While
Locale info can be used to enumerate / retrieve specific details of the user's locale settings, another similar method is used to obtain the
user's Calendar information. Calendar info includes the localized long and abbreviated names for the calendar days and months, as well
as the calendar type used by the locale (ie "Gregorian") and its calendar ID number.
Using EnumCalendarInfo, the VB developer can now retrieve and display month and day information conforming to the national language support for the locale. This means, for example, the day returned corresponding to CAL_SDAYNAME1 constant will differ between the US English, French and German platforms etc. The demo is straight forward, and amply commented. Labels along the left side of the form are not included in discussing creation the form - they are simply to illustrate the values in the corresponding text and combos. The two labels to the right of the combos are required. While it is possible (and was in fact the way I first coded this demo) to provide individual EnumProc methods hard-coded to populate each individual combo box, I have changed the code and opted to set the target combo to a global control variable instead allowing the demo to use the same Enum procedure for months and days. |
BAS Module Code |
Either add the following code to the previously-created Locales.bas, or add a BAS module to a new project: |
|
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 thisCombo As ComboBox 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 Declare Function EnumCalendarInfo Lib "kernel32" _ Alias "EnumCalendarInfoA" _ (ByVal lpCalInfoEnumProc As Long, _ ByVal Locale As Long, _ ByVal Calendar As Long, _ ByVal CalType As Long) As Long Public Declare Sub CopyMemory Lib "kernel32" _ Alias "RtlMoveMemory" _ (Destination As Any, _ Source As Any, _ ByVal Length As Long) Public Const LOCALE_SLANGUAGE As Long = &H2 'localized name of language 'Calendar ID Values. Public Const CAL_GREGORIAN = 1 'Gregorian (localized) calendar Public Const CAL_GREGORIAN_US = 2 'Gregorian (U.S.) calendar Public Const CAL_JAPAN = 3 'Japanese Emperor Era calendar Public Const CAL_TAIWAN = 4 'Taiwan Region Era calendar Public Const CAL_KOREA = 5 'Korean Tangun Era calendar Public Const CAL_HIJRI = 6 'Hijri (Arabic Lunar) calendar Public Const CAL_THAI = 7 'Thai calendar Public Const CAL_HEBREW = 8 'Hebrew (Lunar) calendar Public Const CAL_GREGORIAN_ME_FRENCH = 9 'Gregorian Middle East French calendar Public Const CAL_GREGORIAN_ARABIC = 10 'Gregorian Arabic calendar Public Const CAL_GREGORIAN_XLIT_ENGLISH = 11 'Gregorian Transliterated English calendar Public Const CAL_GREGORIAN_XLIT_FRENCH = 12 'Gregorian Transliterated French calendar ' Calendar Enumeration Value. Public Const ENUM_ALL_CALENDARS As Long = &HFFFFFFFF 'enumerate all calendars Public Const CAL_ICALINTVALUE As Long = &H1 'calendar type Public Const CAL_SCALNAME As Long = &H2 'native name of calendar Public Const CAL_IYEAROFFSETRANGE As Long = &H3 'starting years of eras Public Const CAL_SERASTRING As Long = &H4 'era name for IYearOffsetRanges Public Const CAL_SSHORTDATE As Long = &H5 'short date format string Public Const CAL_SLONGDATE As Long = &H6 'long date format string Public Const CAL_SDAYNAME1 As Long = &H7 'native name for Monday Public Const CAL_SDAYNAME2 As Long = &H8 'native name for Tuesday Public Const CAL_SDAYNAME3 As Long = &H9 'native name for Wednesday Public Const CAL_SDAYNAME4 As Long = &HA 'native name for Thursday Public Const CAL_SDAYNAME5 As Long = &HB 'native name for Friday Public Const CAL_SDAYNAME6 As Long = &HC 'native name for Saturday Public Const CAL_SDAYNAME7 As Long = &HD 'native name for Sunday Public Const CAL_SABBREVDAYNAME1 As Long = &HE 'abbreviated name for Monday Public Const CAL_SABBREVDAYNAME2 As Long = &HF 'abbreviated name for Tuesday Public Const CAL_SABBREVDAYNAME3 As Long = &H10 'abbreviated name for Wednesday Public Const CAL_SABBREVDAYNAME4 As Long = &H11 'abbreviated name for Thursday Public Const CAL_SABBREVDAYNAME5 As Long = &H12 'abbreviated name for Friday Public Const CAL_SABBREVDAYNAME6 As Long = &H13 'abbreviated name for Saturday Public Const CAL_SABBREVDAYNAME7 As Long = &H14 'abbreviated name for Sunday Public Const CAL_SMONTHNAME1 As Long = &H15 'native name for January Public Const CAL_SMONTHNAME2 As Long = &H16 'native name for February Public Const CAL_SMONTHNAME3 As Long = &H17 'native name for March Public Const CAL_SMONTHNAME4 As Long = &H18 'native name for April Public Const CAL_SMONTHNAME5 As Long = &H19 'native name for May Public Const CAL_SMONTHNAME6 As Long = &H1A 'native name for June Public Const CAL_SMONTHNAME7 As Long = &H1B 'native name for July Public Const CAL_SMONTHNAME8 As Long = &H1C 'native name for August Public Const CAL_SMONTHNAME9 As Long = &H1D 'native name for September Public Const CAL_SMONTHNAME10 As Long = &H1E 'native name for October Public Const CAL_SMONTHNAME11 As Long = &H1F 'native name for November Public Const CAL_SMONTHNAME12 As Long = &H20 'native name for December Public Const CAL_SMONTHNAME13 As Long = &H21 'native name for 13th month (if any) Public Const CAL_SABBREVMONTHNAME1 As Long = &H22 'abbreviated name for January Public Const CAL_SABBREVMONTHNAME2 As Long = &H23 'abbreviated name for February Public Const CAL_SABBREVMONTHNAME3 As Long = &H24 'abbreviated name for March Public Const CAL_SABBREVMONTHNAME4 As Long = &H25 'abbreviated name for April Public Const CAL_SABBREVMONTHNAME5 As Long = &H26 'abbreviated name for May Public Const CAL_SABBREVMONTHNAME6 As Long = &H27 'abbreviated name for June Public Const CAL_SABBREVMONTHNAME7 As Long = &H28 'abbreviated name for July Public Const CAL_SABBREVMONTHNAME8 As Long = &H29 'abbreviated name for August Public Const CAL_SABBREVMONTHNAME9 As Long = &H2A 'abbreviated name for September Public Const CAL_SABBREVMONTHNAME10 As Long = &H2B 'abbreviated name for October Public Const CAL_SABBREVMONTHNAME11 As Long = &H2C 'abbreviated name for November Public Const CAL_SABBREVMONTHNAME12 As Long = &H2D 'abbreviated name for December Public Const CAL_SABBREVMONTHNAME13 As Long = &H2E 'abbreviated name for 13th month (if any) 'WINVER >= =&H0500 only Public Const CAL_SYEARMONTH As Long = &H2F 'year month format string Public Function EnumCalendarProc(lpDateFormatString As Long) As Long 'application-defined callback function for EnumCalendarInfo thisCombo.AddItem StringFromPointer(lpDateFormatString) 'return 1 to continue enumeration EnumCalendarProc = 1 End Function Public Function EnumCalendarNameProc(lpDateFormatString As Long) As Long 'application-defined callback function for EnumCalendarInfo Form1.Text2.Text = StringFromPointer(lpDateFormatString) 'return 1 to continue enumeration EnumCalendarNameProc = 1 End Function Private Function StringFromPointer(lpString As Long) As String Dim pos As Long Dim buffer As String 'pad a string to hold the data buffer = Space$(128) 'copy the string pointed to by the return value CopyMemory ByVal buffer, lpString, ByVal Len(buffer) 'remove the trailing null and trim pos = InStr(buffer, Chr$(0)) If pos Then StringFromPointer = Left$(buffer, pos - 1) End If End Function 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 (r > 0) 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 two textboxes (Text1, Text2), a command button (Command1) and six Combo boxes (Combo1-Combo6). Add two labels (Label1, Label2) and add the following code to the form: |
|
Option Explicit Private Sub Form_Load() Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2 End Sub Private Sub Command1_Click() Dim LCID As Long Dim success As Long LCID = GetSystemDefaultLCID() 'if the call to obtain the locale 'identifier failed, subsequent calls 'will fail too If LCID <> 0 Then '------------------------------------- 'localized name of language Text1.Text = GetUserLocaleInfo(LCID, LOCALE_SLANGUAGE) 'localized name of calendar success = GetLocaleCalendarName(LCID) '------------------------------------- 'assign the target combo box control Set thisCombo = Form1.Combo1 'enumerated system long date formats success = GetLocaleDateFormats(LCID, CAL_SLONGDATE) If success Then Combo1.ListIndex = 0 '------------------------------------- 'assign the target combo box control Set thisCombo = Form1.Combo2 'enumerated system short date formats success = GetLocaleDateFormats(LCID, CAL_SSHORTDATE) If success Then Combo2.ListIndex = 0 '------------------------------------- 'assign the target combo box control Set thisCombo = Form1.Combo3 'Constants for the days range from ' CAL_SDAYNAME1 = &H7 'Monday to .. ' CAL_SDAYNAME7 = &HD 'Sunday ' 'This and subsequent routines need to loop through 'the values (they are returned only on demand for 'the specific value), so a Enum with a 'For/Next is used. ' 'enumerated system day names success = GetLocaleCalendarLists(LCID, _ CAL_SDAYNAME1, _ CAL_SDAYNAME7) If success Then Combo3.ListIndex = 0 '------------------------------------- 'assign the target combo box control Set thisCombo = Form1.Combo4 'Constants for the days range from ' CAL_SABBREVDAYNAME1 = &HE 'Monday to .. ' CAL_SABBREVDAYNAME7 = &H14 'Sunday 'enumerated abbreviated system day names success = GetLocaleCalendarLists(LCID, _ CAL_SABBREVDAYNAME1, _ CAL_SABBREVDAYNAME7) If success Then Combo4.ListIndex = 0 '------------------------------------- 'assign the target combo box control Set thisCombo = Form1.Combo5 'Constants for the days range from ' CAL_SMONTHNAME1 = &H15 'January to .. ' CAL_SMONTHNAME13 = &H21 '13th month (if any) 'enumerated system month names success = GetLocaleCalendarLists(LCID, _ CAL_SMONTHNAME1, _ CAL_SMONTHNAME13) If success Then Combo5.ListIndex = 0 '------------------------------------- 'assign the target combo box control Set thisCombo = Form1.Combo6 'Constants for the days range from ' CAL_SABBREVMONTHNAME1 = &H22 'January to .. ' CAL_SABBREVMONTHNAME13 = &H2E '13th month (if any) 'enumerated abbreviated system month names success = GetLocaleCalendarLists(LCID, _ CAL_SABBREVMONTHNAME1, _ CAL_SABBREVMONTHNAME13) If success Then Combo6.ListIndex = 0 End If End Sub Private Sub Combo1_Click() Dim tmpFormat As String tmpFormat = Combo1.List(Combo1.ListIndex) Label1.Caption = Format$(Now, tmpFormat) End Sub Private Sub Combo2_Click() Dim tmpFormat As String tmpFormat = Combo2.List(Combo2.ListIndex) Label2.Caption = Format$(Now, tmpFormat) End Sub Private Function GetLocaleCalendarName(LCID As Long) As Long 'enumerate the system calendar name(s) Dim ret As Long If LCID Then ret = EnumCalendarInfo(AddressOf EnumCalendarNameProc, _ LCID, _ ENUM_ALL_CALENDARS, _ CAL_SCALNAME) End If GetLocaleCalendarName = ret End Function Private Function GetLocaleDateFormats(LCID As Long, _ CalType As Long) As Long 'enumerate the system long date formats Dim ret As Long If LCID Then 'enumerate available long date formats ret = EnumCalendarInfo(AddressOf EnumCalendarProc, _ LCID, _ ENUM_ALL_CALENDARS, _ CalType) End If GetLocaleDateFormats = ret End Function Private Function GetLocaleCalendarLists(LCID As Long, _ TMP_CAL_START As Long, _ TMP_CAL_END As Long) As Long 'enumerate the system items for the range passed Dim ret As Long Dim item As Long If LCID Then For item = TMP_CAL_START To TMP_CAL_END ret = EnumCalendarInfo(AddressOf EnumCalendarProc, _ LCID, _ ENUM_ALL_CALENDARS, _ item) Next End If GetLocaleCalendarLists = ret End Function |
Comments |
Save the program and run. The values displayed should correspond to the calendar strings 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. |