2011-09-19 14 views
5

He estado buscando edades ahora para un código que puede traducir cualquier idioma a otro, pero ninguno de los códigos que encuentro funciona.
Sé que Google tiene una buena API de traducción, pero no puedo obtener el código Delphi de nadie para que funcione.
Siempre hay un error en el camino. Cualquier ayuda sería muy apreciada, necesito un programa que pueda traducir lo antes posible de mi proyecto final de escuela.Traduciendo idiomas En Delphi

+0

¿Podría mostrarnos lo que tiene hasta ahora y podemos ayudarle a resolver los problemas. No queremos hacer su proyecto escolar para usted. –

+0

Creo que debería aclarar su pregunta. IMO, usted está buscando un código que realice una traducción llamando a un servicio web, DLL u otra API para hacer la traducción. "Código que puede traducir cualquier idioma a otro" probablemente requiera un doctorado en lingüística además de habilidades avanzadas de CS. –

Respuesta

3

Quizás no encontró los trabajos de Marco Cantu? Works with REST/AJAX/Delphi

Pero, como dice RRUZ, la API de Google Translate solo está disponible ahora como servicio de pago.

+0

Gracias, este código parece muy prometedor, más que Google translate. El exe dado funciona al 100% en mi pc, pero cuando abro el código y trato de compilar obtengo un error, creo que me falta una unidad. Me dice que en "TIdUri.ParamsEncode (strIn)" ParamsEncode es un identificador no declarado. Y dice lo mismo sobre "PosEx" que aparece más tarde. –

+0

Gracias, acabo de instalar Delphi 7 y este código funciona perfectamente. Es más fácil que la API de Google, de todos modos :) –

+0

@MichaelMcQuirk, tenga cuidado porque el proyecto que figura en la página de marco cantu usa una versión anterior de la familia de API de Google Language que está en desuso. – RRUZ

10

La Google Translate API es una buena opción, pero ahora está disponible solo como un servicio de pago. En su lugar, puede probar la API de Microsoft Translator V2, consulte este artículo Using the Microsoft Translator V2 API from delphi para obtener más información sobre cómo usar esta API de delphi.

ACTUALIZACIÓN Este es el mismo proyecto de demostración del artículo modificado para que sea compatible con su versión de Delphi.

program MicrosoftTranslatorApi; 

{$APPTYPE CONSOLE} 

uses 
    ShellApi, 
    ActiveX, 
    Classes, 
    ComObj, 
    Variants, 
    Windows, 
    WinInet, 
    SysUtils; 

const 
    MicrosoftTranslatorTranslateUri = 'http://api.microsofttranslator.com/v2/Http.svc/Translate?appId=%s&text=%s&from=%s&to=%s'; 
    MicrosoftTranslatorDetectUri = 'http://api.microsofttranslator.com/v2/Http.svc/Detect?appId=%s&text=%s'; 
    MicrosoftTranslatorGetLngUri = 'http://api.microsofttranslator.com/v2/Http.svc/GetLanguagesForTranslate?appId=%s'; 
    MicrosoftTranslatorGetSpkUri = 'http://api.microsofttranslator.com/v2/Http.svc/GetLanguagesForSpeak?appId=%s'; 
    MicrosoftTranslatorSpeakUri  = 'http://api.microsofttranslator.com/v2/Http.svc/Speak?appId=%s&text=%s&language=%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      = '73C8F474CA4D1202AD60747126813B731199ECEA'; 
    Msxml2_DOMDocument    = 'Msxml2.DOMDocument.6.0'; 

procedure WinInet_HttpGet(const Url: string;Stream:TStream);overload; 
const 
BuffSize = 1024*1024; 
var 
    hInter : HINTERNET; 
    UrlHandle: HINTERNET; 
    BytesRead: DWORD; 
    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 WinInet_HttpGet(const Url: string): string;overload; 
Var 
    StringStream : TStringStream; 
begin 
    Result:=''; 
    StringStream:=TStringStream.Create(''); 
    try 
     WinInet_HttpGet(Url,StringStream); 
     if StringStream.Size>0 then 
     begin 
      StringStream.Seek(0,0); 
      Result:=StringStream.ReadString(StringStream.Size); 
     end; 
    finally 
     StringStream.Free; 
    end; 
end; 

function 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; 

function DetectLanguage(const AText:string):string; 
var 
    XmlDoc : OleVariant; 
    Node : OleVariant; 
begin 
    Result:=WinInet_HttpGet(Format(MicrosoftTranslatorDetectUri,[BingAppId,AText])); 
    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; 

function GetLanguagesForTranslate: TStringList; 
var 
    XmlDoc : OleVariant; 
    Node : OleVariant; 
    Nodes : OleVariant; 
    lNodes : Integer; 
    i  : Integer; 
    sValue : string; 
