4000
Comentário: converted to 1.6 markup
|
6487
Várias modificações na estrutura e no conteúdo do tutorial
|
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'' | ''Texto original: Pedro Kröger <pedrokroeger.net>'' |
Linha 5: | Linha 5: |
Última atualização: 02.10.2004 | ''Revisado por: Leandro Mattioli'' Última atualização: 16.11.2008 |
Linha 10: | Linha 12: |
Este pequeno tutorial mostra como utilizar a internacionalização (i18n) em aplicações feitas 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. | |
Linha 11: | Linha 14: |
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 17: | Linha 18: |
(em construção...) | |
Linha 19: | Linha 21: |
* Python 2.5 * Gtk+ |
|
Linha 22: | Linha 25: |
* Python 2.3 | * LibGlade |
Linha 24: | Linha 27: |
* Gtk+ 2.4.1 * Libglade 2.4.0 |
* intltool Os 6 primeiros itens já vêm configurados por padrão praticamente em todas as distribuições Linux atuais. Caso seja necessário instalar 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. = Modificando o código da sua aplicação = Algumas pequenas modificações serão feitas, conforme exemplo abaixo: {{{ #!/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) .... }}} 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. 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 binários do usuário 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. |
Linha 28: | Linha 87: |
Você precisará do intltool, um utilitário para internacionalizar documentos em XML. Se você usa Debian basta digitar: |
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 33: | Linha 90: |
apt-get install intltool | intltool-extract --type="gettext/glade" interface.glade |
Linha 36: | Linha 93: |
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"): |
= 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 41: | Linha 97: |
intltool-extract --type="gettext/glade" meuprograma.glade | xgettext -k_ -kN_ -o mensagens.pot *.py *.h |
Linha 43: | Linha 99: |
Você não precisa editar esse arquivo (.h), ele será lido pelo xgettext. = Gerando o arquivo de tradução = |
Caso os arquivos estejam codificados, por exemplo, em utf-8, o comando será: |
Linha 49: | Linha 102: |
xgettext -k_ -kN_ -o messages.pot *.py *.h | xgettext --from-code=utf-8 -k_ -kN_ -o mensagens.pot *.py *.h |
Linha 51: | Linha 104: |
Caso tudo ocorra com sucesso, um arquivo de tradução chamado mensagens.pot será gerado. | |
Linha 52: | Linha 106: |
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: |
Mais informações sobre o comando xgettext podem ser encontradas nas páginas de manual: |
Linha 63: | Linha 109: |
msginit -i messages.pot -l pt_BR | man xgettext |
Linha 65: | Linha 111: |
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 chamados arquivos 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 115: |
msgfmt pt_BR.po -o po/pt/LC_MESSAGES/meuprograma.mo | msginit -i mensagens.pot -l pt_BR |
Linha 72: | Linha 117: |
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: |
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 120: |
#!python print gettext.gettext("Texto a ser traduzido") |
msgfmt pt_BR.po -o po/pt_BR/LC_MESSAGES/nomedomeuprograma.mo |
Linha 90: | Linha 122: |
A estrutura de diretórios deve existir para que seja possível gerar o arquivo de saída (.mo). | |
Linha 91: | Linha 124: |
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 <locale> é uma sigla que representa o idioma utilizado, como por exemplo pt_BR. |
Linha 94: | Linha 126: |
{{{ #!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 129: |
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 136: |
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": {{{ #!python APP='meuprograma' DIR='po' }}} 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") ..... }}} = 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. |
É 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 139: | Linha 139: |
Linha 142: | Linha 141: |
Esse documento está licenciado sob a ''GNU Free Documentation License'', publicada pela ''Free Software Foundation''. |
Esse documento está licenciado sob a ''GNU Free Documentation License'', publicada pela ''Free Software Foundation''. |
Linha 145: | Linha 143: |
É permitido distribuir cópias deste manual, desde que se forneça o ''Copyright'' em todas as cópias. |
É permitido distribuir cópias deste manual, desde que se forneça o ''Copyright'' em todas as cópias. |
Linha 148: | Linha 145: |
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. |
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 atualizado e de acordo com as informações disponíveis. |
Linha 153: | Linha 148: |
Linha 155: | Linha 149: |
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
Texto original: Pedro Kröger <pedrokroeger.net>
Revisado por: Leandro Mattioli
Última atualização: 16.11.2008
Conteúdo
Introdução
Este pequeno tutorial mostra como utilizar a internacionalização (i18n) em aplicações feitas 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.
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 6 primeiros itens já vêm configurados por padrão praticamente em todas as distribuições Linux atuais. Caso seja necessário instalar 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.
Modificando o código da sua aplicação
Algumas pequenas modificações serão feitas, conforme exemplo abaixo:
# -*- 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) ....
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.
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 binários do usuário 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 chamados arquivos 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 <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.
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 atualizado 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 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/