Click here to Skip to main content
Licence CPOL
First Posted 1 Jan 2012
Views 10,161
Downloads 2,097
Bookmarked 63 times

WPF Language Translator

By | 4 Jan 2012 | Article
A WPF application that translates text using the Bing Translation API.
Prize winner in Competition "Best VB.NET article of January 2012"

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, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Meshack Musundi

Software Developer

Kenya Kenya

Member

Meshack is an avid programmer with a bias towards WPF and VB.NET. He currently resides in a small town in Kiambu county, Kenya.
 
Awards;
  • CodeProject MVP 2012
  • Best VB.NET article of February 2012
  • Best VB.NET article of January 2012
  • Best VB.NET article of November 2011
  • Best VB.NET article of June 2011
  • Best VB.NET article of May 2011
  • Best VB.NET article of March 2011
  • Best VB.NET article of February 2011
  • Best VB.NET article of January 2011
  • Best VB.NET article of December 2010
  • Best VB.NET article of November 2010


Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
GeneralMy vote of 5 Pinmember@k@ ?4:08 28 Feb '12  
GeneralRe: My vote of 5 PinmvpMeshack Musundi20:27 1 Mar '12  
GeneralMy vote of 5 PinmentorMd. Marufuzzaman19:52 7 Feb '12  
GeneralRe: My vote of 5 PinmvpMeshack Musundi19:49 9 Feb '12  
GeneralNice effort PinmemberLakamraju Raghuram16:40 6 Feb '12  
GeneralRe: Nice effort PinmvpMeshack Musundi20:35 6 Feb '12  
GeneralMy vote of 5 PinmemberJαved8:58 6 Feb '12  
GeneralRe: My vote of 5 PinmvpMeshack Musundi20:33 6 Feb '12  
GeneralMy vote of 5 PinassociateSteve Maier3:22 6 Feb '12  
GeneralRe: My vote of 5 PinmvpMeshack Musundi20:31 6 Feb '12  
GeneralMy vote of 5 PinmemberJan Zumwalt12:40 11 Jan '12  
GeneralRe: My vote of 5 PinmvpMeshack Musundi4:36 12 Jan '12  
QuestionNice article PinmemberRatish Philip0:17 4 Jan '12  
GeneralRe: Nice article PinmemberMeshack Musundi1:00 4 Jan '12  
QuestionGreat Article :) PinmemberKelvin Armstrong21:13 3 Jan '12  
GeneralRe: Great Article :) PinmemberMeshack Musundi23:43 3 Jan '12  

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Mobile
Web03 | 2.5.120517.1 | Last Updated 4 Jan 2012
Article Copyright 2012 by Meshack Musundi
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid