Sometimes, it would be great to be able to translate a text from e.g. English to Danish directly from C#. This could be useful when you want to translate a Resource file into another language.
Google Translate is awesome. There’s also Windows Live Translator, but Microsoft are far behind Google (also) in this game.
Code:
using System; using System.Net; using System.Text; using System.Text.RegularExpressions; namespace Utilities { public static class Translator { /// <summary> /// Translates the text. /// </summary> /// <param name="input">The input.</param> /// <param name="languagePair">The language pair.</param> /// <returns></returns> public static string TranslateText(string input, string languagePair) { return TranslateText(input, languagePair, System.Text.Encoding.UTF7); } /// <summary> /// Translate Text using Google Translate /// </summary> /// <param name="input">The string you want translated</param> /// <param name="languagePair">2 letter Language Pair, delimited by "|". /// e.g. "en|da" language pair means to translate from English to Danish</param> /// <param name="encoding">The encoding.</param> /// <returns>Translated to String</returns> public static string TranslateText(string input, string languagePair, Encoding encoding) { string url = String.Format("http://www.google.com/translate_t?hl=en&ie=UTF8&text={0}&langpair={1}", input, languagePair); string result = String.Empty; using (WebClient webClient = new WebClient()) { webClient.Encoding = encoding; result = webClient.DownloadString(url); } Match m = Regex.Match(result, "(?<=<div id=result_box dir=\"ltr\">)(.*?)(?=</div>)"); if (m.Success) result = m.Value; return result; } } }
The translated string is fetched by the RegEx close to the bottom. This could of course change, and you have to keep it up to date.
« C# TwitPic API client Automatically translate Global and Local Resource (resx) files »






Have you tried to pass in "en|ar" as the languagePair?
How to translate a formatted html text, like the google translate when you type a full url?
It seems that google has changed its layout of the result page. I choce to use the HtmlAgilityPack, which makes it much easier to handle those changes.
public static string Translate(string input, string languagePair, Encoding encoding)
{
string url = String.Format("http://www.google.com/translate_t?hl=en&ie=UTF8&text={0}&langpair={1}", input, languagePair);
string result = String.Empty;
using (WebClient webClient = new WebClient())
{
webClient.Encoding = encoding;
result = webClient.DownloadString(url);
}
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(result);
return doc.DocumentNode.SelectSingleNode("//textarea[@name='utrans']").InnerText;
}
Get the HtmlAgilityPack here: http://www.codeplex.com/htmlagilitypack
I hope this will help the translation to keep working for everyone
I am trying to user this code in c# 2008 express on Window XP.
I have modified the line below
//Match m = Regex.Match(result, "(?<=<div id=result_box dir=\"ltr\">)(.*?)(?=</>)");
to
Match m = Regex.Match(result, "(?<=overflow:auto\">)(.*?)(?<=</textarea>)");
This is returning the text but the translation pair is not working as I expected. If I pass in "HELLO MY FRIEND" "en|sp" the result is "HELLO MY FRIEND</textarea>". If I pass in "HOLA MI AMIGO" "sp|en" I get "HELLO MY FRIEND</textarea>".
If I passin "HELLO MY FRIEND" "en|da" the result is "Hello my friend</textarea>". A different font proper case but no translation. Can you throw any lighy on this problem?
Thanks in advance
Bob pointon
Hello my friend</textarea>
Hi Bob
Take a look at the comment above yours. Lennart points out, that Google may have changed their HTML markup lately – which have broken my code.
Hope you’ll get it working.