要使用Microsoft Translator Soap API實作翻譯功能,首先我們必須要有Bing的開發者ID,可至Bing Developer網站申請。可點選『註冊以使用 Bing 搜尋 API 並建立 AppID』或是透過『建立您的 AppID』開始進行申請。

接著按下『Add』按鈕新增一個應用程式。

填寫要申請的應用程式相關資訊。

都填好後系統會給予申請的應用程式一個Application ID,後續的開發會時常的需要帶入這個Application ID。

有了Application ID後,在方案總管上按下右鍵,在彈出的滑鼠右鍵快顯選單中選取Add Service Reference, Visual Studio會帶出Add Service Reference對話方塊,在Address欄位中填入http://api.microsofttranslator.com/V2/Soap.svc後按下OK,這樣就完成了引用的動作,可以直接在程式中使用到Soap API現成的類別。

接下來進入程式開發的階段,整個Microsoft Translator Soap API在使用上,最重要的類別就是LanguageServiceClient,必須建立一個LanguageServiceClient物件實體並對其操作,以完成我們想要的功能,像是偵測要翻譯的字串訊息是屬於哪種語言、如何取得可使用的語言清單、針對翻譯的內容發音、以及最重要的翻譯動作。

在偵測翻譯的字串訊息是屬於哪種語言上,我們可透過現成的API去偵測,將Application ID與要偵測的字串帶入。

http://api.microsofttranslator.com/V2/Http.svc/Detect?app ID]&text=[字串訊息]

該API會回傳入下XML。

因此在程式的撰寫上我們可以用WebRequest與WebResponse去取得網頁的內容,並擷取回傳的XML中我們感興趣的部分,就像是下面這樣:

string GetDetectedLanguage(string text) { const string DEFAULT_DETECTED_LANG = “en”;

if (String.IsNullOrEmpty(text)) return DEFAULT_DETECTED_LANG;

const string DETECT_API_URI_PATTERN = “http://api.microsofttranslator.com/V2/Http.svc/Detect?app const string MATCH_PATTERN = “]>([^<>])]*>”;

WebRequest req = WebRequest.Create(String.Format(DETECT_API_URI_PATTERN, APP_ID, text)); WebResponse resp = req.GetResponse();

string local = DEFAULT_DETECTED_LANG; using (StreamReader reader = new StreamReader(resp.GetResponseStream())) { local = reader.ReadToEnd(); local = Regex.Match(local, MATCH_PATTERN).Groups[1].Value; } return local; }

在發音方面,可透過LanguageServiceClient.GetLanguagesForSpeak與LanguageServiceClient.Speak這兩個方法來實現。LanguageServiceClient.GetLanguagesForSpeak方法可以取得所有能支援發音的語言,可以用來列表發音的語系。LanguageServiceClient.Speak則是能取得發音檔的位置,帶入要發音的字串與期望的發音語系等資訊就可以了。抓出來的發音檔位置是一串網址,可直接透過MediaPlayer的Com元件下去撥放。

string GetSpeakUri(LanguageServiceClient client, string text) { string[] langs = client.GetLanguagesForSpeak(APP_ID); string lang = (cbTranslateTo.SelectedValue == null)? “en”: cbTranslateTo.SelectedValue.ToString();

if (!langs.Contains(lang)) lang = “en”;

return client.Speak(APP_ID, tbxSource.Text, lang, “audio/wav”, string.Empty); }

而在取得能支援翻譯的語系方面,可使用LanguageServiceClient.GetLanguagesForTranslate與LanguageServiceClient.GetLanguageNames,LanguageServiceClient.GetLanguagesForTranslate可取得語系的代碼,LanguageServiceClient.GetLanguageNames則是可取得語系的名稱。若只是要以特定語系顯示能支援的語系名稱,只要像下面這樣就可以了:

string lang = “en”; string[] langs = Client.GetLanguagesForTranslate(APP_ID); string[] names = Client.GetLanguageNames(APP_ID, lang, langs);

這樣支援的語系名稱都會以英文的方式顯現,像是ja就會以Japan來顯示、en會以English。若是要以對應的語系來顯示支援的語系名稱,讓ja顯示日語、en顯示English,可以像下面這樣撰寫:

void UpdateTranslationLanguages() { string local = GetDetectedLanguage(tbxSource.Text); string[] langs = Client.GetLanguagesForTranslate(APP_ID);

var langNames = (from lang in langs.AsParallel() select new { lang, new string[] { lang })[0], Value = lang }).ToList();

cbTranslateTo.DisplayMember = “Name”; cbTranslateTo.ValueMember = “Value”; cbTranslateTo.DataSource = langNames;

if (cbTranslateTo.Items.Count > 0) cbTranslateTo.Text = Client.GetLanguageNames(APP_ID, local, new string[] { local }).FirstOrDefault(); }

最後要提的是最重要的翻譯功能,直接叫用LanguageServiceClient.Translate就可以了,帶入的參數不外乎就是Application ID、要翻譯的訊息、要翻譯的訊息是何語系、要翻譯的語系…等。

tbxTarget.Text = Client.Translate(APP_ID, tbxSource.Text, local, cbTranslateTo.SelectedValue.ToString(), “text/html”, “general”);

這邊筆者試做了個程式來展示API的功能,設計界面如下,期望該小程式能由使用者決定要翻譯的語系,能正常的翻譯到期望的語系,並具備發音的功能。

完整的範例程式如下(Application ID部分請自行補上):

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Windows.Forms; using AxWMPLib; using TranslateAPIDemo.TranslatorService;

namespace TranslateAPIDemo { public partial class Form1 : Form { #region Const private const string APP_; #endregion

#region Var private LanguageServiceClient _client; #endregion

#region Property public LanguageServiceClient Client { get { if (_client == null) _client = new LanguageServiceClient(); return _client; } } #endregion

public Form1() { InitializeComponent(); }

string GetDetectedLanguage(string text) { const string DEFAULT_DETECTED_LANG = “en”;

if (String.IsNullOrEmpty(text)) return DEFAULT_DETECTED_LANG;

const string DETECT_API_URI_PATTERN = “http://api.microsofttranslator.com/V2/Http.svc/Detect?app const string MATCH_PATTERN = “]>([^<>])]*>”;

WebRequest req = WebRequest.Create(String.Format(DETECT_API_URI_PATTERN, APP_ID, text)); WebResponse resp = req.GetResponse();

string local = DEFAULT_DETECTED_LANG; using (StreamReader reader = new StreamReader(resp.GetResponseStream())) { local = reader.ReadToEnd(); local = Regex.Match(local, MATCH_PATTERN).Groups[1].Value; } return local; }

string GetSpeakUri(LanguageServiceClient client, string text) { string[] langs = client.GetLanguagesForSpeak(APP_ID); string lang = (cbTranslateTo.SelectedValue == null)? “en”: cbTranslateTo.SelectedValue.ToString();

if (!langs.Contains(lang)) lang = “en”;

return client.Speak(APP_ID, tbxSource.Text, lang, “audio/wav”, string.Empty); }

void UpdateTranslationLanguages() { string local = GetDetectedLanguage(tbxSource.Text); string[] langs = Client.GetLanguagesForTranslate(APP_ID);

var langNames = (from lang in langs.AsParallel() select new { lang, new string[] { lang })[0], Value = lang }).ToList();

cbTranslateTo.DisplayMember = “Name”; cbTranslateTo.ValueMember = “Value”; cbTranslateTo.DataSource = langNames;

if (cbTranslateTo.Items.Count > 0) cbTranslateTo.Text = Client.GetLanguageNames(APP_ID, local, new string[] { local }).FirstOrDefault(); }

private void button1_Click(object sender, EventArgs e) { string local = GetDetectedLanguage(tbxSource.Text);

string speakUri = GetSpeakUri(Client, tbxSource.Text); if (speakUri.Length > 0) { axWindowsMediaPlayer1.URL = speakUri; axWindowsMediaPlayer1.Ctlcontrols.play(); }

if (cbTranslateTo.SelectedValue != null) tbxTarget.Text = Client.Translate(APP_ID, tbxSource.Text, local, cbTranslateTo.SelectedValue.ToString(), “text/html”, “general”); }

private void Form1_Load(object sender, EventArgs e) { UpdateTranslationLanguages(); } } }

Link

使用 Bing 進行開發

[C#] 運用微軟API 線上翻譯

Using the SOAP API

微软在线翻译API试用