Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- unit Localization;
- interface
- uses
- Classes;
- type
- TLanguageInfo = record
- Name : String;
- LocalName : String;
- CountryCode : String;
- Author : String;
- end;
- {$M+}
- TLocalizer = class
- private
- FLanguageFile : String;
- FLanguageList : TStringList;
- FLanguagesDir : String;
- FLanguagesFileMask : String;
- public
- constructor Create(const ALanguagesDir : String = ''; const ALanguagesFilemask : String = '*.*');
- destructor Destroy; override;
- procedure Localize(const AComponent : TComponent);
- procedure LocalizeResourceStrings;
- procedure RefreshLanguageList;
- function GetLanguageInfo(const ALanguageFile : String) : TLanguageInfo;
- function FindLanguageByName(const ALanguageName : String; var AIndex : Integer) : Boolean;
- published
- property LanguageFile : String read FLanguageFile write FLanguageFile;
- property LanguageList : TStringList read FLanguageList;
- property LanguagesDir : String read FLanguagesDir write FLanguagesDir;
- end;
- {$M-}
- implementation
- uses
- SysUtils, INIFiles, TypInfo, SharedFunctions, LocalizationStr;
- constructor TLocalizer.Create(const ALanguagesDir : String = ''; const ALanguagesFilemask : String = '*.*');
- begin
- DbgLn('TLocalizer.Create()');
- FLanguageFile := '';
- FLanguagesDir := ALanguagesDir;
- FLanguagesFilemask := ALanguagesFilemask;
- FLanguageList := TStringList.Create;
- FLanguageList.Clear;
- FLanguageList.Sorted := TRUE;
- RefreshLanguageList;
- end;
- destructor TLocalizer.Destroy;
- begin
- DbgLn('TLocalizer.Destroy()');
- FLanguageList.Free;
- inherited;
- end;
- procedure TLocalizer.Localize(const AComponent : TComponent);
- const
- DATASECTION = 'data';
- var
- INI : TMemINIFile;
- ident : TStringList;
- values : TStringList;
- objects : TStringList;
- C1 : Integer;
- fcomp : TComponent;
- PropInfo : PPropInfo;
- isHint : Boolean;
- objStr : String;
- begin
- If Assigned(AComponent) Then
- Begin
- DbgLn(Format('TLocalizer.Localize(%s)', [AComponent.Name]));
- If FileExists(FLanguageFile) Then
- Begin
- INI := TMemINIFile.Create(FLanguageFile, TEncoding.UTF8);
- If INI.SectionExists(DATASECTION) Then
- Begin
- ident := TStringList.Create;
- values := TStringList.Create;
- INI.ReadSection(DATASECTION, ident);
- INI.ReadSectionValues(DATASECTION, values);
- For C1 := 0 to values.Count - 1 Do
- values.Strings[C1] := Trim(Copy(values.Strings[C1], Pos('=', values.Strings[C1]) + 1, Length(values.Strings[C1]) - Pos('=', values.Strings[C1])));
- objects := TStringList.Create;
- If ident.Count = values.Count Then
- For C1 := 0 to ident.Count - 1 Do
- Begin
- Split('.', ident.Strings[C1], objects);
- If objects.Count > 0 Then
- Begin
- objStr := objects.Strings[0];
- isHint := objStr[1] = '#';
- If isHint Then
- Delete(objStr, 1, 1);
- If LowerCase(objStr) = LowerCase(AComponent.Name) Then
- Begin
- objects.Delete(0);
- fcomp := AComponent;
- While (objects.Count > 0) and
- (fcomp <> nil) Do
- Begin
- fcomp := fcomp.FindComponent(objects.Strings[0]);
- objects.Delete(0);
- End;
- If fcomp <> nil Then
- Begin
- If isHint Then
- PropInfo := GetPropInfo(fcomp, 'Hint')
- else
- Begin
- PropInfo := GetPropInfo(fcomp, 'Caption');
- If PropInfo = nil Then
- PropInfo := GetPropInfo(fcomp, 'Text');
- End;
- If PropInfo <> nil Then
- SetStrProp(fcomp, PropInfo, PrepareString(values.Strings[C1]));
- End;
- End;
- End;
- End;
- objects.Free;
- values.Free;
- ident.Free;
- End;
- INI.Free;
- End;
- End;
- end;
- procedure TLocalizer.LocalizeResourceStrings;
- const
- SECTION = 'strresources';
- var
- INI : TMemINIFile;
- begin
- DbgLn('TLocalizer.LocalizeResourceStrings()');
- If FileExists(FLanguageFile) Then
- Begin
- INI := TMemINIFile.Create(FLanguageFile, TEncoding.UTF8);
- RS_AUTHENTICATING := PrepareString(INI.ReadString(SECTION, 'RS_AUTHENTICATING', RS_AUTHENTICATING));
- RS_RESPONSE_UNKNOWN := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_UNKNOWN', RS_RESPONSE_UNKNOWN));
- RS_RESPONSE_REGISTER_EMAIL_SENT := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_REGISTER_EMAIL_SENT', RS_RESPONSE_REGISTER_EMAIL_SENT));
- RS_RESPONSE_CHANNEL_ADDED := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_CHANNEL_ADDED', RS_RESPONSE_CHANNEL_ADDED));
- RS_RESPONSE_CHANNEL_PASSWORD_CHANGED := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_CHANNEL_PASSWORD_CHANGED', RS_RESPONSE_CHANNEL_PASSWORD_CHANGED));
- RS_RESPONSE_REQUEST_SENT := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_REQUEST_SENT', RS_RESPONSE_REQUEST_SENT));
- RS_RESPONSE_CONFIRMED_REQUEST := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_CONFIRMED_REQUEST', RS_RESPONSE_CONFIRMED_REQUEST));
- RS_RESPONSE_USER_UNBLOCKED := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_USER_UNBLOCKED', RS_RESPONSE_USER_UNBLOCKED));
- RS_RESPONSE_USER_BLOCKED := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_USER_BLOCKED', RS_RESPONSE_USER_BLOCKED));
- RS_RESPONSE_COULD_NOT_SEND_EMAIL := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_COULD_NOT_SEND_EMAIL', RS_RESPONSE_COULD_NOT_SEND_EMAIL));
- RS_RESPONSE_USERNAME_TAKEN := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_USERNAME_TAKEN', RS_RESPONSE_USERNAME_TAKEN));
- RS_RESPONSE_EMAIL_ALREADY_USED := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_EMAIL_ALREADY_USED', RS_RESPONSE_EMAIL_ALREADY_USED));
- RS_RESPONSE_CAPTCHA_ERROR := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_CAPTCHA_ERROR', RS_RESPONSE_CAPTCHA_ERROR));
- RS_RESPONSE_REQ_LIMIT_REACHED := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_REQ_LIMIT_REACHED', RS_RESPONSE_REQ_LIMIT_REACHED));
- RS_RESPONSE_INVALID_KEY := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_INVALID_KEY', RS_RESPONSE_INVALID_KEY));
- RS_RESPONSE_INVALID_USERNAME := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_INVALID_USERNAME', RS_RESPONSE_INVALID_USERNAME));
- RS_RESPONSE_ALREADY_A_FRIEND := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_ALREADY_A_FRIEND', RS_RESPONSE_ALREADY_A_FRIEND));
- RS_RESPONSE_INVALID_CONFIRMATION := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_INVALID_CONFIRMATION', RS_RESPONSE_INVALID_CONFIRMATION));
- RS_RESPONSE_INVALID_POSTS := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_INVALID_POSTS', RS_RESPONSE_INVALID_POSTS));
- RS_RESPONSE_INVALID_USER := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_INVALID_USER', RS_RESPONSE_INVALID_USER));
- RS_RESPONSE_NOT_CHANNEL_OWNER := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_NOT_CHANNEL_OWNER', RS_RESPONSE_NOT_CHANNEL_OWNER));
- RS_RESPONSE_INVALID_USERPASS := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_INVALID_USERPASS', RS_RESPONSE_INVALID_USERPASS));
- RS_RESPONSE_ALREADY_SENT_REQ := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_ALREADY_SENT_REQ', RS_RESPONSE_ALREADY_SENT_REQ));
- RS_RESPONSE_CHANNEL_RESERVED := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_CHANNEL_RESERVED', RS_RESPONSE_CHANNEL_RESERVED));
- RS_RESPONSE_ACCOUNT_NOT_ACTIVATED := PrepareString(INI.ReadString(SECTION, 'RS_RESPONSE_ACCOUNT_NOT_ACTIVATED', RS_RESPONSE_ACCOUNT_NOT_ACTIVATED));
- RS_RUN_CLIENT_AS_ADMIN := PrepareString(INI.ReadString(SECTION, 'RS_RUN_CLIENT_AS_ADMIN', RS_RUN_CLIENT_AS_ADMIN));
- RS_CANNOT_CONNECT := PrepareString(INI.ReadString(SECTION, 'RS_CANNOT_CONNECT', RS_CANNOT_CONNECT));
- RS_WAITING_FOR_GAME := PrepareString(INI.ReadString(SECTION, 'RS_WAITING_FOR_GAME', RS_WAITING_FOR_GAME));
- RS_GAME_IN_PROGRESS := PrepareString(INI.ReadString(SECTION, 'RS_GAME_IN_PROGRESS', RS_GAME_IN_PROGRESS));
- RS_GAME_ENDED := PrepareString(INI.ReadString(SECTION, 'RS_GAME_ENDED', RS_GAME_ENDED));
- RS_WARDIALOG_TITLE := PrepareString(INI.ReadString(SECTION, 'RS_WARDIALOG_TITLE', RS_WARDIALOG_TITLE));
- RS_NO_RESPONSE_FROM_SERVER := PrepareString(INI.ReadString(SECTION, 'RS_NO_RESPONSE_FROM_SERVER', RS_NO_RESPONSE_FROM_SERVER));
- RS_GAME_PRECREEPS := PrepareString(INI.ReadString(SECTION, 'RS_GAME_PRECREEPS', RS_GAME_PRECREEPS));
- RS_DOWNLOAD_DOWNLOADING := PrepareString(INI.ReadString(SECTION, 'RS_DOWNLOAD_DOWNLOADING', RS_DOWNLOAD_DOWNLOADING));
- RS_WARCRAFT_REPLAY_NOT_ASSOCIATED := PrepareString(INI.ReadString(SECTION, 'RS_WARCRAFT_REPLAY_NOT_ASSOCIATED', RS_WARCRAFT_REPLAY_NOT_ASSOCIATED));
- RS_STARCRAFT_REPLAY_NOT_ASSOCIATED := PrepareString(INI.ReadString(SECTION, 'RS_STARCRAFT_REPLAY_NOT_ASSOCIATED', RS_STARCRAFT_REPLAY_NOT_ASSOCIATED));
- RS_INVALID_EMAIL := PrepareString(INI.ReadString(SECTION, 'RS_INVALID_EMAIL', RS_INVALID_EMAIL));
- RS_PASSWORD_MISMATCH := PrepareString(INI.ReadString(SECTION, 'RS_PASSWORD_MISMATCH', RS_PASSWORD_MISMATCH));
- RS_FILL_ALL_FIELDS := PrepareString(INI.ReadString(SECTION, 'RS_FILL_ALL_FIELDS', RS_FILL_ALL_FIELDS));
- RS_PASSWORD_TOO_SHORT := PrepareString(INI.ReadString(SECTION, 'RS_PASSWORD_TOO_SHORT', RS_PASSWORD_TOO_SHORT));
- RS_USERNAME_TOO_SHORT := PrepareString(INI.ReadString(SECTION, 'RS_USERNAME_TOO_SHORT', RS_USERNAME_TOO_SHORT));
- RS_CHECKING_FOR_UPDATES := PrepareString(INI.ReadString(SECTION, 'RS_CHECKING_FOR_UPDATES', RS_CHECKING_FOR_UPDATES));
- RS_REPLAY_DOWNLOADING := PrepareString(INI.ReadString(SECTION, 'RS_REPLAY_DOWNLOADING', RS_REPLAY_DOWNLOADING));
- RS_UPDATE_DOWNLOADING := PrepareString(INI.ReadString(SECTION, 'RS_UPDATE_DOWNLOADING', RS_UPDATE_DOWNLOADING));
- RS_AGREE_TO_TERMS := PrepareString(INI.ReadString(SECTION, 'RS_AGREE_TO_TERMS', RS_AGREE_TO_TERMS));
- INI.Free;
- End;
- end;
- function TLocalizer.GetLanguageInfo(const ALanguageFile : String) : TLanguageInfo;
- var
- INI : TMemINIFile;
- begin
- DbgLn(Format('TLocalizer.GetLanguageInfo(%s)', [ALanguageFile]));
- If FileExists(ALanguageFile) Then
- Begin
- INI := TMemINIFile.Create(ALanguageFile, TEncoding.UTF8);
- result.Name := INI.ReadString('info', 'LanguageName', '');
- result.LocalName := INI.ReadString('info', 'LocalLanguageName', '');
- result.CountryCode := INI.ReadString('info', 'CountryCode', '');
- result.Author := INI.ReadString('info', 'Author', '');
- INI.Free;
- End;
- end;
- procedure TLocalizer.RefreshLanguageList;
- begin
- DbgLn('TLocalizer.RefreshLanguageList()');
- LanguageList.Clear;
- EnumerateFiles(FLanguagesDir, FLanguagesFilemask, TRUE, FLanguageList);
- end;
- function TLocalizer.FindLanguageByName(const ALanguageName : String; var AIndex : Integer) : Boolean;
- var
- C1 : Integer;
- langInfo : TLanguageInfo;
- begin
- DbgLn(Format('TLocalizer.FindLanguageByName(%s, %d)', [ALanguageName, AIndex]));
- result := FALSE;
- AIndex := -1;
- For C1 := 0 to FLanguageList.Count - 1 Do
- Begin
- langInfo := GetLanguageInfo(FLanguageList.Strings[C1]);
- If (langInfo.Name = ALanguageName) or
- (langInfo.LocalName = ALanguageName) Then
- Begin
- AIndex := C1;
- result := TRUE;
- Break;
- End;
- End;
- end;
- end.
Add Comment
Please, Sign In to add comment