Internacionalizando seu aplicativo


Leia em 3 minutos

Quem utiliza algum software-livre sabe como é fácil conseguir qualquer aplicativo no seu idioma nativo. Se a tradução ainda não foi feita, basta entrar em contato com o autor para contribuir. Um exemplo que vale ser citado é o grupo de tradutores do Ubuntu Brasil (Og Maciel, Fábio Nogueira e cia). Provavelmente, existem muitos outros grupos ativos, mas como assino o feed do Planeta Ubuntu Brasil, é o que me chama mais a atenção.

De um outro lado, é preciso que o desenvolvedor se preocupe em distribuir seu software de maneira internacionalizada. Com Python, isso pode ser feito de maneira muito simples utilizando o módulo gettext. Irei explicar aqui como utilizá-lo.

Colocando a mão na massa

Primeiro, vamos criar um script que imprime algumas frases na tela.

#! /usr/bin/python
# -*- coding: utf-8 -*-

print "Hi. We're going to test the gettext module."
print "The book is on the table."
print "Hello %s. I'm glad you're back!" % "Nando"

Crie um novo diretório chamado "gettext-example" e salve o script como "test.py".

Da maneira como fizemos nosso script, não importa qual idioma selecionemos, nossas frases serão escritas sempre no idioma inglês.

O primeiro passo para internacionalizar nosso aplicativo é extrair todas as frases de nosso código. Para isso, iremos utilizar o poEdit. No Ubuntu, instale-o com o seguinte comando:

~$ sudo aptitude install poedit

Quando formos utilizar o módulo gettext, iremos criar um atalho para a função que pega o texto traduzido. E é esta mesma função que o poEdit procura no seu código, indicando as frases que precisam ser traduzidas. Esta função é simplesmente um _ (underscore). Altere seu script para o código abaixo:

#! /usr/bin/python
# -*- coding: utf-8 -*-

print _("Hi. We're going to test the gettext module.")
print _("The book is on the table.")
print _("Hello %s. I'm glad you're back!") % "Nando"

Não tente rodar este script, pois irá ocorrer um erro, já que ainda não definimos a função _.

Agora, abra o poEdit em Applications > Programming > poEdit. Crie um novo catálogo em File > New catalog.... Preencha as informações da janela que irá surgir.

poEdit: Settings

Na aba "Paths", coloque o caminho do diretório que você salvou o script "test.py". Salve o arquivo no diretório "locale", dentro do diretório principal (o mesmo que você salvou "test.py") com o nome "pt_BR.po". Agora, já podemos extrair todas as frases que iremos traduzir. No menu "Catalog", selecione a opção "Update from sources". Se tudo saiu conforme o planejado, você verá um resumo de todas as frases encontradas.

poEdit: Update Summary

Agora, basta traduzir as frases! Uma coisa que deve ser levada em consideração na hora da tradução, é o tamanho das frases. É aconselhável que você traduza cada frase com o mesmo tamanho da original. Não exatamente o mesmo tamanho, mas o mais próximo possível, pois algumas telas podem não exibir todo o texto caso ele seja muito longo. Salve o arquivo traduzido.

poEdit: Translated Strings

Se você notou, ele salvou no mesmo diretório do arquivo "pt_BR.po" um outro arquivo, de mesmo nome, mas sob a extensão ".mo". Este arquivo nada mais é que uma versão compilada do arquivo ".po" e que será efetivamente utilizado em nosso script. Mova este arquivo (pt_BR.mo) para um diretório "pt_BR/LC_MESSAGES", dentro do diretório "locale". Renomeie o arquivo para "app.mo".

Gettext: Estrutura de Diretórios

Agora que já criamos o arquivo com as frases traduzidas, já podemos implementar a chamada do módulo gettext em nosso script.

#! /usr/bin/python
# -*- coding: utf-8 -*-

import locale
import gettext

locale.setlocale(locale.LC_ALL, '')
gettext.bindtextdomain('app', './locale')
gettext.textdomain('app')
_ = gettext.gettext

print _("Hi. We're going to test the gettext module.")
print _("The book is on the table.")
print _("Hello %s. I'm glad you're back!") % 'Nando'

O Python identifica o aplicativo por seu domínio, que deve ser também o nome do arquivo compilado (app.mo). Por isso, definimos o domínio "app" na função gettext.bindtextdomain e gettext.textdomain. Quando você for criar seu aplicativo, defina seu próprio domínio.

Para ver o script acima, é preciso que você logue com o idioma Português. Isso pode ser um problema na hora de desenvolver, já que necessariamente teríamos que ter o idioma que queremos testar instalado. Para alterar o idioma sem verificar qual é o padrão do sistema operacional, podemos forçar a localização instalando o idioma desejado:

#! /usr/bin/python
# -*- coding: utf-8 -*-

import gettext

PT_BR = gettext.translation('app', './locale', languages=['pt_BR'])
PT_BR.install()
_ = PT_BR.gettext

print _("Hi. We're going to test the gettext module.")
print _("The book is on the table.")
print _("Hello %s. I'm glad you're back!") % 'Nando'

A abordagem acima também pode ser utilizada para definir o idioma do aplicativo através de opções, onde o usuário escolhe qual idioma quer usar. Ao rodar o script, veremos:

nando:~/gettext-example$ python test2.py
Olá. Nós iremos testar o módulo gettext.
O livro está sobre a mesa.
Olá Nando. Fico feliz que você voltou!

Se você está desenvolvendo um aplicativo, seja ele comercial ou livre, vale a pena fazer a sua internacionalização, pois a abrangência será, provavelmente, muito maior.

Agradecimento: Obrigado Nilton Volpato (Lista Python-Brasil) por me esclarecer o funcionamento da estrutura de diretórios.