Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   traducir texto de español a ingles desde un programa delphi (https://www.clubdelphi.com/foros/showthread.php?t=64299)

gulder 25-03-2009 21:23:33

traducir texto de español a ingles desde un programa delphi
 
hola foro como andan espero que bien bueno tengo una pequeña duda y es como hago para traducir un linea de texto del español al ingles desde un programa delphi existen algunos componentes que hagan esto saludos desde ya gulder-gan

roman 25-03-2009 21:39:35

Lo primero que se me ocurre, aunque no sé si es viable, es usar INDY para comunicarme con el traductor de Google, examinar la respuesta y pegarla en la aplicación. Así, además, podrías traducir en varios idiomas.

// Saludos

gulder 25-03-2009 21:45:27

gracias roman por tu respuesta y una pregunta como hago eso si no es mucho pedir por que no se nada de las yndi jaja saludos

Caro 25-03-2009 23:19:52

Cita:

Empezado por roman (Mensaje 342708)
Lo primero que se me ocurre, aunque no sé si es viable, es usar INDY para comunicarme con el traductor de Google, examinar la respuesta y pegarla en la aplicación. Así, además, podrías traducir en varios idiomas.

Hola, amiguito como se hace eso, nos puedes indicar por favor ;).

Saluditos

Kipow 26-03-2009 00:46:28

bueno revisando un poco el traductor me pude dar cuenta de esto:

Código:

http://translate.google.com.mx/translate_t#es|en|este%20es%20el%20texto%20a%20traducir
esta es la forma de llamar al traductor y este es el codigo del campo del resultado

Código:

<div style="text-align: left;" id="result_box" dir="ltr">This is the text to be translated</div>
Me imagino que con las indy y el objeto idhttp algo se podra hacer ahi

gulder 26-03-2009 02:41:44

Cita:

Empezado por Caro (Mensaje 342732)
Hola, amiguito como se hace eso, nos puedes indicar por favor ;).

Saluditos

opino lo mismo enseñanos salu2

roman 26-03-2009 03:45:26

1 Archivos Adjunto(s)
Ya Kipow lo analizó, yo sólo les pongo un ejemplito listo para ejecutar. La función que usa es un poco artesanal:

Código Delphi [-]
function GoogleTranslate(SourceLanguage, TargetLanguage, Text: String): String;
const
  GoogleUrl = 'http://translate.google.com.mx/translate_t';
  StartTag = '<div id=result_box dir="ltr">';
  EndTag = '</div>';

var
  IdHTTP: TIdHTTP;
  Fields: TStrings;
  Response: String;
  I: Integer;

begin
  IdHTTP := nil;
  Fields := nil;

  try
    IdHTTP := TIdHTTP.Create(nil);
    Fields := TStringList.Create;

    (* Asignar parámetros *)
    Fields.Values['sl'] := SourceLanguage;
    Fields.Values['tl'] := TargetLanguage;
    Fields.Values['text'] := Text;

    (* Invocar al traductor *)
    Response := IdHTTP.Post(GoogleUrl, Fields);

    (* Buscar el comienzo de la cadena traducida *)
    I := Pos(StartTag, Response);
    Delete(Response, 1, I + Length(StartTag) - 1);

    (* Buscar el final de la cadena traducida *)
    I := Pos(EndTag, Response);
    Response := Copy(Response, 1, I - 1);

    Result := Response;
  finally
    IdHTTP.Free;
    Fields.Free;
  end;
end;

Quizá sería más adecuado utilizar un analizador del documento HTML. De hecho probé con éste y funciona bien pero pensé que podíamos hhacerlo con sólo lo estándar.

Ya queda en ustedes generalizar la aplicación de ejemplo para que se puedan escoger los idiomas de la traducción.

// Saludos

gulder 26-03-2009 05:08:49

roman gracias men probando mañana comento aca es un poco tarde y me toca temprano saludes gulder

Caro 26-03-2009 14:00:41

Muchísimas gracias Roman y Kipow, funciona bien tu ejemplo Roman, creo que tengo que estudiar sobre el TIdHttp, pero si he entendido el codigo.

Saluditos

