NdVO

Usando gettext com o python

fazer um comentário »

Perdi um tempo considerável para aprender a usar o gettext com o python para internacionalizar um código.

Para minha própria referência e para ajudar a quem mais estiver com problemas, deixo aqui o que deu certo.

As fontes foram várias, mas as principais foram:

  • http://www.python.org/doc/2.6/library/gettext.html
  • http://www.gnu.org/software/hello/manual/gettext/xgettext-Invocation.html

Bem, desde já peço desculpas aos mais entendidos pelo meu jeito de tratar o tema. Sei que não sou nenhum expert, mas estou certo de que há muitos que muitos precisam do auxílio de não experts.

Quando uma determinada aplicação precisa ser utilizada por falantes de mais de um idioma (ou mesmo em qualquer  circunstância), é bom você preparar seu código para ser traduzido no futuro.

Minha primeira idéia foi a de separar as strings em um arquivo apartado, mas logo me dei conta de que este problema já deveria ter sido resolvido antes de mim. Então conheci o gettext que, apesar de não ser a única forma de internacionalização é bastante conhecido.

(Nota: i18n é uma forma resumida de se referir a internacionalização.)

Funciona assim: você insere ‘marcações’ no código sempre que for utilizar uma string.

Na verdade não são marcações, mas sim uma função que vc usa toda vez que for criar uma string candidata a tradução.

Esta função irá pesquisar por uma tradução em arquivos feitos para isto. Se não encontrar, retorna a própria string.

Feito isto, você precisará gerar um arquivo com as traduções, com a extensão .po e compilá-lo em um arquivo .mo que será usado pelo programa.

Vamos pôr a mão na massa.

1- Instale um programa que te auxiliará na tradução: o poedit

sudo apt-get install poedit

2- Crie uma pasta “locale”, na qual vc vai salvar os arquivos de tradução.’

3- Dentro da pasta “locale”, crie uma pasta correspondente ao idioma para o qual se traduzirá. Dentro desta pasta crie a pasta LC_MESSAGE.

mkdir ~pasta_do_programa/locale/pt_BR/LC_MESSAGE/

4- Insira as seguintes linhas no arquivo principal do código python:

import gettext                                                        #Importa o gettext
t = gettext.translation(‘nome_do_programa’, ‘caminho_da_pasta_locale’)   #cria uma instancia da tradução, com o nome do “domínio” (o seu programa e a pasta na qual estão os arquivos de tradução)
_ = t.ugettext                                        #renomeia a função t.ugettext para “_” para facilitar no corpo do código

É importante notar que se vc usar a função gettext ao invés da ugettext terá sempre uma string de 8 bits em retorno, ao invés de uma unicode.

Isto é muito ruim se vc precisar usar acentos, cedilhas e coisas do gênero. Convenhamos que se vc quer internacionalizar seu código, certamente irá usar acentos, cedilhas e coisas do gênero.

5- No código python, antes de cada string candidata à tradução, coloque um “_”, conforme os exemplos:

antes:

string = ‘minha string’

depois:

string = _(‘minha string’)

6- Abra o poedit (Aplicativos => Programação => Poedit) e crie um novo catálogo. Preste atenção na aba “caminhos”, na qual vc deverá digitar o diretório onde estão os arquivos do programa a ser traduzido.

7- Clique em atualizar catálogo na barra de ferramentas do poedit

8- Salve o arquivo. Eu salvo direto no diretório LC_MESSAGE correspondente ao idioma para o qual se irá traduzir. Assim, a cada vez que eu salvar a tradução o arquivo compilado já estará no lugar certo para que eu possa rodar o programa. Salve o arquivo com o mesmo nome que vc referenciou como o nome do programa.

9- Você provavelmente vai querer que o poedit apresente as linhas de comentário do gettext escritas no código python. Tratam-se de comentários que o programador (no caso, vc), deixou no código para ajudar o tradutor com textos potencialmente ambíguos. Para isso, no poedit, clique em opções > interpretadores > python > editar.

Em seguida, altere o comando em “comando do interpretador” para o seguinte

xgettext -c –force-po -o %o %C %K %F

11- Clique novamente em atualizar catálogo na barra de ferramentas do poedit

Com estes passos consegui preparar o código python para ser internacionalizado usando codificação unicode (utf-8) e configurei o poedit para ler os comentários dos tradutores.

Escrito por ndvo

26 Maio 2009 às 1:08 am

Publicado em Software livre

Etiquetado com , , ,

Deixe uma resposta