65.9K
CodeProject 正在变化。 阅读更多。
Home

WPF 语言翻译器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.92/5 (34投票s)

2012年1月2日

CPOL

3分钟阅读

viewsIcon

107865

downloadIcon

12043

一个使用 Bing 翻译 API 进行文本翻译的 WPF 应用程序。

Screenshot_1.png

引言

在本文中,我将介绍如何使用 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 AppID
  • text:要翻译的文本
  • 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 语言翻译器

使用翻译应用程序是一个简单的过程。只需运行应用程序,输入要翻译的文本,指定语言,然后单击“翻译”按钮即可显示翻译后的文本。

Screenshot_2.png

工作原理

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 对象,并使用 XElementValue 属性返回翻译后的文本。

注意:在运行可从下载源获取的项目之前,您需要先设置 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 日:首次发布。
© . All rights reserved.