目錄
由於項目需要,我整理了網上一些跟在線翻譯有關的資料,做了一個整合Google和百度翻譯的Demo程序。大概工作就是將Google翻譯和百度翻譯的Web在線版本功能移植PC客戶端,用的是它們提供的一些翻譯API(非付費)。功能簡單,原理也不復雜,記下來希望能夠幫助一些人。以下是截圖:
“麻雀雖小五臟俱全”,由於支持兩種翻譯方式,所以可以將一些共性抽象出來,放在一個獨立的接口當中(假如以后擴展更多種翻譯方式,也會方便很多)。我們定義一個“翻譯接口”ITranslator,負責翻譯的兩個類分別為GoogleTranslator和BaiduTranslator。ITranslator接口代碼如下:
1 /// <summary> 2 /// 翻譯器接口 所有翻譯器必須實現該接口 3 /// </summary> 4 interface ITranslator 5 { 6 /// <summary> 7 /// 翻譯方法 8 /// </summary> 9 /// <param name="srcTxt"></param> 10 /// <param name="srcLanguage"></param> 11 /// <param name="desLanguage"></param> 12 /// <returns></returns> 13 string TranslateText(string srcTxt, string srcLanguage, string desLanguage); 14 /// <summary> 15 /// 翻譯結果發音URL 16 /// </summary> 17 string TranslateSpeechURL 18 { 19 get; 20 } 21 /// <summary> 22 /// 所有支持的語言 23 /// </summary> 24 List<string> AllSupportedLanguages 25 { 26 get; 27 } 28 /// <summary> 29 /// 本次翻譯耗時 30 /// </summary> 31 double TranslateTime 32 { 33 get; 34 } 35 }
兩個翻譯類(GoogleTranslator和BaiduTranslator)均實現該接口。UI界面直接依賴於ITranslator接口,不會直接依賴於兩個具體的翻譯類:
以上是“依賴倒置原則”最簡單的應用場合。
使用很簡單,定義一個ITranslator接口即可:
1 itranslator = new GoogleTranslator(); 2 //翻譯 3 string translated_string = itranslator.TranslateText("我是一個地球人 ——來自Google的翻譯", "中文", "英語"); 4 //翻譯結果朗讀URL 5 string speechURL = itranslator.TranslateSpeechURL; 6 //翻譯耗時(毫秒) 7 int translate_time = (int)itranslator.TranslateTime; 8 9 itranslator = new BaiduTranslator(); 10 //翻譯 11 translated_string = itranslator.TranslateText("我是一個地球人 ——來自百度的翻譯", "中文", "德語"); 12 //翻譯結果朗讀URL 13 speechURL = itranslator.TranslateSpeechURL; 14 //翻譯耗時(毫秒) 15 translate_time = (int)itranslator.TranslateTime;
后續如果有更多種翻譯方式,可以參照GoogleTranslator和BaiduTranslator的實現。具體代碼我就不貼了,源碼中注釋很詳細。請求Web Server時用到了WebClient和WebRequest/WebResponse(前者較后者更高層、更抽象)。
- 由於有些詞語並沒有得到支持,所以翻譯的朗讀效果並不太好。
- 而且程序中是通過“http://tts.baidu.com/text2audio?lan=zh&ie=UTF-8&text=博客園”這種方式去加載音頻文件的,如果語句太長,官方web版本中是分多次加載音頻數據,但是程序中並沒有做如此處理,所以可能拋出異常。
- 另外,音頻是通過一個簡單的WebBrowser控件加載的,在有些環境中,並不能直接朗讀,需要打開系統自帶的media palyer進行播放。
- 程序中在解析服務器返回來的Json數據時,並不嚴格(可以說是很隨便)。建議實際使用過程中,可以采用專門的JSON解析工具。