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

Publicado por Ramon em 20/06/2011

[ Hits: 8.841 ]

 


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

GNOME 3 - Mudando a Tela de Logon

Debian 6 - Autenticado no Active Directory utilizando o Likewise Open6

Arch-Anywhere - ambiente de instalação do Arch Linux

Configurando o Recoll

OcoMon - Sistema HelpDesk em PHP

  

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