by Stiod Desenvolvimento Web
Assine nosso RSS
No Gravatar

Fiquei um tempo sem colocar nada no blog, mas voltei. Recebi até um comunicado oficial do Rafael que se não colocasse nada no blog, era para pegar minhas coisas e passar no RH (ou era para passar no RH e depois pegar as minhas coisas?).

Introdução
Imagine que seu professor de linguagem C++ (ou outra de sua preferência, mas uma linguagem descente, por favor) lhe passe uma lição de casa: “Faça um MMORPG em 5 idiomas diferentes”.
Simples não? Qualquer um faz um MMORPG em C++ da noite para o dia. O detalhe desta simples aplicação é permitir a utilização ou diversão (já que é um game) em outros idiomas.
Se você pensou em um colocar vários “IFs” ou “CASEs” para cada linha que contenha uma string...

Bom, talvez não seja algo tão errado, se você tiver tempo para colocar vários “IFs” para cada uma das 4.000 strings de frases aleatórias dos NPCs do seu game. O trabalho todo será seu mesmo.
Tudo bem, é só uma lição de casa, mas se não for pegue suas coisas e passe no RH (ou passe no RH e depois pegue as suas coisas... vocês entenderam né?).

Bom, sem encher muita lingüiça, vamos ao ponto: i18n

What?
i18n é o acrônimo de internacionalization (“i” + 18 letras + “n”). As vantagens de se utilizar i18n são:

- O programa não precisa ser re-compilado a cada alteração nas traduções. Alternar entre os idiomas pode ser feito dinamicamente em tempo de execução (salvo algumas situações específicas).

- Este método é válido para muitas linguagens, não só o C++, o processo é praticamente o mesmo.

- Se o programa não conseguir encontrar a string traduzida ele exibirá a string original.

- A pessoa que fará as traduções não precisa entender de programação. Como o arquivo a ser traduzido está separado do programa, você pode mandar para um tradutor e depois só fazer as modificações necessárias para encaixar no programa (poucas coisas mesmo).

- Seu amigo chinês vai poder jogar seu game! De quebra ele indica o seu game para outros amiguinhos chineses que devem ser mais ou menos uns 10 mil só no bairro dele.

- Formatação correta de moeda, pesos, medidas, data, hora, etc. para o idioma escolhido.

- Aumento do alcance do seu programa/game em escala mundial. Para um alemão, nada melhor do que se utilizar um software em alemão. Para um brasileiro, nada melhor do que utilizar um software em português, não é?

- Perdão. Não existe nada melhor do que utilizar um software em português brasileiro (ora pois!).

- E outros benefícios que eu não me lembro ou não consegui inventar.

Nada mastigado, apenas o caminho das pedras...
Mas como utilizar a/o i18n em meu programa? A melhor forma é utilizando o gettext. Seu uso é relativamente simples (claro, se você for um programador de verdade). Os passos e quesitos básicos para implementar as traduções são:

- O programa para estar perfeitamente internacionalizado deve ter suporte a caracteres UNICODE, mas tem que ter suporte de verdade ao UNICODE. Por exemplo, no Delphi só é possível manipular esses caracteres internamente sem poder exibi-los, pois os componentes dele não possuem suporte ao UNICODE (e vai saber quando terá de verdade). Mas você pode comprar componentes de terceiros com suporte a UNICODE, ou fazer que nem eu que alterei o componente TEdit na mão e fez o antivírus apitar na hora de rodar o programa (depois eu conto essa história).

- Instalar o gettext se você não tiver.

- Marcar no código as strings que serão traduzidas. Por exemplo:

  1. printf("Welcome to the Django Mr. %s!\n", name);

se transforma em:

  1. printf(_("Welcome to the Django Mr. %s!\n"), name);

onde “_()” é uma função do gettext que marca a string para extração. Esta talvez seja a parte chata da coisa, mas não é tanto esforço assim.

- Um botão ou opção no seu programa para o usuário mudar o idioma.

- Extrair as strings (veja o manual do gettext). Será gerado um arquivo *.po com as strings marcadas.

