Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

WPF Language Translator

0.00/5 (No votes)
4 Jan 2012 1  
A WPF application that translates text using the Bing Translation API.

Screenshot_1.png

Introduction

In this article I will describe how to go about using the Bing Translation API to develop a WPF application that provides text translation functionality.

Bing Translation API

The Bing Translation API is a service that provides instant text translation, language detection, collaborative translation[^] functionality, and text-to-speech in multiple languages. The API is currently used by some high profile websites like Facebook and eBay.

The Bing translation service is offered in various usage volume levels. High-volume usage of the service is offered at a price while it is free for low-volume usage and hobbyist use.

NB: While use of the Bing Translation API is free for low-volume usage, this is not a future guarantee. Item 14 in the Bing Web Service API Terms of Use states in part, "... We (Microsoft) may change (including by removing features or charging fees for features previously provided free), update, or enhance (collectively, "modify") the services at any time... ".

Using the Bing Translation API

In order to make use of the Translation API, you need to acquire a Bing AppID, which is free. To get a Bing AppID, go here[^], sign in with your Windows Live ID, fill out and save the application form to generate an AppID, and enable the ID.

The URL that you'll use to access the translation service should be in the following form:

http://api.microsofttranslator.com/v2/Http.svc/Translate?Parameters

The URL has four parameters which must be specified:

  • appId: The Bing AppID for your application
  • text: The text to be translated
  • from: The language to translate from, in the form of an ISO 639-1 Language Code
  • to: The language to translate to, in the form of an ISO 639-1 Language Code

The eventual URL should look something like the following:

http://api.microsofttranslator.com/v2/Http.svc/Translate?appId=1A2345B6789C2345B6789&text=Translate Me&from=en&to=es

Supported Languages

The following table shows the languages currently (as of the time of writing) supported by the Translator API and their ISO 639-1 Language Codes:

Language Code
Arabic ar
Czech cs
Danish da
German de
English en
Estonian et
Finnish fi
Dutch nl
Greek el
Hebrew he
Haitian Creole ht
Hindi hi
Hungarian hu
Indonesian id
Italian it
Japanese ja
Korean ko
Lithuanian lt
Latvian lv
Norwegian no
Polish pl
Portuguese pt
Romanian ro
Spanish es
Russian ru
Slovak sk
Slovene sl
Swedish sv
Thai th
Turkish tr
Ukranian uk
Vietnamese vi
Simplified Chinese zh-CHS
Traditional Chinese zh-CHT

WPF Language Translator

Using the translator application is a simple affair. Just run the app, enter the text you want to translate, specify the languages, and click on the Translate button to display the translated text.

Screenshot_2.png

How it Works

The GetTranslatedText() method in class Translator makes a call to the Bing Translator service and returns a string containing the translated text.

VB.NET

''' <summary>
''' Get translated text from Bing Translator service.
''' </summary>
''' <param name="textToTranslate">Text to translate.</param>
''' <param name="fromLang">Language to translate from.</param>
''' <param name="toLang">Language to translate to.</param>
''' <returns>Translated text</returns>
Public Function GetTranslatedText(ByVal textToTranslate As String, ByVal fromLang As String, _
                               ByVal toLang As String) As String
    Dim translation As String

    ' Translate only if specified languages are different.
    If (fromLang <> toLang) Then
        Dim uri As String = "http://api.microsofttranslator.com/v2/Http.svc/Translate?appId=" & _
                        appID & "&text=" & textToTranslate & "&from=" & fromLang & "&to=" & toLang

        Dim request As HttpWebRequest = CType(WebRequest.Create(uri), HttpWebRequest)

        Try
            Using response As WebResponse = request.GetResponse
                Dim strm As Stream = response.GetResponseStream
                Using sr As New StreamReader(strm)
                    translation = sr.ReadToEnd
                End Using
            End Using
        Catch ex As WebException
            MessageBox.Show("Ensure that you are connected to the internet.", _
                            "Translator", MessageBoxButton.OK, MessageBoxImage.Stop)
            Exit Function
        End Try
    Else
        MessageBox.Show("Will not translate to the same language.", "Translator", _
                        MessageBoxButton.OK, MessageBoxImage.Exclamation)
        Exit Function
    End If

    ' Parse string into an XElement and get the XElement Value
    ' which is returned as the translated text.
    Return (XElement.Parse(translation).Value)
End Function

C#

/// <summary>
/// Get translated text from Bing Translator service.
/// </summary>
/// <param name="textToTranslate">Text to translate.</param>
/// <param name="fromLang">Language to translate from.</param>
/// <param name="toLang">Language to translate to.</param>
/// <returns>Translated text.</returns>
public string GetTranslatedText(string textToTranslate, string fromLang, string toLang)
{
    string translation;

    if (fromLang != toLang)
    {
        string uri = "http://api.microsofttranslator.com/v2/Http.svc/Translate?appId=" +
                    appID + "&text=" + textToTranslate + "&from=" + 
                    fromLang + "&to=" + toLang;

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);

        try
        {
            WebResponse response = request.GetResponse();
            Stream strm = response.GetResponseStream();
            StreamReader sr = new StreamReader(strm);
            translation = sr.ReadToEnd();

            response.Close();
            sr.Close();
        }
        catch (WebException)
        {
            MessageBox.Show("Ensure that you are connected to the internet.",
                        "Translator", MessageBoxButton.OK, MessageBoxImage.Stop);
            return (string.Empty);
        }
    }
    else
    {
        MessageBox.Show("Will not translate to the same language.", 
                        "Translator", MessageBoxButton.OK, 
                        MessageBoxImage.Exclamation);
        return (string.Empty);
    }

    // Parse string into an XElement and get the XElement Value
    // which is returned as the translated text.
    return (XElement.Parse(translation).Value);
}

After setting the value of the string variable, translation, we will end up with an XML string that looks something like the following:

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">Translated Text</string>

I then use the XElement.Parse() method to parse the XML string into an XElement object and return the translated text, using the XElement Value property.

NB: You will first need to set the value of the appID field in the class Translator before running the project available from the downloadable source.

VB.NET

' Specify your Bing AppId
Private appID As String = ""

C#

// Specify your Bing appId
private string appID = "";

The Translator class also contains a property that returns a List(Of Language) / List<Language> object that is used to set the ItemsSource property of the language combo boxes.

VB.NET

''' <summary>
''' Returns a List(Of Language)
''' </summary>    
Public ReadOnly Property LanguageList() As List(Of Language)
    Get
        Return (langList.OrderBy(Function(l) l.lang).ToList)
    End Get
End Property

C#

/// <summary>
/// Returns a List<Language>
/// </summary>
public List<language> LanguageList
{
    get
    {
        return (langList.OrderBy(l => l.lang).ToList());
    }
}

The class Language contains two fields and overrides ToString().

VB.NET

Public Class Language
    Public lang As String
    Public langCode As String

    Public Overrides Function ToString() As String
        Return (lang)
    End Function
End Class

C#

class Language
{
    public string lang;
    public string langCode;

    public override string ToString()
    {
        return (lang);
    }
}

The List(Of Language) / List<Language> object in the class Translator is populated by the PopulateLanguageList() method that is called by the class' constructor.

VB.NET

Private Sub PopulateLanguageList()
    langList.Add(New Language With {.lang = "Arabic", .langCode = "ar"})
    langList.Add(New Language With {.lang = "Czech", .langCode = "cs"})
    langList.Add(New Language With {.lang = "Danish", .langCode = "da"})
    langList.Add(New Language With {.lang = "German", .langCode = "de"})        
    ...
End Sub

C#

private void PopulateLanguageList()
{
    langList.Add(new Language {lang = "Arabic", langCode = "ar"});
    langList.Add(new Language {lang = "Czech", langCode = "cs"});
    langList.Add(new Language {lang = "Danish", langCode = "da"});
    langList.Add(new Language {lang = "German", langCode = "de"});
    ...
}

I use this approach to make it easier to get the ISO Language Codes based on the languages specified in the combo boxes.

VB.NET

fromLang = CType(FromLanguageCmbBox.SelectedValue, Language).langCode
toLang = CType(ToLanguageCmbBox.SelectedValue, Language).langCode

C#

fromLang = ((Language)FromLanguageCmbBox.SelectedValue).langCode;
toLang = ((Language)ToLanguageCmbBox.SelectedValue).langCode;

Conclusion

That's it, I hope that you have picked up something useful from this article.

History

  • 2nd Jan, 2012: Initial post.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here