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

本文介绍了如何利用搜狗翻译API进行网页内容的多国语言转换。通过解析HTML,提取需要翻译的文本,结合Java正则表达式与搜狗的翻译接口,实现了从HTML到多种语言的智能翻译。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

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

HTML解析

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>

如何分解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();// 返回文本字符串

在这里插入图片描述

考虑一下特殊的标记

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

搜狗翻译API的使用

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;


    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值