Visual Basic Locale/Regionalization Routines

GetLocaleInfo: Regional Locale Country Settings
Posted:   Monday March 20, 2000
Updated:   Monday December 26, 2011
Applies to:   VB4-32, VB5, VB6
Developed with:   VB6, Windows NT4
OS restrictions:   None
Author:   VBnet - Randy Birch


EnumSystemLocales: Enumerate Installed and Supported System Locales
GetLocaleInfo: Regional Locale Country Settings
GetLocaleInfo: Regional Locale Currency Settings
GetLocaleInfo: System Calendar Information

This aspect of the national language support functions is handy when you need to identify some aspect of the users system based on country information. As the illustration shows, there is ample information available for just about any need.  Any required information from this exercise could be easily wrapped into a function or class.
 BAS Module Code
Place the following code into the general declarations area of a bas module:

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 lang
Public Const LOCALE_SENGLANGUAGE          As Long = &H1001 'English name of lang
Public Const LOCALE_SABBREVLANGNAME       As Long = &H3    'abbreviated lang name
Public Const LOCALE_SNATIVELANGNAME       As Long = &H4    'native name of lang
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_SINTLSYMBOL           As Long = &H15   'intl monetary symbol
Public Const LOCALE_IDEFAULTLANGUAGE      As Long = &H9    'def language id
Public Const LOCALE_IDEFAULTCOUNTRY       As Long = &HA    'def country code
Public Const LOCALE_IDEFAULTCODEPAGE      As Long = &HB    'def oem code page
Public Const LOCALE_IDEFAULTANSICODEPAGE  As Long = &H1004 'def ansi code page
Public Const LOCALE_IDEFAULTMACCODEPAGE   As Long = &H1011 'def mac code page

Public Const LOCALE_IMEASURE              As Long = &HD     '0 = metric, 1 = US

'#if(WINVER >=  &H0400)
Public Const LOCALE_SISO639LANGNAME       As Long = &H59   'ISO abbreviated language name
Public Const LOCALE_SISO3166CTRYNAME      As Long = &H5A   'ISO abbreviated country name
'#endif /* WINVER >= as long = &H0400 */

