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
Odpowiedz
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.
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. –
Dziękuję, właśnie zainstalowałem Delphi 7 i ten kod działa idealnie. Jest to łatwiejsze niż API Google'a :) –
@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
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.
+1 dla twojego artykułu – RBA
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. –
(ciąg dalszy) oczywiście kompilator nie wie, co to jest TEncoding.UTF8. Przypuszczam, że musi to dotyczyć brakującego pliku "Generics.Collections". –
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 ...
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. –
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. –
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. –