Browse Source

* First era patch of Taka_JP.

git-svn-id: trunk@15775 -
marco 15 years ago
parent
commit
2d8ac256cf
1 changed files with 72 additions and 0 deletions
  1. 72 0
      rtl/win/sysutils.pp

+ 72 - 0
rtl/win/sysutils.pp

@@ -50,6 +50,13 @@ Var
   Win32BuildNumber   : dword;
   Win32CSDVersion    : ShortString;   // CSD record is 128 bytes only?
 
+const
+  MaxEraCount = 7;
+
+var
+  EraNames: array [1..MaxEraCount] of String;
+  EraYearOffsets: array [1..MaxEraCount] of Integer;
+
 { Compatibility with Delphi }
 function Win32Check(res:boolean):boolean;inline;
 function WinCheck(res:boolean):boolean;
@@ -651,6 +658,70 @@ Begin
     Result:=Def;
 End;
 
+function EnumEraNames(Names: PChar): WINBOOL; stdcall;
+var
+  i : integer;
+begin
+  Result := False;
+  for i := Low(EraNames) to High(EraNames) do
+   if (EraNames[i] = '') then
+   begin
+     EraNames[i] := Names;
+     Result := True;
+     break;
+   end;
+end;
+
+function EnumEraYearOffsets(YearOffsets: PChar): WINBOOL; stdcall;
+var
+  i : integer;
+begin
+  Result := False;
+  for i := Low(EraYearOffsets) to High(EraYearOffsets) do
+   if (EraYearOffsets[i] = -1) then
+   begin
+     EraYearOffsets[i] := StrToIntDef(YearOffsets, 0);
+     Result := True;
+     break;
+   end;
+end;
+
+procedure GetEraNamesAndYearOffsets;
+  var
+    ACALID : CALID;
+    ALCID : LCID;
+    buf : array[0..10] of char;
+    i : integer;
+begin
+  for i:= 1 to MaxEraCount do
+   begin
+     EraNames[i] := '';  EraYearOffsets[i] := -1;
+   end;
+  ALCID := GetThreadLocale;
+  if GetLocaleInfo(ALCID , LOCALE_IOPTIONALCALENDAR, buf, sizeof(buf)) <= 0 then exit;
+  ACALID := StrToIntDef(buf,1);
+
+  if ACALID in [3..5] then
+  begin
+    EnumCalendarInfoA(@EnumEraNames, ALCID, ACALID , CAL_SERASTRING);
+    EnumCalendarInfoA(@EnumEraYearOffsets, ALCID, ACALID, CAL_IYEAROFFSETRANGE);
+  end;
+(*
+1 CAL_GREGORIAN Gregorian (localized)
+2 CAL_GREGORIAN_US Gregorian (English strings always)
+3 CAL_JAPAN Japanese Emperor Era
+4 CAL_TAIWAN Taiwan Calendar
+5 CAL_KOREA Korean Tangun Era
+6 CAL_HIJRI Hijri (Arabic Lunar)
+7 CAL_THAI Thai
+8 CAL_HEBREW Hebrew (Lunar)
+9 CAL_GREGORIAN_ME_FRENCH Gregorian Middle East French
+10 CAL_GREGORIAN_ARABIC Gregorian Arabic
+11 CAL_GREGORIAN_XLIT_ENGLISH Gregorian transliterated English
+12 CAL_GREGORIAN_XLIT_FRENCH Gregorian transliterated French
+23 CAL_UMALQURA Windows Vista or later: Um Al Qura (Arabic lunar) calendar
+*)
+end;
 
 procedure GetLocaleFormatSettings(LCID: Integer; var FormatSettings: TFormatSettings); 
 var
@@ -744,6 +815,7 @@ begin
 
   Set8087CW(old8087CW);
   GetFormatSettings;
+  if SysLocale.FarEast then GetEraNamesAndYearOffsets;
 end;