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+)?");}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/15797.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于YOLOv8+PyQt5的目标检测系统(环境配置+数据集+Python源码+PyQt5界面)——持续更新中

第1期 基于YOLOv8的吸烟行为检测系统&#xff08;环境配置数据集Python源码PyQt5界面&#xff09; 第2期 基于YOLOv8的玩手机行为检测系统&#xff08;环境配置数据集Python源码PyQt5界面&#xff09; 第3期 基于YOLOv8的灭火器检测系统&#xff08;环境配置数据集Python源码…

项目的虚拟环境的搭建与pytorch依赖的下载

文章目录 配置环境 pytorch的使用需要安装对应的cuda 在PyTorch中使用CUDA, pytorch与cuda不同版本对应安装指南&#xff0c;查看CUDA版本&#xff0c;安装对应版本pytorch 【超详细教程】2024最新Pytorch安装教程&#xff08;同时讲解安装CPU和GPU版本&#xff09; 配置环境…

[2025年最新]2024.3版本idea无法安装插件问题解决

背景 随着大模型的持续发展&#xff0c;特别年前年后deepseek的优异表现&#xff0c;编程过程中&#xff0c;需要解决ai来辅助编程&#xff0c;因此需要安装一些大模型插件 问题描述 在线安装插件的时候会遇到以下问题&#xff1a; 1.数据一直在加载&#xff0c;加载的很满 2.点…

怎么查看电脑显存大小(查看电脑配置)

这里提供一个简单的方法查看 winr打开cmd 终端输入dxdiag进入DirectX 点击显示查看设备的显示内存&#xff08;VRAM&#xff09; 用这个方法查看电脑配置和显存是比较方便的 dxdiag功能 Dxdiag是Windows的DirectX诊断工具&#xff0c;其主要作用包括但不限于以下几点&#…

拾取丢弃物品(结构体/数组/子UI/事件分发器)

实现&#xff1a;场景中随机生成几种物品&#xff0c;玩家可以拾取这些物品&#xff0c;也可丢弃已经拾取到的物品。 拾取丢弃物品时UI能实时更新玩家身上的物品量。 一.物品信息的创建 1.枚举 物品名 2.结构体表示物体属性 3.物品缩略图&#xff08;缩略图大小要为2的n次方…

KITE提示词框架:引导大语言模型的高效新工具

大语言模型的应用日益广泛。然而&#xff0c;如何确保这些模型生成的内容在AI原生应用中符合预期&#xff0c;仍是一个需要不断探索的问题。以下内容来自于《AI 原生应用开发&#xff1a;提示工程原理与实战》一书&#xff08;京东图书&#xff1a;https://item.jd.com/1013604…

性能优化中的系统架构优化

系统架构优化是性能优化的一个重要方面&#xff0c;它涉及到对整个IT系统或交易链上各个环节的分析与改进。通过系统架构优化&#xff0c;可以提高系统的响应速度、吞吐量&#xff0c;并降低各层之间的耦合度&#xff0c;从而更好地应对市场的变化和需求。业务增长导致的性能问…

【学习笔记】计算机网络(三)

第3章 数据链路层 文章目录 第3章 数据链路层3.1数据链路层的几个共同问题3.1.1 数据链路和帧3.1.2 三个基本功能3.1.3 其他功能 - 滑动窗口机制 3.2 点对点协议PPP(Point-to-Point Protocol)3.2.1 PPP 协议的特点3.2.2 PPP协议的帧格式3.2.3 PPP 协议的工作状态 3.3 使用广播信…

机器学习 - 理解偏差-方差分解

为了避免过拟合&#xff0c;我们经常会在模型的拟合能力和复杂度之间进行权衡。拟合能力强的模型一般复杂度会比较高&#xff0c;容易导致过拟合。相反&#xff0c;如果限制模型的复杂度&#xff0c;降低其拟合能力&#xff0c;又可能会导致欠拟合。因此&#xff0c;如何在模型…

【STM32】ADC

本次实现的是ADC实现数字信号与模拟信号的转化&#xff0c;数字信号时不连续的&#xff0c;模拟信号是连续的。 1.ADC转化的原理 模拟-数字转换技术使用的是逐次逼近法&#xff0c;使用二分比较的方法来确定电压值 当单片机对应的参考电压为3.3v时&#xff0c;0~ 3.3v(模拟信号…

DeepSeek 助力 Vue 开发:打造丝滑的步骤条

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

基于Python的人工智能驱动基因组变异算法:设计与应用(下)

3.3.2 数据清洗与预处理 在基因组变异分析中,原始数据往往包含各种噪声和不完整信息,数据清洗与预处理是确保分析结果准确性和可靠性的关键步骤。通过 Python 的相关库和工具,可以有效地去除噪声、填补缺失值、标准化数据等,为后续的分析提供高质量的数据基础。 在基因组…

elasticsearch安装插件analysis-ik分词器(深度研究docker内elasticsearch安装插件的位置)

最近在学习使用elasticsearch&#xff0c;但是在安装插件ik的时候遇到许多问题。 所以在这里开始对elasticsearch做一个深度的研究。 首先提供如下链接&#xff1a; https://github.com/infinilabs/analysis-ik/releases 我们下载elasticsearch-7-17-2的Linux x86_64版本 …

linux部署ollama+deepseek+dify

Ollama 下载源码 curl -L https://ollama.com/download/ollama-linux-amd64.tgz -o ollama-linux-amd64.tgz sudo tar -C /usr -xzf ollama-linux-amd64.tgz启动 export OLLAMA_HOST0.0.0.0:11434 ollama serve访问ip:11434看到即成功 Ollama is running 手动安装deepseek…

力扣 单词拆分

动态规划&#xff0c;字符串截取&#xff0c;可重复用&#xff0c;集合类。 题目 单词可以重复使用&#xff0c;一个单词可用多次&#xff0c;应该是比较灵活的组合形式了&#xff0c;可以想到用dp&#xff0c;遍历完单词后的状态的返回值。而这里的wordDict给出的是list&…

【JVM详解二】常量池

一、常量池概述 JVM的常量池主要有以下几种&#xff1a; class文件常量池运行时常量池字符串常量池基本类型包装类常量池 它们相互之间关系大致如下图所示&#xff1a; 每个 class 的字节码文件中都有一个常量池&#xff0c;里面是编译后即知的该 class 会用到的字面量与符号引…

企业数据集成案例:吉客云销售渠道到MySQL

测试-查询销售渠道信息-dange&#xff1a;吉客云数据集成到MySQL的技术案例分享 在企业的数据管理过程中&#xff0c;如何高效、可靠地实现不同系统之间的数据对接是一个关键问题。本次我们将分享一个具体的技术案例——通过轻易云数据集成平台&#xff0c;将吉客云中的销售渠…

CTFHub-RCE系列wp

目录标题 引言什么是RCE漏洞 eval执行文件包含文件包含php://input读取源代码远程包含 命令注入无过滤过滤cat过滤空格过滤目录分隔符过滤运算符综合过滤练习 引言 题目共有如下类型 什么是RCE漏洞 RCE漏洞&#xff0c;全称是Remote Code Execution漏洞&#xff0c;翻译成中文…

深度学习之神经网络框架搭建及模型优化

神经网络框架搭建及模型优化 目录 神经网络框架搭建及模型优化1 数据及配置1.1 配置1.2 数据1.3 函数导入1.4 数据函数1.5 数据打包 2 神经网络框架搭建2.1 框架确认2.2 函数搭建2.3 框架上传 3 模型优化3.1 函数理解3.2 训练模型和测试模型代码 4 最终代码测试4.1 SGD优化算法…

STM32自学记录(十)

STM32自学记录 文章目录 STM32自学记录前言一、USART杂记二、实验1.学习视频2.复现代码 总结 前言 USART 一、USART杂记 通信接口&#xff1a;通信的目的&#xff1a;将一个设备的数据传送到另一个设备&#xff0c;扩展硬件系统。 通信协议&#xff1a;制定通信的规则&#x…