[C#.NET] 利用 Microsoft Translator 翻譯
Microsoft Translator 提供一些翻譯功能,可讓我們在線上進行翻譯,它提供了Web Widget,API,只要善用它們,你將能縮短開發的時間
翻譯小工具,可以讓你的Blog或網站瞬間變成其他語言,使用步驟參考http://msdn.microsoft.com/en-us/library/ff512392.aspx
線上翻譯:
當你想要翻譯某個網頁時,利用這個網頁
申請AppID:
Microsoft Translator有三種通訊協定讓開發人員使用,AJAX、HTTP、SOAP(http://msdn.microsoft.com/en-us/library/ff512423.aspx),要使用這個API之前我們需要申請一個APPID,
請先前往http://www.bing.com/toolbox/bingdeveloper/進行申請動作
SOAP Service:
參考http://msdn.microsoft.com/en-us/library/ff512435.aspx
Add Service Reference:
將SOAP Service加入參考http://api.microsofttranslator.com/V2/Soap.svc
在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服務是沒有問題的
加入Web Service Reference
為了解決這問題我改用Add Web Service
加入後我們可以看到SoapService類別,這功能跟LanguageServiceClient是一樣的
程式碼實作
加入以下程式碼
{
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