2011-09-19 8 views
5

나는 어떤 언어를 다른 언어로 번역 할 수있는 코드를 찾고 있었지만 작동하지 않는 코드는 발견하지 못했습니다.
Google에 좋은 번역 API가 있다는 것을 알고 있지만 누구에게도 델파이 코드를 사용할 수 없습니다.
항상 오류가 있습니다. 도움이된다면 최종 학교 프로젝트의 최대한 빨리 번역 할 수있는 프로그램이 필요합니다.번역 언어 델파이

+0

지금까지 가지고있는 것을 보여 주시겠습니까? 문제 해결에 도움을 줄 수 있습니까? 우리는 당신을 위해 학교 프로젝트를하고 싶지 않습니다. –

+0

질문을 분명히해야한다고 생각합니다. IMO, 번역을 수행 할 웹 서비스, DLL 또는 기타 API를 호출하여 변환을 수행하는 코드를 찾고 있습니다. "다른 언어로 번역 할 수있는 코드"는 고급 CS 기술 이외에 언어학 박사 학위를 요구할 수 있습니다. –

답변

3

아마 당신은 마르코 칸 투의 작품을 찾지 못했습니까? Works with REST/AJAX/Delphi

하지만 RRUZ에 따르면 Google 번역 API는 유료 서비스로만 제공됩니다.

+0

감사합니다,이 코드는 구글 번역보다 더 유망 해 보입니다. exe는 주어진 PC에서 100 % 작동하지만 코드를 열고 컴파일하려고 할 때 오류가 발생합니다. 제가 실종 된 것 같습니다. 그것은 "TIdUri.ParamsEncode (strIn)"에서 ParamsEncode가 선언되지 않은 식별자라는 것을 알려줍니다. 그리고 그것은 나중에 나오는 PosEx에 대해서도 마찬가지입니다. –

+0

감사합니다. 방금 델파이 7을 설치했고이 코드는 완벽하게 작동합니다. 어쨌든 Google의 API보다 쉽습니다. –

+0

@MichaelMcQuirk, marco cantu 페이지에 나열된 프로젝트는 사용되지 않는 Google Language API 제품군의 이전 버전을 사용하므로주의하십시오. – RRUZ

10

Google Translate API은 좋은 옵션이지만 유료 서비스로만 제공됩니다. 대신 Microsoft Translator V2 API를 사용해보십시오. Using the Microsoft Translator V2 API from delphi에서 델파이에서이 API를 사용하는 방법에 대해 자세히 알아보십시오.

업데이트 이것은 귀하의 델파이 버전과 호환되도록 수정 된 기사의 동일한 데모 프로젝트입니다.

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"가 존재하지 않습니다. 나는 당신이 .pas 파일을 다운로드 할 수있는 사이트를 찾고 있지만 어떤 것도 찾을 수 없다. 두 번째 오류는 내가, 나는 첫 번째 오류 때문에 그것을 얻을 줄 알았는데 64 행 (페이지의 하단에 전체 코드) 나는 많은 실제 매개 변수가 있다는 오류가 발생합니다. –

+0

(계속) 컴파일러는 분명히 TEncoding.UTF8이 무엇인지 알지 못합니다. 내가 누락 된 "Generics.Collections"파일에 있어야합니다. –

0

우선 언어를 다른 언어로 번역 할 수있는 100 % 도구를 찾을 수 없습니다. 당신은 당신을 위해 약간의 (다소간) 일을하는 도구를 가질 수 있지만, 나머지는 '연마'해야합니다. RRUZ이 말했듯이 Microsoft의 번역기를 사용할 수는 있지만이 경우에도 제가 말한 내용이 적용됩니다. 이 유형의 도구는 비용이들 것입니다. Google의 번역은 상당히 훌륭하지만 비용을 지불해야합니다.

추신 : 나는 학교에서 어떤 언어에서 어떤 언어로 번역하는 도구를 만들 것을 요구하지 않는다고 생각합니다. 어쩌면 그 개념을 증명할 수있는 작은 도구 일 것입니다. 그냥 내 2 센트 ...

+0

글쎄요, 실제로 제가 가진 프로젝트는 사용자에게 새로운 언어를 가르쳐 줄 수있는 프로그램을 만들어야한다는 것입니다. Google 번역의 API를 사용하는 것은 프로그램의 작지만 중요한 요소 중 하나 일뿐입니다. 대부분의 프로젝트가 완료되었으므로 텍스트를 번역 할 방법이 필요합니다. –

관련 문제