Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Google Translate


Автор: huismori 19.1.2010, 21:47
Привет всем на форуме. У меня есть вопрос о переводе Google ... Я этого проекта перевода языка, но существует проблема получения переведенного текста, как показано на картинке ...


user posted image

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdCookieManager, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient, IdHTTP, StrUtils;

type
  TForm1 = class(TForm)
    IdHTTP1: TIdHTTP;
    IdCookieManager1: TIdCookieManager;
    Button1: TButton;
    Memo1: TMemo;
    Memo2: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var txt, translate        :string;
    BlockStart, BlockEnd  :integer;
begin
txt:=Memo1.text;
while Pos(' ', txt) > 0 do
 begin
 txt[Pos(' ', txt)] := '+';
 end;
translate:=IdHTTP1.Get('http://translate.google.ru/translate_t?prev=hp&hl=ru&js=y&text='+txt+'&file=&sl=en&tl=ru&history_state0=');
BlockStart:=Pos('id=result_box dir="ltr">',LowerCase(translate));
if BlockStart > 0 then
  begin
    BlockEnd:=PosEx('</div>',LowerCase(translate),BlockStart);
  end;
memo2.text:=copy(translate,BlockStart+length('id=result_box dir="ltr">'),BlockEnd-BlockStart-length('id=result_box dir="ltr">'));
end;

end.

Автор: Keeper89 19.1.2010, 23:55
huismori, если ошибка в ????????????
то
Код

translate := Utf8ToAnsi(IdHTTP1.Get(...));

Автор: huismori 19.1.2010, 23:59
не повезло  smile 

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdCookieManager, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient, IdHTTP, StrUtils;

type
  TForm1 = class(TForm)
    IdHTTP1: TIdHTTP;
    IdCookieManager1: TIdCookieManager;
    Button1: TButton;
    Memo1: TMemo;
    Memo2: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var txt, translate        :string;
    BlockStart, BlockEnd  :integer;
begin
txt:=Memo1.text;
while Pos(' ', txt) > 0 do
 begin
 txt[Pos(' ', txt)] := '+';
 end;
translate:=Utf8ToAnsi(IdHTTP1.Get('http://translate.google.com.tr/#en|ru|'+txt));
BlockStart:=Pos('id=result_box dir="ltr">',LowerCase(translate));
if BlockStart > 0 then
  begin
    BlockEnd:=PosEx('</div>',LowerCase(translate),BlockStart);
  end;
memo2.text:=copy(translate,BlockStart+length('id=result_box dir="ltr">'),BlockEnd-BlockStart-length('id=result_box dir="ltr">'));
end;

end.

Автор: Keeper89 20.1.2010, 00:04
Цитата(huismori @  19.1.2010,  23:59 Найти цитируемый пост)
не повезло  smile 

Ну, не повезло, так не повезло, телепатор у меня дальше не работает.

Автор: muratboy31 20.1.2010, 00:09
ok i found something for u but i really dont know how to make it project but i am sure professianols in the forum will definitely help u...

It requires the Synapse internet classes (http://www.ararat.cz/synapse/doku.php)

Код

Unit translator_unit;
{$IFDEF FPC}
{$MODE DELPHI} {$H+}
{$ENDIF}
Interface

Const
{..............................................................................}

//    cLanguagePair_ = 0;
    cLanguagePair_EnglishToFrench  = 2;
    cLanguagePair_EnglishToGerman  = 3;
    cLanguagePair_EnglishToItalian = 4;
//    cLanguagePair_ = 5;
//    cLanguagePair_ = 6;
//    cLanguagePair_ = 7;
//    cLanguagePair_ = 8;
//    cLanguagePair_ = 9;
//    cLanguagePair_ = 10;
//    cLanguagePair_ = 11;
//    cLanguagePair_ = 12;
    cLanguagePair_ItalianToEnglish = 13;
//    cLanguagePair_ = 14;
//    cLanguagePair_ = 15;
//    cLanguagePair_ = 16;
//    cLanguagePair_ = 17;

    cLanguagePairList : Array[0..17] Of AnsiString =(
        'zh-CN%7Cen',
        'en%7Czh-CN',
        'en%7Cfr',
        'en%7Cde',
        'en%7Cit',
        'en%7Cja',
        'en%7Cko',
        'en%7Cpt',
        'en%7Ces',
        'fr%7Cen',
        'fr%7Cde',
        'de%7Cen',
        'de%7Cfr',
        'it%7Cen',
        'ja%7Cen',
        'ko%7Cen',
        'pt%7Cen',
        'es%7Cen'
    );
{..............................................................................}

{..............................................................................}
Function  TranslateText(Const ATextIn        : AnsiString;
                        Var   ATextOut       : AnsiString;
                        Const ALanguagePair  : Integer) : Boolean;
                        
Implementation

Uses
    Classes,
    httpsend,
    SysUtils;
    
{..............................................................................}

{..............................................................................}
Function  HTTPEncode(Const AStr : AnsiString) : AnsiString;
Const
    cNoConversion = ['A'..'Z', 'a'..'z', '*', '@', '.', '_', '-'];
Var
    Sp, Rp : PChar;
Begin
    SetLength(Result, Length(AStr) * 3);
    Sp := PChar(AStr);
    Rp := PChar(Result);
    While Sp^ <> #0 Do
    Begin
        If Sp^ in cNoConversion Then
            Rp^ := Sp^
        Else
        If Sp^ = ' ' Then
            Rp^ := '+'
        Else
        Begin
            FormatBuf(Rp^, 3, '%%%.2x', 6, [Ord(Sp^)]);
            Inc(Rp, 2);
        End;
        Inc(Rp);
        Inc(Sp);
    End;
    SetLength(Result, Rp - PChar(Result));
End;
{..............................................................................}

{..............................................................................}
Function PosEx(Const SubStr, S : AnsiString; Offset : Cardinal) : Integer;

Var
    i : PChar;
Begin
    If (offset <1> length(s)) Then
    Begin
        Result := 0;
        Exit
    End;

    i := StrPos(@s[offset],@substr[1]);
    If i = Nil Then
        PosEx := 0
    Else
        PosEx := Succ(i-PChar(s));
End;
{..............................................................................}

{..............................................................................}
Function  TranslateText(Const ATextIn        : AnsiString;
                        Var   ATextOut       : AnsiString;
                        Const ALanguagePair  : Integer) : Boolean;
Var
    SendTxt  : AnsiString;
    Response : TStringList;
    s        : AnsiString;
    a,b      : integer;
Begin
      Result   := False;
      Response := TStringList.Create;
      Try
          SendTxt := 'http://translate.google.com/translate_t?text=' +
                     HTTPEncode(ATextIn) +
                     '&langpair=' +
                     cLanguagePairList[ALanguagePair];

          If Not HttpGetText(SendTxt,Response) Then Exit;
          s := Response.Text;
          a := PosEx('>',s,Pos('id=suggestion>',s));
          b := PosEx('</textarea>',s,a);
          ATextOut := Copy(s,a+1,b-a-1);
          Result := True;
      Finally
          Response.Free;
      End;
End;
{..............................................................................}

{..............................................................................}
End.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)