Raficcha 1 Denunciar post Postado Julho 26, 2010 Pessoal, esses dias precisei traduzir um programa para diversas linguagens. Para tal criei um classe que gostaria de compartilhar com vocês. A classe segue baixo (na verdade toda a unit segue abaixo): unit tradutor;{$mode objfpc}{$H+}interfaceuses Classes, SysUtils, Forms, extCtrls, stdCtrls, Menus; type { TTradutor } TTradutor = class private Originais: TStrings; //conterá as mensagens originais (antes do "Separador nas linha") Traducoes: TStrings; //contera as mensagens traduzidas (depois do "Separador nas linha") function QebrarLinhas(Texto: AnsiString): AnsiString; //função que quebra as linhas de uma mensage utilizando a diretiva %n procedure CarregarArquivo(Arquivo: AnsiString; Separador: char = '='); function TraduzirTexto(Texto: AnsiString): AnsiString; public Constructor create; procedure TraduzirForm(FForm: TForm; ArqLang: AnsiString; Separador: char = '='); end;implementation Uses Global, Rotinas;{ TTradutor }function TTradutor.QebrarLinhas(Texto: AnsiString): AnsiString;var Cont : Integer; Temp, temp2 : string;begin Result := ''; for Cont := 1 to Length(Texto) do begin Result := Result + Texto[cont]; if (Result[Length(Result)-1] = '%') then begin temp := Result[Length(Result)-1]+Result[Length(Result)]; if (temp = '%n') then temp2 := #13#10 else temp2 := ''; Result := Copy(Result, 1, Length(Result)-2)+Temp2; end; end;end;procedure TTradutor.CarregarArquivo(Arquivo: AnsiString; Separador: char);var Arq : TStrings; Cont : Integer;begin if (Not(FileExists(Arquivo))) then Exit; Arq := TStringList.Create; Arq.LoadFromFile(Arquivo); //separar os originais das traduções do arquivo carregado Originais.Clear; Traducoes.Clear; for Cont := 0 to Arq.Count -1 do begin Originais.Add(UTF8Encode(Split(Arq[Cont], 1, Separador))); Traducoes.Add(UTF8Encode(Split(Arq[Cont], 2, Separador))); end; Arq.Free;end;function TTradutor.TraduzirTexto(Texto: AnsiString): AnsiString;var Cont : Integer;begin Result := Texto; for Cont := 0 to Originais.Count-1 do begin if (Texto = Originais[Cont]) then begin Result := Self.QebrarLinhas(Traducoes[Cont]); Break; end; end;end;constructor TTradutor.create;begin Originais := TStringList.Create; Traducoes := TStringList.Create;end;procedure TTradutor.TraduzirForm(FForm: TForm; ArqLang: AnsiString; Separador: char);var Cont, Cont2 : Integer; Temp : string;begin Self.CarregarArquivo(ArqLang, Separador); FForm.Caption := TraduzirTexto(FForm.Caption); for Cont := 0 to FForm.ComponentCount-1 do begin if (FForm.Components[Cont].ClassType = TLabel) then (FForm.Components[Cont] as TLabel).Caption := TraduzirTexto((FForm.Components[Cont] as TLabel).Caption) else if (FForm.Components[Cont].ClassType = TButton) then (FForm.Components[Cont] as TButton).Caption := TraduzirTexto((FForm.Components[Cont] as TButton).Caption) else if (FForm.Components[Cont].ClassType = TGroupBox) then (FForm.Components[Cont] as TGroupBox).Caption := TraduzirTexto((FForm.Components[Cont] as TGroupBox).Caption) else if (FForm.Components[Cont].ClassType = TCheckBox) then (FForm.Components[Cont] as TCheckBox).Caption := TraduzirTexto((FForm.Components[Cont] as TCheckBox).Caption) else if (FForm.Components[Cont].ClassType = TRadioButton) then (FForm.Components[Cont] as TRadioButton).Caption := TraduzirTexto((FForm.Components[Cont] as TRadioButton).Caption) else if (FForm.Components[Cont].ClassType = TMenuItem) then (FForm.Components[Cont] as TMenuItem).Caption := TraduzirTexto((FForm.Components[Cont] as TMenuItem).Caption) else if (FForm.Components[Cont].ClassType = TListBox) then begin For Cont2 := 0 to (FForm.Components[Cont] as TListBox).Items.Count-1 do (FForm.Components[Cont] as TListBox).Items[Cont2] := TraduzirTexto((FForm.Components[Cont] as TListBox).Items[Cont2]); end end;end;end.Ela foi feita em lazarus. Os arquivos de tradução devem ter a seguiente extrutura: texto a ser traduzido=text to be translatedna primeira parte da linha (as partes da linha são separadas pelo caractere "=", mas pode ser trocado, o código fonte esta ai em cima) temos o texto de algum componente no formulário, e na segunda parte temos o texto traduzido. Como não utilizei todos os componentes disponíveis no meu projeto, ele não traduz todos os componentes, porem mais componentes para tradução podem ser inseridos no método "TraduzirForm" espero que seja util. Compartilhar este post Link para o post Compartilhar em outros sites