(转)利用Google在线翻译引擎制作自己的多国语言翻译机
出处:http://www.blogjava.net/ekinglong/archive/2006/11/12/80704.html?Pending=true#Post
本文介绍如何利用Google在线翻译引擎来制作自己的多国语言翻译器。本程序利用Google的在线翻译引擎实现汉语到英语,英语到汉语,英语到日语的单词,整句的翻译。因为是在命令行运行,不支持\n,不能对文章、段落进行翻译,不过稍微做一个Application 程序扩展一下就可以了。
本类可以直接在命令行下使用:
java ekinglong.languageEngine.GoogleTranslationEngine2 [text] [langpair]
java ekinglong.languageEngine.GoogleTranslationEngine2 hello en - ja
java ekinglong.languageEngine.GoogleTranslationEngine2 hello,the world ! en - cn
java ekinglong.languageEngine.GoogleTranslationEngine2 你好 世界 cn - en
/** */ /** * 利用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); } }