Follow me on Twitter

First time here?

Check out the Archive, and Subscribe to the RSS feed.

Translate text in C#, using Google Translate

This post was written on March 12, 2009 00:14 by martinhn

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.

Comments

March 13. 2009 22:31

trackback

Trackback from dnknormark.net

Automatically translate Global and Local Resource (resx) files

dnknormark.net

May 11. 2009 22:40

Martin H. Normark

Have you tried to pass in "en|ar" as the languagePair?

Martin H. Normark

September 7. 2009 10:06

Daxii

How to translate a formatted html text, like the google translate when you type a full url?

Daxii

January 10. 2010 09:47

Lennart Øster

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("www.google.com/translate_t{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

Lennart Øster

March 9. 2010 14:48

bob

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>

bob

March 10. 2010 15:52

MartinHN

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.

MartinHN

Add comment


(Will show your Gravatar icon)

  Country flag

biuquote
  • Comment
  • Preview
Loading



Powered by BlogEngine.NET 1.6.0.0

Disclaimer

The opinions expressed herein are my own personal opinions and do not represent my employer's view in  anyway.

© Copyright 2010