Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0277: Länderspezifische Einstellungen auslesen

 von 

Beschreibung 

Das Auslesen der länderspezifischen Einstellungen geht, wie hier gezeigt, recht leicht mit der API-Funktion GetLocaleInfo. Es sind jede Menge Informationen zu erhalten, wie z.B. Land, Landessprache, Währungsysmbol, Datumsformat,Kalenderage und Monate in Schrift, Vorzeichen bei postiven und negativen Zahlen und Währungen, Dezimaltrennzeichen, Zeittrennzeichen etc. Das Ändern dieser Einstellungen ist nicht grundsätzlich bei allen Einträgen möglich, es kann nur eine begrenze Auswahl manipuliert werden. Zudem gestaltet es sich meist sehr individuell.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

GetLocaleInfoA (GetLocaleInfo), GetSystemDefaultLCID

Download:

Download des Beispielprojektes [3,6 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Project1.vbp -------------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Schaltfläche "Command1"
' Steuerelement: Listen-Steuerelement "List1"

Option Explicit

Private Declare Function GetSystemDefaultLCID Lib _
        "kernel32" () As Long

Private 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

Const LOCALE_ILANGUAGE = &H1
Const LOCALE_SLANGUAGE = &H2
Const LOCALE_SENGLANGUAGE = &H1001
Const LOCALE_SABBREVLANGNAME = &H3
Const LOCALE_SNATIVELANGNAME = &H4
Const LOCALE_ICOUNTRY = &H5
Const LOCALE_SCOUNTRY = &H6
Const LOCALE_SENGCOUNTRY = &H1002
Const LOCALE_SABBREVCTRYNAME = &H7
Const LOCALE_SNATIVECTRYNAME = &H8
Const LOCALE_IDEFAULTLANGUAGE = &H9
Const LOCALE_IDEFAULTCOUNTRY = &HA
Const LOCALE_IDEFAULTCODEPAGE = &HB
Const LOCALE_SLIST = &HC
Const LOCALE_IMEASURE = &HD
Const LOCALE_SDECIMAL = &HE
Const LOCALE_STHOUSAND = &HF
Const LOCALE_SGROUPING = &H10
Const LOCALE_IDIGITS = &H11
Const LOCALE_ILZERO = &H12
Const LOCALE_SNATIVEDIGITS = &H13
Const LOCALE_SCURRENCY = &H14
Const LOCALE_SINTLSYMBOL = &H15
Const LOCALE_SMONDECIMALSEP = &H16
Const LOCALE_SMONTHOUSANDSEP = &H17
Const LOCALE_SMONGROUPING = &H18
Const LOCALE_ICURRDIGITS = &H19
Const LOCALE_IINTLCURRDIGITS = &H1A
Const LOCALE_ICURRENCY = &H1B
Const LOCALE_INEGCURR = &H1C
Const LOCALE_SDATE = &H1D
Const LOCALE_STIME = &H1E
Const LOCALE_SSHORTDATE = &H1F
Const LOCALE_SLONGDATE = &H20
Const LOCALE_STIMEFORMAT = &H1003
Const LOCALE_IDATE = &H21
Const LOCALE_ILDATE = &H22
Const LOCALE_ITIME = &H23
Const LOCALE_ICENTURY = &H24
Const LOCALE_ITLZERO = &H25
Const LOCALE_IDAYLZERO = &H26
Const LOCALE_IMONLZERO = &H27
Const LOCALE_S1159 = &H28
Const LOCALE_S2359 = &H29
Const LOCALE_SDAYNAME1 = &H2A
Const LOCALE_SDAYNAME2 = &H2B
Const LOCALE_SDAYNAME3 = &H2C
Const LOCALE_SDAYNAME4 = &H2D
Const LOCALE_SDAYNAME5 = &H2E
Const LOCALE_SDAYNAME6 = &H2F
Const LOCALE_SDAYNAME7 = &H30
Const LOCALE_SABBREVDAYNAME1 = &H31
Const LOCALE_SABBREVDAYNAME2 = &H32
Const LOCALE_SABBREVDAYNAME3 = &H33
Const LOCALE_SABBREVDAYNAME4 = &H34
Const LOCALE_SABBREVDAYNAME5 = &H35
Const LOCALE_SABBREVDAYNAME6 = &H36
Const LOCALE_SABBREVDAYNAME7 = &H37
Const LOCALE_SMONTHNAME1 = &H38
Const LOCALE_SMONTHNAME2 = &H39
Const LOCALE_SMONTHNAME3 = &H3A
Const LOCALE_SMONTHNAME4 = &H3B
Const LOCALE_SMONTHNAME5 = &H3C
Const LOCALE_SMONTHNAME6 = &H3D
Const LOCALE_SMONTHNAME7 = &H3E
Const LOCALE_SMONTHNAME8 = &H3F
Const LOCALE_SMONTHNAME9 = &H40
Const LOCALE_SMONTHNAME10 = &H41
Const LOCALE_SMONTHNAME11 = &H42
Const LOCALE_SMONTHNAME12 = &H43
Const LOCALE_SABBREVMONTHNAME1 = &H44
Const LOCALE_SABBREVMONTHNAME2 = &H45
Const LOCALE_SABBREVMONTHNAME3 = &H46
Const LOCALE_SABBREVMONTHNAME4 = &H47
Const LOCALE_SABBREVMONTHNAME5 = &H48
Const LOCALE_SABBREVMONTHNAME6 = &H49
Const LOCALE_SABBREVMONTHNAME7 = &H4A
Const LOCALE_SABBREVMONTHNAME8 = &H4B
Const LOCALE_SABBREVMONTHNAME9 = &H4C
Const LOCALE_SABBREVMONTHNAME10 = &H4D
Const LOCALE_SABBREVMONTHNAME11 = &H4E
Const LOCALE_SABBREVMONTHNAME12 = &H4F
Const LOCALE_SABBREVMONTHNAME13 = &H100F
Const LOCALE_SPOSITIVESIGN = &H50
Const LOCALE_SNEGATIVESIGN = &H51
Const LOCALE_IPOSSIGNPOSN = &H52
Const LOCALE_INEGSIGNPOSN = &H53
Const LOCALE_IPOSSYMPRECEDES = &H54
Const LOCALE_IPOSSEPBYSPACE = &H55
Const LOCALE_INEGSYMPRECEDES = &H56
Const LOCALE_INEGSEPBYSPACE = &H57

Const LOCALE_USER_DEFAULT = &H400
Const LOCALE_SYSTEM_DEFAULT As Long = &H400

Private Sub Form_Load()
  Call Command1_Click
End Sub

Private Sub Command1_Click()
  List1.Clear
  
  GLI LOCALE_SLIST, "Listentrennzeichen"
  GLI LOCALE_IMEASURE, "0=metrisch, 1=US"
  GLI LOCALE_SDECIMAL, "Dezimaltrennzeichen"
  GLI LOCALE_STHOUSAND, "Tausendertrennzeichen"
  GLI LOCALE_SGROUPING, "Gruppierung links vom Komma"
  GLI LOCALE_IDIGITS, "Zahlen hinter dem Komma"
  GLI LOCALE_ILZERO, "führende Nullen"
  GLI LOCALE_SCURRENCY, "Währungsymbol"
  GLI LOCALE_SINTLSYMBOL, "Währung nach ISO 4217"
  GLI LOCALE_SMONDECIMALSEP, "Währungstrennzeichen"
  GLI LOCALE_SMONTHOUSANDSEP, "Währungstausendertrennzeichen"
  GLI LOCALE_SMONGROUPING, "Währungsgruppierung"
  GLI LOCALE_ICURRDIGITS, "Zahlen hinter dem Komma (Pf)"
  GLI LOCALE_ICURRENCY, "Anzeige des Währungssymbols"
  GLI LOCALE_INEGCURR, "Negatives Währungsvorzeichen"
  GLI LOCALE_SDATE, "Datumstrennzeichen"
  GLI LOCALE_STIME, "Zeittrennzeichen"
  GLI LOCALE_SSHORTDATE, "Kurzes Datumsformat"
  GLI LOCALE_SLONGDATE, "Langes Datumsformat"
  GLI LOCALE_STIMEFORMAT, "Zeitformat"
  GLI LOCALE_ITIME, "12/24 Stunden"
  GLI LOCALE_S1159, "AM-Zeichen"
  GLI LOCALE_S2359, "PM-Zeichen"
  GLI LOCALE_SPOSITIVESIGN, "Positives Vorz."
  GLI LOCALE_SNEGATIVESIGN, "Negatives Vorz."
  GLI LOCALE_ILANGUAGE, "Sprach ID"
  GLI LOCALE_SLANGUAGE, "Lokalisierter Sprachname"
  GLI LOCALE_SENGLANGUAGE, "Engl. Äquivalent"
  GLI LOCALE_SABBREVLANGNAME, "Abgekürzt"
  GLI LOCALE_SNATIVELANGNAME, "Sprache in Landessprache"
  GLI LOCALE_ICOUNTRY, "Ländercode"
  GLI LOCALE_SCOUNTRY, "Ländername"
  GLI LOCALE_SENGCOUNTRY, "Ländername in Engl."
  GLI LOCALE_SABBREVCTRYNAME, "Abgekürzt"
  GLI LOCALE_SNATIVECTRYNAME, "Land in Landessprache"
  GLI LOCALE_IDEFAULTLANGUAGE, "Standard Sprach-ID"
  GLI LOCALE_IDEFAULTCOUNTRY, "Standard Landes-ID"
  GLI LOCALE_IDEFAULTCODEPAGE, "Standard Codeseite"
  GLI LOCALE_SNATIVEDIGITS, "gebräuchliche Zahlen"
  GLI LOCALE_IINTLCURRDIGITS, "Zahlen hinter Komma nach ISO"
  GLI LOCALE_IDATE, "Datums Gruppierung"
  GLI LOCALE_ILDATE, "Reihenfolge langes Datumsformat"
  GLI LOCALE_ICENTURY, "Jahr in 2/4 Ziffern"
  GLI LOCALE_ITLZERO, "führende Null für Zeiten"
  GLI LOCALE_IDAYLZERO, "führende Null für Tage"
  GLI LOCALE_IMONLZERO, "führende Null für Monate"
  GLI LOCALE_SDAYNAME1, "Langer Name für Mo"
  GLI LOCALE_SDAYNAME2, "Langer Name für Di"
  GLI LOCALE_SDAYNAME3, "Langer Name für Mi"
  GLI LOCALE_SDAYNAME4, "Langer Name für Do"
  GLI LOCALE_SDAYNAME5, "Langer Name für Fr"
  GLI LOCALE_SDAYNAME6, "Langer Name für Sa"
  GLI LOCALE_SDAYNAME7, "Langer Name für So"
  GLI LOCALE_SABBREVDAYNAME1, "Abgk. Name für Mo"
  GLI LOCALE_SABBREVDAYNAME2, "Abgk. Name für Di"
  GLI LOCALE_SABBREVDAYNAME3, "Abgk. Name für Mi"
  GLI LOCALE_SABBREVDAYNAME4, "Abgk. Name für Do"
  GLI LOCALE_SABBREVDAYNAME5, "Abgk. Name für Fr"
  GLI LOCALE_SABBREVDAYNAME6, "Abgk. Name für Sa"
  GLI LOCALE_SABBREVDAYNAME7, "Abgk. Name für So"
  GLI LOCALE_SMONTHNAME1, "Langer Name für Jan"
  GLI LOCALE_SMONTHNAME2, "Langer Name für Feb"
  GLI LOCALE_SMONTHNAME3, "Langer Name für Mae"
  GLI LOCALE_SMONTHNAME4, "Langer Name für Mai"
  GLI LOCALE_SMONTHNAME5, "Langer Name für Apr"
  GLI LOCALE_SMONTHNAME6, "Langer Name für Jun"
  GLI LOCALE_SMONTHNAME7, "Langer Name für Jul"
  GLI LOCALE_SMONTHNAME8, "Langer Name für Aug"
  GLI LOCALE_SMONTHNAME9, "Langer Name für Sep"
  GLI LOCALE_SMONTHNAME10, "Langer Name für Okt"
  GLI LOCALE_SMONTHNAME11, "Langer Name für Nov"
  GLI LOCALE_SMONTHNAME12, "Langer Name für Dez"
  GLI LOCALE_SABBREVMONTHNAME1, "Abgk. Name für Jan"
  GLI LOCALE_SABBREVMONTHNAME2, "Abgk. Name für Feb"
  GLI LOCALE_SABBREVMONTHNAME3, "Abgk. Name für Mae"
  GLI LOCALE_SABBREVMONTHNAME4, "Abgk. Name für Apr"
  GLI LOCALE_SABBREVMONTHNAME5, "Abgk. Name für Mai"
  GLI LOCALE_SABBREVMONTHNAME6, "Abgk. Name für Jun"
  GLI LOCALE_SABBREVMONTHNAME7, "Abgk. Name für Jul"
  GLI LOCALE_SABBREVMONTHNAME8, "Abgk. Name für Aug"
  GLI LOCALE_SABBREVMONTHNAME9, "Abgk. Name für Sep"
  GLI LOCALE_SABBREVMONTHNAME10, "Abgk. Name für Okt"
  GLI LOCALE_SABBREVMONTHNAME11, "Abgk. Name für Nov"
  GLI LOCALE_SABBREVMONTHNAME12, "Abgk. Name für Dez"
  GLI LOCALE_IPOSSIGNPOSN, "Format. für pos. Währung"
  GLI LOCALE_INEGSIGNPOSN, "Format. für neg. Währung"
  GLI LOCALE_IPOSSYMPRECEDES, "Präfix für pos. Währungsvorzeichen"
  GLI LOCALE_IPOSSEPBYSPACE, "Trennz. bei pos. Währungsbetrag"
  GLI LOCALE_INEGSYMPRECEDES, "Präfix für neg. Währungsvorzeichen"
  GLI LOCALE_INEGSEPBYSPACE, "Trennz. bei neg. Währungsbetrag"
End Sub

Private Sub GLI(ID&, Text$)
  List1.AddItem Text & ":  " & GetEntry(ID)
  List1.ItemData(List1.NewIndex) = ID
End Sub

Private Function GetEntry(ID&) As String
  Dim LCID&, Result&, Buffer$, Length&
    
    LCID = GetSystemDefaultLCID()
    Length = GetLocaleInfo(LCID, ID, Buffer, 0) - 1
    Buffer = Space(Length + 1)
    Result = GetLocaleInfo(LCID, ID, Buffer, Length)
    GetEntry = Left$(Buffer, Length)
End Function
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'-------------- Ende Projektdatei Project1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

GetLocaleInfo - Gast 23.01.12 15:43 1 Antwort

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 20 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Cornflake am 01.02.2007 um 15:03

Wo steht der Tipp, mit dem ich das Gebietsschema wechseln kann ?
Möchte wenn mein Programm startet und feststellt, das win nicht auf Deutschland(Deutschland) steht es auf Deutschland umstellt und nach der Verarbeitung wieder zurück. Mein Tool läuft nur wenige Minuten auf dem jeweiligen Rechner und wird dann vom User beendet.

Danke Cornflake

Kommentar von frankk am 24.02.2006 um 14:13

Kein Wert bei Bsp.: Ländereinstg. Standard D, aber Dezimaltrennzeichen Punkt

Code-Änderung
LCID = GetSystemDefaultLCID()
Length = GetLocaleInfo(LCID, ID, Buffer, 0)
Buffer = Space(Length)
Result = GetLocaleInfo(LCID, ID, Buffer, Length)
GetEntry = Left$(Buffer, Length-1)

Sollte sein -> len(Buffer)=Length!!

Gruß Frank

Kommentar von uwe am 13.01.2005 um 11:02

hallo,
habe bei der suche meines problems diese seite gefunden und möchte hier mal kurz mein problem schildern. vieleicht hat jemand eine lösung.
ich verwende vb6 im zusammenhang mit access200. unter win98
drucke ich mit folgenden code ein bericht aus.

Public Sub redr()
Dim MyAccess As Object
Set MyAccess = GetObject("dbup.mdb")
MyAccess.DoCmd.OpenReport "bericht1"
End Sub

unter winxp bekomme ich fehlermeldung "laufzeitfehler".
nehme an access wird nicht gefunden.

kennt jemand das problem und hat eine lösung ?
danke
uwe

Kommentar von Tobias Beißinger am 12.11.2004 um 09:22

Da dieser Tipp leider nur für die System-Einstellungen für nonunicode-Programme funktioniert, hier der Registry-Key, wo man die wirklich am System (Regional Settings) eingestellten Werte herbekommt:
HKEY_CURRENT_USER\Control Panel\International
(z.b. key: sdecimal, ICountry, ...)
Der VB-Zugriff auf die Registry ist in den Tipps&Tricks erklärt.

Kommentar von Tobias Beißinger am 12.11.2004 um 09:02

Leider bezieht diese Funktion die SystemDefaultLCID aus dem Setting "Language for non unicode programs" (vb6, winxp). Diese kann jedoch von den "Regional Options" abweichen, aus denen z.B. Officeprogramme die Werte für Tausender- und Dezimaltrennzeichen beziehen. Da ich aus VB Excel-Zellen formatieren muss (und da ich keinen Alias in Excel für die Trennzeichen kenne), komme ich mit diesem Tipp nicht weiter.

Kommentar von Manuel am 12.10.2004 um 11:10

Gibt es auch ein Programm womit man die Benutzerdefinierten
Einstellung von z.B. Word XP oder Exel XP auslesen kann?

Kommentar von Tobias Beißinger am 03.08.2004 um 10:31

Schade, dass das Auslesen von Parametern nur abhängig von einer Locale-Id zu funktionieren scheint. Allerdings halte ich es auch für einen Bug in XP, dass man zwar als Land z.B. Germany einstellen, dann aber jeden einzelnen Wert (Dezimal, Datum, Währung) beliebig anpassen kann. Konsequenterweise müsste die Ländereinstellung dann "Benutzerdifferenziert" lauten. Mir hilft es nichts, wenn ich weiss, dass das Dezimaltrennzeichen in Deutschland ein Komma ist, der Anwender es aber trotz Gebietsschema Deutschland in ein x umegesetzt hat.

Kommentar von Jan am 20.07.2004 um 13:49

Funktioniert auch mit VBA (Office XP / Win XP)

Kommentar von Danielo am 23.02.2004 um 08:31

Bug Report:
Unter Win 98 scheint's einen Bug in der GetLocalInfo Funktion zu geben: laut MSDN gibt die Funktion bei Aufruf mit BufferLänge=0 die benötigte Länge *inklusive* abschliessendem Nullbyte zurück. das funktioniert bei zb Win2000 auch ganz gut, aber Win98 gibt mir immer für Length 1 zurück. Der darauf folgende zweite Aufruf von GetLocalInfo hat daraufhin nix in den Buffer geschrieben (aber Result war trotzdem 0)

so gings dann:
statt:
Result = GetLocaleInfo(LCID, ID, Buffer, Length)
einfach:
Result = GetLocaleInfo(LCID, ID, Buffer, Len(Buffer))

lg

Kommentar von Peter Bartels am 05.12.2003 um 14:58

Kleiner Zahlendreher-Fehler:

LOCALE_SMONTHNAME4 mit LOCALE_SMONTHNAME5

Kommentar von Catherine am 30.10.2003 um 02:48

Thank You

Kommentar von Dietrich Hermann am 08.08.2003 um 14:34

Hallo,
habs mit VB6 unter Win 98 probiert.
Leider wurde, obwohl es in der Systemsteuerung definiert ist, das Eurosymbol und die Währung nicht bzw. nicht richtig erkannt.

Ciao
Dietrich

Kommentar von Mousse am 24.10.2002 um 14:06

wenn man die zeile
"LCID = GetSystemDefaultLCID()"
in
"LCID = LOCALE_USER_DEFAULT"
aendert, funktioniert es zumindest unter win2k besser ;)

Kommentar von Klaus am 16.01.2002 um 19:49

Wie kann man solche Einträge mit VB Ändern?
Wenn z.B. im kurzen Datumsformat im System TT.MM.JJ anstatt TT.MM.JJJJ steht?
Dies ist vor allem bei W98 und früher der Fall!

Kommentar von Heinz Goentgen am 09.01.2002 um 10:42

Ich bekomme in keinem Fall das Währungssymbol. Gibt es eine andere Lösung?

Kommentar von Goetz Reinecke am 20.07.2001 um 12:14

Schwachsinn, richtig ist natürlich:
Private Declare Function GetUserDefaultLCID _
Lib "kernel32" () As Long

Kommentar von Goetz Reinecke am 20.07.2001 um 11:16

Kleine Anmerkung: Der Tip bezieht sich auf die Default-Einstellungen des Systems, wers User spezifisch haben möchte muß die GetSystemDefaultLangID gegen folgendes tauschen:
Public Declare Function GetUserDefaultLangID Lib "kernel32" Alias "GetUserDefaultLangID" () As Integer
Grüße
Götz

Kommentar von Ulrich Mutmann am 07.06.2001 um 12:14

Das Währungssymbol $ und € wird nicht angezeigt

Kommentar von Wolfgang Kotterba am 16.03.2001 um 08:14

Funktioniert unter WinNT4 SP5 wunderbar, aber ....
wie kann ich das aktuell eingestelle Dezimal- bzw Tausendertrennzeichen feststellen?
Beispiel: als Standardsystemgebietsschema wurde Deutsch(Deutschland) festgelegt - der Anwender stellt auf Englisch(GB) um - ausgelesen werden aber die Einstellungen für Deutsch(Deutschland)
mfg
Wolfgang Kotterba

Kommentar von Uwe Rieger am 01.03.2001 um 19:21

Was haben wir nicht alles versucht um die richtigen Einstellungen für die Konvertierung von Zahlen zu finden.
Hiermit scheints sogar auf Multi-Language-Systemen zu laufen.