associação pythonbrasil[11] django zope/plone planet Início Logado como (Entrar)

Revisão 2e 2005-06-06 13:29:31

Excluir mensagem

InternacionalizePyGtk

Internacionalizando programas feitos com PyGtk e Libglade

Pedro Kröger

Última atualização: 02.10.2004

TableOfContents

Introdução

Se você tem escrito programas usando o PyGtk e libglade (veja tutorial em LibGlade) pode ter interesse em torná-los internacionalizados. Ou seja, a linguagem do programa (o menu, mensagens de texto, etc.) será definida pela locale do sistema.

Breve introdução à internacionalização

Ferramentas utilizadas

  • PyGtk

  • Glade
  • Python 2.3
  • GNU gettext
  • Gtk+ 2.4.1
  • Libglade 2.4.0

Extraindo as mensagens do Glade

Você precisará do intltool, um utilitário para internacionalizar documentos em XML. Se você usa Debian basta digitar:

apt-get install intltool

O programa intltool-extract extrai as strings de um arquivo glade (no exemplo "meuprograma.glade" e gera um arquivo .h (no exemplo "meuprograma.glade.h"):

intltool-extract --type="gettext/glade" meuprograma.glade

Você não precisa editar esse arquivo (.h), ele será lido pelo xgettext.

Gerando o arquivo de tradução

xgettext -k_ -kN_ -o messages.pot *.py *.h

vai criar um arquivo de tradução "messages.pot" a partir dos códigos fonte de python e dos arquivos .h gerados pelo intltool-extract.

Criando arquivos de tradução

Para que seja possível criar traduções para diferentes línguas é necessário criar um arquivo para cada uma. Isso é feito com msginit. Nesse exemplo ele cria o arquivo pt_BR.po adequado para a tradução para o português brasileiro:

msginit -i messages.pot -l pt_BR

Tendo traduzido o arquivo pt_BR.po é necessário gerar o arquivo que será usado pelo programa:

msgfmt pt_BR.po -o po/pt/LC_MESSAGES/meuprograma.mo

Não importa o nome do diretório onde você coloque o arquivo *.mo, mas a estrutura desse diretório tem que ser <diretório>/<locale>/LC_MESSAGES/<nome-do-programa>.mo. Onde <locale> é algo como pt ou pt_BR.

Fazendo seu programa reconhecer as traduções

Tipicamente um programa de python usando o libglade terá strings para serem traduzidas tanto no programa python quanto no arquivo glade. Para lidar com as strings na parte em python pode-se usar o módulo gettext. Todas as strings a serem traduzidas deverão usar o método gettext desse módulo:

   1 print gettext.gettext("Texto a ser traduzido")

Porém é muito mais prático usar o formato _(<string>), mas para isso deve-se definir _ como gettext.gettext:

   1 _ = gettext.gettext
   2 
   3 print _("Texto a ser traduzido")

O local padrão para os arquivos com mensagens de tradução é geralmente "/usr/share/locale", mas enquanto estiver desenvolvendo seu programa é bastante útil tê-los em um diretório local, algo como "i18n" ou "po":

   1 APP='meuprograma'
   2 DIR='po'

Um exemplo mais completo ficaria como:

   1 import gettext
   2 
   3 APP='meuprograma'
   4 DIR='po'
   5 
   6 gettext.bindtextdomain(APP, DIR)
   7 gettext.textdomain(APP)
   8 
   9 _ = gettext.gettext
  10 
  11 gtk.glade.bindtextdomain(APP, DIR)
  12 gtk.glade.textdomain(APP)
  13 
  14 gui = gtk.glade.XML("meuprograma.glade")
  15 .....

Contribuições

Esse texto ainda está sendo escrito, por favor não deixe de mandar correções e sugestões para kroger em pedrokroeger.net.

Copyright

(C) 2004 Pedro Kroger.

Esse documento está licenciado sob a GNU Free Documentation License, publicada pela Free Software Foundation.

É permitido distribuir cópias deste manual, desde que se forneça o Copyright em todas as cópias.

Se você pretende incluir este documento em alguma publicação, por favor contate o responsável e nós trabalharemos para garantir que todo documento esteja atualizada e de acordo com as informações disponíveis.

Links

http://www.async.com.br/faq/pygtk/index.py?req=show&file=faq22.002.htp