WPF 语言翻译器






4.92/5 (34投票s)
一个使用 Bing 翻译 API 进行文本翻译的 WPF 应用程序。
引言
在本文中,我将介绍如何使用 Bing 翻译 API 开发一个提供文本翻译功能的 WPF 应用程序。
Bing 翻译 API
Bing 翻译 API 是一项提供即时文本翻译、语言检测、协作翻译[^] 功能以及多种语言文本转语音的服务。该 API 目前被 Facebook 和 eBay 等一些知名网站使用。
Bing 翻译服务提供不同级别的用量。高用量使用服务是收费的,而低用量和爱好者使用是免费的。
注意: 虽然 Bing 翻译 API 的低用量使用是免费的,但这并非未来保证。Bing 网页服务 API 使用条款第 14 条部分内容指出,“……我们(Microsoft)可以随时更改(包括删除功能或对先前免费提供的功能收费)、更新或增强(统称为“修改”)服务……”。
使用 Bing 翻译 API
为了使用翻译 API,您需要获取一个免费的 Bing AppID。要获取 Bing AppID,请在此处[^]前往,使用您的 Windows Live ID 登录,填写并保存申请表以生成 AppID,然后启用该 ID。
您将用于访问翻译服务的 URL 应采用以下形式
http://api.microsofttranslator.com/v2/Http.svc/Translate?Parameters
URL 包含四个必须指定的参数
appId
:您应用程序的 Bing AppIDtext
:要翻译的文本from
:要从中翻译的语言,格式为 ISO 639-1 语言代码to
:要翻译到的语言,格式为 ISO 639-1 语言代码
最终的 URL 应该类似于以下内容
http://api.microsofttranslator.com/v2/Http.svc/Translate?appId=1A2345B6789C2345B6789&text=Translate Me&from=en&to=es
支持的语言
下表显示了翻译 API 当前(截至撰写本文时)支持的语言及其 ISO 639-1 语言代码
语言 | 代码 |
阿拉伯语 | ar |
Czech | cs |
Danish | da |
German | de |
English | en |
Estonian | et |
Finnish | fi |
Dutch | nl |
Greek | el |
希伯来语 | he |
海地克里奥尔语 | ht |
印地语 | hi |
Hungarian | hu |
印度尼西亚语 | id |
Italian | it |
Japanese | ja |
Korean | ko |
立陶宛语 | lt |
Latvian | lv |
Norwegian | 否 |
波兰语 | pl |
葡萄牙语 | pt |
罗马尼亚语 | ro |
西班牙语 | es |
俄语 | ru |
斯洛伐克语 | sk |
斯洛文尼亚语 | sl |
瑞典语 | sv |
泰语 | th |
土耳其语 | tr |
乌克兰语 | uk |
越南语 | vi |
Simplified Chinese | zh-CHS |
Traditional Chinese | zh-CHT |
WPF 语言翻译器
使用翻译应用程序是一个简单的过程。只需运行应用程序,输入要翻译的文本,指定语言,然后单击“翻译”按钮即可显示翻译后的文本。
工作原理
Translator
类中的 GetTranslatedText()
方法会调用 Bing Translator 服务,并返回一个包含翻译文本的字符串。
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);
}
设置字符串变量 translation
的值后,我们将得到一个类似如下的 XML 字符串
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">Translated Text</string>
然后,我使用 XElement.Parse()
方法将 XML 字符串解析为 XElement
对象,并使用 XElement
的 Value
属性返回翻译后的文本。
注意:在运行可从下载源获取的项目之前,您需要先设置 Translator
类中 appID
字段的值。
VB.NET
' Specify your Bing AppId
Private appID As String = ""
C#
// Specify your Bing appId
private string appID = "";
Translator
类还包含一个返回 List(Of Language)
/ List<Language>
对象的属性,该对象用于设置语言组合框的 ItemsSource
属性。
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());
}
}
Language
类包含两个字段并重写了 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);
}
}
Translator
类中的 List(Of Language)
/ List<Language>
对象由 PopulateLanguageList()
方法填充,该方法由类的构造函数调用。
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"});
...
}
我使用此方法可以更轻松地根据组合框中指定的语言获取 ISO 语言代码。
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;
结论
就是这样,希望您能从本文中有所收获。
历史
- 2012 年 1 月 2 日:首次发布。