Tôi đã tìm kiếm các độ tuổi bây giờ cho một số mã có thể dịch bất kỳ ngôn ngữ nào sang ngôn ngữ khác nhưng không có mã nào tôi tìm thấy hoạt động.
Tôi biết Google có API dịch tốt nhưng tôi không thể nhận mã Delphi của bất kỳ ai trên đó để hoạt động.
Luôn có lỗi xảy ra. Bất kỳ trợ giúp nào sẽ được đánh giá cao, tôi cần một chương trình có thể dịch ASAP của dự án trường học cuối cùng của tôi.Dịch các ngôn ngữ trong Delphi
Trả lời
Có thể bạn không tìm thấy tác phẩm của Marco Cantu? Works with REST/AJAX/Delphi
Nhưng như RRUZ cho biết, API Google Translate hiện chỉ khả dụng dưới dạng dịch vụ trả tiền.
Cảm ơn bạn, mã này trông rất hứa hẹn, hơn google dịch. Các exe cho công trình 100% trên máy của tôi nhưng khi tôi mở mã và cố gắng biên dịch tôi nhận được một lỗi, tôi nghĩ rằng tôi đang thiếu một đơn vị. Nó nói với tôi rằng trong "TIdUri.ParamsEncode (strIn)" ParamsEncode là một định danh không khai báo. Và nó nói tương tự về "PosEx" xuất hiện sau đó. –
Cảm ơn bạn, tôi chỉ cần cài đặt Delphi 7 và mã này hoạt động hoàn hảo. Dễ dàng hơn API của Google anyway :) –
@MichaelMcQuirk, hãy cẩn thận vì dự án được liệt kê trong trang marco cantu sử dụng phiên bản cũ của họ API Google Language không được dùng nữa. – RRUZ
Google Translate API là một tùy chọn tốt, nhưng hiện chỉ có sẵn dưới dạng dịch vụ trả tiền. Thay vào đó, bạn có thể thử API phiên dịch V2 của Microsoft, hãy xem bài viết này Using the Microsoft Translator V2 API from delphi
để biết thêm chi tiết về cách sử dụng API này từ delphi.
CẬP NHẬT Đây là cùng một dự án demo của bài viết được sửa đổi để tương thích với phiên bản delphi của bạn.
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 cho bài viết của bạn – RBA
Được rồi, cho tất cả những ai muốn có một ví dụ về các lỗi tôi nhận được, đây là trường hợp tôi gặp phải 2 lỗi. (Tôi đang đề cập đến http://theroadtodelphi.wordpress.com/2011/05/30/using-the-microsoft-translator-v2-from-delphi/) Lỗi đầu tiên của tôi khi tôi thử mã này là tệp lớp "Generics.Collections" không tồn tại. Tôi có googling một trang web cho phép bạn tải về tập tin .pas nhưng tôi không thể tìm thấy bất kỳ. Lỗi thứ hai tôi nhận được, tôi đoán tôi nhận được nó vì lỗi đầu tiên, là trên dòng 64 (mã đầy đủ ở dưới cùng của trang) tôi nhận được một lỗi nói rằng có nhiều tham số thực tế. –
(tiếp theo) rõ ràng trình biên dịch không biết TEncoding.UTF8 là gì. Tôi cho rằng nó phải nằm trong tệp "Generics.Collections" bị thiếu. –
Trước hết, bạn không thể tìm thấy công cụ 100% để dịch từ ngôn ngữ này sang ngôn ngữ khác. Bạn có thể có một công cụ đang thực hiện một số (nhiều hơn hoặc ít hơn) công việc cho bạn, nhưng bạn cần phải 'đánh bóng' phần còn lại. Như RRUZ đã nói, bạn có thể sử dụng dịch giả của Microsoft nhưng những gì tôi đã nói cũng áp dụng trong trường hợp này. Bất kỳ công cụ nào thuộc loại này sẽ khiến bạn mất tiền. Dịch của Google khá tốt, nhưng bạn cần phải trả tiền cho nó.
PS: Tôi không nghĩ rằng ở trường họ yêu cầu bạn tạo một công cụ dịch từ bất kỳ ngôn ngữ nào sang bất kỳ ngôn ngữ nào. Có lẽ một công cụ nhỏ có thể chứng minh bạn đã có khái niệm. chỉ 2 xu của tôi ...
Vâng, thực sự dự án tôi có là tôi cần phải thực hiện một chương trình có thể dạy cho người dùng một ngôn ngữ mới. Sử dụng API của Google Translate chỉ là một trong những thành phần nhỏ (nhưng rất quan trọng) của chương trình. Hầu hết các dự án được thực hiện, tôi chỉ cần một cách để dịch văn bản. –
Bạn có thể cho chúng tôi biết những gì bạn có cho đến nay và chúng tôi có thể giúp bạn giải quyết vấn đề. Chúng tôi không muốn làm dự án trường học của bạn cho bạn. –
Tôi nghĩ bạn nên làm rõ câu hỏi của bạn. IMO, bạn đang tìm kiếm mã thực hiện bản dịch bằng cách gọi một webservice, DLL hoặc API khác để thực hiện việc dịch. "Mã có thể dịch bất kỳ ngôn ngữ nào sang ngôn ngữ khác" có thể yêu cầu bằng tiến sĩ về ngôn ngữ học ngoài các kỹ năng CS nâng cao. –