Using Google Translate/pt

From Lazarus wiki
Jump to navigationJump to search

English (en) français (fr) português (pt)

Introdução

Existem pelo menos duas maneiras de acessar o Google Translate:

  • Uma forma gratuita, mas controlada.
  • Usando a API autenticada com OAuth2.

Este é um exemplo de uso do primeiro.

Para obter informações sobre o último, é favor consultar: Google Translate Getting Started

Informações sobre os parâmetros

De acordo com uma resposta no Stack Overflow (What is the meaning of Google Translate query params?) aqui está uma lista dos parâmetros para a chamada HTTP GET:

  • sl - código do idioma de origem (auto para detecção automática)
  • tl - linguagem de tradução
  • q - texto / palavra fonte
  • ie - codificação de entrada (um palpite)
  • oe - codificação de saída (um palpite)
  • dt - pode ser incluído mais de uma vez e especifica o que retornar na resposta
  • dj - resposta JSON com nomes em vez de apenas matrizes (dj=1)

Aqui estão alguns valores para dt:

  • t - tradução do texto fonte
  • at - traduções alternativas
  • rm - transcrição / transliteração de textos fonte e traduzidos
  • bd - dicionário, caso o texto de origem seja uma palavra (você obtém traduções com artigos, traduções reversas, etc.)
  • md - definições de texto de origem, se for uma palavra
  • ss - sinônimos de texto fonte, se for uma palavra
  • ex - exemplos
  • rw - Veja também a lista


Contactando o Google

Esta função retornará a resposta em JSON.

uses
  {...}, fpjson, fphttpclient, opensslsockets, {...}

function CallGoogleTranslate(AURL: String): TJSONStringType;
var
  client: TFPHTTPClient;
  doc: TStringList;
begin
  Result:= EmptyStr;
  doc:=TStringList.Create;
  client:=TFPHTTPClient.Create(nil);
  try
    client.Get(AURL,doc);
    Result:=doc.Text;
  finally
    doc.Free;
    client.Free;
  end;
end;

Analisando a resposta baseada em matriz JSON

uses
  {...}, fpjson, jsonparser, HTTPDefs, {...}

const
  cArrayShortLanguages: Array [0..7] of String = (
    'auto',
    'en',
    'pt',
    'pl',
    'fr',
    'es',
    'it',
    'ru'
  );

procedure ParseArraysTranslate;
var
  URL: String;
  Index: integer;
  strResponse: TJSONStringType;
  jdResponse, jdTranslation, jdTranslationArray: TJSONData;
  jaTranslation, jaTranslationArray: TJSONArray;
begin

  URL:='https://translate.googleapis.com/translate_a/single?client=gtx'
    +'&q='+HTTPEncode({** COLOQUE O TEXTO PARA TRADUZIR AQUI **})
    +'&sl='+cArrayShortLanguages[0] // Deteção automática
    +'&tl='+cArrayShortLanguages[1] // Inglês
    +'&dt=t'
    +'&ie=UTF-8&oe=UTF-8'
    ;

  strResponse:= CallGoogleTranslate(URL);
  try
    jdResponse:= GetJSON(strResponse);

    jdTranslation:= jdResponse.FindPath('[0]');
    if (jdTranslation <> nil) and (jdTranslation.JSONType = jtArray) then
    begin
      jaTranslation:= TJSONArray(jdTranslation);
      for index:= 0 to Pred(jaTranslation.Count) do
      begin
        jdTranslationArray:= jaTranslation[Index];
        if (jdTranslationArray <> nil) and (jdTranslationArray.JSONType = jtArray) then
        begin
          jaTranslationArray:= TJSONArray(jdTranslationArray);
          WriteLN(Trim(jaTranslationArray[0].AsString));
        end;
      end;
    end;
  finally
    jdResponse.Free;
  end;
end;

Analisando a resposta baseada em objeto JSON

uses
  {...}, fpjson, jsonparser, HTTPDefs, {...}

const
  cArrayShortLanguages: Array [0..7] of String = (
    'auto',
    'en',
    'pt',
    'pl',
    'fr',
    'es',
    'it',
    'ru'
  );
  cJSONSentences = 'sentences';
  cJSONTranslation = 'trans';
  cJSONSource = 'src';

procedure ParseObjectTranslate;
var
  URL: String;
  Index: integer;
  strResponse: TJSONStringType;
  jdResponse: TJSONData;
  joTranslation, joSentence: TJSONObject;
  jaSentencesArray: TJSONArray;
begin
  Application.ProcessMessages;
    URL:='https://translate.googleapis.com/translate_a/single?client=gtx'
      +'&q='+HTTPEncode({** COLOQUE O TEXTO PARA TRADUZIR AQUI **})
      +'&sl='+cArrayShortLanguages[0] // Deteção automática
      +'&tl='+cArrayShortLanguages[1] // Inglês
      +'&dt=t&dj=1' // dj=1 faz com que a resposta seja um objeto JSON
      +'&ie=UTF-8&oe=UTF-8'
      ;

    strResponse:= CallGoogleTranslate(URL);
    try
      jdResponse:= GetJSON(strResponse);

      if (jdResponse <> nil) and (jdResponse.JSONType = jtObject) then
      begin
        joTranslation:= TJSONObject(jdResponse);
        jaSentencesArray:= TJSONArray(joTranslation.FindPath(cJSONSentences));
        for Index:=0 to Pred(jaSentencesArray.Count) do
        begin
          joSentence:= TJSONObject(jaSentencesArray[Index]);
          WriteLN(Trim(joSentence.Get(cJSONTranslation,'')));
        end;
      end;
    finally
      jdResponse.Free;
    end;
end;

Links externos

Test Google Translate - Um repositório GitHub que demonstra este exemplo.