Translate text in C#, using Google Translate, revisited
A long time ago, I wrote a blog post about how to translate text in C# using Google Translate. Since then, an official AJAX API has been released, which is a much better solution. Reading the comments of the blog post indicates that the code was broken quite quickly!
Google’s AJAX Language API, also includes functionality to detect language from a given string. All you can do on translate.google.com you can do via the API. Reading the class reference for the Translation API, for Flash and other Non-Javascript environments gives us the information we need to perform translations from C#. Most important is the URL and the parameters required and accepted.
Another very important thing we can read in the documentation is this:
Applications MUST always include a valid and accurate http referer header in their requests
We must remember to add a valid referrer when making the actual call!
The response object
Google’s AJAX Language APIs uses JSON, and returns a JSON object containing 3 properties:
- responseData
- responseDetails
- responseStatus
This means we need to have some C# objects that we can use to deserialize the JSON returned from Google. I’m using a generic class called GoogleAjaxResponse
using System.Runtime.Serialization; namespace Milkshake.Integration.Google { /// Defines a response from one of Google's AJAX APIs. /// The type of object, being returned. [DataContract] public class GoogleAjaxResponse
To deserialize the Translation specific JSON, I use the TranslationResponse class:
using System.Net; using System.Runtime.Serialization; namespace Milkshake.Integration.Google.Translate { /// Defines a response from the Google AJAX Translate API. [DataContract] public class TranslationResponse { /// Initializes a new instance of the class. public TranslationResponse() { this.ResponseStatus = HttpStatusCode.OK; } /// Gets or sets the translated text. /// The translated text. [DataMember(Name = "translatedText", Order = 0)] public string TranslatedText { get; set; } /// Gets or sets the response details. /// The response details. [DataMember(Name = "responseDetails", Order = 1)] public object ResponseDetails { get; set; } /// Gets or sets the response status. /// The response status. [DataMember(Name = "responseStatus", Order = 2)] public HttpStatusCode ResponseStatus { get; set; } } }
Calling the Google AJAX Translate API
To make the actual call, we can use the HttpWebRequest and HttpWebResponse classes.
using System; using System.Globalization; using System.IO; using System.Net; using System.Web; using System.Web.Script.Serialization; namespace Milkshake.Integration.Google.Translate { /// An API Client for the Google AJAX Translate API. public class TranslateApi { /// The JavaScript serializer private JavaScriptSerializer _Serializer = new JavaScriptSerializer(); /// Translates the text. public string TranslateText(string inputText, string sourceLanguage, string destinationLanguage, string referrer, string apiKey) { string requestUrl = string.Format("http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q={0}&langpair={1}|{2}&key={3}", HttpUtility.UrlEncode(inputText), sourceLanguage.ToLowerInvariant(), destinationLanguage.ToLowerInvariant(), apiKey); try { using (HttpClient http = new HttpClient(requestUrl)) { http.AddReferrer(referrer); http.ExecuteRequest(); string responseJson = http.GetResponseString(); GoogleAjaxResponse
The response JSON and translated text
Doing a simple test, I translate “Hello world” from English to Danish, and I can see that it works like ng "image")](GHOST_URL/wp-content/uploads/2010/10/image.png)