Delphi Can
Yandex Translate - Baskı Önizleme

+- Delphi Can (https://www.delphican.com)
+-- Forum: Delphi (https://www.delphican.com/forumdisplay.php?fid=3)
+--- Forum: Mobil Platform - FireMonkey (FMX) (https://www.delphican.com/forumdisplay.php?fid=7)
+--- Konu Başlığı: Yandex Translate (/showthread.php?tid=2722)

Sayfalar: 1 2


Yandex Translate - narkotik - 09-10-2018

Merhaba ;
Fmx ve Vcl için kullanabileceğiniz, translate fonksiyonunu paylaşmak istiyorum. Yandex mail açarak api key alabilirsiniz.

unit TranslateFmx;
{-------------------------------------------
 S.B FMX Yandex Translate
--------------------------------------------}

interface

uses SysUtils, FMX.Forms, System.Classes, System.Net.HttpClientComponent, Xml.XMLDoc, StrUtils;

type
 TYandexLanguages=
 (Afrikaans,Albanian,Arabic,Basque,Belarusian,Bulgarian,Catalan,Chinese,Chinese_Traditional,
 Croatian,Czech,Danish,Dutch,English,Estonian,Filipino,Finnish,French,Galician,German,Greek,
 Haitian_Creole,Hebrew,Hindi,Hungarian,Icelandic,Indonesian,Irish,Italian,Japanese,Latvian,
 Lithuanian,Macedonian,Malay,Maltese,Norwegian,Persian,Polish,Portuguese,Romanian,Russian,
 Serbian,Slovak,Slovenian,Spanish,Swahili,Swedish,Thai,Turkish,Ukrainian,Vietnamese,Welsh,Yiddish);

 function  mobTranslate(fParent:TForm;const Value:String;SourceLanguage,TargetLanguage:TYandexLanguages):String;

var
 GlobalValue : String;
const
 YandexLanguagesArr : array[TYandexLanguages] of string =
 ( 'af','sq','ar','eu','be','bg','ca','zh-CN','zh-TW','hr','cs','da','nl','en','et','tl','fi','fr','gl',
   'de','el','ht','iw','hi','hu','is','id','ga','it','ja','lv','lt','mk','ms','mt','no','fa','pl','pt',
   'ro','ru','sr','sk','sl','es','sw','sv','th','tr','uk','vi','cy','yi');

 ApiKey      = 'Api Key Yazılacak....';
implementation

function  mobTranslate(fParent:TForm;const Value:String;SourceLanguage,TargetLanguage:TYandexLanguages):String;
var
 xNetHTTP                 :  TNetHTTPClient;
 xMemoryStream            :  TMemoryStream;
 XmlDoc                   :  TXMLDocument;
 xOutList                 :  TStringList;
 xUrl                     :  String;
 xSource,xTarget          :  String;
begin
 Result                   := '';
 xSource                  := YandexLanguagesArr[SourceLanguage];
 xTarget                  := YandexLanguagesArr[TargetLanguage];
 xUrl                     := '';
 xUrl                     := Concat(xUrl,'https://translate.yandex.net/api/v1.5/tr/translate?key=',ApiKey);
 xUrl                     := Concat(xUrl,'&lang=',xSource,'-',xTarget,'&text=');
 xUrl                     := Concat(xUrl,UTF8Encode(Value));
 xNetHTTP                 := TNetHTTPClient.Create(fParent);
 xMemoryStream            := TMemoryStream.Create;
 xOutList                 := TStringList.Create;
 XmlDoc                   := TXMLDocument.Create(fParent);
 try
   xNetHTTP.Get(xUrl,xMemoryStream);
   xMemoryStream.Position := 0;
   xOutList.LoadFromStream(xMemoryStream);
   result                 := UTF8ToWideString(xOutList.Text);
   XmlDoc.XML.Text        := Result;
   XmlDoc.Active          := True;
   Result                 := IfThen(XmlDoc.DocumentElement.ChildNodes.Count = 0 , 'Hata!' + sLineBreak + Result,XmlDoc.DocumentElement.ChildNodes['text'].Text);
 finally
   FreeAndNil(XmlDoc);
   FreeAndNil(xOutList);
   FreeAndNil(xMemoryStream);
   FreeAndNil(xNetHTTP);
 end;
end;

end.



Yandex Translate - klavye - 10-10-2018

Teşekkürler.


Yandex Translate - ozcanm - 10-10-2018

Paylaşım için teşekkürler.
Hocam düzeltme yapmak gerekiyor olabilir mi?
uses SysUtils, System.Classes, System.Net.HttpClientComponent, Xml.XMLDoc,
{$IFDEF ANDROID}
  FMX.Forms,
{$ENDIF}
{$IF DEFINED(MSWINDOWS)}
   Vcl.Forms,
{$ENDIF}
StrUtils;



Yandex Translate - uparlayan - 10-10-2018

Bu fonksiyonu bir nesneye dönüştürseniz, fonksiyon içindeki nesneleri create / destroy maliyetinden kurtarsanız kullandığınız yerdeki verim / randıman artar


Yandex Translate - uparlayan - 10-10-2018

UTF8Encode(Value) yerine TURLEncoding sınıfının Encode(Value) fonksiyonunu kullanabilirsiniz.


Yandex Translate - ozcanm - 10-10-2018

JSON kullanım örneğide aşağıdaki gibidir.
Functionda yer alan dil parametresi hangi dile çevirileceğini işaret etmektedir. Çevirisi yapılacak dil ise otomatik alğılacaktır. Çevirisi yapılacak dil bilgisi biliniyor ise ingilizce - Türkçe için "en-tr" parametresinin girilmesi gerekiyor.
Teknik dönküman;

uses
 JSON,REST.Client,Data.Bind.Components,Data.Bind.ObjectScope,IpPeerClient;
 {IpPeerClient eklemediğiniz zaman aşağıdaki uyarı mesajını alabilirsiniz!
 IPProcs is not defined. make sure IPPeerCommon (or an alternative IP Imperlementation unit ) is the uses clause. }

function YandexCeviri(ApiKey,Metin,dil:string):string;
var
 pJson         : TJSONObject;
 Sonuc         : TJSONArray;
 vRESTClient   : TRESTClient;
 vRESTRequest  : TRESTRequest;
 vRESTResponse : TRESTResponse;
Begin
 vRESTClient   :=TRESTClient.Create(nil);
 vRESTRequest  :=TRESTRequest.Create(nil);
 vRESTResponse :=TRESTResponse.Create(nil);
 Try
   vRESTClient.BaseURL       :='https://translate.yandex.net/api/v1.5/tr.json/translate';
   vRESTRequest.Client       :=vRESTClient;
   vRESTRequest.Response     :=vRESTResponse;
   vRESTResponse.ContentType :='application/json';
   vRESTRequest.AddParameter('key',ApiKey);
   vRESTRequest.AddParameter('text',Metin);
   vRESTRequest.AddParameter('lang',Dil);
   vRESTRequest.Execute;
   pJson   := TJsonObject(TJSONObject.ParseJSONValue(TEncoding.UTF8.GetBytes(vRESTResponse.Content),0));
   Sonuc   := TJSONArray(pJson.Get('text').JsonValue);
   Result  := Sonuc.Items[0].Value;
 Finally
   pJson.Free;
   FreeAndNil(vRESTClient);
   FreeAndNil(vRESTRequest);
   FreeAndNil(vRESTResponse);
 End;
End;
Kullanımı;
procedure TForm1.Button1Click(Sender: TObject);
begin
 Memo1.Text:=YandexCeviri(Edit1.Text,'Hello World!','tr');
end;



Cvp: Yandex Translate - narkotik - 10-10-2018

(10-10-2018, Saat: 10:45)uparlayan Adlı Kullanıcıdan Alıntı: Bu fonksiyonu bir nesneye dönüştürseniz, fonksiyon içindeki nesneleri create / destroy maliyetinden kurtarsanız kullandığınız yerdeki verim / randıman artar

Mantıklı olurdu, zamandan kazanmak icin ben bu sekilde yaptım.

(10-10-2018, Saat: 13:57)Cyber Adlı Kullanıcıdan Alıntı: JSON kullanım örneğide aşağıdaki gibidir.
Functionda yer alan dil parametresi hangi dile çevirileceğini işaret etmektedir. Çevirisi yapılacak dil ise otomatik alğılacaktır. Çevirisi yapılacak dil bilgisi biliniyor ise ingilizce - Türkçe için "en-tr" parametresinin girilmesi gerekiyor.
Teknik dönküman;

uses
 JSON,REST.Client,Data.Bind.Components,Data.Bind.ObjectScope,IpPeerClient;
 {IpPeerClient eklemediğiniz zaman aşağıdaki uyarı mesajını alabilirsiniz!
 IPProcs is not defined. make sure IPPeerCommon (or an alternative IP Imperlementation unit ) is the uses clause. }

function YandexCeviri(ApiKey,Metin,dil:string):string;
var
 pJson         : TJSONObject;
 Sonuc         : TJSONArray;
 vRESTClient   : TRESTClient;
 vRESTRequest  : TRESTRequest;
 vRESTResponse : TRESTResponse;
Begin
 vRESTClient   :=TRESTClient.Create(nil);
 vRESTRequest  :=TRESTRequest.Create(nil);
 vRESTResponse :=TRESTResponse.Create(nil);
 Try
   vRESTClient.BaseURL       :='https://translate.yandex.net/api/v1.5/tr.json/translate';
   vRESTRequest.Client       :=vRESTClient;
   vRESTRequest.Response     :=vRESTResponse;
   vRESTResponse.ContentType :='application/json';
   vRESTRequest.AddParameter('key',ApiKey);
   vRESTRequest.AddParameter('text',Metin);
   vRESTRequest.AddParameter('lang',Dil);
   vRESTRequest.Execute;
   pJson   := TJsonObject(TJSONObject.ParseJSONValue(TEncoding.UTF8.GetBytes(vRESTResponse.Content),0));
   Sonuc   := TJSONArray(pJson.Get('text').JsonValue);
   Result  := Sonuc.Items[0].Value;
 Finally
   pJson.Free;
   FreeAndNil(vRESTClient);
   FreeAndNil(vRESTRequest);
   FreeAndNil(vRESTResponse);
 End;
End;
Kullanımı;
procedure TForm1.Button1Click(Sender: TObject);
begin
 Memo1.Text:=YandexCeviri(Edit1.Text,'Hello World!','tr');
end;

Katkilariniz için teşekkürler

(10-10-2018, Saat: 10:31)Cyber Adlı Kullanıcıdan Alıntı: Paylaşım için teşekkürler.
Hocam düzeltme yapmak gerekiyor olabilir mi?
uses SysUtils, System.Classes, System.Net.HttpClientComponent, Xml.XMLDoc,
{$IFDEF ANDROID}
  FMX.Forms,
{$ENDIF}
{$IF DEFINED(MSWINDOWS)}
   Vcl.Forms,
{$ENDIF}
StrUtils;
Vclde derlemek icin direktifleri eklemek gerekli, kullaniminiz dogru


Cvp: Yandex Translate - edo - 10-10-2018

(10-10-2018, Saat: 10:31)Cyber Adlı Kullanıcıdan Alıntı: Paylaşım için teşekkürler.
Hocam düzeltme yapmak gerekiyor olabilir mi?
uses SysUtils, System.Classes, System.Net.HttpClientComponent, Xml.XMLDoc,
{$IFDEF ANDROID}
  FMX.Forms,
{$ENDIF}
{$IF DEFINED(MSWINDOWS)}
   Vcl.Forms,
{$ENDIF}
StrUtils;

uses SysUtils, System.Classes, System.Net.HttpClientComponent, Xml.XMLDoc, 
Forms,
StrUtils;
şeklinde sorun çıkarmaması lazım. Bu özellik/notasyonun bildiğim kadarıyla geliş amacı zaten Vcl ve Fmx uyumlu kütüphane linklerinde sorun yaşamamak olması lazım.


Yandex Translate - uparlayan - 10-10-2018

mobTranslate(fParent:TForm;..... yerine mobTranslate(fParent:TComponent;.....

şeklinde bir düzenleme yapılırsa Vcl.Forms veya Fmx.Forms'a gerek kalmaz.


Cvp: Yandex Translate - ozcanm - 10-10-2018

(10-10-2018, Saat: 16:53)edo Adlı Kullanıcıdan Alıntı:
(10-10-2018, Saat: 10:31)Cyber Adlı Kullanıcıdan Alıntı: Paylaşım için teşekkürler.
Hocam düzeltme yapmak gerekiyor olabilir mi?
uses SysUtils, System.Classes, System.Net.HttpClientComponent, Xml.XMLDoc,
{$IFDEF ANDROID}
  FMX.Forms,
{$ENDIF}
{$IF DEFINED(MSWINDOWS)}
   Vcl.Forms,
{$ENDIF}
StrUtils;

uses SysUtils, System.Classes, System.Net.HttpClientComponent, Xml.XMLDoc, 
Forms,
StrUtils;
şeklinde sorun çıkarmaması lazım. Bu özellik/notasyonun bildiğim kadarıyla geliş amacı zaten Vcl ve Fmx uyumlu kütüphane linklerinde sorun yaşamamak olması lazım.

Hocam,
Community Edition sürümü kullanıyorum. Yeni bir "Multi-Device Application"  oluşturup ilgili uniti projeye dahil edersek burada FMX yada VCL belirtmemizi istiyor.

2.png

1.png