
08/04/2006 - Critérios de armazenamento no Oracle
07/12/2003 - Action Script 2.0 ( Primeira Parte )
23/06/2007 - Classe MovieClipLoader( ) : Como usá-lo ?
05/05/2005 - CSS para tabelas e listas de seleção HTML
14/01/2005 - Validando um e-mail checando se o domínio existe ou não...
21/04/2003 - Aplicação simultânea de Fio e Sombra a bitmaps - Fireworks
09/01/2003 - Segurança em programação PHP
30/08/2006 - Pixel Fonts : Encaixe preciso e fácil com Action Script
09/01/2003 - Paginando registros com o Dreamweaver MX
08/11/2006 - Parte 01 - Configurando as cores do CorelDraw
22/09/2006 - Trabalhando com o WITH
14/06/2006 - Interagindo com o teclado dinâmicamente - Parte II
09/01/2003 - Indique
07/12/2003 - Flash e as mudanças do IE
Leituras: 28679 -
Introdução
Na minha época de script kiddie meu sonho era colocar um tradutor de Inglês para Português no meu primeiro web site, que ficava hospedado no Geocities, numa URL enorme e que hoje nem existe mais. Pois é, o tempo foi passando, a lógica da informática tomando alguns rumos de esclarecimento na minha cabeça, fui apresentado ao Babelfish, à linguagem PHP e finalmente consegui criar uma gambiarra que funciona como um tradutor.
Neste artigo vou mostrar como projetar uma interface que utiliza o engine doAltavista.com, o babelfish.altavista.com, sem dúvida um dos melhores tradutores multi-línguas da Internet.
Implementando o script - parte 1
Nosso script funcionará da seguinte forma: um formulário será exibido ao usuário, que irá digitar o texto a ser traduzido, escolher a linguagem de origem/destino e pedir para traduzir submetendo o mesmo. O formulário é recursivo, ou seja, os dados são enviados para o mesmo script PHP que mostrou o formulário na tela. Caso exista algum texto a ser traduzido, antes que apareça o formulário na tela, uma rotina de consulta ao engine babelfish será executada e o resultado mostrado na tela.
No primeiro bloco de código do programa definimos algumas constantes que serão processadas pelo babelfish e faremos a verificação do conteúdo da variável que armazena o texto, para saber se apenas mostraremos o formulário na tela ou se efetuaremos conexão com o AltaVista.com:<?
// definição de constantes
$DOIT = 'done';
$TT = 'urltext';
// se o formulário foi submetido, teremos urltext diferente de vazio
if ($urltext) {
$traducao = traduzir($urltext,$lp);
} else {
$traducao = '-';
}
?>Em seguida vou digitar o bloco de código HTML que mostra o formulário na tela,com espaço para a entrada do texto a ser traduzido e uma caixa de seleção onde o usuário escolherá as linguagens de origem/destino.
<html>
<style type="text/css">
td,textarea,select,input,a:link,a:visited {
font-family: Arial,Helvetica,Sans-Serif;
font-size: 11px;
color: #000000;
}
</style>
<body bgcolor="#fffff0">
<form name="form1" action="<? echo $PHP_SELF ?>">
<table width="400" bgcolor="#000000" cellpadding=1 cellspacing=0
align="center">
<tr><td>
<table width="100%" bgcolor="#ffffff" cellpadding=3 cellspacing=0>
<tr>
<td class="codigo" nowrap><b><big>BabelFish Translator</big>
</b></td>
<td class="codigo" align="right">
<a href="http://www.altavista.com" >Powered by
AltaVista</a>
</td>
</tr>
<tr><td colspan=2>
Texto:
<br>
<textarea name="urltext" style="width: 100%;" rows=6><? echo
$urltext ?></textarea>
</td></tr>
<tr>
<td width="1%" nowrap>Selecione uma linguagem:</td>
<td>
<select name="lp" style="width: 100%;">
<option value="en_zh">Inglês para Chinês
<option value="en_fr">Inglês para Francês
<option value="en_de">Inglês para Alemão
<option value="en_it">Inglês para Italiano
<option value="en_ja">Inglês para Japonês
<option value="en_ko">Inglês para Coreano
<option value="en_pt">Inglês para Português
<option value="en_es">Inglês para Espanhol
<option value="zh_es">Chinês para Inglês
<option value="fr_en">Francês para Inglês
<option value="fr_de">Francês para Alemão
<option value="de_en">Alemão para Inglês
<option value="de_fr">Alemão para Francês
<option value="it_en">Italiano para Inglês
<option value="ja_en">Japonês para Inglês
<option value="ko_en">Coreano para Inglês
<option value="pt_en" SELECTED>Português para Inglês
<option value="ru_en">Russo para Inglês
<option value="es_en">Espanhol para Inglês
</select>
</td>
</tr>
<tr>
<td align="right">Tradução </td>
<td><? echo $traducao ?></td>
</tr>
<tr><td colspan=2 align="center">
<br>
<input type="submit" value=" Traduzir agora ! ">
</td></tr>
</table>
</td></tr>
</table>
</form>
</body>
</html>Implementando o script - parte 2
O coração do nosso programa é a parte que efetua comunicação com o babelfish. Abriremos uma conexão via sockets com o programa engine e enviaremos as informações necessárias, que serão as constantes que definimos, o texto a ser traduzido e a linguagem selecionada. Neste procedimento estaremos simulando um browser, que envia a requisição ao programa CGI e aguarda a resposta. Assim que recebermos a resposta,trataremos o código HTML retornado com expressões regulares de modo a buscar apenas o que nos interessa, o texto traduzido.
Vamos ao código da rotina:<?
function traduzir($urltext,$lp) {
// definição de variáveis
$host = 'babelfish.altavista.com';
// codificar a linha que será enviada ao programa CGI do babelfish
$vars = "doit=$DOIT&tt=$TT&urltext=" . urlencode(utf8_encode($urltext))
. "&lp=$lp";
$url = "/tr?$vars";
// efetuando conexão com o babelfish
$fp = fsockopen ($host, 80, $errno, $errstr, 30);
if (!$fp) {
echo "Ocorreu um erro ao tentar conexão com $host:
$errstr ($errno)<br>\n";
exit;
} else {
// informações adicionais: nossa localidade e mapa
// de caracteres
$addinfo .= "Accept-Language: en\r\nAccept-Charset:
iso-8859-1,*,utf-8\r\n";
// envie as informações e jogue todo o retorno para a
// variável $html
fputs ($fp,
"GET $url HTTP/1.1\r\nHost: $host\r\n$addinfo\r\n");
while (!feof($fp)) {
$html .= fgets ($fp,128);
}
fclose ($fp);
}
// removendo quebras de linhas do resultado para facilitar
// a expressão regular
$html = ereg_replace("\n"," ",$html);
// capturando o texto traduzido, que está na linha que casa
// com a expressão abaixo
ereg("name=\"q\" value=(.*)>",$html,$saida);
$traducao = $saida[1];
$traducao = ereg_replace(">.*$","",$traducao);
// decodificar a string, pois os acentos vem em formato UNICODE,
// ilegíveis para
// nós
$traducao = utf8_decode($traducao);
return($traducao);
}
?>Prontinho, um tradutor web acabou de sair da boca do forno ! Que conclusão podemos tirar deste exemplo prático de programa complexo de forma simples ? Hum, conclui-seque associando os recursos de rede com expressões regulares temos a bomba atômica e o detonador em mãos para causar bastante barulho Internet à fora. Não deixem de dar atenção especial à esses dois tópicos, valem à pena.
Atenciosamente,
Fábio Berbert de Paula
fabio@vivaolinux.com.br