[置顶] 微软翻译接口
经过若干次谷歌和度娘,发现提供翻译接口的有2家,一个是google的,还有个就是microsoft,后来发现google的翻译接口,不是免费的,而且经常调用接口就会限制访问,所以就只能用微软的,微软的接口也是要收费的,不过有个翻译内容数量的限制。
下面是两家提供翻译的连接,本人英语也很懒,不能说的很全面,如果需要全面的资料还是浏览官方的网站吧。
Google Translate:https://developers.google.com/translate/?hl=zh-CN
Microsoft Translate:http://msdn.microsoft.com/en-us/library/dd576287.aspx
外国的互联网公司稍微有点良知,最起码在赚钱的同时,也同时回馈了社会,国内简直没有提供这样服务的网站(这里不爽的吐槽下)。
下面简简述用Java访问微软翻译接口,翻译字符串的方法。
要使用微软的翻译接口,必须首先注册微软的Marketplace,然后填写发布软的名称,分别得到一个软件名称和一个key,这个基本上和现在各个广告平台和第三方接口的模式差不多。
在使用翻译的接口前,发送请求,提交你的名称和key,然后得到token,然后在发送需要翻译的内容加token,最后得到的就是翻译后的内容。
由于在获取token的时候,必须使用post请求,返回的数据是json,所以在使用的时候,额外引用了第三方jar包,commons-httpclient.jar、commons-logging-1.0.4.jar、org.json.jar等。
下面是代码部分:
1、第一部分读取本地配置,包括名称、key、微软支持的语种类型(38种,真的很强大,),以及需要翻译的内容。
private void getTokenFromMs() throws HttpException, IOException { MCLog.i("Begin to get token."); HttpClient client = new HttpClient(); PostMethod postMethod = new PostMethod("https://datamarket.accesscontrol.windows.net/v2/OAuth2-13"); postMethod.addParameter("grant_type", "client_credentials"); postMethod.addParameter("client_id", "xxx"); postMethod.addParameter("client_secret", "xxxxxxxx"); postMethod.addParameter("scope", "http://api.microsofttranslator.com"); client.executeMethod(postMethod); String body = postMethod.getResponseBodyAsString(); try { JSONObject jsonObj = new JSONObject(body); tokenText = jsonObj.getString("access_token"); MCLog.i("Success get token."); MCLog.i("token = %s .", tokenText); } catch (JSONException e) { e.printStackTrace(); } }
上面的xxx的地方写上自己的软件的名称和key。
2、开启线程池,使用线程池来发送请求,翻译数据,翻译的速度真的很快,。
Properties pro = I18n.getInstance().getProperties();
ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 5);
CompletionService<TextOut> completionService = new ExecutorCompletionService<TextOut>(executorService);
Iterator<Object> iterator = pro.keySet().iterator();
int cout = 0;
while (iterator.hasNext()) {
final String key = iterator.next().toString();
completionService.submit(new Callable<TextOut>() {
public TextOut call() throws Exception {
Translator translate = new Translator();
TextOut ce = translate.translate("en", key, in.getEneitys());
return ce;
}
});
cout++;
}
for (int i = 0; i < cout; i++) {
TextOut ce = null;
try {
ce = completionService.take().get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
if (ce != null) {
onTranslate(ce);
}
}
3、翻译的代码
public synchronized TextOut translate(String from, String to, List<Entity> entitys) { if (token == null) { throw new RuntimeException("Token is null."); } list.clear(); MultiThreadedHttpConnectionManager manager = new MultiThreadedHttpConnectionManager(); HttpClient client = new HttpClient(manager); HttpMethod getMethod = null; for (Entity e : entitys) { String name = e.getName(); String text = e.getText(); String url = "http://api.microsofttranslator.com/v2/Http.svc/Translate?From={0}&To={1}&Text={2}"; MessageFormat message = new MessageFormat(url); try { url = message.format(new Object[] { URLEncoder.encode(from, "utf-8"), URLEncoder.encode(to, "utf-8"), URLEncoder.encode(text, "utf-8") }); getMethod = new GetMethod(url); getMethod.addRequestHeader("Authorization", authorization); client.executeMethod(getMethod); String body = getMethod.getResponseBodyAsString(); getMethod.releaseConnection(); Entity entity = new Entity(name, body.replaceAll("<([^>]*)>", "")); list.add(entity); MCLog.i("Translate %s is completing in %s.", name, to); } catch (HttpException ex) { ex.printStackTrace(); } catch (IOException ex) { ex.printStackTrace(); } } TextOut out = new TextOut(to, list); if (onTranslateCompleteCallback != null) { onTranslateCompleteCallback.onTranslateCompleteCallback(out); } return out; }
上面翻译的核心代码就是发送一个get请求,使用url传参技术,但是在请求前,必须先编码,不然会有错误,我在使用的时候,就出现过这样的错误。
比如翻译hello是没有问题的,如果翻译welcome to china。那么就会出现问题,因为中间有空格,在url中当然不能出现空格了,所以必须先编码下。
比如我翻译loading,得到数据内容是这样的。
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">正在加载。</string>然后把xml的标签全部去掉,就得到翻译的结构了。
body = body.replaceAll("<([^>]*)>", "")
最后使用Java中的Future,当所有的任务完成的时候,调用回调。
public interface OnTranslateCallback { public void onTranslate(int current, int count); public void onComplete(List<TextOut> outs); }
好的,打完收工,,如有问题,欢迎指导。