UPDATE
The Google Translate API has been officially deprecated an alternative is the Microsoft Translator V2, check this article for more details.
In this post i will show you how work with the Google Translate API V2 (Labs), this API lets you automatically translates text from one language to another.
Disclaimer
- This version of the Google Translate API is in Labs, and its features might change unexpectedly until it graduates.
- The Google Translate API requires the use of an API key, which you can get from the Google APIs console
- Before to use this API check the Google Translate API Terms of Use.
To use the Google Translate API you must send a HTTP GET request to its URI.
The URI for a request has the following format:
Example to making a request to translate the Hello World text from English (en) to Spanish (es) the URI must be constructed in this way
https://www.googleapis.com/language/translate/v2?key=INSERT-YOUR-KEY&source=en&target=es&q=Hello%20world
The response in JSON format will be
{"data":{"translations":[{"translatedText":"Hola Mundo"}]}}
To activate the auto-detection of the source language you must avoid the use of the source keyword
https://www.googleapis.com/language/translate/v2?key=INSERT-YOUR-KEY&target=es&q=Hello%20world
and the JSON response in this case will be
{"data":{"translations":[{"translatedText":"Hola a todos","detectedSourceLanguage":"en"}]}
if you pass incorrect parameters the response will look like this
{"error":{"errors":[{"domain":"global","reason":"invalid","message":"Invalid Value"}],"code":400,"message":"Invalid Value"}}
some conversions between languages are not allowed by the API, in thi case you will get a response of this type
{"error":{"errors":[{"domain":"global","reason":"badRequest","message":"Bad language pair: en|zh-TW"}],"code":400,"message":"Bad language pair: en|zh-TW"}}
Now I will show 3 ways to process the data
Using the JSON – SuperObject , this library is very well written and is very easy to use, also is compatible with olders versions of Delphi and Freepascal (win32/64 linux32/64).
function Translate_JSONsuperobject(const Text:string;Source,Dest:TGoogleLanguages):string; var XMLHTTPRequest: IXMLHTTPRequest; EncodedRequest: string; Response : string; begin Result:=''; if Source=Autodetect then //build the URI EncodedRequest:=Format(GoogleTranslateUrlAuto,[GoogleLanguageApiKey,GoogleLanguagesArr[Dest],HTTPEncode(Text)]) else EncodedRequest:=Format(GoogleTranslateUrl,[GoogleLanguageApiKey,HTTPEncode(Text),GoogleLanguagesArr[Source],GoogleLanguagesArr[Dest]]); XMLHTTPRequest := CoXMLHTTP.Create; XMLHTTPRequest.open('GET', EncodedRequest, False, EmptyParam, EmptyParam); //Make the request XMLHTTPRequest.send(''); Response:=XMLHTTPRequest.responseText; if Response<>'' then begin if SO(Response)['error']=nil then //all ok Result := SO(Response)['data.translations[0].translatedText'].AsString else //exist an error response Result := Format('Error Code %d message %s',[SO(Response)['error.code'].AsInteger,SO(Response)['error.message'].AsString]); Result:=HTMLDecode(Result); end; end;
Using the DBXJSON unit included since Delphi 2010
function Translate_DBXJSON(const Text:string;Source,Dest:TGoogleLanguages):string; var XMLHTTPRequest: IXMLHTTPRequest; EncodedRequest: string; json : TJSONObject; jPair : TJSONPair; jValue : TJSONValue; Response : string; begin Result:=''; if Source=Autodetect then //buil the URI EncodedRequest:=Format(GoogleTranslateUrlAuto,[GoogleLanguageApiKey,GoogleLanguagesArr[Dest],HTTPEncode(Text)]) else EncodedRequest:=Format(GoogleTranslateUrl,[GoogleLanguageApiKey,HTTPEncode(Text),GoogleLanguagesArr[Source],GoogleLanguagesArr[Dest]]); XMLHTTPRequest := CoXMLHTTP.Create; XMLHTTPRequest.open('GET', EncodedRequest, False, EmptyParam, EmptyParam); //make the request XMLHTTPRequest.send(''); Response:=XMLHTTPRequest.responseText; if Response<>'' then begin json := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(Response),0) as TJSONObject; //create a TJSONObject instance try jPair := json.Get(0); if jPair.JsonString.value='error' then //if error in response Result := Format('Error Code %s message %s',[TJSONObject(jPair.JsonValue).Get(1).JsonValue.Value,TJSONObject(jPair.JsonValue).Get(2).JsonValue.Value]) else //all ok, show the response, begin jValue := TJSONArray(TJSONObject(jPair.JsonValue).Get(0).JsonValue).Get(0); Result := TJSONObject(jValue).Get(0).JsonValue.Value; end; finally json.Free; end; Result:=HTMLDecode(Result); end; end;
and finally without using JSON, a very ugly way, but works.
function Translate_JSONLess(const Text:string;Source,Dest:TGoogleLanguages):string; const TagIOk='{"data":{"translations":[{"translatedText":"'; TagFOk='"}]}}'; TagErr='{"error":{"errors":[{'; TagAut=',"detectedSourceLanguage":"'; var XMLHTTPRequest: IXMLHTTPRequest; EncodedRequest: string; Response : string; begin Result:=''; if Source=Autodetect then //build the URI EncodedRequest:=Format(GoogleTranslateUrlAuto,[GoogleLanguageApiKey,GoogleLanguagesArr[Dest],HTTPEncode(Text)]) else EncodedRequest:=Format(GoogleTranslateUrl,[GoogleLanguageApiKey,HTTPEncode(Text),GoogleLanguagesArr[Source],GoogleLanguagesArr[Dest]]); XMLHTTPRequest := CoXMLHTTP.Create; XMLHTTPRequest.open('GET', EncodedRequest, False, EmptyParam, EmptyParam); //make the request XMLHTTPRequest.send(''); Response:=XMLHTTPRequest.responseText; if Response<>'' then begin if StartsStr(TagErr,(Response)) then //Response Error begin Result:='Error' end else begin //Response Ok if Source=Autodetect then begin Result:=StringReplace(Response,TagIOk,'',[rfReplaceAll]); //remove tags Result:=Copy(Result,1,Pos(TagAut,Result)-2);//remove tags end else begin Result:=StringReplace(Response,TagIOk,'',[rfReplaceAll]);//remove tags Result:=StringReplace(Result,TagFOk,'',[rfReplaceAll]);//remove tags end; end; Result:=HTMLDecode(Result); end; end;
Check the full source showing the 3 ways to access the Google Translate API, listed in this entry.
program GoogleAPITranslate; //Author : Rodrigo Ruz V. 2010-12-03 03;30 A.M {$APPTYPE CONSOLE} {$DEFINE USE_SUPER_OBJECT} {$DEFINE USE_DBXJSON} {$DEFINE USE_JSONLess} uses msxml ,Activex ,HTTPApp ,Variants ,SysUtils {$IFDEF USE_JSONLess} ,StrUtils {$ENDIF} {$IFDEF USE_SUPER_OBJECT} ,superobject {$ENDIF} {$IFDEF USE_DBXJSON} ,DBXJSON {$ENDIF} ; type TGoogleLanguages= (Autodetect,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); const GoogleLanguagesArr : array[TGoogleLanguages] of string = ( 'Autodetect','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'); //¡¡¡¡¡¡Please be nice and create your own Google Api Key ¡¡¡¡¡¡¡ GoogleLanguageApiKey ='AIzaSyDb18pd1IfkYyupC2XUIANcRoB3f9J2DJg'; GoogleTranslateUrl ='https://www.googleapis.com/language/translate/v2?key=%s&q=%s&source=%s&target=%s'; GoogleTranslateUrlAuto ='https://www.googleapis.com/language/translate/v2?key=%s&target=%s&q=%s'; {$IFDEF USE_DBXJSON} function Translate_DBXJSON(const Text:string;Source,Dest:TGoogleLanguages):string; var XMLHTTPRequest: IXMLHTTPRequest; EncodedRequest: string; json : TJSONObject; jPair : TJSONPair; jValue : TJSONValue; Response : string; begin Result:=''; if Source=Autodetect then EncodedRequest:=Format(GoogleTranslateUrlAuto,[GoogleLanguageApiKey,GoogleLanguagesArr[Dest],HTTPEncode(Text)]) else EncodedRequest:=Format(GoogleTranslateUrl,[GoogleLanguageApiKey,HTTPEncode(Text),GoogleLanguagesArr[Source],GoogleLanguagesArr[Dest]]); XMLHTTPRequest := CoXMLHTTP.Create; XMLHTTPRequest.open('GET', EncodedRequest, False, EmptyParam, EmptyParam); XMLHTTPRequest.send(''); Response:=XMLHTTPRequest.responseText; if Response<>'' then begin json := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(Response),0) as TJSONObject; try jPair := json.Get(0); if jPair.JsonString.value='error' then //{"error":{"errors":[{"domain":"global","reason":"invalid","message":"Invalid Value"}],"code":400,"message":"Invalid Value"}} Result := Format('Error Code %s message %s',[TJSONObject(jPair.JsonValue).Get(1).JsonValue.Value,TJSONObject(jPair.JsonValue).Get(2).JsonValue.Value]) else begin //{"data":{"translations":[{"translatedText":"Hola a todos","detectedSourceLanguage":"en"}]}} jValue := TJSONArray(TJSONObject(jPair.JsonValue).Get(0).JsonValue).Get(0); Result := TJSONObject(jValue).Get(0).JsonValue.Value; end; finally json.Free; end; Result:=HTMLDecode(Result); end; end; {$ENDIF} {$IFDEF USE_SUPER_OBJECT} function Translate_JSONsuperobject(const Text:string;Source,Dest:TGoogleLanguages):string; var XMLHTTPRequest: IXMLHTTPRequest; EncodedRequest: string; Response : string; begin Result:=''; if Source=Autodetect then EncodedRequest:=Format(GoogleTranslateUrlAuto,[GoogleLanguageApiKey,GoogleLanguagesArr[Dest],HTTPEncode(Text)]) else EncodedRequest:=Format(GoogleTranslateUrl,[GoogleLanguageApiKey,HTTPEncode(Text),GoogleLanguagesArr[Source],GoogleLanguagesArr[Dest]]); XMLHTTPRequest := CoXMLHTTP.Create; XMLHTTPRequest.open('GET', EncodedRequest, False, EmptyParam, EmptyParam); XMLHTTPRequest.send(''); Response:=XMLHTTPRequest.responseText; if Response<>'' then begin //{"data":{"translations":[{"translatedText":"Hola a todos","detectedSourceLanguage":"en"}]}} if SO(Response)['error']=nil then Result := SO(Response)['data.translations[0].translatedText'].AsString else //{"error":{"errors":[{"domain":"global","reason":"invalid","message":"Invalid Value"}],"code":400,"message":"Invalid Value"}} //{"error":{"errors":[{"domain":"global","reason":"badRequest","message":"Bad language pair: en|zh-TW"}],"code":400,"message":"Bad language pair: en|zh-TW"}} Result := Format('Error Code %d message %s',[SO(Response)['error.code'].AsInteger,SO(Response)['error.message'].AsString]); Result:=HTMLDecode(Result); end; end; {$ENDIF} {$IFDEF USE_JSONLess} function Translate_JSONLess(const Text:string;Source,Dest:TGoogleLanguages):string; const TagIOk='{"data":{"translations":[{"translatedText":"'; TagFOk='"}]}}'; TagErr='{"error":{"errors":[{'; TagAut=',"detectedSourceLanguage":"'; var XMLHTTPRequest: IXMLHTTPRequest; EncodedRequest: string; Response : string; begin Result:=''; if Source=Autodetect then EncodedRequest:=Format(GoogleTranslateUrlAuto,[GoogleLanguageApiKey,GoogleLanguagesArr[Dest],HTTPEncode(Text)]) else EncodedRequest:=Format(GoogleTranslateUrl,[GoogleLanguageApiKey,HTTPEncode(Text),GoogleLanguagesArr[Source],GoogleLanguagesArr[Dest]]); XMLHTTPRequest := CoXMLHTTP.Create; XMLHTTPRequest.open('GET', EncodedRequest, False, EmptyParam, EmptyParam); XMLHTTPRequest.send(''); Response:=XMLHTTPRequest.responseText; if Response<>'' then begin if StartsStr(TagErr,(Response)) then //Response Error begin Result:='Error' end else begin //Response Ok if Source=Autodetect then begin Result:=StringReplace(Response,TagIOk,'',[rfReplaceAll]); Result:=Copy(Result,1,Pos(TagAut,Result)-2); end else begin Result:=StringReplace(Response,TagIOk,'',[rfReplaceAll]); Result:=StringReplace(Result,TagFOk,'',[rfReplaceAll]); end; end; Result:=HTMLDecode(Result); end; end; {$ENDIF} Const Text ='"Hello World"'; Var TranslatedText : string; begin try CoInitialize(nil); try {$IFDEF USE_JSONLess} Writeln('Without JSON (very ugly)'); Writeln(''); TranslatedText:=Translate_JSONLess(Text,Autodetect,Spanish); Writeln(TranslatedText); TranslatedText:=Translate_JSONLess(Text,English,Chinese_Traditional); Writeln(TranslatedText); TranslatedText:=Translate_JSONLess(Text,English,German); Writeln(TranslatedText); TranslatedText:=Translate_JSONLess(Text,English,Danish); Writeln(TranslatedText); TranslatedText:=Translate_JSONLess(Text,English,Portuguese); Writeln(TranslatedText); Writeln(''); {$ENDIF} {$IFDEF USE_SUPER_OBJECT} Writeln('Using the superobject library'); Writeln(''); TranslatedText:=Translate_JSONsuperobject(Text,Autodetect,Spanish); Writeln(TranslatedText); TranslatedText:=Translate_JSONsuperobject(Text,English,Chinese_Traditional); Writeln(TranslatedText); TranslatedText:=Translate_JSONsuperobject(Text,English,German); Writeln(TranslatedText); TranslatedText:=Translate_JSONsuperobject(Text,English,Danish); Writeln(TranslatedText); TranslatedText:=Translate_JSONsuperobject(Text,English,Portuguese); Writeln(TranslatedText); Writeln(''); {$ENDIF} {$IFDEF USE_DBXJSON} Writeln('Using the DBXJSON unit'); Writeln(''); TranslatedText:=Translate_DBXJSON(Text,Autodetect,Spanish); Writeln(TranslatedText); TranslatedText:=Translate_DBXJSON(Text,English,Chinese_Traditional); Writeln(TranslatedText); TranslatedText:=Translate_DBXJSON(Text,English,German); Writeln(TranslatedText); TranslatedText:=Translate_DBXJSON(Text,English,Danish); Writeln(TranslatedText); TranslatedText:=Translate_DBXJSON(Text,English,Portuguese); Writeln(TranslatedText); Writeln(''); {$ENDIF} finally CoUninitialize; end; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; Readln; end.