'#if(WINVER >=  &H0500)
Public Const LOCALE_SNATIVECURRNAME        As Long = &H1008'native name of currency
Public Const LOCALE_IDEFAULTEBCDICCODEPAGE As Long = &H1012'default ebcdic code page
Public Const LOCALE_SSORTNAME              As Long = &H1013'sort name
'#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 21 textboxes named Text1 through Text21 (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()

  'Country/region code, based on international phone
  'codes, also referred to as IBM country codes.
  'The maximum characters allowed is six.
   Text1.Text = GetUserLocaleInfo(LCID, LOCALE_ICOUNTRY)

  'American National Standards Institute (ANSI) code page
  'associated with this locale. If the locale does not use
  'an ANSI code page, the value is 0. The maximum characters
  'allowed is six.

  'Original equipment manufacturer (OEM) code page associated
  'with the country/region. If the locale does not use an OEM
  'code page, the value is 1.The maximum characters allowed is six.
   Text3.Text = GetUserLocaleInfo(LCID, LOCALE_IDEFAULTCODEPAGE)

  'Code for the principal country/region in this locale.
  'This is provided so that partially specified locales
  'can be completed with default values. The maximum
  'characters allowed is six.
   Text4.Text = GetUserLocaleInfo(LCID, LOCALE_IDEFAULTCOUNTRY)

  'Windows 2000: Default EBCDIC code page associated
  'with the locale. The maximum characters allowed is six.
   If Len(Text5.Text) = 0 Then Text5.Text = "Sorry, Windows 2000 only"

  'Language identifier for the principal language spoken in this
  'locale. This is provided so partially specified locales can be
  'completed with default values. The maximum characters allowed is five.
   Text6.Text = GetUserLocaleInfo(LCID, LOCALE_IDEFAULTLANGUAGE)

  'Default Macintosh code page associated with the locale.
  'If the locale does not use a Macintosh code page, the
  'value is 2. The maximum characters allowed is six.
   Text7.Text = GetUserLocaleInfo(LCID, LOCALE_IDEFAULTLANGUAGE)

  'Language identifier. The maximum characters allowed is five.
   Text8.Text = GetUserLocaleInfo(LCID, LOCALE_ILANGUAGE)

  'System of measurement. This value is 0 if the metric system
  '(Systéme International d'Unités, or S.I.) is used, and 1 if
  'the U.S. system is used. The maximum characters allowed is two.
   Select Case GetUserLocaleInfo(LCID, LOCALE_IMEASURE)
      Case "0": Text9.Text = "0 - Metric system is used"
      Case "1": Text9.Text = "1 - U.S. system is used"
   End Select

  'Full localized name of the country/region. This is based on
  'the localization of the product, thus it changes for
  'each localized version.
   Text10.Text = GetUserLocaleInfo(LCID, LOCALE_SCOUNTRY)

  'Full English name of the country/region. This is always
  'restricted to characters that can be mapped into the
  'ASCII 127-character subset.
   Text11.Text = GetUserLocaleInfo(LCID, LOCALE_SENGCOUNTRY)
  'Full English name of the language from the International
  'Organization for Standardization (ISO) Standard 639.
  'This is always restricted to characters that can be
  'mapped into the ASCII 127-character subset. This is
  'not always equivalent to the English version of LOCALE_SLANGUAGE.
   Text12.Text = GetUserLocaleInfo(LCID, LOCALE_SENGLANGUAGE)
  'Three characters of the international monetary symbol specified
  'in ISO 4217 followed by the character separating this string
  'from the amount.
   Text13.Text = GetUserLocaleInfo(LCID, LOCALE_SINTLSYMBOL)

  'Windows NT 4.0 and Windows 2000: Country/region name, based on
  'ISO Standard 3166.
   Text14.Text = GetUserLocaleInfo(LCID, LOCALE_SISO3166CTRYNAME)
  'Windows NT 4.0 and Windows 2000: The abbreviated name of the
  'language based entirely on the ISO Standard 639 values.
   Text15.Text = GetUserLocaleInfo(LCID, LOCALE_SISO639LANGNAME)
  'Abbreviated name of the language. In most cases it is created
  'by taking the two-letter language abbreviation from the ISO
  'Standard 639 and adding a third letter, as appropriate, to
  'indicate the sublanguage.
   Text16.Text = GetUserLocaleInfo(LCID, LOCALE_SABBREVLANGNAME)
  'Full localized name of the language. This name is based on the
  'localization of the product, thus the value changes for each
  'localized version.
   Text17.Text = GetUserLocaleInfo(LCID, LOCALE_SLANGUAGE)
  'Native name of the language.
   Text18.Text = GetUserLocaleInfo(LCID, LOCALE_SNATIVELANGNAME)
  'Native name of the country/region.
   Text19.Text = GetUserLocaleInfo(LCID, LOCALE_SNATIVECTRYNAME)
  'Windows 2000: The native name of the currency associated with the locale.
   Text20.Text = GetUserLocaleInfo(LCID, LOCALE_SNATIVECURRNAME)
   If Len(Text20.Text) = 0 Then Text20 = "Sorry, Windows 2000 only"
  'Windows 2000: The full localized name of the sort for the
  'specified locale identifier, dependent on the language of the shell.
   Text21.Text = GetUserLocaleInfo(LCID, LOCALE_SSORTNAME)
   If Len(Text21.Text) = 0 Then Text21 = "Sorry, Windows 2000 only"
End Sub
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.


PayPal Link
Make payments with PayPal - it's fast, free and secure!


Copyright ©1996-2011 VBnet and Randy Birch. All Rights Reserved.
Terms of Use  |  Your Privacy


Hit Counter