2011-09-19 15 views
5

Od dawna szukam jakiegoś kodu, który przetłumaczy dowolny język na inny, ale żaden z kodów, które znajduję, nie działa.
Wiem, że Google ma dobry translate API, ale nie mogę nigdzie znaleźć kodu Delphi do pracy.
Zawsze pojawia się błąd, który przeszkadza. Każda pomoc byłaby bardzo cenna, potrzebuję programu, który można przetłumaczyć JAK NAJSZYBCIEJ w moim ostatnim projekcie szkolnym.Tłumaczenie języków w Delphi

+0

Czy możesz pokazać nam, co masz do tej pory i możemy pomóc Ci rozwiązać problemy. Nie chcemy zrobić dla ciebie twojego szkolnego projektu. –

+0

Myślę, że powinieneś wyjaśnić swoje pytanie. IMO, szukasz kodu, który wykonuje tłumaczenie, wywołując serwis internetowy, bibliotekę DLL lub inne API do tłumaczenia. "Kod, który może przetłumaczyć dowolny język na inny" prawdopodobnie wymaga doktoratu z zakresu językoznawstwa, oprócz zaawansowanych umiejętności CS. –

Odpowiedz

3

Może nie znalazłeś prac Marco Cantu? Works with REST/AJAX/Delphi

Ale jak powiedział RRUZ, Google Translate API jest dostępny tylko teraz jako płatna usługa.

+0

Dziękuję, ten kod wygląda bardzo obiecująco, więcej niż tłumaczenie google. Exe podane działa w 100% na moim komputerze, ale kiedy otwieram kod i próbuję skompilować, dostaję błąd, myślę, że brakuje mi jednostki. Mówi mi, że w "TIdUri.ParamsEncode (strIn)" ParamsEncode jest niezadeklarowanym identyfikatorem. I mówi to samo o "PosEx", który pojawia się później. –

+0

Dziękuję, właśnie zainstalowałem Delphi 7 i ten kod działa idealnie. Jest to łatwiejsze niż API Google'a :) –

+0

@MichaelMcQuirk, bądź ostrożny, ponieważ projekt wymieniony na stronie marco cantu używa starej wersji rodziny języków Google API API, która jest przestarzała. – RRUZ

10

Opcja Google Translate API jest dobrym rozwiązaniem, ale teraz jest dostępna tylko jako usługa płatna. Zamiast tego możesz wypróbować Microsoft Translator V2 API, sprawdź ten artykuł Using the Microsoft Translator V2 API from delphi, aby uzyskać więcej informacji o tym, jak korzystać z tego interfejsu API z delphi.

UPDATE To jest ten sam projekt demonstracyjny artykułu, który został zmodyfikowany tak, aby był kompatybilny z wersją 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 dla twojego artykułu – RBA

+0

OK, dla wszystkich, którzy chcą podać przykład błędów, które otrzymuję, oto przypadek, w którym dostałem 2 błędy. (Mam na myśli http://theroadtodelphi.wordpress.com/2011/05/30/using-the-microsoft-translator-v2-from-delphi/) Mój pierwszy błąd, który dostaję, gdy próbuję tego kodu jest to, że plik klasy "Generics.Collections" nie istnieje. Mam google na stronie, która pozwala ci pobrać plik .pas, ale nie mogę go znaleźć. Drugi błąd jaki dostaję, zakładam, że dostaję go z powodu pierwszego błędu, jest to, że w linii 64 (pełny kod na dole strony) dostaję błąd mówiąc, że istnieje wiele rzeczywistych parametrów. –

+0

(ciąg dalszy) oczywiście kompilator nie wie, co to jest TEncoding.UTF8. Przypuszczam, że musi to dotyczyć brakującego pliku "Generics.Collections". –

0

Przede wszystkim nie można znaleźć narzędzia w 100% do przetłumaczenia z jednego języka na inny. Możesz mieć narzędzie, które wykonuje (mniej więcej) pracę dla ciebie, ale musisz "polerować" resztę. Jak powiedział RRUZ, możesz użyć tłumacza Microsoftu, ale to, co powiedziałem, odnosi się również do tego przypadku. Każde narzędzie tego typu będzie cię kosztować. Tłumacz Google jest całkiem niezły, ale trzeba za to zapłacić.

PS: Nie sądzę, że w szkole proszą o stworzenie narzędzia tłumaczącego z dowolnego języka na dowolny język. Może małe narzędzie, które może udowodnić, że masz pomysł. tylko moje 2 centy ...

+0

Cóż, w rzeczywistości mam projekt, który musi nauczyć użytkownika nowego języka. Korzystanie z API Tłumacza Google to tylko jeden z małych (ale bardzo ważnych) elementów programu. Większość projektu jest ukończona, po prostu potrzebuję sposobu na przetłumaczenie tekstu. –