Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Raficcha

[Resolvido] Classe para tradução de formulários

Recommended Posts

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 translated
na 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.

 

Imagem Postada

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.