当前位置: 首页 > article >正文

Java 使用腾讯翻译 API 实现含 HTML 标签文本,json值,精准翻译工具

注意:需搭配标题二的腾讯翻译工具使用

一-1、翻译标签文本工具


package org.springblade.common.utils;import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class TencentTranslationForHTML {public static void main(String[] args) {String htmlContent = "<div style=\"text-align:center\"><img src=\"http://192.168.0.137:8999/machine/upload/image/20250208/32551087576762.jpg\" alt=\"图片 alt\" width=\"350\" height=\"auto\" data-align=\"center\"></div><p style=\"text-align: center\">下料工序后的加工件</p>";try {String translatedHtml = translateHTML(htmlContent);System.out.println(translatedHtml);} catch (Exception e) {e.printStackTrace();}}public static String translateHTML(String html) throws com.tencentcloudapi.common.exception.TencentCloudSDKException {// 匹配 HTML 标签Pattern tagPattern = Pattern.compile("<[^>]+>");Matcher tagMatcher = tagPattern.matcher(html);// 存储标签位置和内容List<int[]> tagPositions = new ArrayList<>();while (tagMatcher.find()) {tagPositions.add(new int[]{tagMatcher.start(), tagMatcher.end()});}// 提取文本内容进行翻译List<String> textParts = new ArrayList<>();int lastEnd = 0;for (int[] position : tagPositions) {String textPart = html.substring(lastEnd, position[0]);if (!textPart.isEmpty()) {textParts.add(textPart);}lastEnd = position[1];}String remainingText = html.substring(lastEnd);if (!remainingText.isEmpty()) {textParts.add(remainingText);}// 调用腾讯翻译 API 翻译文本List<String> translatedParts = new ArrayList<>();for (String text : textParts) {
//            String translated = translateText(text);String translated = TencentTranslationUtil.getText(text,"zh","en");translatedParts.add(translated);}// 重新组合翻译后的文本和 HTML 标签StringBuilder result = new StringBuilder();int textPartIndex = 0;lastEnd = 0;for (int[] position : tagPositions) {int start = position[0];int end = position[1];if (start > lastEnd) {result.append(translatedParts.get(textPartIndex++));}result.append(html, start, end);lastEnd = end;}if (lastEnd < html.length()) {result.append(translatedParts.get(textPartIndex));}return result.toString();}}

一-2、翻译json工具

package org.springblade.common.utils;import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;import java.util.ArrayList;
import java.util.List;public class TencentTranslationForJson {public static void main(String[] args) {String jsonStr = "[{\"col1\":\"设备名称及数量\",\"col2\":\"铝切机、切管机\",\"$cellEdit\":false,\"$index\":0},{\"col1\":\"最大日产量\",\"col2\":\"10000 件\",\"$cellEdit\":false,\"$index\":1},{\"col1\":\"工人数量\",\"col2\":\"5 人\",\"$cellEdit\":false,\"$index\":2}]";extracted(jsonStr, "en", "zh");}public static void extracted(String jsonStr, String sourceLang, String targetLang) {// 判断是否为有效的 JSONif (isValidJson(jsonStr)) {// 解析 JSON 字符串为 JsonArrayGson gson = new Gson();JsonArray jsonArray = gson.fromJson(jsonStr, JsonArray.class);// 遍历 JSON 数组,提取需要翻译的文本List<String> textsToTranslate = new ArrayList<>();for (JsonElement element : jsonArray) {JsonObject obj = element.getAsJsonObject();for (String key : obj.keySet()) {if (obj.get(key).isJsonPrimitive() && obj.get(key).getAsJsonPrimitive().isString()) {textsToTranslate.add(obj.get(key).getAsString());}}}// 调用腾讯翻译 API 进行翻译List<String> translatedTexts = translateTexts(textsToTranslate, sourceLang, targetLang);// 将翻译结果回填到 JSON 中int index = 0;for (JsonElement element : jsonArray) {JsonObject obj = element.getAsJsonObject();for (String key : obj.keySet()) {if (obj.get(key).isJsonPrimitive() && obj.get(key).getAsJsonPrimitive().isString()) {obj.addProperty(key, translatedTexts.get(index));index++;}}}// 输出翻译后的 JSONSystem.out.println(gson.toJson(jsonArray));} else {System.out.println("输入的字符串不是有效的 JSON,不进行翻译。");}}private static boolean isValidJson(String jsonStr) {jsonStr = jsonStr.trim();if (jsonStr.isEmpty()) {return false;}// 判断是否以 '{' 或 '[' 开头,以 '}' 或 ']' 结尾if ((jsonStr.startsWith("{") && jsonStr.endsWith("}")) || (jsonStr.startsWith("[") && jsonStr.endsWith("]"))) {try {int depth = 0;boolean inString = false;for (int i = 0; i < jsonStr.length(); i++) {char c = jsonStr.charAt(i);if (inString) {if (c == '\\') {i++; // 跳过转义字符后的字符} else if (c == '"') {inString = false;}} else {if (c == '"') {inString = true;} else if (c == '{' || c == '[') {depth++;} else if (c == '}' || c == ']') {depth--;if (depth < 0) {return false; // 括号不匹配}}}}return depth == 0 && !inString; // 括号完全匹配且不在字符串中结束} catch (Exception e) {return false;}}return false;}private static List<String> translateTexts(List<String> texts, String sourceLang, String targetLang) {List<String> translatedTexts = new ArrayList<>();for (String text : texts) {String translatedText = TencentTranslationUtil.getText(text, sourceLang, targetLang);translatedTexts.add(translatedText);}return translatedTexts;}
}

二、腾讯翻译api调用

package org.springblade.common.utils;import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.tmt.v20180321.TmtClient;
import com.tencentcloudapi.tmt.v20180321.models.TextTranslateRequest;
import com.tencentcloudapi.tmt.v20180321.models.TextTranslateResponse;
import org.springblade.core.tool.utils.Func;import java.lang.reflect.Field;/*** @project* @Classname* @Description* @Author:* @CreateTime:*/
public class TencentTranslationUtil {private final static String secretId = "自己的";private final static String secretKey = "自己的";private final static String params = "isMenu,type,icon";private final TmtClient client;/*** 翻译** @param text       需要翻译的文本* @param sourceLang 来源语言* @param targetLang 目标语言* @return*/public static String getText(String text, String sourceLang, String targetLang) {TencentTranslationUtil translationClient = new TencentTranslationUtil(secretId, secretKey);if (Func.isEmpty(text.trim())) {return text;}try {return translationClient.translateText(text, sourceLang, targetLang);} catch (TencentCloudSDKException e) {System.err.println("腾讯翻译错误 = " + e.getMessage());}return "";}/*** secretId,secretKey id和密钥*/public TencentTranslationUtil(String secretId, String secretKey) {Credential cred = new Credential(secretId, secretKey);client = new TmtClient(cred, "ap-beijing");}/*** secretId,secretKey id和密钥* region 地域*/public TencentTranslationUtil(String secretId, String secretKey, String region) {Credential cred = new Credential(secretId, secretKey);client = new TmtClient(cred, region);}/*** text 需要翻译的文本* sourceLang 翻译文本的语种* targetLang 目标语种*/public String translateText(String text, String sourceLang, String targetLang) throws TencentCloudSDKException {TextTranslateRequest req = new TextTranslateRequest();req.setSourceText(text);req.setSource(sourceLang);req.setTarget(targetLang);req.setProjectId(0L);TextTranslateResponse resp = client.TextTranslate(req);return resp.getTargetText();}/*** 翻译对象每个的字段并重新给对象赋值* @param obj* @param sourceLang* @param targetLang*/public static void translateFields(Object obj, String sourceLang, String targetLang) {if (!sourceLang.equals(targetLang)) {Class<?> clazz = obj.getClass();Field[] fields = clazz.getDeclaredFields();try {for (Field field : fields) {field.setAccessible(true); // 允许访问私有字段Object value = field.get(obj);//值不为空,且是字符串,不包含透明度,值非纯数字if (Func.isNotEmpty(value) && value instanceof String&& !((String) value).contains("div") && !((String) value).contains("opacity") && !isNumeric(((String) value))) {if (!params.contains(field.getName())) {Thread.sleep(150);String text = TencentTranslationUtil.getText((String) value, sourceLang, targetLang);if (Func.isNotEmpty(text)) {field.set(obj, text); // 重新赋值翻译后的文本} else {field.set(obj, Func.toStr(value)+"(翻译失败)"); // 重新赋值翻译后的文本}}}}} catch (Exception e) {}}}public static void main(String[] args) {
//		System.out.println(getText("{\"opacity\":1,\"x\":\"67.5px\",\"y\":\"53px\",\"rotate\":0}","en","zh-TW"));
//		System.out.println("args = " + isNumeric("1s"));if(!isNumeric("1")){System.out.println("翻译");}}/*** 判断字符串是否是纯数字* @param str* @return*/public static boolean isNumeric(String str) {return str.matches("-?\\d+(\\.\\d+)?");}
}

相关文章:

Java 使用腾讯翻译 API 实现含 HTML 标签文本,json值,精准翻译工具

注意&#xff1a;需搭配标题二的腾讯翻译工具使用 一-1、翻译标签文本工具 package org.springblade.common.utils;import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern;public class TencentTranslationFor…...

前端导出pdf,所见即所得

一、推荐方案&#xff1a;html2canvas jsPDF&#xff08;图片式PDF&#xff09; javascript import html2canvas from html2canvas; import jsPDF from jspdf;const exportPDF async (elementId, fileName) > {const element document.getElementById(elementId);// 1.…...

单片机上SPI和IIC的区别

SPI&#xff08;Serial Peripheral Interface&#xff09;和IC&#xff08;Inter-Integrated Circuit&#xff09;是两种常用的嵌入式外设通信协议&#xff0c;它们各有优缺点&#xff0c;适用于不同的场景。以下是它们的详细对比&#xff1a; — 1. 基本概念 SPI&#xff0…...

03-DevOps-安装并初始化Gitlab

Gitlab可以理解为是自己搭建的GitHub&#xff0c;也就是自己的代码仓库。 开启macvlan 在192.168.1.10服务器上&#xff0c;构建Macvlan网络&#xff0c;这种网络模式可以为每个容器独立分配ip。 docker network create -d macvlan \--subnet192.168.1.0/24 \--ip-range192.16…...

RabbitMQ 从入门到精通:从工作模式到集群部署实战(五)

#作者&#xff1a;闫乾苓 系列前几篇&#xff1a; 《RabbitMQ 从入门到精通&#xff1a;从工作模式到集群部署实战&#xff08;一&#xff09;》&#xff1a;link 《RabbitMQ 从入门到精通&#xff1a;从工作模式到集群部署实战&#xff08;二&#xff09;》&#xff1a; lin…...

DFS+回溯+剪枝(深度优先搜索)——搜索算法

DFS也就是深度优先搜索&#xff0c;比如二叉树的前&#xff0c;中&#xff0c;后序遍历都属于DFS。其本质是递归&#xff0c;要学好DFS首先需要掌握递归。接下来咱们就一起来学习DFS涉及的算法。 一、递归 1.什么是递归&#xff1f; 递归可以这样理解把它拆分出来&#xff0…...

使用PyCharm创建项目以及如何注释代码

创建好项目后会出现如下图所示的画面&#xff0c;我们可以通过在项目文件夹上点击鼠标右键&#xff0c;选择“New”菜单下的“Python File”来创建一个 Python 文件&#xff0c;在给文件命名时建议使用英文字母和下划线的组合&#xff0c;创建好的 Python 文件会自动打开&#…...

ArrayList和LinkedList有什么区别?在什么情况下使用ArrayList更高效?

ArrayList和LinkedList在Java中是两种常用的数据结构&#xff0c;分别基于数组和链表实现。它们在性能、内存使用和适用场景上各有特点。 ArrayList与LinkedList的主要区别 数据结构&#xff1a; ArrayList&#xff1a;基于动态数组实现&#xff0c;元素存储在连续的内存空间…...

Spring MVC 拦截器(Interceptor)与过滤器(Filter)的区别?

1、两者概述 拦截器&#xff08;Interceptor&#xff09;&#xff1a; 只会拦截那些被 Controller 或 RestController 标注的类中的方法处理的请求&#xff0c;也就是那些由 Spring MVC 调度的请求。过滤器&#xff08;Filter&#xff09;&#xff1a; 会拦截所有类型的 HTTP …...

elasticsearch实战应用从入门到高效使用java集成es快速上手

Elasticsearch 因其出色的性能、可扩展性和易用性,成为了处理大规模数据和构建搜索引擎的首选工具。本文将通过一个实际案例,详细讲解如何在 Spring Boot 项目中集成 Elasticsearch,进行数据索引、搜索、聚合分析等操作。 一、Elasticsearch 简介 Elasticsearch 是一个基于…...

Spring Boot 整合 JPA 实现数据持久化

目录 前言 一、JPA 核心概念与实体映射 1. 什么是 JPA&#xff1f; 2. JPA 的主要组件 3. 实体映射 4. 常见的字段映射策略 二、Repository 接口与自定义查询 1. 什么是 Repository 接口&#xff1f; 2. 动态查询方法 3. 自定义查询 4. 分页与排序 三、实战案例&…...

如何优化网站结构以促进快速收录?

本文转自&#xff1a;百万收录网 原文链接&#xff1a;https://www.baiwanshoulu.com/104.html 优化网站结构以促进快速收录&#xff0c;可以从以下几个方面入手&#xff1a; 一、合理规划页面结构 扁平化结构&#xff1a;采用扁平化的网站结构&#xff0c;减少层级&#xf…...

【零基础学Mysql】常用函数讲解,提升数据操作效率的利器

以耳倾听世间繁华&#xff0c;以语表达心中所想 大家好,我是whisperrrr. 前言&#xff1a; 大家好&#xff0c;我是你们的朋友whisrrr。在日常工作中&#xff0c;MySQL作为一款广泛使用的开源关系型数据库&#xff0c;其强大的功能为我们提供了便捷的数据存储和管理手段。而在…...

防火墙安全综合实验

防火墙安全综合实验 一、拓扑信息 二、需求及配置 实验步骤 需求一&#xff1a;根据下表&#xff0c;完成相关配置 设备接口VLAN接口类型SW2GE0/0/2VLAN 10AccessGE0/0/3VLAN 20AccessGE0/0/1VLAN List&#xff1a;10 20Trunk 1、创建vlan10和vlan20 2、将接口划分到对应…...

在Linux上创建虚拟网卡

在 Linux 上创建虚拟网卡可以通过多种方式进行&#xff0c;常见的方式是使用 ip 命令来配置虚拟网卡。以下是一个简单的步骤指南&#xff0c;用于创建虚拟网卡&#xff1a; 步骤 1: 查看现有的网络接口 首先&#xff0c;查看当前网络接口的状态&#xff0c;可以使用以下命令&…...

AWS Savings Plans 监控与分析工具使用指南

一、背景介绍 1.1 什么是 Savings Plans? AWS Savings Plans 是一种灵活的定价模式,通过承诺持续使用一定金额的 AWS 服务来获得折扣价格。它可以帮助用户降低 AWS 使用成本,适用于 EC2、Fargate 和 Lambda 等服务。 1.2 为什么需要监控? 优化成本支出跟踪使用情况评估投…...

中国通信企业协会通信网络安全服务能力评定安全设计与集成服务能力评定三级要求准则...

安全设计与集成服务能力三级是通信网络安全服务能力评定安全设计与集成服务能力评定的最高等级&#xff0c;所需的要求也会更加严苛&#xff0c;不仅要满足安全设计与集成服务二级能力要求的所有条款&#xff0c;还要满足以下要求&#xff1a; 规模与资产要求 1)单位正规编制员…...

github - 使用

注册账户以及创建仓库 要想使用github第一步当然是注册github账号了, github官网地址:https://github.com/。 之后就可以创建仓库了(免费用户只能建公共仓库),Create a New Repository,填好名称后Create,之后会出现一些仓库的配置信息,这也是一个git的简单教程。 Git…...

RabbitMQ 消息顺序性保证

方式一&#xff1a;Consumer设置exclusive 注意条件 作用于basic.consume不支持quorum queue 当同时有A、B两个消费者调用basic.consume方法消费&#xff0c;并将exclusive设置为true时&#xff0c;第二个消费者会抛出异常&#xff1a; com.rabbitmq.client.AlreadyClosedEx…...

DeepSeek R1 简单指南:架构、训练、本地部署和硬件要求

DeepSeek R1 简单指南&#xff1a;架构、训练、本地部署和硬件要求 DeepSeek 的 LLM 推理新方法 DeepSeek 推出了一种创新方法&#xff0c;通过强化学习 (RL) 来提高大型语言模型 (LLM) 的推理能力&#xff0c;其最新论文 DeepSeek-R1 对此进行了详细介绍。这项研究代表了我们…...

1.攻防世界 unserialize3(wakeup()魔术方法、反序列化工作原理)

进入题目页面如下 直接开审 <?php // 定义一个名为 xctf 的类 class xctf {// 声明一个公共属性 $flag&#xff0c;初始值为字符串 111public $flag 111;// 定义一个魔术方法 __wakeup()// 当对象被反序列化时&#xff0c;__wakeup() 方法会自动调用public function __wa…...

麒麟系统编译安装git

有些版本的麒麟系统上没有git&#xff0c;官网又找不到现成的安装包&#xff0c;只好下载编译进行编译安装 1、下载源码 下载源码&#xff0c;地址&#xff1a;https://git-scm.com/downloads/linux。 2、解压 直接鼠标右键解压&#xff0c;或者用命令行&#xff1a; tar …...

Web - CSS3过渡与动画

过渡 基本使用 transition过渡属性是css3浓墨重彩的特性&#xff0c;过渡可以为一个元素在不同样式之间变化自动添加补间动画。 过渡从kIE10开始兼容&#xff0c;移动端兼容良好&#xff0c;网页上的动画特效基本都是由JavaScript定时器实现的&#xff0c;现在逐步改为css3过…...

Git 常见错误与解决方案全指南

&#x1f680; Git 常见错误与解决方案全指南 这份指南涵盖了你在 Git 操作过程中遇到的所有常见错误、问题及其对应的解决方案&#xff0c;确保你在日常开发中能够快速定位问题并高效解决。 &#x1f517; 1. 如何将本地项目上传到 GitHub 仓库&#xff1f; 步骤&#xff1a…...

OpenStack四种创建虚拟机的方式

实例&#xff08;Instances&#xff09;是在云内部运行的虚拟机。您可以从以下来源启动实例&#xff1a; 一、上传到镜像服务的镜像&#xff08;Image&#xff09; 使用已上传到镜像服务的镜像来启动实例。 二、复制到持久化卷的镜像&#xff08;Volume&#xff09; 使用已…...

线上hbase rs 读写请求个数指标重置问题分析

问题描述: 客户想通过调用hbase的jmx接口获取hbase的读写请求个数,以此来分析HBase读写请求每日增量。 但是发现生产,测试多个集群,Hbase服务指标regionserver读写请求个数存在突然下降到0或者大幅度下降情况。 需要排查原因: 某个Region的读写请求数:会发现经常会重置为…...

【R语言】卡方检验

一、定义 卡方检验是用来检验样本观测次数与理论或总体次数之间差异性的推断性统计方法&#xff0c;其原理是比较观测值与理论值之间的差异。两者之间的差异越小&#xff0c;检验的结果越不容易达到显著水平&#xff1b;反之&#xff0c;检验结果越可能达到显著水平。 二、用…...

2025.2.9机器学习笔记:PINN文献阅读

2025.2.9周报 文献阅读题目信息摘要Abstract创新点网络架构实验结论缺点以及后续展望 文献阅读 题目信息 题目&#xff1a; GPT-PINN:Generative Pre-Trained Physics-Informed Neural Networks toward non-intrusive Meta-learning of parametric PDEs期刊&#xff1a; Fini…...

c语言:取绝对值

假设我们有一个 long 类型的变量 l&#xff0c;我们希望恢复其绝对值。以下是两种方法的对比&#xff1a; 方法1&#xff1a;使用条件语句 这个很好理解&#xff0c;负数时取负运算 &#xff0c;用于数值的符号反转。 long abs_value(long l) {if (l < 0) {return -l;} e…...

JVM(Java 虚拟机)

Java语言的解释性和编译性&#xff08;通过JVM 的执行引擎&#xff09; Java 代码&#xff08;.java 文件&#xff09;要先使用 javac 编译器编译为 .class 文件&#xff08;字节码&#xff09;&#xff0c;紧接着再通过JVM 的执行引擎&#xff08;Execution Engine&#xff09…...