111°

使用搜狗翻译实现网页多国语言转换

在浏览器访问网页,特别是英文网页经常需要自己做翻译,特别是英文不好的盆友会非常头疼,我就是其中一员 哈。

传统的翻译软件需要手动粘贴到工具进行翻译,而且准确度不高,目前各大平台都推出了自己的在线翻译,有些平台提供了AI智能翻译,翻译的准确性有了很大的提供。

以搜狗AI平台为例就提供了中英文翻译的API,可以通过调用接口方式对中文或者英文进行互译。

下面就简单谈一下对网页进行翻译的思想。

1 HTML解析


1.1 HTML组成


Html语言是一种标记语言,类似于xml。元素通常是封装在<>中,一段标记是有<元素名称></元素名称>组成。

一般完整的HTML网页内容包括如下:

 

<!DOCTYPE html>
<html lang="en">
<head prefix="og: http://ogp.me/ns#">
<meta name="generator" content="在线HTML">
<meta charset="utf-8">
<title>Freedgo Desing</title>
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="canonical" href="https://www.freedgo.com/index.html">
<meta name="description" content="各种专业图表.">
<meta name="keywords" content="在线图表编辑器">
<script>
</script>
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
</head>
<body>
<div id="container"/>
<!-- Cookie -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/js-cookie/2.2.0/js.cookie.min.js"></script>
<!-- build:js build/js/main.js -->
<script src="/public/js/lang_select.js"></script>
<script src="/public/js/toc.js"></script>
<script src="/public/js/mobile_nav.js"></script> 
</body>
<script>

</script>
</html>
<script>
</script>

</body>
</html> 

  


1.2 如何分解HTML,获取需要翻译的文本


针对HTML元素,思路分析

  • <A>: A里面的内容通常不需要翻译,暂不考虑alt, tip。
  • <>B</>: B部分包装体里面的内容可以通过java 正则表达式对网页内容进行分组。分离出B的内容通过调用搜狗AI翻译API成中文,然后重新组织在标记<> 内。

可以通过java正则表达式处理:

private static Pattern descripitonPattern = Pattern.compile("(([<|</][^>]+>)?)([^>|<]+)?(([<|/][^>]+>)+)");

 



该表达式对html源码进行匹配获取group,其中group(3)获取到html标签中的内容,然后进行翻译获取对应的中文。在进行组合生成对应的翻译后的文件。

 

StringBuffer sb = new StringBuffer();
Matcher matcher = descripitonPattern.matcher(inputString);

while (matcher.find()) {
// sb.append(matcher.group(0));
sb.append(matcher.group(1));
String transWord = matcher.group(3);
if (!StringUtil.isEmpty(transWord)) {
transWord = transWord.trim();
try {
sb.append(transferCn(transWord));
} catch (Exception e) {
System.out.println("transWord = " + transWord);
break;
}
}
sb.append(matcher.group(4));

}


return sb.toString();// 返回文本字符串 

  

 


1.2 考虑一下特殊的标记

  • <pre> 标签的一个常见应用就是用来表示计算机的源代码,这部分通常不需要做翻译
  • <code>标签
  • Script 体内容不需要做翻译(暂未实现)
  • Style 体内容不需要做翻译(暂未实现)

2. 搜狗翻译API的使用

2.1 API调用方式

需要登录https://deepi.sogou.com
注册PID和Key
使用机器翻译->文本翻译可以实现中文到(英、日、韩、阿、俄、德、法、葡、意、西、捷、波、匈、荷、瑞、丹、芬、土、越) 的互译。

先封装用于翻译的基础方法,直接上代码如下:

public static String transferCn(String engTxt) throws IOException {


PoolingHttpClientConnectionManager manager = new PoolingHttpClientConnectionManager();
manager.setMaxTotal(400);
manager.setDefaultMaxPerRoute(30);
CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(manager)
.build();
HttpPost httpPost = new HttpPost("http://fanyi.sogou.com:80/reventondc/api/sogouTranslate");
String pid = "xxxx";

String salt = new Long(System.currentTimeMillis()).toString();
String sign = DigestUtils.md5Hex(pid + engTxt + salt + "xxxx");
//in the case, the pid with the key counts sign will be this value
// sign = "882e9c08aba3b673d055a6d1a14d0c9f";

List nvps = new ArrayList<>();
nvps.add(new BasicNameValuePair("from", "en"));
nvps.add(new BasicNameValuePair("to", "zh-CHS"));
nvps.add(new BasicNameValuePair("pid", pid));
nvps.add(new BasicNameValuePair("q", engTxt));
nvps.add(new BasicNameValuePair("salt", salt));
nvps.add(new BasicNameValuePair("sign", sign));
httpPost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
HttpRequestBase requestBase = httpPost;
requestBase.addHeader("content-type", "application/x-www-form-urlencoded");
requestBase.addHeader("accept", "application/json");
CloseableHttpResponse response = httpClient.execute(requestBase);
HttpEntity entity = response.getEntity();
String result = EntityUtils.toString(entity, "UTF-8");
Map map = JsonUtils.toObject(result, Map.class);
if (map.get("translation") != null) {
return (String) map.get("translation");
} else {
return "";
}
// return result;


} 

  

原文链接:https://www.cnblogs.com/csy2019/p/10910971.html

全部评论: 0

    我有话说: