本文介紹如何利用Google在線翻譯引擎來製作自己的多國語言翻譯器。本程序利用Google的在線翻譯引擎實現漢語到英語,英語到漢語,英語到日語的單詞,整句的翻譯。因爲是在命令行運行,不支持/n,不能對文章、段落進行翻譯,不過稍微做一個Application 程序擴展一下就可以了。
因爲是剛剛接觸java 的網絡編程,如果有不當之錯,還請各位看官指證。
本類可以直接在命令行下使用:
java ekinglong.languageEngine.GoogleTranslationEngine2 [text] [langpair]
說明:
[text]表示要翻譯的文本,可以有空格,這樣支持英語的整句翻譯。
[langpair]是指定翻譯語言對值。這個翻譯引擎類支持“漢語譯英語”,“英語譯漢語”和“英語譯日語”,它們分別對應的翻譯語言對值是:cn-en , en-cn , en-ja。
示例如下:
示例1:將英語“hello”翻譯成“日語”
java ekinglong.languageEngine.GoogleTranslationEngine2 hello en - ja
結果1:
翻譯內容:hello
Google翻譯結果:こんにちは
示例2:翻譯英文句子“hello, the world!”到中文。
java ekinglong.languageEngine.GoogleTranslationEngine2 hello,the world ! en - cn
結果2:
翻譯內容:hello, the world !
Google翻譯結果:你好,世界 !
示例3:將漢語“你好 世界”翻譯成英語
java ekinglong.languageEngine.GoogleTranslationEngine2 你好 世界 cn - en
翻譯內容:你好 世界
Google翻譯結果:Hello world
下面是實現代碼:
/**
* 利用Google在線翻譯引擎實現多國語言互譯
* 這裏只使用google的對譯項目
* 目前只針對中日英,且因爲google不提供中日直接互譯,
* 所以,此引擎也不能進行中日對譯
*
* @author ekinglong
* @version 1.0 06/10/30
*/
package ekinglong.languageEngine;
import java.io. * ;
import java.net. * ;
public class GoogleTranslationEngine2 {
// 定義互譯語言對常數變量,符合google頁面相關對譯語言對的值
public static final String LANGPAIR_CN_EN = " zh-CN|en " ; // 漢語到英語
public static final String LANGPAIR_EN_CN = " en|zh-CN " ; // 英語到漢語
public static final String LANGPAIR_EN_JA = " en|ja " ; // 英語到日語
// 定義編碼常數
public static final String CHARSET_CN = " GBK " ;
public static final String CHARSET_JA = " Shift_JIS " ;
// google在線翻譯引擎url
static final String engineUrl = " http://translate.google.com/translate_t " ;
/*
* 利用google在線翻譯引擎實現翻譯,並獲取翻譯內容
* @param translateText 要翻譯的文本內容
* @param langpair 對譯語言的值對,如en|ja是由英語翻譯到日語
*/
public String translate(String translateText,String langpair)
throws MalformedURLException,IOException,UnsupportedEncodingException {
// text是google翻譯頁面提交時對於欲翻譯文字的變量名
// langpair是google翻譯頁面提交時對於採用何種互對語言的變量名
String urlstr = engineUrl + " ?text= " + encodeText(translateText) + " &langpair= " + langpair;
URL url = new URL(urlstr);
URLConnection connection = (HttpURLConnection)url.openConnection();
connection.setRequestProperty( " User-agent " , " IE/6.0 " ); // 必須,否則報錯,到於FF的怎麼寫,沒做過測試
connection.connect();
String charset = getCharsetFromLangpair(langpair); // 自動獲取目標語言的編碼
BufferedReader in = new BufferedReader( new
InputStreamReader(connection.getInputStream(),charset)); // 使用指定編碼接收數據
String line = null ;
StringBuilder sb = new StringBuilder();
while ((line = in.readLine()) != null ) {
sb.append(line);
}
in.close();
String translation = getContent(sb.toString());
return translation;
}
/**
* 從獲得的源文件中剝取翻譯內容
* 分析google翻譯生成的html源碼來看
* 翻譯內容被置於<div id=result_box dir=ltr>和</div>標籤之間
* @param htmltext 獲得的網業源代碼
*/
private String getContent(String htmltext) {
String ss = " <div id=result_box dir=ltr> " ;
String se = " </div> " ;
int ssidx = htmltext.indexOf(ss);
int seidx = htmltext.indexOf(se,ssidx);
String restr = htmltext.substring(ssidx + ss.length(),seidx);
return restr;
}
// 將文本進行URL編碼
private String encodeText(String text) {
String str = java.net.URLEncoder.encode(text);
return str;
}
/**
* 根據翻譯的目標語言獲取對應的接收編碼
*
* @langpair 對譯語言的值對,如en|ja是由英語翻譯到日語
*/
private String getCharsetFromLangpair(String langpair) {
// 當翻譯的目標語言爲日語時,採用Shift+JIS編碼接收數據
if (langpair.equals(LANGPAIR_EN_JA))
return CHARSET_JA;
else return CHARSET_CN;
}
public static void main(String[] args) throws Exception {
GoogleTranslationEngine2 engine = new GoogleTranslationEngine2();
String text = " hello " ;
String langpair = " en|ja " ;
if (args.length >= 2 ) {
StringBuilder sb = new StringBuilder();
for ( int i = 0 ;i < args.length - 1 ;i ++ ) {
sb.append(args[i]).append( " " );
}
text = sb.toString();
String tmp = args[args.length - 1 ];
// 因爲在cmd.exe中|是特殊字符,所以不能直接指定翻譯對,如"en|ja"所以轉一下
if (tmp.equals( " cn-en " )) langpair = GoogleTranslationEngine2.LANGPAIR_CN_EN;
else if (tmp.equals( " en-cn " )) langpair = GoogleTranslationEngine2.LANGPAIR_EN_CN;
else if (tmp.equals( " en-ja " )) langpair = GoogleTranslationEngine2.LANGPAIR_EN_JA;
else throw new Exception( " 語言對指定錯誤 " );
}
String rst = engine.translate(text,langpair);
System.out.println( " 翻譯內容: " + text);
System.out.println( " Google翻譯結果: " + rst);
}
}