Konuyu Oyla:
  • Derecelendirme: 5/5 - 2 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Yandex Translate
#1
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.
Yalnızım ama bir kente yürüyen ordu gibiyim, edebiyattan kaçınmalıyım..
Cevapla
#2
Teşekkürler.
Cevapla
#3
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;
Cevapla
#4
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
YouTube Delphi Tips
"Mantıklı adam kendini dünyaya uyarlar; mantıksız adam ise dünyayı kendine uydurmakta inat eder. Bu nedenle, tüm ilerleme o inatçı adama bağlıdır." - George Bernard Shaw
WWW
Cevapla
#5
UTF8Encode(Value) yerine TURLEncoding sınıfının Encode(Value) fonksiyonunu kullanabilirsiniz.
YouTube Delphi Tips
"Mantıklı adam kendini dünyaya uyarlar; mantıksız adam ise dünyayı kendine uydurmakta inat eder. Bu nedenle, tüm ilerleme o inatçı adama bağlıdır." - George Bernard Shaw
WWW
Cevapla
#6
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;
Cevapla
#7
(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
Yalnızım ama bir kente yürüyen ordu gibiyim, edebiyattan kaçınmalıyım..
Cevapla
#8
(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.
Cevapla
#9
mobTranslate(fParent:TForm;..... yerine mobTranslate(fParent:TComponent;.....

şeklinde bir düzenleme yapılırsa Vcl.Forms veya Fmx.Forms'a gerek kalmaz.
YouTube Delphi Tips
"Mantıklı adam kendini dünyaya uyarlar; mantıksız adam ise dünyayı kendine uydurmakta inat eder. Bu nedenle, tüm ilerleme o inatçı adama bağlıdır." - George Bernard Shaw
WWW
Cevapla
#10
(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
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Yandex Map quiet1day 1 1.098 02-12-2021, Saat: 12:25
Son Yorum: forumcuali
  translate.yandex.com sitesinden bilgi parser etme delhici 15 7.969 02-12-2020, Saat: 22:40
Son Yorum: delhici



Konuyu Okuyanlar: 1 Ziyaretçi