Internacionalização dos programas em Python

Publicado por João Carlos abreu Junior em 16/02/2011

[ Hits: 8.692 ]

 


Internacionalização dos programas em Python



Esse pequeno exemplo foi escrito tomando como base o tutorial em [1] e a documentação oficial dos módulos gettext[2] e locale[3].

Para usar a internacionalização (i18n) em seus programas Python é preciso ter o módulos gettext e locale instalados.

Os módulos msgfmt e pygettext serão utilizados para a geração dos arquivos de tradução e se encontram no Subdiretório "Tools\i18n" da instalação do Python.

Para exemplo vamos escrever o "Hello Word!!!" para testar a internacionalização. A linha abaixo será salva no arquivo "hello.py".

print "Hello Word!!!"

Para internacionalizar seus programas em Python são necessários 4 passos básicos: alteração do seu programa para possuir strings candidatas a serem traduzidas, criar o arquivo de tradução em formato de texto, gerar o arquivo de tradução "compilado" e instalar a tradução no seu programa.

1) Alteração do seu programa para possuir strings candidatas a serem traduzidas

Altere a linha do arquivo "hello.py" para ficar como a linha abaixo:

print _("Hello Word!!!")

Se você executar o arquivo "hello.py" receberá um erro, pois o nome _ não está definido, posteriormente definiremos esse nome.

2) Criar o arquivo de tradução em formato de texto

Crie um arquivo de texto com qualquer nome, nesse exemplo vou denominar o arquivo como "translate.po", a extenão .po é necessária para que o módulo msgfmt reconheça esse arquivo. Coloque nesse arquivo as linhas abaixo:

msgid "Hello Word!!!"

msgstr "Alô Mundo!!!"

O msgid é a linha que será candidata a tradução, a linha msgstr será a tradução corresponde a string "Hello Word!!!".

3) Gerar o arquivo de tradução "compilado"

No diretório onde foi salvo o arquivo "translate.po" execute "msgfmt.py translate.po" e será gerado um arquivo denominado "translate.mo", que é um arquivo "compilado" correspondente ao "translate.po". O arquivo "translate.mo" deverá ser salvo no subdiretório "locale\pt_BR\LC_MESSAGES" dentro do diretório que se encontra o arquivo "hello.py".

4) Instalar a tradução no seu programa

Nesse passo é que usaremos o módulo gettext, que é o responsável por conseguir traduzir nossas strings. Altere o arquivo "hello.py" para ficar com as seguintes linhas:

import gettext

nameFileTraduction = 'translate' # nome do arquivo de tradução

namefolderLocationFileTraduction = 'locale' # localização inicial do arquivo de tradução, a localização completa é locale\pt_BR\LC_MESSAGES

language = gettext.translation(nameFileTraduction, namefolderLocationFileTraduction, languages=["pt_BR"])

language.install() # instalação da Linguagem requerida

_ = language.gettext # renomeando o gettext para _

print _("Hello World!!!") # O seu programa continua basicamento o mesmo

Agora execute seu programa e veja ele vai imprimir "Alô Mundo!!!".

O módulo pygettext é utilizado para gerar os arquivos de tradução em formato de texto, como no passo 2, o módulo pygettext percorre todo o módulo passado como parâmetro é gera a estrutura msgid e msgstr para todas as strings que estiverem no formato _("String a ser traduzida").

[1] http://softwarelivre.org/furusho/blog/python-internacionalizacao-no-windows
[2] http://docs.python.org/library/gettext
[3] http://docs.python.org/library/locale

Outras dicas deste autor

Livro: Python para desenvolvedores

Matrizes e vetores numéricos em Python: A solução

Leitura recomendada

Ordenando dicionários em Python

Python3 demorando a compilar numpy e/ou pandas [Resolvido]

Python - capturar a saída do programa em um arquivo ou variável

Docker API com Python

Livro: Python para desenvolvedores

  

Comentários
[1] Comentário enviado por josephseraos em 29/04/2013 - 15:15h

Perfeito. Funcionou legal. Agora, o que eu deveria fazer se no caso da minha String houvesse um texto variável, como é o caso da exceção:

'unknown url type: joseph'

No caso, joseph é um termo variável. Essa string é formada por um termo constante + esta variável. Dá pra traduzir com esta mesma técnica de internacionalização?

Eu não quero que o tradutor consiga traduzir o termo variável, mas o termo até os dois-pontos. Obs: Não sou eu quem formo a string

Obrigado.



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts