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.
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
Public Function GetTranslatedText(ByVal textToTranslate As String, ByVal fromLang As String, _
ByVal toLang As String) As String
Dim translation As String
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
Return (XElement.Parse(translation).Value)
End Function
C#
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);
}
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
Private appID As String = ""
C#
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
Public ReadOnly Property LanguageList() As List(Of Language)
Get
Return (langList.OrderBy(Function(l) l.lang).ToList)
End Get
End Property
C#
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.