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

Diferenças para "InternacionalizePyGtk"

Diferenças entre as versões de 1 e 7 (6 versões de distância)
Revisão 1e 2004-10-02 19:01:04
Tamanho: 3878
Editor: PedroKroeger
Comentário:
Revisão 7e 2009-02-03 01:54:27
Tamanho: 6426
Comentário: Erro de sintaxe do Wiki corrigido.
Deleções são marcadas assim. Adições são marcadas assim.
Linha 1: Linha 1:
'''Internacionalizando programas feitos com PyGtk e Libglade''' '''Internacionalizando programas feitos com PyGtk e LibGlade'''
Linha 3: Linha 3:
''Pedro Kröger'' ''Leandro Resende Mattioli''
Linha 5: Linha 5:
Última atualização: 02.10.2004 Última atualização: 02/02/2009
Linha 7: Linha 7:
[[TableOfContents]] <<TableOfContents>>
Linha 9: Linha 9:
= 1. Introdução = = Introdução =
Este pequeno tutorial mostra como utilizar a internacionalização (i18n) em aplicações Python que utilizam PyGtk e LibGlade. Com a internacionalização, o idioma do programa é definido em tempo de execução, de acordo com variáveis do sistema. As etapas aqui descritas servem para qualquer sistema operacional GNU/Linux baseado na distribuição Debian, como por exemplo o Ubuntu. Com algumas modificações, no entanto, é possível aproveitar este tutorial para outras distribuições ou mesmo outros sistemas operacionais.
Linha 11: Linha 12:
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.
= Pré-requisitos =
Este tutorial parte do princípio que o leitor esteja familiarizado com algum ambiente GNU/Linux baseado no Debian GNU/Linux (ou o próprio Debian, é claro). Além disso, o tutorial supõe que o leitor já tenha uma aplicação feita em PyGtk e LibGlade.
Linha 16: Linha 15:
= 1.1 Breve introdução à internacionalização = = Breve introdução à internacionalização =
(em construção...)
Linha 18: Linha 18:
= 1.2 Ferramentas utilizadas =
= Ferramentas utilizadas =
Os seguintes pacotes deverão estar instalados:
 * Python 2.5
 * Gtk+
Linha 22: Linha 24:
 * Python 2.3  * LibGlade
Linha 24: Linha 26:
 * Gtk+ 2.4.1
 * Libglade 2.4.0
 * intltool
Linha 27: Linha 28:
= 2. Extraindo as mensagens do Glade =

Você precisará do intltool, um utilitário para internacionalizar
documentos em XML. Se você usa Debian basta digitar:
A maioria destes pacotes já vêm configurados por padrão praticamente em todas as distribuições Linux atuais. Caso seja necessário instalar, por exemplo, o intltool no Debian, basta executar os seguintes comandos:
Linha 33: Linha 31:
su
Linha 35: Linha 34:
O primeiro comando irá solicitar a senha do usuário root.
Linha 36: Linha 36:
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"):
Para o Ubuntu Linux, o comando apropriado é:
Linha 41: Linha 39:
intltool-extract --type="gettext/glade" meuprograma.glade sudo apt-get install intltool
}}}
O comando solicitará a senha do usuário.

Caso você esteja usando outra distribuição, consulte a documentação da mesma para obter detalhes do procedimento de instalação.

= Modificando o código da sua aplicação =
Algumas pequenas modificações serão feitas, conforme exemplo abaixo:

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

"""Exemplo para i18n.

    OBS.: Não tente executar isto! O código é apenas ilustrativo.

"""

import gettext
import pygtk
pygtk.require("2.0")
import gtk, gtk.glade

APP = 'nomedoprograma'
DIR = 'locale'

gettext.bindtextdomain(APP,DIR)
gettext.textdomain(APP) _ = gettext.gettext

print _("String em português 1")
print _("String em português 2")

gtk.glade.bindtextdomain(APP,DIR)
gtk.glade.textdomain(APP)

