Ver Feed RSS

root@blog:/# chmod o+r *

[Python] Internacionalização (no Windows)

Avalie este Post de Blog
Olá pessoal!! Como vocês sabem, acabei fazendo uma aplicação para gerenciamento de dispositivos de armazenamento via USB que eu chamei de USBManager (Dããã, nome óbvio!).

Como eu falei, aquela era só uma versão prévia pra ver a aceitação das pessoas. Fico feliz em dizer que ele "foi bem recebido". Na primeira semana foram quase 200 downloads. Isso acabou me incentivando a estudar algumas coisas para melhorar a aplicação. E, não sei se por influência do texto que ando lendo (Gnome HIG), que inclusive é muito bom, mas começei a trabalhar com o suporte a multiplas linguagens (internacionalização). Acho que não tem nada pior do que seu Linux estar todo em português e uma única aplicação estar toda em inglês!

Então fui pesquisar como fazer isso no Python e descobri que tudo o que você precisa é do PoEdit e dos módulos gettext e locale. Mas pelo que vi ontem de noite e hoje de manhã (ao preparar esse post) alguma coisa não está 100% portável... Então vou dividir esse post em Internacionalização no Windows e no Linux. Vamos ver como isso funciona...

Primeiro vamos criar um script básico (lang_test.py):
Código :
[FONT=Courier New][COLOR=DarkRed]#! /usr/bin/python
# -*- coding: utf-8 -*- 
# File: lang_test.py[/COLOR][/FONT][FONT=Courier New]
 
[/FONT]  [FONT=Courier New][COLOR=DarkOrange]print[/COLOR][/FONT][FONT=Courier New][COLOR=SeaGreen]'This is a basic internationalization test'[/COLOR][/FONT]
Como tornar esse script "internacional"?! Vamos fazer uma pequena edição no script:
Código :
[FONT=Courier New][COLOR=DarkRed]#! /usr/bin/python
 # -*- coding: utf-8 -*- 
# File: lang_test.py[/COLOR][/FONT][FONT=Courier New]
 
[/FONT]  [FONT=Courier New][COLOR=DarkOrange]import[/COLOR][/FONT][FONT=Courier New] locale
[/FONT] [FONT=Courier New][COLOR=DarkOrange]import[/COLOR][/FONT][FONT=Courier New] gettext
 
locale.setlocale(locale.LC_ALL, [/FONT] [FONT=Courier New][COLOR=SeaGreen]''[/COLOR][/FONT][FONT=Courier New])
lang = locale.getdefaultlocale()[0]
lang = gettext.translation([/FONT][FONT=Courier New][COLOR=SeaGreen]'lang_test'[/COLOR][/FONT][FONT=Courier New], [/FONT][FONT=Courier New][COLOR=SeaGreen]'./locale'[/COLOR][/FONT][FONT=Courier New], languages=[lang])
lang.install()
_ = lang.gettext
 
[/FONT]  [FONT=Courier New][COLOR=DarkOrange]print[/COLOR][/FONT][FONT=Courier New] _([/FONT][FONT=Courier New][COLOR=SeaGreen]'This is a basic internationalization test'[/COLOR][/FONT][FONT=Courier New])[/FONT]
Não deve fazer o menor sentido, mas eu explico! Após os imports temos o locale.setlocale que reconhece as configurações de internacionalização do python. Depois descobrimos qual lingua está o nosso sistema operacional com o comando getdefaultlocale. Depois abrimos o diretório de traduções chamado locale e buscamos a lingua definida em 'lang' e a 'instalamos'. Depois é só um atalho...

Perai, diretório de traduções?!?! Sim, temos que criar uma estrutura de diretórios na mesma pasta que está o script. No final vai ficar assim:
Código :
[FONT=Courier New]lang_test
   |
   |---lang_test.py
   \---locale
        \---pt_BR
             \---LC_MESSAGES
[/FONT]
Em suma o que o gettext faz é pegar as strings em inglês e consultar em um 'banco de dados' (baseado na estrutura de arquivos) qual a string correspondente para a string em inglês. Caso não encontre, a string permanece em inglês mesmo...

Depois de criada a estrutura vamos abrir o PoEdit. Essa é a cara do PoEdit:



Agora, temos que ir em Arquivo->Novo catálogo... E preencher da seguinte forma:




Na aba 'Caminhos' adicione o diretório onde está o script lang_test.py Depois clique em OK, salve-o na mesma pasta que o script. Ele vai começar o processo de escaneamento e vai retornar a seguinte janela:



Perfeito, ele achou as strings que tem que ser traduzidas! Agora é só traduzir:



Depois de traduzido salve-o. Ao salvar vãoser gerados dois arquivos, uma co uma extensão po e outro com a extensão mo. Temos que copiar esse arquivo .mo para dentro da pasta pt_BR/LC_MESSAGES erenomeá-lo para lang_test.po. Se não renomear para lang_test o programa não irá localizar-lo pois ele foi instruiído para buscar arquivos com essa string nessa linha:
Código :
[FONT=Courier New]lang = gettext.translation([/FONT][FONT=Courier New][COLOR=SeaGreen]'lang_test'[/COLOR][/FONT][FONT=Courier New], [/FONT][FONT=Courier New][COLOR=SeaGreen]'./locale'[/COLOR][/FONT][FONT=Courier New], languages=[lang])[/FONT]
Agora é só executar o script:
Código :
[FONT=Courier New]python lang_test.py
Este é um teste básico de internacionalização[/FONT]
Pronto! Traduzimos o programa! Se quisermos forçar uma lingua, por motives de testes, basta alterar a seguinte linha:
Código :
[FONT=Courier New]lang = gettext.translation([/FONT][FONT=Courier New][COLOR=SeaGreen]'lang_test'[/COLOR][/FONT][FONT=Courier New], [/FONT][FONT=Courier New][COLOR=SeaGreen]'./locale'[/COLOR][/FONT][FONT=Courier New], languages=[lang])[/FONT]
Eu realizei esse teste para o espanhol (após criar as pastas e realizar a tradução, claro):
Código :
[FONT=Courier New]lang = gettext.translation([/FONT][FONT=Courier New][COLOR=SeaGreen]'lang_test'[/COLOR][/FONT][FONT=Courier New], [/FONT][FONT=Courier New][COLOR=SeaGreen]'./locale'[/COLOR][/FONT][FONT=Courier New], languages=[[/FONT][FONT=Courier New][COLOR=SeaGreen]'es'[/COLOR][/FONT][FONT=Courier New]])[/FONT]
A saída foi a seguinte:
Código :
[FONT=Courier New]python lang_test.py
Esta es una prueba de la internacionalización[/FONT]
Simples e fácil como Python tem que ser!
Até mais...

Atualizado 20-01-2010 em 08:15 por Magnun

Categorias
Dicas , Python , Projetos , USBManager

Comentários


+ Enviar Comentário