{ *************************************************************************** * * * This source is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License * * as published by the Free Software Foundation; either version 2 of * * the License, or (at your option) any later version. * * * * This code is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * A copy of the GNU Library General Public License is available on the * * Web at . You can also * * obtain it by writing to the Free Software Foundation, * * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * * *************************************************************************** Author: Olivier GUILBAUD Abstract: This code initialze all FPC Date and Numbers formats consts with the localized format. The KDE configuration it's suported (Default config and User config) I have tested this unit with Linux Mandrake 10.0. For the Euro Monay symbol, I have overriten the result because the config file it's utf8 coded. History 08/10/2004 OG - Create ------------------------------------------------------------------------------} unit SysUtilsAdds; {$mode objfpc}{$H+} interface {$IFDEF LINUX} uses Classes, SysUtils,LibC; {$ENDIF} implementation {$IFDEF LINUX} procedure InitInternationalFormats; Var i : Integer; St : string; Lg : String; LstKde : TStringList; U8S : UTF8String; Function ConvertLinuxDateFormatToFp(Fmt,Dflt : String):string; begin try Fmt:=StringReplace(Fmt,'%x',nl_langinfo(D_FMT),[rfReplaceAll]); Fmt:=StringReplace(Fmt,'%X',nl_langinfo(T_FMT),[rfReplaceAll]); Fmt:=StringReplace(Fmt,'%r',nl_langinfo(T_FMT_AMPM),[rfReplaceAll]); Fmt:=StringReplace(Fmt,'%a','ddd',[rfReplaceAll]); Fmt:=StringReplace(Fmt,'%A','dddd',[rfReplaceAll]); Fmt:=StringReplace(Fmt,'%b','mmm',[rfReplaceAll]); Fmt:=StringReplace(Fmt,'%B','mmmm',[rfReplaceAll]); Fmt:=StringReplace(Fmt,'%c','c',[rfReplaceAll]); Fmt:=StringReplace(Fmt,'%d','dd',[rfReplaceAll]); Fmt:=StringReplace(Fmt,'%D','mm/dd/yy',[rfReplaceAll]); Fmt:=StringReplace(Fmt,'%e','d',[rfReplaceAll]); Fmt:=StringReplace(Fmt,'%F','yyyy-mm-dd',[rfReplaceAll]); Fmt:=StringReplace(Fmt,'%g','yy',[rfReplaceAll]); Fmt:=StringReplace(Fmt,'%G','yyyy',[rfReplaceAll]); Fmt:=StringReplace(Fmt,'%h','mm',[rfReplaceAll]); Fmt:=StringReplace(Fmt,'%H','hh',[rfReplaceAll]); Fmt:=StringReplace(Fmt,'%h','hh',[rfReplaceAll]); Fmt:=StringReplace(Fmt,'%k','h',[rfReplaceAll]); Fmt:=StringReplace(Fmt,'%l','h',[rfReplaceAll]); Fmt:=StringReplace(Fmt,'%m','mm',[rfReplaceAll]); Fmt:=StringReplace(Fmt,'%M','nn',[rfReplaceAll]); Fmt:=StringReplace(Fmt,'%p','ampm',[rfReplaceAll]); Fmt:=StringReplace(Fmt,'%R','hh:nn',[rfReplaceAll]); Fmt:=StringReplace(Fmt,'%S','ss',[rfReplaceAll]); Fmt:=StringReplace(Fmt,'%t',#9,[rfReplaceAll]); Fmt:=StringReplace(Fmt,'%T','hh:nn:ss',[rfReplaceAll]); Fmt:=StringReplace(Fmt,'%y','yy',[rfReplaceAll]); Fmt:=StringReplace(Fmt,'%Y','YYYY',[rfReplaceAll]); Fmt:=StringReplace(Fmt,'%%','%',[rfReplaceAll]); //No correspond values Fmt:=StringReplace(Fmt,'%n','',[rfReplaceAll]); //New line char Fmt:=StringReplace(Fmt,'%C','',[rfReplaceAll]); Fmt:=StringReplace(Fmt,'%E','',[rfReplaceAll]); Fmt:=StringReplace(Fmt,'%j','',[rfReplaceAll]); Fmt:=StringReplace(Fmt,'%o','',[rfReplaceAll]); Fmt:=StringReplace(Fmt,'%s','',[rfReplaceAll]); Fmt:=StringReplace(Fmt,'%u','',[rfReplaceAll]); Fmt:=StringReplace(Fmt,'%U','',[rfReplaceAll]); Fmt:=StringReplace(Fmt,'%V','',[rfReplaceAll]); Fmt:=StringReplace(Fmt,'%W','',[rfReplaceAll]); Fmt:=StringReplace(Fmt,'%w','',[rfReplaceAll]); Fmt:=StringReplace(Fmt,'%+','',[rfReplaceAll]); Fmt:=StringReplace(Fmt,'%z','',[rfReplaceAll]); Fmt:=StringReplace(Fmt,'%Z','',[rfReplaceAll]); finally if Trim(fmt)<>'' then Result:=Fmt else Result:=Dflt; end; end; procedure ReadKdeFileConfig(aFileName,aSection : String; alst : TStringList); Var f : Text; Stc,S : String; Flag : Boolean; begin if FileExists(aFileName) then begin AssignFile(f,aFileName); Reset(f); try Flag:=False; While not EOF(F) do begin ReadLn(f,Stc); if ((Trim(Stc)='') or (Pos('[',Stc)=1)) and Flag then Break; if AnsiSameText(Stc,aSection) then Flag:=True; if Flag then begin S:=UpperCase(Trim(Copy(Stc,1,Pos('=',Stc)-1))); //Name System.Delete(Stc,1,Pos('=',Stc)); //Value //if code is Euro symbol (UTF8) if Stc=#226#130#172 then Stc:='¤'; aLst.Values[S]:=Stc; //if name exists, the value is override end; end; finally CloseFile(F); end; end; end; function ReadKdeConfig(Ident,defaultValue : string; DateFmt : Boolean=False):string; begin Result:=LstKde.Values[UpperCase(Ident)]; if Result='' then Result:=LstKde.Values[UpperCase(Format('%s[%s]',[Ident,Lg]))]; if (Result<>'') and DateFmt then Result:=ConvertLinuxDateFormatToFp(Result,''); if Result='' then Result:=DefaultValue; end; begin //Months for i:=1 to 12 do begin ShortMonthNames[i]:=nl_langinfo((ABMON_1-1)+i); LongMonthNames[i]:=nl_langinfo((MON_1-1)+i); end; //Days for i:=1 to 7 do begin ShortDayNames[i]:=nl_langinfo((ABDAY_1-1)+i); LongDayNames[i]:=nl_langinfo((DAY_1-1)+i); end; //PM/AM TimeAMString:=nl_langinfo(AM_STR); TimePMString:=nl_langinfo(PM_STR); //Date and time format ShortDateFormat:=ConvertLinuxDateFormatToFp(nl_langinfo(D_FMT),ShortDateFormat); LongDateFormat :=ConvertLinuxDateFormatToFp(nl_langinfo(D_T_FMT),LongDateFormat); ShortTimeFormat:=ConvertLinuxDateFormatToFp(nl_langinfo(T_FMT),ShortTimeFormat); LongTimeFormat :=ConvertLinuxDateFormatToFp(nl_langinfo(T_FMT_AMPM),LongTimeFormat); CurrencyString:=nl_langinfo(__CURRENCY_SYMBOL); St:=nl_langinfo(THOUSEP); if Length(St)>0 then ThousandSeparator:=St[1]; St:=nl_langinfo(DECIMAL_POINT); if Length(St)>0 then DecimalSeparator:=St[1]; //Date séparator for i:=1 to Length(ShortDateFormat) do begin if ShortDateFormat[i] in ['-','.','/'] then begin DateSeparator:=ShortDateFormat[i]; Break; end; end; ShortDateFormat:=StringReplace(ShortDateFormat,DateSeparator,'/',[rfReplaceAll]); //KDE config if DirectoryExists(ExpandFileName('~/.kde/share/config')) then begin Lg:=Copy(GetEnv('LANG'),1,2); //Langue LstKde:=TStringList.Create; try ReadKdeFileConfig(Format('/usr/share/locale/l10n/%s/entry.desktop',[Lg]),'[KCM Locale]',LstKde); ReadKdeFileConfig(ExpandFileName('~/.kde/share/config/kdeglobals'),'[Locale]',LstKde); St:=ReadKdeConfig('DecimalSymbol',DecimalSeparator); DecimalSeparator:=St[1]; CurrencyString:=ReadKdeConfig('CurrencySymbol',CurrencyString); ThousandSeparator:=ReadKdeConfig('ThousandsSeparator',ThousandSeparator)[1]; LongTimeFormat:=ReadKdeConfig('TimeFormat',LongTimeFormat,True); LongDateFormat:=ReadKdeConfig('DateFormat',LongDateFormat,True); ShortDateFormat:=ReadKdeConfig('DateFormatShort',ShortDateFormat,True); ShortTimeFormat:=ReadKdeConfig('TimeFormatShort',ShortTimeFormat,True); //Date séparator for i:=1 to Length(ShortDateFormat) do begin if ShortDateFormat[i] in ['-','.','/'] then begin DateSeparator:=ShortDateFormat[i]; Break; end; end; ShortDateFormat:=StringReplace(ShortDateFormat,DateSeparator,'/',[rfReplaceAll]); finally LstKde.Free; end; end; end; INITIALIZATION InitInternationalFormats; {$ENDIF} end.