Tradução mensagens do Delphi 2010

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.

14 respostas para Tradução mensagens do Delphi 2010

  1. Sérgio Loback disse:

    Se uma pessoa fizer isso pode disponibilizar o arquivo, assim poupa retrabalho, mesmo que não traduza tudo, outro pode terminar a ir repassando até o processo se completar, eu mesmo já vou começar e assim se alguém tiver interesse, me avise !!!!!!!!

    • Rodrigo Andrade disse:

      Sérgio o link para o arquivo de tradução que estou usando no momento é este tradução
      se alguém colocar mais alguma tradução ou alguma outra forma de traduzir as mensagens do Delphi, basta postar.
      Obrigado.

      • Junior disse:

        Rodrigo vc pode me enviar esse arquivo de tradução que vc atualmente utiliza por favor?
        Estou começando a utilizar o D2010 dai queria pegar a versão mais nova desse arquivo. Logo, se implementar algo te envio tambem.
        Obrigado.

  2. Jean Wetter disse:

    Alguém poderia me passar este arquivo de tradução também? o Link relacionado não está funcionando.

    Vlew!

  3. Jadir disse:

    o link não está funcionando

  4. fernando disse:

    bem legal esse tópico maneiro

  5. Jore disse:

    Olá Rodrigo,
    Parabéns pelo blog e continue nos presentando com suas dicas!!
    Bom, sou iniciante e gostei muito dessa dica e preciso entender melhor como usar nos meus projetos. Desculpe a minha ignorância mais tem algum tutorial para eu estudar?
    Estou usando o D XE4 ele serve?

    Muito Obrigado!

    • Rodrigo Andrade disse:

      no XE4 ainda não testei, mas a tradução, basta declarar no formulário principal, que todos os outros irão traduzir.
      Mande comentário se deu certo no XE4.
      Abraços.

  6. Yamasaki disse:

    Alguém pode me enviar? O link está quebrado

  7. Silnei disse:

    Obrigado, muito bom

  8. Juliano Oliveira disse:

    Show!!! Muito bom mesmo!!! Rápido e muito fácil!!! Parabéns!!!

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: