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

news2025/2/11 20:23:22

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

一-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) {
		// 判断是否为有效的 JSON
		if (isValidJson(jsonStr)) {
			// 解析 JSON 字符串为 JsonArray
			Gson 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++;
					}
				}
			}

			// 输出翻译后的 JSON
			System.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.coloradmin.cn/o/2296495.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

单片机上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 文件会自动打开&#…

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

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

【零基础学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、将接口划分到对应…

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…

【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…

JVM(Java 虚拟机)

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

利用二分法进行 SQL 盲注

什么是sql注入&#xff1f; SQL 注入&#xff08;SQL Injection&#xff09;是一种常见的 Web 安全漏洞&#xff0c;攻击者可以通过构造恶意 SQL 语句来访问数据库中的敏感信息。在某些情况下&#xff0c;服务器不会直接返回查询结果&#xff0c;而是通过布尔值&#xff08;Tr…

大模型数据集全面整理:444个数据集下载地址

本文针对Datasets for Large Language Models: A Comprehensive Survey 中的 444 个数据集&#xff08;涵盖8种语言类别和32个领域&#xff09;进行完整下载地址整理收集。 2024-02-28&#xff0c;由杨刘、曹家欢、刘崇宇、丁凯、金连文等作者编写&#xff0c;深入探讨了大型语…

Linux 创建进程 fork()、vfork() 与进程管理

Linux 创建进程 fork、vfork、进程管理 一、Linux的0号、1号、2号进程二、Linux的进程标识三、fork() 函数1、基本概念2、函数特点3、用法以及应用场景&#xff08;1&#xff09;父子进程执行不同的代码&#xff08;2&#xff09;进程执行另一个程序 4、工作原理 四、vfork() 函…

2025web寒假作业二

一、整体功能概述 该代码构建了一个简单的后台管理系统界面&#xff0c;主要包含左侧导航栏和右侧内容区域。左侧导航栏有 logo、管理员头像、导航菜单和安全退出按钮&#xff1b;右侧内容区域包括页头、用户信息管理内容&#xff08;含搜索框和用户数据表格&#xff09;以及页…

鸿蒙NEXT API使用指导之文件压缩和邮件创建

鸿蒙NEXT API 使用指导 一、前言二、邮件创建1、拉起垂类应用2、 UIAbilityContext.startAbilityByType 原型2.1、wantParam2.2、abilityStartCallback 与 callback 3、拉起邮箱类应用3.1、单纯拉起邮箱应用3.2、传入带附件的邮件 三、压缩文件1、认识 zlib2、压缩处理2.1、单文…

javaEE-10.CSS入门

目录 一.什么是CSS ​编辑二.语法规则: 三.使用方式 1.行内样式: 2.内部样式: 3.外部样式: 空格规范 : 四.CSS选择器类型 1.标签选择器 2.类选择器 3.ID选择器 4.通配符选择器 5.复合选择器 五.常用的CSS样式 1.color:设置字体颜色 2.font-size:设置字体大小 3…