Ola pessoal, procurando pela net, achei uma página que ensina a traduzir as mensagens do Delphi sem precisar instalare/ou substituir os arquvos do Delphi 2010.
Sempre que pesquisei sobre como traduzir as mensagens do Delphi obtive, na maioria das vezes, a mesma resposta. Basicamente essas respostas envolviam a substituição das units do Delphi por outras já traduzidas.
Enfim encontrei algo mais elegante. Todas as mensagens do Delphi são declaradas como resourcestring, que é uma área onde são declaradas “constantes” que podem ser alteradas em run-time, ou seja, sem a necessidade de recompilar o projeto.
Para alterar essas “constantes” usamos a função VirtualProtec (windows.pas). Através dela obtemos a estrutura do resourcestring armazenado no executável e a alteramos. Para simplificar criei um método que faz toda a operação.
procedure SetResourceString(AResString: PResStringRec; ANewValue: PChar);
var
POldProtect: DWORD;
begin
VirtualProtect(AResString, SizeOf(AResString^), PAGE_EXECUTE_READWRITE, @POldProtect);
AResString^.Identifier := Integer(ANewValue);
VirtualProtect(AResString, SizeOf(AResString^), POldProtect, @POldProtect);
end;
Para utilizar esse método basta passar o ponteiro do resourcestring e seu novo valor. Exemplo:
resourcestring
rsMinhaMensagem = ‘Exemplo de alteração do resourcestring’;
.
.
.
SetResourceString(@rsMinhaMensagem, ‘rsMinhaMensagem mudou’);
As declarações de resourcestring do Delphi estão espalhadas em várias units (corbcnst, midconst, mxconsts, comconst, webconst, ibconst, bdeconst, comstrs, consts), portanto para traduzir basta localiza-las na pastasource da instalação do Delphi e executar o método SetResourceString para cada constante que deseja traduzir. Exemplo:
SetResourceString(@SMsgDlgYes, ‘Novo Yes’);
Toda a tradução pode ser declarada na inicialização de uma unit comum a todos os seus projetos. Você encontrará mais detalhes no projeto exemplo.
Esse conceito pode ser utilizado para a internacionalização de seu sistema, ou seja, poderíamos declarar todas as mensagens como resourcestring e cria um mecanismo no sistema que permita ao usuário trocar a linguagem. Nas versões mais atuais do Delphi já temos opções que simplificam esse trabalho.
Ai vai o link da página onde foi extraido o artigo.
Leandro Piga
Espero ter ajudado.
Até a próxima.
Meu arquivo de tradução
Tradução Delphi 2010 ou superior.
unit uTraducao;
interface
uses Windows, Consts;
procedure SetResourceString(AResString: PResStringRec; ANewValue: PChar);
const
SNewMsgDlgYes: PChar = ‘&Sim’;
SNewMsgDlgOK: PChar = ‘Ok’;
SNewMsgDlgCancel: PChar = ‘Cancelar’;
SNewMsgDlgNo: PChar = ‘&Não’;
SNewMsgDlgWarning = ‘Aviso’;
SNewMsgDlgError = ‘Erro’;
SNewMsgDlgInformation = ‘Informação’;
SNewMsgDlgConfirm = ‘Confirme’;
SNewMsgDlgHelp = ‘&Ajuda’;
SNewMsgDlgHelpNone = ‘Não há arquivo de ajuda’;
SNewMsgDlgHelpHelp = ‘Ajuda’;
SNewMsgDlgAbort = ‘&Abortar’;
SNewMsgDlgRetry = ‘&Repetir’;
SNewMsgDlgIgnore = ‘&Ignorar’;
SNewMsgDlgAll = ‘&Todos’;
SNewMsgDlgNoToAll = ‘N&ão para Todos’;
SNewMsgDlgYesToAll = ‘Sim pata &Todos’;
implementation
procedure SetResourceString(AResString: PResStringRec; ANewValue: PChar);
var
POldProtect: DWORD;
begin
VirtualProtect(AResString, SizeOf(AResString^), PAGE_EXECUTE_READWRITE,
@POldProtect);
AResString^.Identifier := Integer(ANewValue);
VirtualProtect(AResString, SizeOf(AResString^), POldProtect, @POldProtect);
end;
initialization
SetResourceString(@SMsgDlgYes, SNewMsgDlgYes);
SetResourceString(@SMsgDlgOK, SNewMsgDlgOK);
SetResourceString(@SMsgDlgCancel, SNewMsgDlgCancel);
SetResourceString(@SMsgDlgNo, SNewMsgDlgNo);
SetResourceString(@SMsgDlgWarning, SNewMsgDlgWarning);
SetResourceString(@SMsgDlgError, SNewMsgDlgError);
SetResourceString(@SMsgDlgInformation, SNewMsgDlgInformation);
SetResourceString(@SMsgDlgConfirm, SNewMsgDlgConfirm);
SetResourceString(@SMsgDlgHelp, SNewMsgDlgHelp);
SetResourceString(@SMsgDlgHelpNone, SNewMsgDlgHelpNone);
SetResourceString(@SMsgDlgHelpHelp, SNewMsgDlgHelpHelp);
SetResourceString(@SMsgDlgAbort, SNewMsgDlgAbort);
SetResourceString(@SMsgDlgRetry, SNewMsgDlgRetry);
SetResourceString(@SMsgDlgIgnore, SNewMsgDlgIgnore);
SetResourceString(@SMsgDlgAll, SNewMsgDlgAll);
SetResourceString(@SMsgDlgNoToAll, SNewMsgDlgNoToAll);
SetResourceString(@SMsgDlgYesToAll, SNewMsgDlgYesToAll);
end.