Caro 26-03-2009 14:27:55

Cita:

Empezado por roman (Mensaje 342760)
Ya queda en ustedes generalizar la aplicación de ejemplo para que se puedan escoger los idiomas de la traducción.

Hola de nuevo, acabo de hacer una pruebita para que funcionen con los demas idiomas y funciona perfecto, muchas gracias de nuevo Roman.

Saluditos

gulder 26-03-2009 21:21:28

roman gracias roman funciona 100% exelecte jijiji salu2 :):):):):):):)

Kipow 26-03-2009 21:52:44

Muchas gracias por el ejemplo Roman, bueno al menos la idea la tenia jaja. vamos a meternos un poco mas en las indy ya veo que se les puede sacar bastante el jugo.

roman 26-10-2010 00:25:44

1 Archivos Adjunto(s)
Hola,

Gracias a la ayuda de movorack en este hilo he actualizado este ejemplo para que sea más afín con la API de Google y no dependa de las etiquetas HTML exactas de la página de Google, pues, como puede verse ahora, el primer ejemplo ya no funciona debido a que éstas cambiaron.

Aproveché para hacer el ejemplo un poco más versátil



permitiendo al usuario escoger los idiomas de la traducción.

En esta versión, anexo el archivo languages.ini con la lista de lenguajes entre los que puede traducirse (o casi).

// Saludos

rrf 27-10-2010 01:00:36

Muchííííííísimas gracias, Román.

Había consultado ESTE OTRO HILO, pero no funcionaba y la solución que has aportado se ajusta a lo que buscaba.

Salu2

rrf 01-11-2010 10:03:55

Todo sigue bien y la función Googletranslate me ha dado muy buen resultado.

Sin embargo, hay un detalle que quizás podría ser mejorado.

En el ejemplo que añadió Roman, cuando se quiere traducir:

Código:

This is the line 1.

This is the line 3.

This is the line 5.

El resultado que aparece es:

Código:

Esta es la línea 1. Esta es la línea 3. Esta es la línea 5.
Sin embargo, si se copia el texto desde un memo y se pega en la página del traductor de Google, el resultado es:

Código:

Esta es la línea 1.

Esta es la línea 3.

Esta es la línea 5.

¿Alguien conoce algún truco para utilizar esta función, pero haciendo que el traductor de Google, respete las líneas cuando devuelve el texto traducido?.

Muchas gracias de antemano.

Saludos.

aposi 24-11-2010 19:21:30

Alguien sabe com hacer para que el traductor pueda traducir :

"Save" por "Guardar" en vez de

\u0026quot;Guardar\u0026quot;

rrf 25-11-2010 16:54:42

Hola Aposi.