- Traduzir as strings para um idioma em um editor de texto UNICODE. Utilizando o exemplo anterior ficaria assim:
"Welcome to the Django Mr. %s!\n"
"Bem-vindo a Djelva Sr. %s!\n"

- Compilar o arquivo traduzido com uma ferramenta apropriada, será gerado um arquivo *.mo. Uma ferramenta que utilizo para compilar e editar é o Poedit.

- Copiar o arquivo compilado para a pasta correta, normalmente (ou sempre) é em “diretório_do_programa/locale/sigla_do_idioma/LC_MESSAGES/default.mo”. Como em “meu_programa_bilingue/locale/pt_BR/LC_MESSAGES/default.mo”. Agora você sabe por que alguns programas com vários idiomas possuem uma pasta “locale” no diretório de instalação?

- Testar o seu programa.

- Para alterar a tradução basta editar apenas o *.po do idioma e compila-lo novamente, sem precisar mexer no código fonte do programa.

Basicamente, para cada idioma haverá um arquivo compilado diferente. De preferência, o idioma original do seu programa deve estar em inglês, mas nada impede que você o faça em português.

Dicas
- Ao fazer a tradução procure fazer com que a tradução possua um tamanho próximo ao do original.

- No caso do Delphi você pode utilizar o dxgettext, ele faz a captura automática das strings dos componentes. Infelizmente, faça uma boa leitura da documentação dele, pois existem alguns atributos de componentes que não devem ser traduzidos.

- Antes de fazer o seu programa estude (é estude!) um pouco sobre os idiomas que você irá disponibilizar em seu programa. Dependendo do idioma será necessário colocar algumas alterações no programa, como a escrita da direita-para-esquerda, de cima-para-baixo, etc. Não é nada muito difícil de fazer, muitas vezes isso é feito de forma automática pelo programa (depende muito da API utilizada) ou só mudar uma flag do componente que está utilizando (que também depende muito da API utilizada XD).

- Permita que o usuário escolha o idioma. Não obrigue ele a utilizar somente o idioma definido pelo SO. Eu mesmo já sofri muito com isso. :´(

- Para aplicações Desktop o ideal é que o texto possa fluir na tela de forma dinâmica, pois um texto pode aumentar ou diminuir de dimensões ao mudar de idioma, como de "texto romanizado" para "ideogramas chineses". Faça com que os itens da tela se redimensionem e se posicionem automaticamente. Uma boa opção é deixar com quebras de linhas automáticas, tomando o cuidado para que o texto não fique em cima de outros itens ao quebrar a linha.

Repare que só é possível fazer essas traduções com textos estáticos do programa. Se vierem dados do banco de dados já é mais complicado. A não ser que suas tabelas estejam bem modeladas, pelo menos na 3NF já daria para traduzir boa parte dos campos. Por exemplo, uma tabela de cores poderia ter os campos “cor_ptbr” e “cor_en”. Mas como fazer traduções corretamente de banco de dados isso eu deixo para próxima (pois nem eu sei XD).

Não entendeu nada do que falei? Clique aqui que tudo ficará mais claro.

3 Responses to “Internacionalização de software: i18n”

  1. RodrigoNo Gravataron 11 Jun 2008 at 2:19 pm

    Parabéns galera, mto bom esse post!! =o)

  2. HSujdikNo Gravataron 17 Jul 2008 at 1:26 pm

    Muito bom seu texto… bastante simples pra quem está aprendendo. Eu trabalho com i18n e l10n em uma companhia líder do segmento e posso dizer que é bem por aí mesmo.
    Temos diversos métodos de l10n e o que eu realmente prefiro é utilizar o banco de dados como uma string table. Então, basta copiar a tabela original, alterar o nome para o idioma traduzido (por exemplo, de en_us para pt_br) e traduzir. As variáveis são marcadas com tags do tipo %1, %2, etc e portanto podem ter sua posição alterada.

  3. adminNo Gravataron 08 Aug 2008 at 11:40 pm

    Eu não falei nada…xD

Trackback URI | Comments RSS

Leave a Reply