2011-09-19 33 views
5

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

+0

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. –

+0

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. –

Trả lời

3

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.

+0

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 đó. –

+0

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 :) –

+0

@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

10

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. 
+2

+1 cho bài viết của bạn – RBA

+0

Đượ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ế. –

+0

(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. –

0

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 ...

+0

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. –

Các vấn đề liên quan