"Lokale" Monats- und Tagesnamen

  • 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
    [autoit]

    #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

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit]
    Version mit Parameter LCID
    [autoit]

    #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

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit]


    Sollte ich bei meiner Suche vorhandene Funktionen übersehen haben, habe ich mir die Arbeit halt umsonst gemacht. ;)

    2 Mal editiert, zuletzt von Großvater (15. Oktober 2010 um 07:17) aus folgendem Grund: Durch Copy&Paste verunstalteten Variablennamen korrigiert.

  • Also haste eig. eine Fertige Funktion die vorher auf Englisch war Übersetzt?

    Meine Projekte :

    Taschenrechner [X]
    JamLegend Auto-Player [Canceld]
    Launcher [X]
    Multi-Game-Quest-Viewer [Canceld]


    [autoit]

    If $goffy or not $brain Then $DeleteInetCable

    [/autoit]
  • Hi!

    Sehr schön!
    Ich habe mir Sorry mir wurde geholfen das so zu lösen!

    Spoiler anzeigen
    [autoit]

    #include <Date.au3>

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(0, 0,W_Tag( _DateToDayOfWeekISO(@YEAR, @MON, @MDAY)))

    [/autoit] [autoit][/autoit] [autoit]

    Func W_Tag($Tag)
    Local $W_Tag[7] = ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa']
    Return $W_Tag[$Tag]
    EndFunc ;==>W_Tag

    [/autoit]


    Mit den Monaten auch lösbar!

    LG Kleiner

  • Die Locales (Monats / Tagnamen) sind standardisiert.. es sollte also kein großes Thema sein (fast) alle Locales in eine UDF einzulegen.

    Dann sollte man Funktionen wie

    [autoit]

    _NameOfMonth("02" , "daDK") => februar
    _NameOfDay("2012/02/28","daDK") => mandag

    [/autoit]

    nutzen können.


    Oder gibt es schon so was ?

    PS: Meine Muttersprache ist Dänish, deshalb vorbehalt für Fehler...:)

  • Dann sollte man Funktionen wie

    [autoit]

    _NameOfMonth("02" , "daDK") => februar
    _NameOfDay("2012/02/28","daDK") => mandag

    [/autoit]


    nutzen können.


    Die vorhandenen Funktionen nutzen die Standardeinstellung des Benutzers. Wenn Du das Gebietsschema auf "dänisch" eingestellt hast, liefern sie auch dänische Bezeichnungen.

    Wenn Du die Namen einer anderen Locale haben willst, muss man nur einen LCID (language identifier) mitgeben, wie im Anhang der Hilfedatei im Abschnitt "@OSLang values" aufgeführt. Ich habe mal oben eine zweite Version mit entsprechendem Parameter zusätzlich eingestellt.