A seguir veremos como dar suporte a tradução de um software escrito em python com
GNU\GetText.
Explicação sobre o Gettext e requerimentos
O GNU\Gettext, é uma biblioteca disponível em várias linguagens que permite a tradução de programas a partir de arquivos
binários. Sua utilização é muito simples e ao longo deste artigo, criaremos um script para tradução com a
Google Translate
API, agilizando a tradução.
Para maiores informações sobre o Gettext, visite a página do projeto:
Requerimentos:
- gettext - (isso pode variar de acordo com a linguagem, no python o mesmo vem por padrão)
- pygettext - (um utilitário para vasculhar o código Python e encontrar as strings isoladas)
- msgfmt - ( converte os arquivos gerados pelo pygettext para binários )
Com tudo certo, vamos ao código
Isolando strings no código:
Para que o gettext funcione, é preciso isolar as strings no código python:
#!/usr/bin/python
# importing the gettext library
import gettext
# Defining the translate file
SOURCE_FILE_TRADUCTION='messages'
# Defining the translate directory
LOCALE_DIR='locale'
# Start gettext
language = gettext.translation(SOURCE_FILE_TRADUCTION,LOCALE_DIR,languages=["pt-br"])
language.install()
# Alias the underscore to translate
_ = language.gettext
# Code
print _("Hello World")
Aqui isolamos as strings com _(), e agora iremos gerar o arquivo .po com o pygettext:
user@localhost:~> pygettext -o test.po test.py
Eis o arquivo de tradução:
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR , YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2011-05-10 09:18+BRT\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: ENCODING\n"
"Generated-By: pygettext.py 1.5\n"
#: test.py:10
msgid "Hello World"
msgstr ""
Obs.: É essencial preencher o cabeçalho, pois a frente teremos problemas na conversão para binário.
Enfim, agora podemos traduzir, mas porque não usar o Google?.
Google Translate API + Gettext
Agora creio que é a parte mais legal, automatizar a tradução.
Sinceramente, confesso que o script possa conter alguns erros, principalmente se a string isolada contem caracteres especiais,
como
%,<,>, entre outros.Esse script funcionou bem para traduções de texto puro.
Aceito sugestões de melhorias :)
#!/bin/bash
#############
# Author: Ramon Medeiros @ Viva o Linux
##############
# Line break
ORI_IFS=$IFS
IFS=$'\n'
# Set the language to be translated
LANG_FROM=en
LANG_TO=pt
# Google Translate API Key
KEY=
# Translated dir
mkdir TRANSLATED_FILES
for FILE in `ls *.po`; do
# Start translation for .po files
for LINE in `cat $FILE`; do
if ! [ "$(echo $LINE | grep -o '^msgstr')" = "msgstr" -o "$(echo $LINE | grep -o '^msgid')" =
"msgid" ]; then
echo "$LINE" >> TRANSLATED_FILES/$FILE
fi
if [ "$(echo $LINE | grep -o '^msgid')" = "msgid" ]; then
echo $LINE >> TRANSLATED_FILES/$FILE
# Blank space and % treatment
TEXT=$(echo $LINE | cut -d'"' -f 2)
TEXT=$(echo $TEXT | sed 's/%/%25/g')
TEXT=$(echo $TEXT | sed 's/ /%20/g')
# Using the Google Translate API
OUTPUT=$(GET "https://www.googleapis.com/language/translate/v2?
key=$KEY&source=$LANG_FROM&target=$LANG_TO&q=$TEXT" |
grep translatedText |
sed 's/translatedText\": \"//g' |
sed 's/\"//g' |
sed 's/^ //g' |
sed 's/%\ /\ %/g'
)
echo -e "msgstr \"$OUTPUT\"\n" >> TRANSLATED_FILES/$FILE
fi
done
done
# Line break treatment
IFS=$ORI_IFS
Para pegar sua key, vá em
Apenas uma coisa, o limite diário de caracteres é de 100.000 =/
Com esse script, que deve ser rodado na mesma pasta onde ficam os arquivos .po, a pasta TRANSLATED_FILES será criada com
os arquivos traduzidos.
Finalizando a tradução
Com os arquivos traduzidos, vamos convertê-los em binários!
user@localhost:~> msgfmt -o test.mo test.po
Caso você tenha especificado apenas locale no código, terá de criar as seguintes pastas:
user@localhost:~> mkdir -p locale/$LANG/LC_MESSAGES
Agora, basta colocar o arquivo .mo na pasta LC_MESSAGES, criar a pasta $LANG com a língua passada no código e pronto. Seja
feliz com seu programa traduzido. :)
Agradecimentos especiais ao dono do tópico: