Note:
GoogleTranslator
was originally written when screen scraping was the only way to access Google's online translation tools. As has been rightly pointed out in this article's forum, a more modern approach would be to use Google's AJAX APIs. See this link for more information. This screen scraper version of GoogleTranslator
continues to be maintained at the request of CP readers.
This latest version of GoogleTranslator
utilizes Google Translate's AJAX APIs to translate text and retrieves the translation by parsing the returned JSON content. Thanks to CPians @Airstriker82, @Member 9899010 and @bgsjust for pointing me to these APIs. The latest version of the code also includes the ability to speak the translation from the demo app. Because Google limits the speech to common words in a few languages, don't be surprised if the demo plays dumb when you try to speak your translated text!
What is it?
|
GoogleTranslator is an object that allows you to translate text using the power of Google's online language tools. The demo app also allows you to easily perform a reverse translation. The app can be used as a poor man's resource translator for simple phrases, but you'd be wise to confirm the translation with a native speaker before using the results. |
How do I use it?
You use GoogleTranslator
by constructing it and calling its Translate()
method.
using RavSoft.GoogleTranslator;
Translator t = new GoogleTranslator();
string translation = t.Translate ("Hello, how are you?", "English", "French");
Console.WriteLine (translation);
Console.WriteLine ("Translated in " + t.TranslationTime.TotalMilliseconds + " mSec");
Console.WriteLine ("Translated speech = " + t.TranslationSpeechUrl);
How it works
GoogleTranslator works by directly invoking Google's translation API called by its online translation form and parsing the results.
this.Error = null;
this.TranslationSpeechUrl = null;
this.TranslationTime = TimeSpan.Zero;
DateTime tmStart = DateTime.Now;
string translation = string.Empty;
try {
string url = string.Format ("https://translate.googleapis.com/translate_a/single?client=gtx&sl={0}&tl={1}&dt=t&q={2}",
Translator.LanguageEnumToIdentifier (sourceLanguage),
Translator.LanguageEnumToIdentifier (targetLanguage),
HttpUtility.UrlEncode (sourceText));
string outputFile = Path.GetTempFileName();
using (WebClient wc = new WebClient ()) {
wc.Headers.Add ("user-agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 " +
"(KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36");
wc.DownloadFile(url, outputFile);
}
if (File.Exists (outputFile)) {
string text = File.ReadAllText(outputFile);
int index = text.IndexOf (string.Format(",,\"{0}\"", Translator.LanguageEnumToIdentifier (sourceLanguage)));
if (index == -1) {
int startQuote = text.IndexOf('\"');
if (startQuote != -1) {
int endQuote = text.IndexOf('\"', startQuote + 1);
if (endQuote != -1) {
translation = text.Substring(startQuote + 1, endQuote - startQuote - 1);
}
}
}
else {
text = text.Substring(0, index);
text = text.Replace("],[", ",");
text = text.Replace("]", string.Empty);
text = text.Replace("[", string.Empty);
text = text.Replace("\",\"", "\"");
}
string[] phrases = text.Split (new[] { '\"' }, StringSplitOptions.RemoveEmptyEntries);
for (int i=0; (i < phrases.Count()); i += 2) {
string translatedPhrase = phrases[i];
if (translatedPhrase.StartsWith(",,")) {
i--;
continue;
}
translation += translatedPhrase + " ";
}
translation = translation.Trim();
translation = translation.Replace(" ?", "?");
translation = translation.Replace(" !", "!");
translation = translation.Replace(" ,", ",");
translation = translation.Replace(" .", ".");
translation = translation.Replace(" ;", ";");
this.TranslationSpeechUrl = string.Format ("https://translate.googleapis.com/translate_tts?ie=UTF-8&q={0}&tl={1}&total=1&idx=0&textlen={2}&client=gtx",
HttpUtility.UrlEncode (translation),
Translator.LanguageEnumToIdentifier (targetLanguage),
translation.Length);
}
}
catch (Exception ex) {
this.Error = ex;
}
this.TranslationTime = DateTime.Now - tmStart;
return translation;
As you can see, the logic used to parse the JSON result is very simple!
Speaking the translation
The Translator
object retrieves the URL that will stream the spoken version of the translation. The demo app speaks this content by navigating to this URL in a hidden browser control. As mentioned in the preamble, because Google limits the speech to common words in a few languages, don't be surprised if the demo plays dumb when you try to speak your translated text!
Revision History
- 18 Mar 2016
Switched to Google Translate plugin APIs. Fix identified by User-12366202. Thank you!
- 6 Aug 2015
Corrected parsing logic. Fix identified by Member 11019371. Thank you!
- 6 May 2015
Corrected parsing logic to fix translation of single words.
- 5 May 2015
Corrected Google URL.
Removed all external dependencies.
- 9 Mar 2014
Switched to using Google's JSON translation APIs.
Added TranslationTime
and TranslationSpeakUrl
properties.
Tweaked demo app UI to assist in reverse translation and resetting an English source and target.
- 13 Jan 2013
Added support for current full language set.
Refixed bug that limited translation to first sentence.
Fixed a bug that caused reverse translation to fail when accented characters were present.
- 10 Mar 2010
Added support for current full language set.
Fixed bug that limited translation to first sentence.
- 15 Feb 2010
Even more parsing tweakage.
- 28 Mar 2009
More parsing tweakage.
- 20 Mar 2007
Tweaked parsing logic to conform to changes at Google's website.
- 15 Jan 2006
Initial version.