begin 
    Result:=TStringList.Create; 
    sValue:=WinInet_HttpGet(Format(MicrosoftTranslatorGetLngUri,[BingAppId])); 
    XmlDoc:= CreateOleObject(Msxml2_DOMDocument); 
    try 
    XmlDoc.Async := False; 
    XmlDoc.LoadXML(sValue); 
    if (XmlDoc.parseError.errorCode <> 0) then 
    raise Exception.CreateFmt('Error in Xml Data %s',[XmlDoc.parseError]); 
    Node:= XmlDoc.documentElement; 
    if not VarIsClear(Node) then 
    begin 
     Nodes := Node.childNodes; 
     if not VarIsClear(Nodes) then 
     begin 
     lNodes:= Nodes.Length; 
      for i:=0 to lNodes-1 do 
      Result.Add(Nodes.Item(i).Text); 
     end; 
    end; 
    finally 
    XmlDoc:=Unassigned; 
    end; 
end; 

function GetLanguagesForSpeak: TStringList; 
var 
    XmlDoc : OleVariant; 
    Node : OleVariant; 
    Nodes : OleVariant; 
    lNodes : Integer; 
    i  : Integer; 
    sValue : string; 
begin 
    Result:=TStringList.Create; 
    sValue:=WinInet_HttpGet(Format(MicrosoftTranslatorGetSpkUri,[BingAppId])); 
    XmlDoc:= CreateOleObject(Msxml2_DOMDocument); 
    try 
    XmlDoc.Async := False; 
    XmlDoc.LoadXML(sValue); 
    if (XmlDoc.parseError.errorCode <> 0) then 
    raise Exception.CreateFmt('Error in Xml Data %s',[XmlDoc.parseError]); 
    Node:= XmlDoc.documentElement; 
    if not VarIsClear(Node) then 
    begin 
     Nodes := Node.childNodes; 
     if not VarIsClear(Nodes) then 
     begin 
     lNodes:= Nodes.Length; 
      for i:=0 to lNodes-1 do 
      Result.Add(Nodes.Item(i).Text); 
     end; 
    end; 
    finally 
    XmlDoc:=Unassigned; 
    end; 
end; 

procedure Speak(const FileName,AText,Lng:string); 
var 
    Stream : TFileStream; 
begin 
    Stream:=TFileStream.Create(FileName,fmCreate); 
    try 
    WinInet_HttpGet(Format(MicrosoftTranslatorSpeakUri,[BingAppId,AText,Lng]),Stream); 
    finally 
    Stream.Free; 
    end; 
end; 

var 
lng  : TStringList; 
i   : Integer; 
FileName : string; 

begin 
try 
    CoInitialize(nil); 
    try 
     Writeln(TranslateText('Hello World','en','es')); 
     Writeln(DetectLanguage('Hello World')); 

     Writeln('Languages for translate supported'); 
     lng:=GetLanguagesForTranslate; 
     try 
     for i:=0 to lng.Count-1 do 
     Writeln(lng[i]); 
     finally 
     lng.free; 
     end; 

     Writeln('Languages for speak supported'); 
     lng:=GetLanguagesForSpeak; 
     try 
     for i:=0 to lng.Count-1 do 
     Writeln(lng[i]); 
     finally 
     lng.free; 
     end; 

     FileName:=ExtractFilePath(ParamStr(0))+'Demo.wav'; 
     Speak(FileName,'This is a demo using the Microsoft Translator Api from delphi, enjoy','en'); 
     ShellExecute(0, 'open', PChar(FileName),nil,nil, SW_SHOWNORMAL) ; 

    finally 
     CoUninitialize; 
    end; 
except 
    on E:Exception do 
     Writeln(E.Classname, ':', E.Message); 
end; 
Writeln('Press Enter to exit'); 
Readln; 
end. 
+2

+1 para su artículo – RBA

+0

Bien, para todos aquellos que quieren un ejemplo de los errores que estoy recibiendo, aquí hay un caso en el que obtuve 2 errores. (Me refiero a http://theroadtodelphi.wordpress.com/2011/05/30/using-the-microsoft-translator-v2-from-delphi/) Mi primer error que consigo cuando intento este código es que el el archivo de clase "Generics.Collections" no existe. Tengo Google buscando en un sitio que te permite descargar el archivo .pas pero no puedo encontrar ninguno. El segundo error que recibo, supongo que lo entiendo debido al primer error, es que en la línea 64 (código completo en la parte inferior de la página) aparece un error que dice que hay muchos parámetros reales. –

+0

(continuación) obviamente, el compilador no sabe qué es TEncoding.UTF8. Supongo que debe estar en el archivo "Generics.Collections" que falta. –

0

Antes que nada, no puede encontrar una herramienta 100% para traducir de un idioma a otro. Puede tener una herramienta que esté haciendo algo (más o menos) del trabajo para usted, pero necesita 'pulir' el resto. Como dijo RRUZ, puede usar el traductor de Microsoft, pero lo que dije también se aplica en este caso. Cualquier herramienta de este tipo le costará dinero. La traducción de Google es bastante buena, pero debe pagarla.

PD: No creo que en la escuela te pidan que crees una herramienta que está traduciendo de cualquier idioma a cualquier idioma. Tal vez una pequeña herramienta que puede probar que tienes el concepto. solo mis 2 centavos ...

+0

Bueno, en realidad el proyecto que tengo es que necesito hacer un programa que pueda enseñarle a su usuario un nuevo idioma. Usar Google Translate's API es solo uno de los componentes pequeños (pero muy importantes) del programa. La mayor parte del proyecto está terminado, solo necesito una forma de traducir el texto. –