Guten Tag,
als ich mir das hier von Kev eingestellte Skript angeschaut habe, bin ich über die "fest verdrahteten" Namen gestolpert. Als ich dann gesehen habe, dass die UDF-Funktionen _DateDayOfWeek() und _DateToMonth() aus Date.au3 ebenfalls mit "fest verdrahteten" englischen Wortlisten arbeiten, war ich nicht wirklich begeistert. Bei einem kurzen Check in diesem und im englischen Forum habe ich nichts gefunden. Ich habe deshalb zwei Funktionen geschrieben, die die Monats- und Tagesnamen in Abhängigkeit von den Spracheinstellungen (locale) des aktuellen Benutzers ermitteln:
Ursprungsversion
#include <Date.au3>
$M = @MON
$T = _DateToDayOfWeekISO(@YEAR, @MON, @MDAY)
MsgBox(0, "Monat " & $M, _Locale_MonthName($M))
MsgBox(0, "Tag " & $T, _Locale_DayName($T, 1))
Exit
Func _Locale_MonthName($Month, $Abbrev = False)
; ==========================================================================================
; Autor: Großvater (http://www.autoit.de)
; Parameter:
; $Month - Nummer des Monats (1 - 12)
; $Abbrev - abgekürzten Namen liefern:
; |0 : nein
; |1 : ja
; ==========================================================================================
Local Const $LOCALE_USER_DEFAULT = 0x0400
Local Const $LOCALE_SMONTHNAME = 0x37
Local Const $LOCALE_SABBREVMONTHNAME = 0x43
Local $LCType = $LOCALE_SMONTHNAME
If $Abbrev Then $LCType = $LOCALE_SABBREVMONTHNAME
If Not StringIsInt($Month) Or $Month < 1 Or $Month > 12 Then Return False
Local $aResult = DllCall("Kernel32.dll", "Int", "GetLocaleInfoW", _
"UInt", $LOCALE_USER_DEFAULT, _
"UInt", $LCType + $Month, _
"WStr", "", _
"Int", 80)
If @error Or $aResult[0] = 0 Then Return False
Return $aResult[3]
EndFunc
Func _Locale_DayName($WDay, $Abbrev = False)
; ==========================================================================================
; Autor: Großvater (http://www.autoit.de)
; Parameter:
; $WDay - Nummer des Wochentages (1 - 7) (!!! 1 ist Montag (s.u.) !!!)
; $Abbrev - abgekürzten Namen liefern:
; |0 : nein
; |1 : ja
; Anmerkungen:
; Zu meinem Erstaunen hat MS in WinNLS.h folgende Konstanten definiert:
; #define LOCALE_SDAYNAME1 0x0000002A // long name for Monday
; ...
; #define LOCALE_SDAYNAME7 0x00000030 // long name for Sunday
; Anders als beim Macro @WDAY gilt deshalb der Montag als Tag 1 und der Sonntag
; als Tag 7. Der passende Wert lässt sich per Aufruf der UDF-Funktion
; _DateToDayOfWeekISO()
; ermitteln.
; ==========================================================================================
Local Const $LOCALE_USER_DEFAULT = 0x0400
Local Const $LOCALE_SDAYNAME = 0x29
Local Const $LOCALE_SABBREVDAYNAME = 0x30
Local $LCType = $LOCALE_SDAYNAME
If $Abbrev Then $LCType = $LOCALE_SABBREVDAYNAME
If Not StringIsInt($WDay) Or $WDay < 1 Or $WDay > 7 Then Return False
Local $aResult = DllCall("Kernel32.dll", "Int", "GetLocaleInfoW", _
"UInt", $LOCALE_USER_DEFAULT, _
"UInt", $LCType + $WDay, _
"WStr", "", _
"Int", 80)
If @error Or $aResult[0] = 0 Then Return False
Return $aResult[3]
EndFunc
Version mit Parameter LCID
#include <Date.au3>
$M = @MON
$T = _DateToDayOfWeekISO(@YEAR, @MON, @MDAY)
MsgBox(0, "Monat " & $M, _Locale_MonthName($M, 0, 0x0406))
MsgBox(0, "Tag " & $T, _Locale_DayName($T, 0, 0x0406))
Exit
Func _Locale_MonthName($Month, $Abbrev = False, $LCID = "")
; ==========================================================================================
; Autor: Großvater (http://www.autoit.de)
; Parameter:
; $Month - Nummer des Monats (1 - 12)
; $Abbrev - abgekürzten Namen liefern:
; |0 : nein
; |1 : ja
; $LCID - Sprachbezeichner gem. Abschnitt "@OSLang values" im Anhang der Hilfedatei
; als 16-bittiger Hexwert: 0xnnnn (z.b. 0x0407 für Deutschland).
; Bei fehlender Angabe wird die Defaulteinstellung des Benutzers verwendet.
; ==========================================================================================
Local Const $LOCALE_USER_DEFAULT = 0x0400
Local Const $LOCALE_SMONTHNAME = 0x37
Local Const $LOCALE_SABBREVMONTHNAME = 0x43
Local $LCType = $LOCALE_SMONTHNAME
If $Abbrev Then $LCType = $LOCALE_SABBREVMONTHNAME
If $LCID = "" Then $LCID = $LOCALE_USER_DEFAULT
If Not StringIsInt($Month) Or $Month < 1 Or $Month > 12 Then Return False
Local $aResult = DllCall("Kernel32.dll", "Int", "GetLocaleInfoW", _
"UInt", $LCID, _
"UInt", $LCType + $Month, _
"WStr", "", _
"Int", 80)
If @error Or $aResult[0] = 0 Then Return False
Return $aResult[3]
EndFunc
Func _Locale_DayName($WDay, $Abbrev = False, $LCID = "")
; ==========================================================================================
; Autor: Großvater (http://www.autoit.de)
; Parameter:
; $WDay - Nummer des Wochentages (1 - 7) (!!! 1 ist Montag (s.u.) !!!)
; $Abbrev - abgekürzten Namen liefern:
; |0 : nein
; |1 : ja
; $LCID - Sprachbezeichner gem. Abschnitt "@OSLang values" im Anhang der Hilfedatei
; als 16-bittiger Hexwert: 0xnnnn (z.b. 0x0407 für Deutschland).
; Bei fehlender Angabe wird die Defaulteinstellung des Benutzers verwendet.
; Anmerkungen:
; Zu meinem Erstaunen hat MS in WinNLS.h folgende Konstanten definiert:
; #define LOCALE_SDAYNAME1 0x0000002A // long name for Monday
; ...
; #define LOCALE_SDAYNAME7 0x00000030 // long name for Sunday
; Anders als beim Macro @WDAY gilt deshalb der Montag als Tag 1 und der Sonntag
; als Tag 7. Der passende Wert lässt sich per Aufruf der UDF-Funktion
; _DateToDayOfWeekISO()
; ermitteln.
; ==========================================================================================
Local Const $LOCALE_USER_DEFAULT = 0x0400
Local Const $LOCALE_SDAYNAME = 0x29
Local Const $LOCALE_SABBREVDAYNAME = 0x30
If $LCID = "" Then $LCID = $LOCALE_USER_DEFAULT
Local $LCType = $LOCALE_SDAYNAME
If $Abbrev Then $LCType = $LOCALE_SABBREVDAYNAME
If $LCID = "" Then $LCID = $LOCALE_USER_DEFAULT
If Not StringIsInt($WDay) Or $WDay < 1 Or $WDay > 7 Then Return False
Local $aResult = DllCall("Kernel32.dll", "Int", "GetLocaleInfoW", _
"UInt", $LCID, _
"UInt", $LCType + $WDay, _
"WStr", "", _
"Int", 80)
If @error Or $aResult[0] = 0 Then Return False
Return $aResult[3]
EndFunc
Sollte ich bei meiner Suche vorhandene Funktionen übersehen haben, habe ich mir die Arbeit halt umsonst gemacht.