Guest User

Untitled

a guest
May 14th, 2018
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 11.78 KB | None | 0 0
  1. unit Localization;
  2.  
  3. interface
  4.  
  5. uses
  6.   Classes;
  7.  
  8. type
  9.   TLanguageInfo = record
  10.                     Name        : String;
  11.                     LocalName   : String;
  12.                     CountryCode : String;
  13.                     Author      : String;
  14.                   end;
  15.   {$M+}
  16.   TLocalizer = class
  17.                private
  18.                  FLanguageFile      : String;
  19.                  FLanguageList      : TStringList;
  20.                  FLanguagesDir      : String;
  21.                  FLanguagesFileMask : String;
  22.                public
  23.                  constructor Create(const ALanguagesDir : String = ''; const ALanguagesFilemask : String = '*.*');
  24.                  destructor Destroy; override;
  25.  
  26.                  procedure Localize(const AComponent : TComponent);
  27.                  procedure LocalizeResourceStrings;
  28.  
  29.                  procedure RefreshLanguageList;
  30.                  function GetLanguageInfo(const ALanguageFile : String) : TLanguageInfo;
  31.                  function FindLanguageByName(const ALanguageName : String; var AIndex : Integer) : Boolean;
  32.                published
  33.                  property LanguageFile : String read FLanguageFile write FLanguageFile;
  34.                  property LanguageList : TStringList read FLanguageList;
  35.                  property LanguagesDir : String read FLanguagesDir write FLanguagesDir;
  36.                end;
  37.   {$M-}
  38.  
  39.  
  40. implementation
  41.  
  42. uses
  43.   SysUtils, INIFiles, TypInfo, SharedFunctions, LocalizationStr;
  44.  
  45. constructor TLocalizer.Create(const ALanguagesDir : String = ''; const ALanguagesFilemask : String = '*.*');
  46. begin
  47.   DbgLn('TLocalizer.Create()');
  48.  
  49.   FLanguageFile := '';
  50.   FLanguagesDir := ALanguagesDir;
  51.   FLanguagesFilemask := ALanguagesFilemask;
  52.  
  53.   FLanguageList := TStringList.Create;
  54.   FLanguageList.Clear;
  55.   FLanguageList.Sorted := TRUE;
  56.   RefreshLanguageList;
  57. end;
  58.  
  59. destructor TLocalizer.Destroy;
  60. begin
  61.   DbgLn('TLocalizer.Destroy()');
  62.  
  63.   FLanguageList.Free;
  64.  
  65.   inherited;
  66. end;
  67.  
  68. procedure TLocalizer.Localize(const AComponent : TComponent);
  69. const
  70.   DATASECTION = 'data';
  71. var
  72.   INI      : TMemINIFile;
  73.   ident    : TStringList;
  74.   values   : TStringList;
  75.   objects  : TStringList;
  76.   C1       : Integer;
  77.   fcomp    : TComponent;
  78.   PropInfo : PPropInfo;
  79.   isHint   : Boolean;
  80.   objStr   : String;
  81. begin
  82.   If Assigned(AComponent) Then
  83.   Begin
  84.     DbgLn(Format('TLocalizer.Localize(%s)', [AComponent.Name]));
  85.    
  86.     If FileExists(FLanguageFile) Then
  87.     Begin
  88.       INI := TMemINIFile.Create(FLanguageFile, TEncoding.UTF8);
  89.       If INI.SectionExists(DATASECTION) Then
  90.       Begin
  91.         ident := TStringList.Create;
  92.         values := TStringList.Create;
  93.         INI.ReadSection(DATASECTION, ident);
  94.         INI.ReadSectionValues(DATASECTION, values);
  95.         For C1 := 0 to values.Count - 1 Do
  96.           values.Strings[C1] := Trim(Copy(values.Strings[C1], Pos('=', values.Strings[C1]) + 1, Length(values.Strings[C1]) - Pos('=', values.Strings[C1])));
  97.  
  98.         objects := TStringList.Create;
  99.         If ident.Count = values.Count Then
  100.           For C1 := 0 to ident.Count - 1 Do
  101.           Begin
  102.             Split('.', ident.Strings[C1], objects);
  103.             If objects.Count > 0 Then
  104.             Begin
  105.               objStr := objects.Strings[0];
  106.               isHint := objStr[1] = '#';
  107.               If isHint Then
  108.                 Delete(objStr, 1, 1);
  109.  
  110.               If LowerCase(objStr) = LowerCase(AComponent.Name) Then
  111.               Begin
  112.                 objects.Delete(0);
  113.                 fcomp := AComponent;
  114.                 While (objects.Count > 0) and
  115.                       (fcomp <> nil) Do
  116.                 Begin
  117.                   fcomp := fcomp.FindComponent(objects.Strings[0]);
  118.                   objects.Delete(0);
  119.                 End;
  120.                 If fcomp <> nil Then
  121.                 Begin
  122.                   If isHint Then
  123.                     PropInfo := GetPropInfo(fcomp, 'Hint')
  124.                   else
  125.                   Begin
  126.                     PropInfo := GetPropInfo(fcomp, 'Caption');
  127.                     If PropInfo = nil Then
  128.                       PropInfo := GetPropInfo(fcomp, 'Text');
  129.                   End;
  130.                      
  131.                   If PropInfo <> nil Then
  132.                     SetStrProp(fcomp, PropInfo, PrepareString(values.Strings[C1]));
  133.                 End;
  134.               End;  
  135.             End;
  136.           End;
  137.         objects.Free;
  138.  
  139.         values.Free;
  140.         ident.Free;
  141.       End;
  142.       INI.Free;
  143.     End;
  144.   End;
  145. end;
  146.  
  147. procedure TLocalizer.LocalizeResourceStrings;
  148. const
  149.   SECTION = 'strresources';
  150. var
  151.   INI : TMemINIFile;
  152. begin
  153.   DbgLn('TLocalizer.LocalizeResourceStrings()');
  154.  
  155.   If FileExists(FLanguageFile) Then
  156.   Begin
  157.     INI := TMemINIFile.Create(FLanguageFile, TEncoding.UTF8);
  158.  
  159.     RS_AUTHENTICATING := PrepareString(INI.ReadString(SECTION, 'RS_AUTHENTICATING', RS_AUTHENTICATING));
  160.     RS_RESPONSE_UNKNOWN := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_UNKNOWN', RS_RESPONSE_UNKNOWN));
  161.     RS_RESPONSE_REGISTER_EMAIL_SENT := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_REGISTER_EMAIL_SENT', RS_RESPONSE_REGISTER_EMAIL_SENT));
  162.     RS_RESPONSE_CHANNEL_ADDED := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_CHANNEL_ADDED', RS_RESPONSE_CHANNEL_ADDED));
  163.     RS_RESPONSE_CHANNEL_PASSWORD_CHANGED := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_CHANNEL_PASSWORD_CHANGED', RS_RESPONSE_CHANNEL_PASSWORD_CHANGED));
  164.     RS_RESPONSE_REQUEST_SENT := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_REQUEST_SENT', RS_RESPONSE_REQUEST_SENT));
  165.     RS_RESPONSE_CONFIRMED_REQUEST := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_CONFIRMED_REQUEST', RS_RESPONSE_CONFIRMED_REQUEST));
  166.     RS_RESPONSE_USER_UNBLOCKED := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_USER_UNBLOCKED', RS_RESPONSE_USER_UNBLOCKED));
  167.     RS_RESPONSE_USER_BLOCKED := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_USER_BLOCKED', RS_RESPONSE_USER_BLOCKED));
  168.     RS_RESPONSE_COULD_NOT_SEND_EMAIL := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_COULD_NOT_SEND_EMAIL', RS_RESPONSE_COULD_NOT_SEND_EMAIL));
  169.     RS_RESPONSE_USERNAME_TAKEN := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_USERNAME_TAKEN', RS_RESPONSE_USERNAME_TAKEN));
  170.     RS_RESPONSE_EMAIL_ALREADY_USED := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_EMAIL_ALREADY_USED', RS_RESPONSE_EMAIL_ALREADY_USED));
  171.     RS_RESPONSE_CAPTCHA_ERROR := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_CAPTCHA_ERROR', RS_RESPONSE_CAPTCHA_ERROR));
  172.     RS_RESPONSE_REQ_LIMIT_REACHED := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_REQ_LIMIT_REACHED', RS_RESPONSE_REQ_LIMIT_REACHED));
  173.     RS_RESPONSE_INVALID_KEY := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_INVALID_KEY', RS_RESPONSE_INVALID_KEY));
  174.     RS_RESPONSE_INVALID_USERNAME := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_INVALID_USERNAME', RS_RESPONSE_INVALID_USERNAME));
  175.     RS_RESPONSE_ALREADY_A_FRIEND := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_ALREADY_A_FRIEND', RS_RESPONSE_ALREADY_A_FRIEND));
  176.     RS_RESPONSE_INVALID_CONFIRMATION := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_INVALID_CONFIRMATION', RS_RESPONSE_INVALID_CONFIRMATION));
  177.     RS_RESPONSE_INVALID_POSTS := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_INVALID_POSTS', RS_RESPONSE_INVALID_POSTS));
  178.     RS_RESPONSE_INVALID_USER := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_INVALID_USER', RS_RESPONSE_INVALID_USER));
  179.     RS_RESPONSE_NOT_CHANNEL_OWNER := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_NOT_CHANNEL_OWNER', RS_RESPONSE_NOT_CHANNEL_OWNER));
  180.     RS_RESPONSE_INVALID_USERPASS := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_INVALID_USERPASS', RS_RESPONSE_INVALID_USERPASS));
  181.     RS_RESPONSE_ALREADY_SENT_REQ := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_ALREADY_SENT_REQ', RS_RESPONSE_ALREADY_SENT_REQ));
  182.     RS_RESPONSE_CHANNEL_RESERVED := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_CHANNEL_RESERVED', RS_RESPONSE_CHANNEL_RESERVED));
  183.     RS_RESPONSE_ACCOUNT_NOT_ACTIVATED := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_ACCOUNT_NOT_ACTIVATED', RS_RESPONSE_ACCOUNT_NOT_ACTIVATED));
  184.     RS_RUN_CLIENT_AS_ADMIN := PrepareString(INI.ReadString(SECTION, 'RS_RUN_CLIENT_AS_ADMIN', RS_RUN_CLIENT_AS_ADMIN));
  185.     RS_CANNOT_CONNECT := PrepareString(INI.ReadString(SECTION, 'RS_CANNOT_CONNECT', RS_CANNOT_CONNECT));
  186.     RS_WAITING_FOR_GAME := PrepareString(INI.ReadString(SECTION, 'RS_WAITING_FOR_GAME', RS_WAITING_FOR_GAME));
  187.     RS_GAME_IN_PROGRESS := PrepareString(INI.ReadString(SECTION, 'RS_GAME_IN_PROGRESS', RS_GAME_IN_PROGRESS));
  188.     RS_GAME_ENDED := PrepareString(INI.ReadString(SECTION, 'RS_GAME_ENDED', RS_GAME_ENDED));
  189.     RS_WARDIALOG_TITLE := PrepareString(INI.ReadString(SECTION, 'RS_WARDIALOG_TITLE', RS_WARDIALOG_TITLE));
  190.     RS_NO_RESPONSE_FROM_SERVER := PrepareString(INI.ReadString(SECTION, 'RS_NO_RESPONSE_FROM_SERVER', RS_NO_RESPONSE_FROM_SERVER));
  191.     RS_GAME_PRECREEPS := PrepareString(INI.ReadString(SECTION, 'RS_GAME_PRECREEPS', RS_GAME_PRECREEPS));
  192.     RS_DOWNLOAD_DOWNLOADING := PrepareString(INI.ReadString(SECTION, 'RS_DOWNLOAD_DOWNLOADING', RS_DOWNLOAD_DOWNLOADING));
  193.     RS_WARCRAFT_REPLAY_NOT_ASSOCIATED := PrepareString(INI.ReadString(SECTION, 'RS_WARCRAFT_REPLAY_NOT_ASSOCIATED', RS_WARCRAFT_REPLAY_NOT_ASSOCIATED));
  194.     RS_STARCRAFT_REPLAY_NOT_ASSOCIATED := PrepareString(INI.ReadString(SECTION, 'RS_STARCRAFT_REPLAY_NOT_ASSOCIATED', RS_STARCRAFT_REPLAY_NOT_ASSOCIATED));
  195.     RS_INVALID_EMAIL := PrepareString(INI.ReadString(SECTION, 'RS_INVALID_EMAIL', RS_INVALID_EMAIL));
  196.     RS_PASSWORD_MISMATCH := PrepareString(INI.ReadString(SECTION, 'RS_PASSWORD_MISMATCH', RS_PASSWORD_MISMATCH));
  197.     RS_FILL_ALL_FIELDS := PrepareString(INI.ReadString(SECTION, 'RS_FILL_ALL_FIELDS', RS_FILL_ALL_FIELDS));
  198.     RS_PASSWORD_TOO_SHORT := PrepareString(INI.ReadString(SECTION, 'RS_PASSWORD_TOO_SHORT', RS_PASSWORD_TOO_SHORT));
  199.     RS_USERNAME_TOO_SHORT := PrepareString(INI.ReadString(SECTION, 'RS_USERNAME_TOO_SHORT', RS_USERNAME_TOO_SHORT));
  200.     RS_CHECKING_FOR_UPDATES := PrepareString(INI.ReadString(SECTION, 'RS_CHECKING_FOR_UPDATES', RS_CHECKING_FOR_UPDATES));
  201.     RS_REPLAY_DOWNLOADING := PrepareString(INI.ReadString(SECTION, 'RS_REPLAY_DOWNLOADING', RS_REPLAY_DOWNLOADING));
  202.     RS_UPDATE_DOWNLOADING := PrepareString(INI.ReadString(SECTION, 'RS_UPDATE_DOWNLOADING', RS_UPDATE_DOWNLOADING));
  203.     RS_AGREE_TO_TERMS := PrepareString(INI.ReadString(SECTION, 'RS_AGREE_TO_TERMS', RS_AGREE_TO_TERMS));
  204.  
  205.     INI.Free;
  206.   End;
  207. end;
  208.  
  209. function TLocalizer.GetLanguageInfo(const ALanguageFile : String) : TLanguageInfo;
  210. var
  211.   INI : TMemINIFile;
  212. begin
  213.   DbgLn(Format('TLocalizer.GetLanguageInfo(%s)', [ALanguageFile]));
  214.  
  215.   If FileExists(ALanguageFile) Then
  216.   Begin
  217.     INI := TMemINIFile.Create(ALanguageFile, TEncoding.UTF8);
  218.     result.Name := INI.ReadString('info', 'LanguageName', '');
  219.     result.LocalName := INI.ReadString('info', 'LocalLanguageName', '');
  220.     result.CountryCode := INI.ReadString('info', 'CountryCode', '');
  221.     result.Author := INI.ReadString('info', 'Author', '');
  222.     INI.Free;
  223.   End;
  224. end;
  225.  
  226. procedure TLocalizer.RefreshLanguageList;
  227. begin
  228.   DbgLn('TLocalizer.RefreshLanguageList()');
  229.  
  230.   LanguageList.Clear;
  231.   EnumerateFiles(FLanguagesDir, FLanguagesFilemask, TRUE, FLanguageList);
  232. end;
  233.  
  234. function TLocalizer.FindLanguageByName(const ALanguageName : String; var AIndex : Integer) : Boolean;
  235. var
  236.   C1       : Integer;
  237.   langInfo : TLanguageInfo;
  238. begin
  239.   DbgLn(Format('TLocalizer.FindLanguageByName(%s, %d)', [ALanguageName, AIndex]));
  240.  
  241.   result := FALSE;
  242.   AIndex := -1;
  243.  
  244.   For C1 := 0 to FLanguageList.Count - 1 Do
  245.   Begin
  246.     langInfo := GetLanguageInfo(FLanguageList.Strings[C1]);
  247.     If (langInfo.Name = ALanguageName) or
  248.        (langInfo.LocalName = ALanguageName) Then
  249.     Begin
  250.       AIndex := C1;
  251.       result := TRUE;
  252.       Break;
  253.     End;
  254.   End;
  255. end;
  256.  
  257. end.
Add Comment
Please, Sign In to add comment