....
Linha 44: Linha 79:
Você não precisa editar esse arquivo (.h), ele será lido pelo xgettext. == Comentários ==
Linha 46: Linha 81:
= 3. Gerando o arquivo de tradução =  * As variáveis APP e DIR serão utilizadas para buscar um arquivo de tradução para o programa. Em tempo de execução, um arquivo <DIR>/<locale>/LC_MESSAGES/<APP>.mo será procurado, onde <locale> é um indicador do idioma, como pt_BR. Irei tratar deste arquivo em breve.
 * Costuma-se utilizar o símbolo "_" para representar o método gettext.gettext . Desta forma as strings que deverão ter suporte à internacionalização terão a forma _("string que pode ser traduzida").
 * Durante o desenvolvimento do programa, é comum usar a variável DIR com o valor 'locale' ou 'po'. No entanto, é mais apropriado usar uma pasta do sistema específica para isto. Da mesma forma que os binários vão para `/usr/bin`, os arquivos de tradução geralmente vão para `/usr/share/locale`.
 * O arquivo gerado pelo Glade não será alterado.

= Extraindo as mensagens do Glade =
O programa intltool-extract extrai as strings de um arquivo do tipo GladeXML (no exemplo, `interface.glade`), e gera um arquivo `.h` (no exemplo, `interface.glade.h`):
Linha 49: Linha 90:
xgettext -k_ -kN_ -o messages.pot *.py *.h intltool-extract --type="gettext/glade" interface.glade
Linha 52: Linha 93:
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.

= 4. 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:
= Gerando o arquivo de tradução =
Copie todos os arquivos com extensões py e o arquivo .h gerado pelo intltool para uma mesma pasta. Se os arquivos estão codificados em ASCII, execute o seguinte comando:
Linha 63: Linha 97:
msginit -i messages.pot -l pt_BR xgettext -k_ -kN_ -o mensagens.pot *.py *.h
}}}
Caso os arquivos estejam codificados, por exemplo, em utf-8, o comando será:

{{{
xgettext --from-code=utf-8 -k_ -kN_ -o mensagens.pot *.py *.h
}}}
Caso tudo ocorra com sucesso, um arquivo de tradução chamado mensagens.pot será gerado.

Mais informações sobre o comando xgettext podem ser encontradas nas páginas de manual:

{{{
man xgettext
Linha 66: Linha 112:
Tendo traduzido o arquivo pt_BR.po é necessário gerar o arquivo que
será usado pelo programa:
= Criando arquivos de tradução =
Para que seja possível criar traduções para outros idiomas é necessário criar os arquivos de internacionalização não compilados (PO) para cada idioma. Para criar o primeiro arquivo PO, com a língua nativa da aplicação (no nosso exemplo, português brasileiro), usaremos o comando msginit:
Linha 70: Linha 116:
msgfmt pt_BR.po -o po/pt/LC_MESSAGES/meuprograma.mo msginit -i mensagens.pot -l pt_BR
Linha 72: Linha 118:

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.

= 5. 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:
O arquivo pt_BR.po gerado será usado pela equipe de tradutores para gerar arquivos PO para outros idiomas. No entanto, para utilizá-lo no programa, iremos "compilá-lo" para um arquivo MO.
Linha 87: Linha 121:
#!python
print gettext.gettext("Texto a ser traduzido")
msgfmt pt_BR.po -o po/pt_BR/LC_MESSAGES/nomedomeuprograma.mo
Linha 90: Linha 123:
A estrutura de diretórios deve existir para que seja possível gerar o arquivo de saída (.mo).
Linha 91: Linha 125:
Porém é muito mais prático usar o formato _(<string>), mas para isso
deve-se definir _ como gettext.gettext:
Você poderia salvar o arquivo mo em outra pasta, mas os últimos níveis de diretórios devem ser: <locale>/LC_MESSAGES/, onde, como visto anteriormente, <locale> é uma sigla que representa o idioma utilizado, como por exemplo pt_BR.
Linha 94: Linha 127:
{{{
#!python
_ = gettext.gettext
= Finalizando =
Após todos os processos descritos anteriormente, a aplicação deverá conter, além dos códigos em Python e do arquivo GladeXML, os arquivos de extensão mo, na pasta apropriada (vide variáveis APP e DIR). A estrutura recomendada para todos as arquivo é:
Linha 98: Linha 130:
print _("Texto a ser traduzido")
}}}
 * /usr/bin/nome-do-programa.py
 * /usr/share/locale/pt_BR/LC_MESSAGES/nome-do-programa.mo
 * /usr/share/locale/en/LC_MESSAGES/nome-do-programa.mo
 * ...(outros idiomas)...
 * /usr/share/nome-do-programa/glade/interface.glade
 * ...(outros itens associados a entradas de menu, ícones, documentação, etc.)...
Linha 101: Linha 137:
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":
É interessante guardar o PO gerado para que a equipe de tradutores possa gerar outros catálogos de mensagens baseados no original. Então, estes arquivos são compilados e os arquivos MO de saída são inseridos na aplicação. Há editores apropriados para a edição destes catálogos de mensagens, como o poEdit.
Linha 105: Linha 139:
{{{
#!python
APP='meuprograma'
DIR='po'
}}}
= Links =
Linha 111: Linha 141:
Um exemplo mais completo ficaria como:

{{{
#!python
import gettext

APP='meuprograma'
DIR='po'

gettext.bindtextdomain(APP, DIR)
gettext.textdomain(APP)

_ = gettext.gettext

gtk.glade.bindtextdomain(APP, DIR)
gtk.glade.textdomain(APP)

gui = gtk.glade.XML("meuprograma.glade")
.....
}}}


= 6. 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.

= 7. 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.

= 8. Links =

http://www.async.com.br/faq/pygtk/index.py?req=show&file=faq22.002.htp
 * http://www.async.com.br/faq/pygtk/index.py?req=show&file=faq22.002.htp
 * http://wiki.laptop.org/go/Python_i18n
 * http://www.python.org/doc/2.5.2/lib/node731.html
 * http://www.learningpython.com/2006/12/03/translating-your-pythonpygtk-application/

Internacionalizando programas feitos com PyGtk e LibGlade

Leandro Resende Mattioli

Última atualização: 02/02/2009

Introdução

Este pequeno tutorial mostra como utilizar a internacionalização (i18n) em aplicações Python que utilizam PyGtk e LibGlade. Com a internacionalização, o idioma do programa é definido em tempo de execução, de acordo com variáveis do sistema. As etapas aqui descritas servem para qualquer sistema operacional GNU/Linux baseado na distribuição Debian, como por exemplo o Ubuntu. Com algumas modificações, no entanto, é possível aproveitar este tutorial para outras distribuições ou mesmo outros sistemas operacionais.

Pré-requisitos

Este tutorial parte do princípio que o leitor esteja familiarizado com algum ambiente GNU/Linux baseado no Debian GNU/Linux (ou o próprio Debian, é claro). Além disso, o tutorial supõe que o leitor já tenha uma aplicação feita em PyGtk e LibGlade.

Breve introdução à internacionalização

(em construção...)

Ferramentas utilizadas

Os seguintes pacotes deverão estar instalados:

A maioria destes pacotes já vêm configurados por padrão praticamente em todas as distribuições Linux atuais. Caso seja necessário instalar, por exemplo, o intltool no Debian, basta executar os seguintes comandos:

su
apt-get install intltool

O primeiro comando irá solicitar a senha do usuário root.

Para o Ubuntu Linux, o comando apropriado é:

sudo apt-get install intltool

O comando solicitará a senha do usuário.

Caso você esteja usando outra distribuição, consulte a documentação da mesma para obter detalhes do procedimento de instalação.

Modificando o código da sua aplicação

Algumas pequenas modificações serão feitas, conforme exemplo abaixo:

   1 #!/usr/bin/env python 
   2 # -*- coding: utf-8 -*-
   3 
   4 """Exemplo para i18n.
   5 
   6     OBS.: Não tente executar isto! O código é apenas ilustrativo.
   7 
   8 """
   9 
  10 import gettext
  11 import pygtk
  12 pygtk.require("2.0")
  13 import gtk, gtk.glade
  14 
  15 APP = 'nomedoprograma'
  16 DIR = 'locale'
  17 
  18 gettext.bindtextdomain(APP,DIR)
  19 gettext.textdomain(APP) _ = gettext.gettext
  20 
  21 print _("String em português 1")
  22 print _("String em português 2")
  23 
  24 gtk.glade.bindtextdomain(APP,DIR)
  25 gtk.glade.textdomain(APP)
  26 
  27 ....

Comentários

  • As variáveis APP e DIR serão utilizadas para buscar um arquivo de tradução para o programa. Em tempo de execução, um arquivo <DIR>/<locale>/LC_MESSAGES/<APP>.mo será procurado, onde <locale> é um indicador do idioma, como pt_BR. Irei tratar deste arquivo em breve.

  • Costuma-se utilizar o símbolo "_" para representar o método gettext.gettext . Desta forma as strings que deverão ter suporte à internacionalização terão a forma _("string que pode ser traduzida").
  • Durante o desenvolvimento do programa, é comum usar a variável DIR com o valor 'locale' ou 'po'. No entanto, é mais apropriado usar uma pasta do sistema específica para isto. Da mesma forma que os binários vão para /usr/bin, os arquivos de tradução geralmente vão para /usr/share/locale.

  • O arquivo gerado pelo Glade não será alterado.

Extraindo as mensagens do Glade

O programa intltool-extract extrai as strings de um arquivo do tipo GladeXML (no exemplo, interface.glade), e gera um arquivo .h (no exemplo, interface.glade.h):

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

Gerando o arquivo de tradução

Copie todos os arquivos com extensões py e o arquivo .h gerado pelo intltool para uma mesma pasta. Se os arquivos estão codificados em ASCII, execute o seguinte comando:

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

Caso os arquivos estejam codificados, por exemplo, em utf-8, o comando será:

xgettext --from-code=utf-8 -k_ -kN_ -o mensagens.pot *.py *.h

Caso tudo ocorra com sucesso, um arquivo de tradução chamado mensagens.pot será gerado.

Mais informações sobre o comando xgettext podem ser encontradas nas páginas de manual:

man xgettext

Criando arquivos de tradução

Para que seja possível criar traduções para outros idiomas é necessário criar os arquivos de internacionalização não compilados (PO) para cada idioma. Para criar o primeiro arquivo PO, com a língua nativa da aplicação (no nosso exemplo, português brasileiro), usaremos o comando msginit:

msginit -i mensagens.pot -l pt_BR

O arquivo pt_BR.po gerado será usado pela equipe de tradutores para gerar arquivos PO para outros idiomas. No entanto, para utilizá-lo no programa, iremos "compilá-lo" para um arquivo MO.

msgfmt pt_BR.po -o po/pt_BR/LC_MESSAGES/nomedomeuprograma.mo

A estrutura de diretórios deve existir para que seja possível gerar o arquivo de saída (.mo).

Você poderia salvar o arquivo mo em outra pasta, mas os últimos níveis de diretórios devem ser: <locale>/LC_MESSAGES/, onde, como visto anteriormente, <locale> é uma sigla que representa o idioma utilizado, como por exemplo pt_BR.

Finalizando

Após todos os processos descritos anteriormente, a aplicação deverá conter, além dos códigos em Python e do arquivo GladeXML, os arquivos de extensão mo, na pasta apropriada (vide variáveis APP e DIR). A estrutura recomendada para todos as arquivo é:

  • /usr/bin/nome-do-programa.py
  • /usr/share/locale/pt_BR/LC_MESSAGES/nome-do-programa.mo
  • /usr/share/locale/en/LC_MESSAGES/nome-do-programa.mo
  • ...(outros idiomas)...
  • /usr/share/nome-do-programa/glade/interface.glade
  • ...(outros itens associados a entradas de menu, ícones, documentação, etc.)...

É interessante guardar o PO gerado para que a equipe de tradutores possa gerar outros catálogos de mensagens baseados no original. Então, estes arquivos são compilados e os arquivos MO de saída são inseridos na aplicação. Há editores apropriados para a edição destes catálogos de mensagens, como o poEdit.

Links