[C#.NET] 利用 Microsoft Translator 翻譯

  • 10071
  • 0

[C#.NET] 利用 Microsoft Translator 翻譯

Microsoft Translator 提供一些翻譯功能,可讓我們在線上進行翻譯,它提供了Web Widget,API,只要善用它們,你將能縮短開發的時間


The Translator Web Widget

翻譯小工具,可以讓你的Blog或網站瞬間變成其他語言,使用步驟參考http://msdn.microsoft.com/en-us/library/ff512392.aspx

image_thumb[3]

image


線上翻譯

當你想要翻譯某個網頁時,利用這個網頁

image_thumb[4]


申請AppID:

Microsoft Translator有三種通訊協定讓開發人員使用,AJAX、HTTP、SOAP(http://msdn.microsoft.com/en-us/library/ff512423.aspx),要使用這個API之前我們需要申請一個APPID,

image_thumb[2]

請先前往http://www.bing.com/toolbox/bingdeveloper/進行申請動作

image_thumb[5]

image_thumb[6]


SOAP Service:

參考http://msdn.microsoft.com/en-us/library/ff512435.aspx

Add Service Reference:

SOAP Service加入參考http://api.microsofttranslator.com/V2/Soap.svc

image_thumb[8]

在Winform專案加入以下程式碼進行翻譯

TranslatorService.LanguageServiceClient client = new TranslatorService.LanguageServiceClient(); 
result = client.Translate("AppId", "Translate this text into German", "en", "zh-TW", "text/html", "general"); 
Console.WriteLine(result);

LanguageServiceClient 是這個服務最主要的類別,翻譯的功能就靠它

我想再把這服務包成自己的類別,我在使用這個服務時,所引用的LanguageServiceClient類別都會出錯,不知道為什麼,知道的人可以告訴我一下嗎?但如果是在Winform專案直接引用SOAP服務是沒有問題的

image_thumb[9]

加入Web Service Reference

為了解決這問題我改用Add Web Service

image_thumb[11]

加入後我們可以看到SoapService類別,這功能跟LanguageServiceClient是一樣的 
image_thumb[12]

程式碼實作

加入以下程式碼

{
    private string _AppId = "自己申請的APPID";
    public string AppId
    {
        set
        {
            if (string.IsNullOrEmpty(value))
                this._AppId = "自己申請的APPID";
        }
    }

    private string _LanguageID = "en";
    public string LanguageID
    {
        get
        {
            return _LanguageID;
        }
        set
        {
            _LanguageID = value;
        }
    }

    private string _LanguageName;
    public string LanguageName
    {
        get
        {
            return _LanguageName;
        }
        set
        {
            _LanguageName = value;
        }
    }

    private SoapService _Client = new SoapService();
    public SoapService Client
    {
        get
        {
            return _Client;
        }
        set
        {
            _Client = value;
        }
    }
    private Dictionary<string, string> _SupportLanguages = new Dictionary<string, string>();
    public Dictionary<string, string> SupportLanguages
    {
        get
        {
            return _SupportLanguages;
        }
        set
        {
            _SupportLanguages = value;
        }
    }
    public Language()
    : this("自己申請的APPID")
    {
    }

    public Language(string AppId)
    {
        if (string.IsNullOrEmpty(AppId))
        {
            throw new ArgumentNullException("AppId");
        }
        this.AppId = AppId;
        this.GetSupportLanguage();
    }

    Dictionary<string, string> GetSupportLanguage()
    {
        Dictionary<string, string> languages = new Dictionary<string, string>();
        string[] locals = this._Client.GetLanguagesForTranslate(this._AppId);
        string[] names = this._Client.GetLanguageNames(this._AppId, "en", locals);
        for (int i = 0; i < locals.Length; i++)
        {
            languages[locals[i]] = names[i];
        }
        this.SupportLanguages = languages;
        return languages;
    }

    public string GetOriginalLanguageID(string Original)
    {
        string local = LanguageID;

        if (String.IsNullOrEmpty(Original))
            return local;

        local = this.Client.Detect(this._AppId, Original);

        return local;
    }

    public string[] GetLanguageIDs(string[] Originals)
    {
        string[] result = this.Client.DetectArray(this._AppId, Originals);
        return result;
    }

    public string GetLanguageName(string LanguageID)
    {
        string value = this.SupportLanguages[LanguageID];
        return value;
    }

    public string GetTranslation(string Original, string TargetLanguage)
    {
        string local = GetOriginalLanguageID(Original);
        return this.Client.Translate(this._AppId, Original, local, TargetLanguage, "text/html", "general");
    }

    public string GetSpeakUri(string SpeakData)
    {
        string speakLanguage = GetOriginalLanguageID(SpeakData);
        string speakUri = this.Client.Speak(this._AppId, SpeakData, speakLanguage, "audio/wav", string.Empty);
        return speakUri;
    }
}

然後在單元測試裡寫下測試程式,TargetLanguage 的值是English的Language Code,請參考:http://msdn.microsoft.com/en-us/library/hh456380.aspx

///A test for GetTranslation
///</summary>
[TestMethod()]
public void GetTranslationTest()
{
    Language target = new Language(); // TODO: Initialize to an appropriate value
    string Original = "我真的很愛你"; // TODO: Initialize to an appropriate value
    string TargetLanguage = "en"; // TODO: Initialize to an appropriate value
    string expected = "I really love you"; // TODO: Initialize to an appropriate value
    string actual;
    actual = target.GetTranslation(Original, TargetLanguage);
    Assert.AreEqual(expected, actual);
}

當然也能讓它來段繞口令

///A test for GetSpeakUri
///</summary>
[TestMethod()]
public void GetSpeakUriTest()
{
    Language target = new Language(); // TODO: Initialize to an appropriate value
    string Original = "和尚端湯上塔,塔滑湯灑湯燙塔;和尚端塔上湯,湯滑塔灑塔燙湯。"; // TODO: Initialize to an appropriate value
    string expected = "http://api.microsofttranslator.com/V2/http.svc/Speak?appId=TYab6eWIB4oV07OH1GHHeW6cZWPWU0caHAfhvrZP8UgmDnArAiot3H1dq4QQo9dYL&text=%e5%92%8c%e5%b0%9a%e7%ab%af%e6%b9%af%e4%b8%8a%e5%a1%94%ef%bc%8c%e5%a1%94%e6%bb%91%e6%b9%af%e7%81%91%e6%b9%af%e7%87%99%e5%a1%94%ef%bc%9b%e5%92%8c%e5%b0%9a%e7%ab%af%e5%a1%94%e4%b8%8a%e6%b9%af%ef%bc%8c%e6%b9%af%e6%bb%91%e5%a1%94%e7%81%91%e5%a1%94%e7%87%99%e6%b9%af%e3%80%82&language=zh-CHT&format=audio%2fwav"; // TODO: Initialize to an appropriate value
    string actual;
    actual = target.GetSpeakUri(Original);
}


PS.因為每次所回傳到appId都會不一樣,導致 expected 每次產生出來的連結都會不一樣,所以沒有辦法用Assert來處理

PS.請自行用撥放器撥放取回的SpeakUri


HTTP Service:

參考http://msdn.microsoft.com/en-us/library/ff512419.aspx

用法有別於SOAP,他是利用HttpRequest來處理的。

下段範例來自於http://msdn.microsoft.com/en-us/library/ff512421.aspx

{
    string appId = "";//go to http://msdn.microsoft.com/en-us/library/ff512386.aspx to obtain AppId.
    string text = "Translate this for me";
    string from = "en";
    string to = "fr";

    string uri = "http://api.microsofttranslator.com/v2/Http.svc/Translate?appId=" + appId +
        "&text;=" + HttpUtility.UrlEncode(text) + "&from;=" + from + "&to;=" + to;

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

    WebResponse response = null;
    try
    {
        response = httpWebRequest.GetResponse();
        using (Stream stream = response.GetResponseStream())
        {
            System.Runtime.Serialization.DataContractSerializer dcs = new System.Runtime.Serialization.DataContractSerializer(Type.GetType("System.String"));
            string translation = (string)dcs.ReadObject(stream);
            Console.WriteLine("The translated text is: '" + translation + "'.");
        }
    }
    catch (WebException e)
    {
        //TODO: Process Web Exception
        //ProcessWebException(e, "Failed to translate");
    }
    finally
    {
        if (response != null)
        {
            response.Close();
            response = null;
        }
    }
}


AJAX Service:

http://msdn.microsoft.com/en-us/library/ff512404.aspx

也能輕鬆的給Web Browser使用

下段範例來自於http://msdn.microsoft.com/en-us/library/ff512406.aspx

    var languageFrom = "en";
    var languageTo = "es";
    var text = "translate this.";

    function translate() {
        window.mycallback = function(response) { alert(response); }

        var s = document.createElement("script");
        s.src = "http://api.microsofttranslator.com/V2/Ajax.svc/Translate?oncomplete=mycallback&appId=myAppId&from=" + languageFrom + "&to=" + languageTo + "&text=" + text;
        document.getElementsByTagName("head")[0].appendChild(s);
    }
</script>


若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo