Перевод языков в Delphi

Я уже целую вечность ищу код, который может переводить любой язык на другой, но ни один из найденных мной кодов не работает.
Я знаю, что у Google есть хороший API перевода, но я не могу заставить работать чей-либо код Delphi. .
Всегда возникает ошибка. Любая помощь будет высоко оценена, мне нужна программа, которая может перевести как можно скорее мой выпускной школьный проект.


person Michael McQuirk    schedule 19.09.2011    source источник
comment
Не могли бы вы показать нам, что у вас есть, и мы можем помочь вам решить проблемы. Мы не хотим делать ваш школьный проект за вас.   -  person David Heffernan    schedule 19.09.2011
comment
Я думаю, вы должны уточнить свой вопрос. IMO, вы ищете код, который выполняет перевод, вызывая веб-сервис, DLL или другой API для выполнения перевода. Код, который может переводить любой язык на другой, вероятно, требует докторской степени в области лингвистики в дополнение к продвинутым навыкам CS.   -  person Chris Thornton    schedule 20.09.2011


Ответы (3)


Возможно, вы не нашли работы Марко Канту?Работает с REST/AJAX/Delphi

Но, как сказал RRUZ, API Google Translate сейчас доступен только как платная услуга.

person EMBarbosa    schedule 20.09.2011
comment
Спасибо, этот код выглядит очень многообещающе, чем гугл-переводчик. Данный exe-файл работает на моем компьютере на 100%, но когда я открываю код и пытаюсь скомпилировать, я получаю сообщение об ошибке, я думаю, что мне не хватает модуля. Он говорит мне, что в TIdUri.ParamsEncode (strIn) ParamsEncode является необъявленным идентификатором. То же самое говорится и о PosEx, о котором речь пойдет позже. - person Michael McQuirk; 20.09.2011
comment
Спасибо, я только что установил Delphi 7, и этот код работает отлично. В любом случае это проще, чем Google API :) - person Michael McQuirk; 20.09.2011
comment
@MichaelMcQuirk, будьте осторожны, потому что проект, указанный на странице marco cantu, использует старую версию семейства Google Language API, которая устарела. - person RRUZ; 20.09.2011
comment
Эй, как сказал @RRUZ, Google удаляет часть старого API, и я не уверен, как долго это будет работать. Итак, помимо того, что я думаю, что это действительно ответ на ваш вопрос, вам следует больше изучить, если вы хотите использовать это. Изменить: я тестировал его в Delphi 7 и Delphi 2010 раньше и работал отлично. - person EMBarbosa; 20.09.2011

API Google Translate – хороший вариант, но сейчас он доступен только как платная услуга. Вместо этого вы можете попробовать API Microsoft Translator V2, ознакомьтесь с этой статьей Using the Microsoft Translator V2 API from delphi для получения дополнительной информации о том, как использовать этот API от delphi.

ОБНОВЛЕНИЕ Это тот же демонстрационный проект, что и в статье, измененный для совместимости с вашей версией 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.
person RRUZ    schedule 19.09.2011
comment
Хорошо, для всех тех, кому нужен пример ошибок, которые я получаю, вот случай, когда я получил 2 ошибки. (я имею в виду путь к delphi .wordpress.com/2011/05/30/) Моя первая ошибка, которую я получаю, когда пробую этот код, заключается в том, что файл класса Generics.Collections не существует. У меня есть сайт, который позволяет вам скачать файл .pas, но я не могу его найти. Вторая ошибка, которую я получаю, я полагаю, я получаю ее из-за первой ошибки, заключается в том, что в строке 64 (полный код внизу страницы) я получаю сообщение об ошибке, говорящее о том, что существует много фактических параметров. - person Michael McQuirk; 20.09.2011
comment
(продолжение) очевидно, что компилятор не знает, что такое TEncoding.UTF8. Я предполагаю, что это должно быть в отсутствующем файле Generics.Collections. - person Michael McQuirk; 20.09.2011
comment
@MichaelMcQuirk, кажется, вы используете старую версию delphi, пожалуйста, включите свою версию delphi, чтобы помочь вам. - person RRUZ; 20.09.2011
comment
@RRUZ Пожалуйста, укажите ссылку Using the Microsoft Translator V2 API from delphi, включенную в ваш ответ. - person Ilyes; 19.11.2018

Во-первых, вы не можете найти 100% инструмент для перевода с одного языка на другой. У вас может быть инструмент, который делает часть (более или менее) работы за вас, но вам нужно «полировать» остальное. Как сказал RRUZ, вы можете использовать переводчик Microsoft, но то, что я сказал, применимо и в этом случае. Любой инструмент такого типа будет стоить вам денег. Гугловский переводчик неплохой, но за него нужно платить.

PS: Я не думаю, что в школе вас просят создать инструмент, который переводит с любого языка на любой язык. Может быть, небольшой инструмент, который может доказать, что вы поняли концепцию. просто мои 2 цента...

person RBA    schedule 19.09.2011
comment
Ну, на самом деле мой проект заключается в том, что мне нужно сделать программу, которая может научить своего пользователя новому языку. Использование Google Translate API — это лишь один из небольших (но очень важных) компонентов программы. Большая часть проекта завершена, мне просто нужен способ перевода текста. - person Michael McQuirk; 20.09.2011