Windows Phone 7 + Microsoft Translator V2 = 多國語言翻譯機

  • 4926
  • 0
  • 2010-11-30

Windows Phone + Microsoft Translator V2

    如果想要在手機上做一個簡單的多國語言翻譯器並不困難因為微軟已經為我們準備好了 API 來使用,想起來國中那時候要買一台無敵的多國語言翻譯機是很貴要破萬才能擁有他有時候字庫不夠還要買一塊好幾千的記憶卡來擴充,想到從前的軟硬體到現在的軟硬體真的是差很多或許有些人看了有感觸。回到主題首先我們要做這個翻譯器是從手機當輸入界面,在透過網路連到微軟的伺服進行翻譯後回傳至手機上簡單來說就是雲端服務啦,Microsoft Translator 提供了三種 API:SOAP、AJAX、 HTTP ,今天我就使用SOAP來介紹接著就按照下列步驟:

先了解一下微軟目前所支援翻譯代碼及對應名稱

   ar  阿拉伯文
   bg  保加利亞文
   zh-CHS  簡體中文
   zh-CHT  繁體中文
   cs  捷克文 
   da  丹麥文
   nl  荷蘭文 
   en  英文
   et 愛沙尼亞文
   fi  芬蘭文 
   fr 法文
   de 德文 
   el  希臘文
   ht  海地克里奧爾語
   he  希伯來文
   hu  匈牙利文
   id  印尼文
   it  義大利文
   ja  日文
   ko 韓文 
   lv  拉脫維亞文
   lt  立陶宛文
   no  挪威文 
   pl  波蘭文
   pt  葡萄牙文
   ro 羅馬尼亞文
   ru  俄文
   sk 斯洛伐克文  
   sl 斯洛維尼亞文
   es  西班牙文 
   sv  瑞典文
   th  泰文 
   tr  土耳其文
   uk  烏克蘭文
   vi  越南文

Step1:連結到 http://www.bing.com/developers/createapp.aspx 登入 Windows Live ID進行註冊,將表單上相關資料填寫完成及讀取使用條款鉤選後在按下同意鍵,就會取得AppID字串才進使用Microsoft Translator API,記得把他記錄下來等會在寫程式時要使用他。

image

Step2:開啟Microsoft Visual Studio 2010 Express for Windows Phone編輯器建立Windows Phone Application 專案

image

Step3:這次我們用最簡單的方式 SOAP來實行我們的翻譯功能,首先滑鼠移至方案總管視窗下參考節按一下滑鼠右鍵, 然後選擇加入服務參考這時會顯示加入服務參考對話方塊,在對話方塊的位置輸入 http://api.microsofttranslator.com/V2/Soap.svc 在按下Go鍵會去連結伺服找出相對應服務,最後提供服務端點名稱輸入 TranslatorService 按一下OK鍵就完成了手機跟服務端之間的通訊協定及API使用方法。

image

Step4:在來我們要設計一下手機上輸入界面,這次我先以一對多的方式就是英文轉翻多國語言,當然可以多對多就留大家去實作了,所以在MainPage畫面就設計二個文字方塊第一個是輸入英文的文字方塊第二個是英文翻譯後輸出的文字方塊,中間所加入的按鍵是用來切換翻譯語言這裡預設為繁體中文,下面在加二個按鍵翻譯鍵:將輸入的英文字進行翻譯作業第二個朗讀鍵:翻譯結果的文字進行聲音播放。

image

Step5:在專案上加入一個新的Page1,就是從剛才上面MainPage畫面語言切換鍵按一下就會進到此畫面選擇翻譯語言,此頁面只要加入一個listbox元件來顯示語言供使用者點選後返回到MainPage畫面

image

Step6:當畫面UI設計好了就可以開始來寫程式了,首先來定義一下共用變數及變數初始化,在這裡所有的方法都是非同步的方式所以一定要透過委托接受回傳值

       TranslationService.LanguageServiceClient client;
       int idx = 3;
       string AppID = "這裡輸入剛才從bing注冊appid";
       ObservableCollection<string> results;
       ObservableCollection<string> langcodes;
       ObservableCollection<string> Speak;

public MainPage()
     {
         InitializeComponent();

         //初始化SOAP服務變數
         client = new TranslationService.LanguageServiceClient();

         //執行非同步作業取得支援翻譯語言代碼,提供參數AppID
         client.GetLanguagesForTranslateAsync(AppID);
         client.GetLanguagesForTranslateCompleted += new EventHandler<GetLanguagesForTranslateCompletedEventArgs>(client_GetLanguagesForTranslateCompleted);

         //執行非同步作業取得支援朗讀語言代碼,提供參數AppID

        client.GetLanguagesForSpeakAsync(AppID);
         client.GetLanguagesForSpeakCompleted += new EventHandler<GetLanguagesForSpeakCompletedEventArgs>(client_GetLanguagesForSpeakCompleted);


     }

void client_GetLanguagesForTranslateCompleted(object sender,GetLanguagesForTranslateCompletedEventArgs e)
       {
          //將回傳可翻譯代碼放到results變數存放

           results = e.Result;

           //執行非同步作業取得翻譯代碼名稱,,提供參數AppID,"zh-CHT"為取得翻譯名稱語系舉例zh-CHT為翻譯代碼繁體中文為翻譯名稱,en為英語翻譯名稱,results則是透過剛才所取回翻譯代碼在次取回所有的翻譯名稱
           client.GetLanguageNamesAsync(AppID, "zh-CHT",results);
           client .GetLanguageNamesCompleted +=new EventHandler<GetLanguageNamesCompletedEventArgs>(client_GetLanguageNamesCompleted);
       }

void client_GetLanguageNamesCompleted(object sender, GetLanguageNamesCompletedEventArgs e)
        {
            //將回傳翻譯名稱放到langcodes變數存放

            langcodes = e.Result;
        }

void client_GetLanguagesForSpeakCompleted(object sender, GetLanguagesForSpeakCompletedEventArgs e)
       {
          //將回傳可朗讀代碼到Speak變數存放 
          Speak=e.Result;
       }

 

Step7:接著來看翻譯鍵如何使用api在翻譯鍵上點選二下就會進入到翻譯鍵Click事件,使用下列程式碼

 

private void button1_Click(object sender, RoutedEventArgs e)
       {
           //首先判斷輸入英文字是否為空值如果是的話就跳離開

            if (textBox1.Text.Length == 0)
               return;

           //執行非同步翻譯作業,提供參數AppID、textBox1.Text為所要翻譯文字、"en"為textBox1所輸入語系這次我們要做英翻多國語言所以就直接帶 “en”,results[idx]為想要翻譯成什麼語系在剛才初始化就透過GetLanguagesForTranslateAsync把回傳可翻譯代碼放到results集合所以我們可透過這個集合取得代碼值那我們的預設idx為3是繁體中文
           client.TranslateAsync(AppID, textBox1.Text, "en", results[idx]);
           client .TranslateCompleted +=new EventHandler<TranslateCompletedEventArgs>(client_TranslateCompleted);
       }

void client_TranslateCompleted(object sender, TranslateCompletedEventArgs e)
      {
         //將翻譯結果值放到textBox2元件顯示

         textBox2 .Text =e.Result;
      }

 

Step8:在來我們在ui朗讀鍵上點選二下就會進朗讀鍵Click事件,使用下列程式碼

private void button2_Click(object sender, RoutedEventArgs e)
       {
           //首先判朗讀文字是否為空值如果是的話就跳離開

          if (textBox2.Text.Length == 0)
               return;

           //接著我們判斷朗讀語係是否有支援,微軟所提供朗讀語系不多所以要透過GetLanguagesForSpeakAsync所回傳代碼來實作
           if (Speak.Contains(results[idx]))
           {

               //執行非同步朗讀作業,提供參數AppID、textBox2.text要朗讀字串、results[idx] 取得目前翻譯語言代碼當成目前朗讀語系、"audio/wav"回傳語言格式為wav檔好像也只有這一種可選所以別無選擇,目前支援的語系代碼:en、de、es、fr、it、pt、ru、ja、ko、zh-chs、zh-cht
               client.SpeakAsync(AppID, textBox2.Text, results[idx], "audio/wav");
               client.SpeakCompleted += new EventHandler<SpeakCompletedEventArgs>(client_SpeakCompleted);
           }
           else
           {
               MessageBox.Show("尚未支援");
           }
       }

void client_SpeakCompleted(object sender, SpeakCompletedEventArgs e)
        {

            //當朗讀作業完成後回傳的不是音源檔是一串url,所以我們必需要透過WebClient的OpenReadAsync讀取url的檔案

            WebClient wc = new WebClient();
            wc.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted);
            wc.OpenReadAsync(new Uri(e.Result, UriKind.Absolute));
        }

        void wc_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
        {

          //當完成讀取音源檔後使用參考Microsoft.Xna.Framework.Audio元件來播放朗讀音源
          SoundEffect sound = SoundEffect.FromStream (e.Result );
          FrameworkDispatcher.Update();
            sound .Play ();
        }

Step9:接著我們來做一下語系選擇功能,在ui繁體中文鍵上點選二下就會進此鍵Click事件,使用下列程式碼

private void button3_Click(object sender, RoutedEventArgs e)
       {
          //先判斷lang變數是否存在,若不在建立lang變數把GetLanguageNamesAsync所回傳可以翻譯名稱集合變數langcodes帶入

          if (!PhoneApplicationService.Current.State.ContainsKey("lang"))
           {
               PhoneApplicationService.Current.State.Add("lang", langcodes);
           }

           //進入語言選擇畫面
           this.NavigationService.Navigate(new Uri("/Page1.xaml", UriKind.Relative));
       }

Step10:最後到語言選擇畫面Page1設定一下ui 清單資料來源及清單點選事

protected override void OnNavigatedTo(NavigationEventArgs e)
       {
           //判斷lang變數是否存在,如果存把listbox元件帶入翻譯名稱集合到此元件顯示可供翻譯語系

           if (PhoneApplicationService.Current.State.ContainsKey("lang"))
           {
               this.listBox1.ItemsSource = PhoneApplicationService.Current.State["lang"] as ObservableCollection<string>;
           }

       }

       private void listBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
       {
         //當點選listBox元件上所顯示語系,判斷idx變是否存若在就把listBox1.SelectedIndex放到idx,如不存在就建立idx變數其值為listBox1.SelectedIndex,接著返回上一頁。

          if (PhoneApplicationService.Current.State.ContainsKey ("idx"))
           {
               PhoneApplicationService.Current.State["idx"] = listBox1.SelectedIndex;
           }
           else
           {
               PhoneApplicationService.Current.State.Add("idx", listBox1.SelectedIndex);
           }
           this.NavigationService.GoBack();
       }

Step11:程式碼都撰寫完畢後就來測試吧記得要打開網路還有喇叭要開才聽的到朗讀 

image image

以上的使用 soap api函式參考http://msdn.microsoft.com/en-us/library/ff512435.aspx