Implementando suporte a tradução com GetText + Google Translate API

Publicado por Ramon em 20/06/2011

[ Hits: 8.999 ]

 


Implementando suporte a tradução com GetText + Google Translate API



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:


Outras dicas deste autor
Nenhuma dica encontrada.
Leitura recomendada

Identificação de File Systems (Check File Systems on Linux)

Instale Arch Linux em 10 minutos

Criando um repositório rápido de contole de versão com o Mercurial

Pendrive do Windows (bootável) no Ubuntu Linux

Instalando o antivírus AVG Free for Linux

  

Comentários
[1] Comentário enviado por maurorodrigues em 22/06/2011 - 10:41h

Muito bom! Tava procurando uma solução pra essa situação
=)



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts