/* Translate.hrx by Sigbjørn Skjæret
** $VER: Translate.hrx v1.34 (16.08.98)
**
** Translates text using the Babelfish-server of AltaVista...
*/

options results

parse arg nick userhost channel public from to txt

p = ' ' || address() || ' ' || show('P',,)
henryport = pos(' HENRY.',p)

if henryport > 0 then henryport = word(substr(p,henryport+1),1)
else
do
 say 'No HENRY port found!'
 exit 10
end

address(henryport)

if(public) then receiver=channel
else receiver=nick

if(upper(from)='HELP' | upper(from)='AIDE' | upper(from)='HILFE' | upper(from)='AIUTO' | upper(from)='AJUDA' | upper(from)='AYUDA') then do
 ver=word(sourceline(2),4)

 select
  when(upper(to)='EN' | upper(to)='ENGLISH' | upper(to)='ANGLAIS' | upper(to)='ENGLISCH' | upper(to)='INGLESE' | upper(to)='INGLÊS' | upper(from)='HELP' & to='') then
  do
   NOTICE receiver d2c(2)'Translate 'ver' by Sigbjørn Skjæret'd2c(2)
   NOTICE receiver d2c(2)'Usage:'d2c(2)' "Translate ['d2c(31)'<from language> <to language (or Silly for interesting results)> <text to be translated> 'd2c(31)'|'d2c(31)' Help (<language>)'d2c(31)']"'
   NOTICE receiver d2c(2)'Supported languages:'d2c(2)' en (English), fr (French), de (German), it (Italian), pt (Portuguese) and es (Spanish)'
  end
  when(upper(to)='FR' | upper(to)='FRENCH' | upper(to)='FRANÇAIS' | upper(to)='FRANZÖSISCH' | upper(to)='FRANCESI' | upper(to)='FRANCESES' | upper(from)='AIDE' & to='') then
  do
   NOTICE receiver d2c(2)'Traduisez 'ver' par Sigbjørn Skjæret'd2c(2)
   NOTICE receiver d2c(2)'Utilisation:'d2c(2)' "Translate ['d2c(31)'<de langage> <au langage (ou Silly pour des résultats intéressants)> <texte à traduire> 'd2c(31)'|'d2c(31)' Aide (<langage>)'d2c(31)']"'
   NOTICE receiver d2c(2)'Les langages supportés:'d2c(2)' en (Anglais), fr (Français), de (Allemand), it (Italien), pt (Portugais) et es (Espagnols)'
  end
  when(upper(to)='DE' | upper(to)='GERMAN' | upper(to)='DEUTSCH' | upper(to)='ALLEMANDS' | upper(to)='TEDESCO' | upper(to)='ALEMÃO' | upper(to)='ALEMÁN' | upper(from)='HILFE' & to='') then
  do
   NOTICE receiver d2c(2)'Übersetzen 'ver' durch Sigbjørn Skjæret'd2c(2)
   NOTICE receiver d2c(2)'Verbrauch:'d2c(2)' "Translate ['d2c(31)'<von der sprache> <zur sprache (oder Silly für interessante resultate)> <zu übersetzender text> 'd2c(31)'|'d2c(31)' Hilfe (<sprache>)'d2c(31)']"'
   NOTICE receiver d2c(2)'Unterstütztes Sprach:'d2c(2)' en (Englisch), fr (Französisch), de (Deutsch), it (Italienisch), pt (Portugiesisch) und es (Spanisch)'
  end
  when(upper(to)='IT' | upper(to)='ITALIAN' | upper(to)='ITALIANO' | upper(to)='ITALIEN' | upper(to)='ITALIENISCH' | upper(from)='AIUTO' & to='') then
  do
   NOTICE receiver d2c(2)'Tradurre 'ver' da Sigbjørn Skjæret'd2c(2)
   NOTICE receiver d2c(2)'Uso:'d2c(2)' "Translate ['d2c(31)'<dal linguaggio> <al linguaggio (o Silly per di risultati interessanti)> <a linguaggio da essere> 'd2c(31)'|'d2c(31)' Aiuto (<linguaggio>)'d2c(31)']"'
   NOTICE receiver d2c(2)'Sostenute lingue:'d2c(2)' en (Inglese), fr (Francese), de (Tedesco), it (Italiano), pt (Portoghese) ed es (Spagnoli)'
  end
  when(upper(to)='PT' | upper(to)='PORTUGUESE' | upper(to)='PORTUGUÊS' | upper(to)='PORTUGAIS' | upper(to)='PORTUGIESISCH' | upper(to)='PORTOGHESE' | upper(to)='PORTUGUÉS' | upper(from)='AJUDA' & to='') then
  do
   NOTICE receiver d2c(2)'Traduza 'ver' por Sigbjørn Skjæret'd2c(2)
   NOTICE receiver d2c(2)'Uso:'d2c(2)' "Translate ['d2c(31)'<da língua> <à língua (ou Silly para interessantes resultados)> <texto a ser traduzido> 'd2c(31)'|'d2c(31)' Ajuda (<língua>)'d2c(31)']"'
   NOTICE receiver d2c(2)'Suportadas línguas:'d2c(2)' en (Inglês), fr (Francês), de (Alemão), it (Italiano), pt (Português) e es (Espanhóis)'
  end
  when(upper(to)='ES' | upper(to)='SPANISH' | upper(to)='ESPAÑOL' | upper(to)='ESPAGNOLS' | upper(to)='SPANISCH' | upper(to)='SPAGNOLI' | upper(to)='ESPANHÓIS' | upper(from)='AYUDA' & to='') then
  do
   NOTICE receiver d2c(2)'Traduzca 'ver' por Sigbjørn Skjæret'd2c(2)
   NOTICE receiver d2c(2)'Uso:'d2c(2)' "Translate ['d2c(31)'<del lenguaje> <al lenguaje (o Silly para los interesantes resultados)> <texto que se traducirá> 'd2c(31)'|'d2c(31)' Ayuda (<lenguaje>)'d2c(31)']"'
   NOTICE receiver d2c(2)'Utilizados lenguajes:'d2c(2)' en (Inglés), fr (Francés), de (Alemán), it (Italiano), pt (Portugués) y es (Español)'
  end
  otherwise
  do
   NOTICE receiver 'Unsupported language 'to'...'
  end
 end

 exit
end

trto=''
trfrom=''
txt=strip(txt)

if(upper(left(txt,7))='HTTP://') then Failed('Sorry, URLs are not allowed...')

if(upper(from)='EN' | upper(from)='ENGLISH') then trfrom='en'
if(upper(from)='FR' | upper(from)='FRENCH') then trfrom='fr'
if(upper(from)='DE' | upper(from)='GERMAN') then trfrom='de'
if(upper(from)='IT' | upper(from)='ITALIAN') then trfrom='it'
if(upper(from)='PT' | upper(from)='PORTUGUESE') then trfrom='pt'
if(upper(from)='ES' | upper(from)='SPANISH') then trfrom='es'
if(trfrom='') then
do
 NOTICE receiver 'Unsupported language 'from'...'
 exit 5
end

if(upper(to)='SILLY') then
do
/*
 lang.1='fr'
 lang.2='de'
 lang.3='it'
 lang.4='pt'
 lang.5='es'
 prelang=trfrom

 do i=1 to 5
  if(prelang~='en') then
  do
   Trans(prelang'_en' txt)
   txt=translated.text
  end

  if(trfrom~=lang.i) then
  do
   Trans('en_'lang.i txt)
   txt=translated.text
   prelang=lang.i
  end
 end

 Trans(prelang'_en' txt)
 if(trfrom~='en') then
 do
  txt=translated.text
  Trans('en_'trfrom txt)
 end

 NOTICE receiver translated.header''translated.text
*/
 NOTICE receiver 'Sorry, this feature is (permanently?) disabled.'
 exit
end

if(upper(to)='EN' | upper(to)='ENGLISH') then trto='en'
if(upper(to)='FR' | upper(to)='FRENCH') then trto='fr'
if(upper(to)='DE' | upper(to)='GERMAN') then trto='de'
if(upper(to)='IT' | upper(to)='ITALIAN') then trto='it'
if(upper(to)='PT' | upper(to)='PORTUGUESE') then trto='pt'
if(upper(to)='ES' | upper(to)='SPANISH') then trto='es'
if(trto='') then
do
 NOTICE receiver 'Unsupported language 'to'...'
 exit 5
end

if(trto~='en' & trfrom~='en') then
do
 if(Trans(trfrom'_en' txt)) then
 do
  txt=translated.text

  if(Trans('en_'trto txt)) then
  do
   NOTICE receiver translated.header''translated.text
  end
 end
end
else
do
 if(Trans(trfrom'_'trto txt)) then
 do
  NOTICE receiver translated.header''translated.text
 end
end

exit



/*** PROCEDURES ***/
Trans: procedure expose henryport receiver translated.
 parse arg lp txt

 if ~show('L','rxsocket.library') then
 do
  if ~addlib('rxsocket.library',0,-30,0) then
  do
   NOTICE receiver 'ARexx socket library not available, exiting'
   exit 10
  end
 end

 lf=d2c(10)
 crlf=d2c(13)''d2c(10)
 host='babelfish.altavista.digital.com'
 port='80'
 txt=URLEncode(txt)'%0A'
 translated.text=''
 translated.header=''
 strbeg='<font face="arial, helvetica">'
 strend='<br><br>'

 if ~GetHostByName('HOST',host) then call Failed('Sorry, cannot lookup host (the DNS is down?), unable to translate your request!')
 sock=Socket('INET','STREAM','IP');if sock<0 then call Failed('Sorry, cannot create socket, unable to translate your request!')
 conn.ADDRFAMILY='INET';conn.ADDRPORT=port;conn.ADDRADDR=host.HOSTADDRLIST.0
 if Connect(sock,'CONN')<0 then call Failed('Sorry, the Babelfish-server is down, unable to translate your request!')

 reql='doit=done&urltext='txt'&languagepair='lp
 req='POST /cgi-bin/translate HTTP/1.0'crlf
 req=req'Content-Type: application/x-www-form-urlencoded'crlf
 req=req'Content-Length: 'length(reql)''crlf''crlf
 req=req''reql
 call Send(sock,req)

 len=1
 do while len>0
  len=recvline(sock,'BUF',256)
  if(left(buf,length(strbeg))=strbeg) then
  do
   translated.header=d2c(2)''substr(buf,length(strbeg)+1,index(buf,'</b>')-length(strbeg)-1)''d2c(2)' '

   do while len>0
    len=recvline(sock,'BUF',256)
    if(left(buf,length(strbeg))=strbeg) then
    do while left(buf,length(strend))~=strend
     if(left(buf,length(strbeg))=strbeg) then buf=substr(buf,length(strbeg)+1)
     buf=strip(buf,'T',lf)

     if(translated.text='') then translated.text=buf
     else translated.text=translated.text' 'buf
     len=recvline(sock,'BUF',256)
    end
   end
  end
  if(translated.header~='') then break
 end

 call CloseSocket(sock)

 if(translated.header='') then call Failed('Unable to extract translation-data from the Babelfish server...')
 if(translated.text~='') then return 1
return 0

URLEncode: procedure
 parse arg txt

 encstr=''
 txt=strip(txt)
 do i=1 to length(txt)
  c=substr(txt,i,1)

  if(c=' ') then encstr=encstr'+'
  else if(~datatype(c,'A')) then encstr=encstr'%'c2x(c)
  else encstr=encstr''c
 end
return encstr

Failed:
 parse arg errmsg
 address(henryport)
 NOTICE receiver errmsg
exit 10
