Por que eu devo ler este artigo:Com grande frequência, as aplicações são desenvolvidas com suporte unicamente ao idioma nativo da equipe de programação, que insere toda a parte textual do sistema diretamente no design ou via código, sempre de forma estática. Desta forma, este software tende a ficar limitado ao seu país de origem ou, no mínimo, ter os clientes em potencial reduzidos, bem como sua rentabilidade e impacto no mercado. Como a indústria de software tem a capacidade de transcender facilmente os limites territoriais, oferecer suporte a vários idiomas pode aumentar consideravelmente as chances de sucesso da aplicação. Por isso, o tema apresentado neste artigo é útil para quem deseja aprender uma forma simples e flexível de alterar facilmente o idioma de suas aplicações Delphi.

Devido ao caráter mundial da Web, internacionalização é uma característica cada vez mais buscada nas aplicações. Essa demanda tornou necessário o surgimento e amadurecimento contínuo de recursos de tradução que nos dias atuais facilitam, por exemplo, o acesso ao conhecimento por pessoas que não dominam outros idiomas além de sua língua materna. O Delphi, no entanto, cuja principal utilização é no desenvolvimento de aplicações desktop, ainda não possui soluções tão maduras.

O ITE (Integrated Translation Environment), presente no Delphi, permite criar aplicações multi-idiomas graças às suas funcionalidades de tradução, porém, esse ambiente não é muito favorável a aplicações de grande porte. Sua manutenção é consideravelmente complexa e, apesar dos arquivos de tradução não serem embutidos, a escolha de idiomas não é tão trivial para o usuário.

Há também no mercado alguns componentes e ferramentas desenvolvidas com esse propósito, como é o caso do componente TLang, que está disponível apenas para aplicações desenvolvidas com FireMonkey. Para a VCL (Visual Component Library) existem soluções semelhantes, porém, o preço de alguns desses componentes pode ultrapassar os US$ 800 para versões Pro Edition.

Neste artigo veremos uma forma mais eficaz e econômica para implementar essa funcionalidade nas aplicações. Serão explicadas as técnicas que podem ser utilizadas e como identificar a mais adequada para cada situação.

As abordagens exploradas neste artigo não se limitam à tradução entre idiomas. Elas podem ser usadas, por exemplo, para criar sistemas com mensagens customizáveis para cada ramo de empresas ou cliente, permitindo com que o usuário final defina os textos a serem utilizados na aplicação.

Nas próximas seções conheceremos alguns dos mecanismos que podem ser utilizados para implementar esse tipo de funcionalidade com o Delphi.

ResourceString

ResourceString é um recurso que permite a criação de uma tabela de strings que funcionarão como constantes dentro da aplicação. Essa estrutura é muito utilizada internamente pelo Delphi na montagem de mensagens do IDE. Por exemplo, na unit const há exemplos de sua utilização. Os componentes também adotam esse método, evitando assim a utilização da declaração de um texto diretamente no código. Por exemplo, para a apresentação do termo "Open" em caixas de diálogo é utilizada a constante SOpenFileTitle.

Essa técnica facilita a manutenção e extensão do sistema, pois quando houver necessidade, não será preciso trocar o texto fixo em todos os lugares onde ele ocorre. Bastaria alterar seu valor na definição da constante e automaticamente essa mudança seria refletida em toda a aplicação.

Na Listagem 1 vemos um exemplo da declaração de um ResourceString.

Listagem 1. Declaração de ResourceString


  01    ResorceString                                                
  02      sCaptionMinhaAplicacao = 'Meu Caption';                                                              
  03      sCaptionBtnAbrir       = 'Abrir';                                                                    
  04      sMsgFecharAplicacao    = 'Deseja encerrar a aplicação';    

Um ResourceString pode ser declarado em qualquer lugar do projeto, ficando no mesmo contexto das declarações de constantes e variáveis. Para uma melhor organização e aproveitamento do código, no entanto, é uma boa prática fazer essa declaração em uma unit separada, deixando todos em um só local, ou separando por contexto/objetivo.

Para acessarmos os valores definidos nos ResourceStrings basta referenciá-los pelos nomes que foram usados na sua declaração. Por exemplo, considerando as constantes da Listagem 1, poderíamos exibir a mensagem de confirmação de saída da aplicação da seguinte forma:

ShowMessage(sMsgFecharAplicacao);

Em todos os pontos do sistema onde for preciso confirmar a saída da aplicação não precisaremos repetir a mensagem na forma de string fixo, basta utilizar a constante sMsgFecharAplicacao. Além de evitar erros ortográficos nas demais mensagens, essa prática ajuda a manter a padronização dos textos, o que é também importante para oferecer uma boa experiência de uso.

Ao utilizar ResourceStrings, principalmente em arquivos externos, temos ainda os seguintes benefícios:

· Todos os programas que compõem a sua aplicação poderão utilizá-los sem que precisem ser reescritos;

· As mensagens podem ser formatadas para receberem parâmetros, aumentando ainda mais a padronização e estruturação do seu código.

Traduzindo a aplicação com ResourceString

Uma das formas de tradução utilizando o ResourceString é aplicada nas próprias mensagens do Delphi com a substituição dos arquivos de ResourceString originais. Porém isso pode ocasionar problemas ao atualizar a versão do IDE, pois será necessário alterar novamente esses arquivos. Além disso, pode ser que uma string não esteja mais na mesma unit que na versão anterior.

A outra forma é a criação de uma unit que altera os valores dos itens desejados para os novos. Esse será o conceito abordado nesse tópico, e para entender sua implementação crie um novo projeto e a partir do menu File > New > VCL Forms Application. No form principal, adicione um TButton e altere sua propriedade Caption para "Clique Aqui" e seu nome para BtnSaudacao.

Em seguida, crie no projeto uma pasta chamada Idiomas e a ela adicione uma nova unit chamada dicionário, onde deve ser implementado o ResourceString que pode ser visto na Listagem 2.

...

Quer ler esse conteúdo completo? Tenha acesso completo