很是无奈,google翻译收费了,像我们一般人就用不起了.只能另想办法了.上一篇介绍了使用bing也是解决的办法之一,但是不可否认还是google翻译的更加理想.
首先下载项目所需要的jar包:jsoup-*.jar,commons-io-*.jar,commons-logging-*.jar.为了提高可扩展性我使用了接口,看代码:
package gd.hz.lily.util.translate;
/**
* 提供系统的语言翻译功能
* @author lfd
* 2013-10-01
*/
public interface TranslateUtil {
/**
* http请求的类型(如"text/html" , "text/plain")
* @param type 请求的类型
*/
public void setContentType(String type) ;
/**
* 翻译语言(自动识别源语言)
* @param text 翻译的内容
* @param srcLang 源语言
* @param targetLang 目标语言
* @return 目标语言内容
*/
public String translate(final String text, final String targetLang) throws Exception ;
/**
* 翻译语言(自动识别源语言)
* @param texts 翻译的内容数组
* @param targetLang 目标语言
* @return 目标语言内容
*/
public String[] translate(final String[] texts, final String targetLang) throws Exception ;
/**
* 翻译语言
* @param text 翻译的内容
* @param srcLang 源语言
* @param targetLang 目标语言
* @return 目标语言内容
*/
public String translate(final String text, final String srcLang, final String targetLang) throws Exception ;
/**
* 翻译语言
* @param texts 翻译的内容数组
* @param srcLang 源语言
* @param targetLang 目标语言
* @return 目标语言内容
*/
public String[] translate(final String[] texts, final String srcLang, final String targetLang) throws Exception ;
}
在这里我提供了一个枚举类,列出google所支持的翻译语言.
package gd.hz.lily.util.translate;
/**
* 谷歌翻译API定义的语言信息。
* @author lfd 改
* 2013-10-01
*/
public enum GoogleLanguage {
AUTO_DETECT(""),
AFRIKAANS("af"),
ALBANIAN("sq"),
AMHARIC("am"),
ARABIC("ar"),
ARMENIAN("hy"),
AZERBAIJANI("az"),
BASQUE("eu"),
BELARUSIAN("be"),
BENGALI("bn"),
BIHARI("bh"),
BULGARIAN("bg"),
BURMESE("my"),
CATALAN("ca"),
CHEROKEE("chr"),
CHINESE("zh"),
CHINESE_SIMPLIFIED("zh-CN"),
CHINESE_TRADITIONAL("zh-TW"),
CROATIAN("hr"),
CZECH("cs"),
DANISH("da"),
DHIVEHI("dv"),
DUTCH("nl"),
ENGLISH("en"),
ESPERANTO("eo"),
ESTONIAN("et"),
FILIPINO("tl"),
FINNISH("fi"),
FRENCH("fr"),
GALICIAN("gl"),
GEORGIAN("ka"),
GERMAN("de"),
GREEK("el"),
GUARANI("gn"),
GUJARATI("gu"),
HEBREW("iw"),
HINDI("hi"),
HUNGARIAN("hu"),
ICELANDIC("is"),
INDONESIAN("id"),
INUKTITUT("iu"),
IRISH("ga"),
ITALIAN("it"),
JAPANESE("ja"),
KANNADA("kn"),
KAZAKH("kk"),
KHMER("km"),
KOREAN("ko"),
KURDISH("ku"),
KYRGYZ("ky"),
LAOTHIAN("lo"),
LATVIAN("lv"),
LITHUANIAN("lt"),
MACEDONIAN("mk"),
MALAY("ms"),
MALAYALAM("ml"),
MALTESE("mt"),
MARATHI("mr"),
MONGOLIAN("mn"),
NEPALI("ne"),
NORWEGIAN("no"),
ORIYA("or"),
PASHTO("ps"),
PERSIAN("fa"),
POLISH("pl"),
PORTUGUESE("pt"),
PUNJABI("pa"),
ROMANIAN("ro"),
RUSSIAN("ru"),
SANSKRIT("sa"),
SERBIAN("sr"),
SINDHI("sd"),
SINHALESE("si"),
SLOVAK("sk"),
SLOVENIAN("sl"),
SPANISH("es"),
SWAHILI("sw"),
SWEDISH("sv"),
TAJIK("tg"),
TAMIL("ta"),
TAGALOG("tl"),
TELUGU("te"),
THAI("th"),
TIBETAN("bo"),
TURKISH("tr"),
UKRANIAN("uk"),
URDU("ur"),
UZBEK("uz"),
UIGHUR("ug"),
VIETNAMESE("vi"),
WELSH("cy"),
YIDDISH("yi");
/**
* 谷歌的当前语言的字符串表示形式。
*/
private final String language;
/**
* 构造函数
* @param 语言标识符。
*/
private GoogleLanguage(final String pLanguage) {
language = pLanguage;
}
public static GoogleLanguage fromString(final String pLanguage) {
for (GoogleLanguage lang : values()) {
if (pLanguage.equals(lang.toString())) {
return lang ;
}
}
return null;
}
/**
* 返回的字符串表示这种语言。
* @return 这种语言的字符串表示形式。
*/
@Override
public String toString() {
return language;
}
}
接下来看一下TranslateUtil的实现类TranslateToGoogle
package gd.hz.lily.util.translate;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
/**
* 使用google进行翻译
* @author lfd
* 2013-10-01
*/
public class TranslateToGoogle implements TranslateUtil {
private final String ID_RESULTBOX = "result_box";
private String type = "" ;
public void setContentType(String type) {
this.type = type ;
}
public String translate(String text, String targetLang) throws Exception {
return translate(text, "", targetLang) ;
}
public String[] translate(String[] texts, String targetLang)
throws Exception {
return translate(texts, "", targetLang) ;
}
public String translate(String text, String srcLang, String targetLang)
throws Exception {
return execute(text, srcLang, targetLang) ;
}
public String[] translate(String[] texts, String srcLang, String targetLang)
throws Exception {
StringBuilder content = new StringBuilder() ;
int size = texts.length ;
for(int i = 0 ; i < size ; i++) {
if(i < size-1) {
content.append(texts[i]).append("{*}") ;
} else {
content.append(texts[i]) ;
}
}
String[] temps = execute(content.toString(),srcLang , targetLang).split("\\{\\*\\}") ;
size = temps.length ;
//去除左右空白字符
for (int i = 0; i < size; i++) {
temps[i] = temps[i].trim() ;
}
return temps ;
}
/**
* 发送翻译请求
* @param text 要翻译的内容
* @param srcLang 源语言
* @param targetLang 目标语言
* @return 目标语言
* @throws Exception 翻译失败
*/
private String execute(final String text, final String srcLang,
final String targetLang) throws Exception {
inspection(srcLang, targetLang) ;
Document document = Jsoup.connect("http://translate.google.com.hk")
.data("sl", srcLang)
.data("ie", "UTF-8")
.data("oe", "UTF-8")
.data("text", text)
.data("tl", targetLang)
.data("ie", "UTF-8")
.userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.77 Safari/535.7")
.cookie("Cookie", "Cookie PREF=ID=8daa1f767f10d1fe:U=f5ac701cf7d3f2e0:FF=0:LD=en:CR=2:TM=1277174286:LM=1289370601:S=q7yslRWEZs3uK1H8; NID=39=UO-TWo9HzzjHc-d_wYm7BVR1cH33KpqaN5h5877_i29nERA93FeG1GSuV3ZSvsOx8D-TnHKpB9m0KhZRH8U9uPwoE-arYd0bAyAlILyXZxLO2_TyGQhJpcMiOLVEuCpq; SID=DQAAAHoAAADMlGzeKhnGkbkIJ36tVO0ZPXgmQ6Cth7Oa6geyyE1WJooW8P01uKUHNrsRkjggvFMAWIWB9J5i18z0F6GjC_oV79mSwXEDGuRFGhRnDyJdid3ptjFW0pIyt4_2D6AMIqtOWF71aWdvY7IvAU1AWMNs8fBZHAOgRqtf3aCUkr36ZA; HSID=A6-YJTnhjBdFWukoR")
.timeout(2000000)
.post();
Element element = document.getElementById(ID_RESULTBOX);
return element.text() ;
}
/**
* 检查Google是否支持语言.
*/
private void inspection(String srcLang, String targetLang) {
if(!"".equals(this.type)) setContentType(type) ;
if(GoogleLanguage.fromString(srcLang) == null || GoogleLanguage.fromString(targetLang) == null) {
System.out.println("Google不支持的语言") ; }
}
}
测试:
public static void main(String[] args) {
TranslateUtil translate = new TranslateToGoogle() ;
try {
System.out.println(translate.translate("世界你好!", "en")) ;
} catch (Exception e) {
e.printStackTrace();
}
}
这里需要注意,如果使用get请求是有字数限制的.