2011-09-19 67 views
5

我一直在尋找年齡現在的一些代碼,可以將任何語言翻譯到另一個,但沒有我找到的代碼的作品。
我知道谷歌有一個很好的翻譯API,但我無法讓任何人的Delphi代碼工作。
總會出現一個錯誤。 任何幫助將不勝感激,我需要一個程序,可以儘快翻譯我的最終學校項目。在德爾福翻譯語言

+0

您能告訴我們您到目前爲止的狀況嗎?我們可以幫助您解決問題。我們不想爲你做你的學校項目。 –

+0

我認爲你應該澄清你的問題。國際海事組織,您正在尋找通過調用webservice,DLL或其他API來執行翻譯來執行翻譯的代碼。 「可以將任何語言翻譯成另一種語言的代碼」可能需要語言學博士學位以及高級CS技能。 –

回答

3

也許你沒有找到Marco Cantu的作品? Works with REST/AJAX/Delphi

但是正如RRUZ所言,Google Translate API僅作爲付費服務提供。

+0

謝謝,這段代碼看起來非常有希望,超過谷歌翻譯。給予的EXE作品100%在我的電腦上,但當我打開代碼,並嘗試編譯我得到一個錯誤,我想我錯過了一個單位。它告訴我,在「TIdUri.ParamsEncode(strIn)」中,ParamsEncode是一個未聲明的標識符。而且它對後來出現的「PosEx」也有同樣的說法。 –

+0

謝謝,我剛剛安裝了Delphi 7,此代碼完美工作。它比谷歌的API更容易:) –

+0

@MichaelMcQuirk,要小心,因爲marco cantu頁面中列出的項目使用舊版本的Google語言API系列,不推薦使用。 – RRUZ

10

Google Translate API是一個不錯的選擇,但現在只能作爲付費服務使用。相反,您可以嘗試使用Microsoft Translator V2 API,查看此文章Using the Microsoft Translator V2 API from delphi以瞭解有關如何使用此API的更多詳細信息。

UPDATE 這是修改爲與您的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爲您的文章 – RBA

+0

好吧,對於所有那些想要我收到的錯誤的例子,這裏是一個案例,我得到了2個錯誤。 (我指的是http://theroadtodelphi.wordpress.com/2011/05/30/using-the-microsoft-translator-v2-from-delphi/)我嘗試這段代碼時遇到的第一個錯誤是類文件「Generics.Collections」不存在。我有一個網站googling,允許你下載.pas文件,但我找不到任何。第二個錯誤我得到,我認爲我得到它,因爲第一個錯誤,是在64行(完整的代碼在頁面底部)我得到一個錯誤,說有很多實際參數。 –

+0

(續)顯然,編譯器不知道TEncoding.UTF8是什麼。我假設它必須在缺少的「Generics.Collections」文件中。 –

0

首先,你找不到一個從一種語言翻譯到另一種語言的100%的工具。你可以有一個工具爲你做一些(或多或少)工作,但是你需要「擦亮」剩下的工作。正如RRUZ所說,你可以使用微軟的翻譯器,但我所說的也適用於這種情況。任何這種類型的工具都會花費你的錢。谷歌的翻譯很不錯,但你需要付出代價。

PS:我不認爲他們在學校要求你創建一個從任何語言翻譯成任何語言的工具。也許一個小工具可以證明你有這個概念。只是我的2美分...

+0

嗯,實際上我的項目是我需要製作一個程序,可以教會它的用戶一種新的語言。使用谷歌翻譯的API只是該程序的一小部分(但非常重要)。大部分項目已經完成,我只需要一種翻譯文本的方法。 –