Aquí te incluyo una función que elaboré para resolver el problema de las comillas dobles y de algunos otros caracteres ( ' < > =).


Código Delphi [-]
Function rt ( bb: string ) : string ;
var
  a1  : string ;
  d1, d2 : array [1..5] of String ;
  cc : integer ;
begin

      // Reemplaza caracteres especiales mal traducidos
      //-------------------------------------------------

  a1 := bb ;
  d1 [1] := '\u0026#39;' ;       d2 [1] := '''' ;   // Comilla simple: '
  d1 [2] := '\u0026gt;' ;        d2 [2] := '>' ;
  d1 [3] := '\u0026lt;' ;        d2 [3] := '<' ;
  d1 [4] := '\u003d' ;           d2 [4] := '=' ;
  d1 [5] := '\u0026quot;' ;      d2 [5] := '"' ;   // Comilla doble: "

  for cc := 1 to 5 do
    if 0 < pos ( d1 [cc], a1 )
      then a1 := StringReplace( a1, d1 [cc], d2 [cc], [ rfReplaceAll ] ) ;

  result := a1 ;

end;

En la función, se usaron Array para que fuera fácil ampliar el número de caracteres que queden mal traducidos. Están incluidos los que a mí me dieron problemas, pero seguramente deben haber muchos más; por ejemplo "¿" o "¡" posiblemente den problemas.

Para llamar a esta función, sería algo así (aa es una variable tipo string):

Código Delphi [-]
  aa := 'Texto a traducir usando Google Translator' ;
  aa := GoogleTranslate(Source, Target, aa) ;

              // Eliminar caracteres especiales mal traducidos
  aa := rt ( aa ) ;

Puedes usar solo la parte que te interese de este código y, con un par de ajustes, lo tienes resuelto.

Saludos.

aposi 25-11-2010 17:33:24

gracias, lo aplicare al programa

aposi 07-11-2011 12:02:34

hola de nuevo,
google ha cerrado la api del traductor y he encontrado que microsoft tinen tambien una api.
he encontrado el siguiente codigo para utilizar esta api

Código Delphi [-]
 const    
 MicrosoftTranslatorTranslateUri = 'http://api.microsofttranslator.com/v2/Http.svc/Translate?appId=%s&text=%s&from=%s&to=%s';
        //this AppId if for demo only please be nice and use your own , it's easy get one from here http://msdn.microsoft.com/en-us/library/ff512386.aspx    
BingAppId                       = '7FA9D0A8FB6B194BE57E92B286FCAF0B774883F3';
    Msxml2_DOMDocument              = 'Msxml2.DOMDocument.6.0';   


function TDML.TranslateText(const AText, SourceLng, DestLng: string): string;
var
   XmlDoc : OleVariant;
   Node   : OleVariant;
begin
  Result:=WinInet_HttpGet(Format(MicrosoftTranslatorTranslateUri,[BingAppId,AText,SourceLng,DestLng]));
  XmlDoc:= CreateOleObject(Msxml2_DOMDocument);
  try
    XmlDoc.Async := False;
    XmlDoc.LoadXML(Result);
    if (XmlDoc.parseError.errorCode <> 0) then
     raise Exception.CreateFmt('Error in Xml Data %s',[XmlDoc.parseError]);
    Node:= XmlDoc.documentElement;
    if not VarIsClear(Node) then
     Result:=XmlDoc.Text;
  finally
     XmlDoc:=Unassigned;
  end;

end;

procedure TDML.WinInet_HttpGet2(const Url: string; Stream: TStream);
const
BuffSize = 1024*1024;
var
  hInter   : HINTERNET;
  UrlHandle: HINTERNET;
  BytesRead: Longword;
  Buffer   : Pointer;
begin
  hInter := InternetOpen('', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  if Assigned(hInter) then
    try
      Stream.Seek(0,0);
      GetMem(Buffer,BuffSize);
      try
          UrlHandle := InternetOpenUrl(hInter, PChar(Url), nil, 0, INTERNET_FLAG_RELOAD, 0);
          if Assigned(UrlHandle) then
          begin
            repeat
              InternetReadFile(UrlHandle, Buffer, BuffSize, BytesRead);
              if BytesRead>0 then
               Stream.WriteBuffer(Buffer^,BytesRead);
            until BytesRead = 0;
            InternetCloseHandle(UrlHandle);
          end;
      finally
        FreeMem(Buffer);
      end;
    finally
     InternetCloseHandle(hInter);
    end;

end;

function TDML.WinInet_HttpGet(const Url: string): string;
Var
  StringStream : TStringStream;
begin
  Result:='';
    StringStream:=TStringStream.Create('');
    try
        WinInet_HttpGet2(Url,StringStream);
        if StringStream.Size>0 then
        begin
          StringStream.Seek(0,0);
          Result:=StringStream.ReadString(StringStream.Size);
        end;
    finally
      StringStream.Free;
    end;

end;

el probela que tengo es que estoy trabajando con delphi 6 y en el codigo que encontre utiliza la siguiente declaración :

Código Delphi [-]
StringStream:=TStringStream.Create('',TEncoding.UTF8);


esto no funciona con mi delphi y no se como passar a UTF8 el resultado de la traducción

Casimiro Notevi 04-10-2012 09:06:14

Cita:

Empezado por marisbelly (Mensaje 446284)
...

Bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo?, gracias por tu colaboración :)


Ya has hecho la pregunta en otro hilo y se está tratando, no repitas lo mismo en otros.
Gracias.


La franja horaria es GMT +2. Ahora son las 05:42:09.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi