阿里云专业翻译api对接
最近我们一个商城项目涉及多语言切换,默认中文。用户切换语言可选英语和阿拉伯语言,前端APP和后端返回动态数据都要根据用户选择语言来展示。前端静态内容都做了三套语言,后端商品为了适用这种多语言我们也进行了改造。每一件商品名称,图片,价格等等 分别都有三中语言对应字段,根据前端公共参数(放请求header中的语言标识) 返回不同语言的字段值。
所以在商品的新增,修改等等地方商品名称,介绍等等就需要 根据中文翻译成英文和阿拉伯语保存下来。通过多方对比,最终发现阿里云机器翻译专业版还是最准确的,可能是阿里本来就有海量商品他们翻译引擎训练的比较智能。
接下来我们梳理下整个对接流程,官方文档:
什么是机器翻译JavaSDK_机器翻译(Machine Translation)-阿里云帮助中心
1,引入官方提供的java 版本 maven sdk
<!-- 阿里云翻译sdk --> <!-- https://mvnrepository.com/artifact/com.aliyun/alimt20181012 --> <dependency><groupId>com.aliyun</groupId><artifactId>alimt20181012</artifactId><version>1.3.1</version><exclusions><exclusion><groupId>com.aliyun</groupId><artifactId>openplatform20191219</artifactId></exclusion><exclusion><groupId>com.aliyun</groupId><artifactId>tea-openapi</artifactId></exclusion><exclusion><groupId>com.aliyun</groupId><artifactId>credentials-java</artifactId></exclusion><exclusion><groupId>com.aliyun</groupId><artifactId>tea-openapi</artifactId></exclusion><exclusion><groupId>com.aliyun</groupId><artifactId>openapiutil</artifactId></exclusion><exclusion><groupId>com.aliyun</groupId><artifactId>oss-util</artifactId></exclusion><exclusion><groupId>com.aliyun</groupId><artifactId>tea</artifactId></exclusion><exclusion><groupId>com.aliyun</groupId><artifactId>tea-rpc</artifactId></exclusion><exclusion><groupId>com.aliyun</groupId><artifactId>tea-util</artifactId></exclusion><exclusion><groupId>com.aliyun</groupId><artifactId>tea-rpc</artifactId></exclusion></exclusions> </dependency>
<!-- 商品图片搜索 --> <dependency><groupId>com.aliyun</groupId><artifactId>imagesearch20201214</artifactId><version>4.0.2</version> </dependency>
因为我们后面又使用了阿里的图片搜索,所以里面很多jar和图像搜索中的有冲突,如果只接入翻译实际上不需要排除。
2,定义配置:
建议使用一个ram账号 拿ram的accessKeyId 和secret,给这个子账号开通对应权限
public class AliYunTranslateConfig {private String accessKeyId;private String accessKeySecret;/*** 华南深圳 mt.aliyuncs.com* 阿联酋(迪拜) mt.aliyuncs.com**/private String endpoint;
}
3,封装 核心翻译方法
public class AliTranslamt20181012 {private AliYunTranslateConfig aliYunTranslateConfig;public AliTranslamt20181012(AliYunTranslateConfig aliYunTranslateConfig) {this.aliYunTranslateConfig = aliYunTranslateConfig;}/*** <b>description</b> :* <p>使用AK&SK初始化账号Client</p>* @return Client** @throws Exception*/public com.aliyun.alimt20181012.Client createClient() {com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID.setAccessKeyId(aliYunTranslateConfig.getAccessKeyId())// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。.setAccessKeySecret(aliYunTranslateConfig.getAccessKeySecret());// Endpoint 请参考 https://api.aliyun.com/product/alimtconfig.endpoint = aliYunTranslateConfig.getEndpoint(); // 深圳// 阿联酋(迪拜) mt.aliyuncs.comClient client = null;try {client = new Client(config);} catch (Exception e) {log.error("调用阿里云 翻译 初始化失败cause:{},。,errorMsg:{}",e.getCause().getMessage(),e.getMessage());e.printStackTrace();}return client;}/*** 翻译api** @return*/public List<TranslateResponseBodyDataFromThirdPartDTO> translate(List<AliYunTranslateDTO> dtoList) {StopWatch stopWatch = new StopWatch();stopWatch.start("thirdPart_wordFromZh2ArAndEn");com.aliyun.alimt20181012.Client client = this.createClient();List<TranslateResponseBodyDataFromThirdPartDTO> resultList = new java.util.ArrayList<>(dtoList.size());dtoList.forEach(dto -> {com.aliyun.alimt20181012.models.TranslateRequest translateRequest = new com.aliyun.alimt20181012.models.TranslateRequest().setFormatType(dto.getFormatType()).setTargetLanguage(dto.getTargetLanguage()).setSourceLanguage(dto.getSourceLanguage()).setSourceText(dto.getSourceText()).setScene(dto.getScene()).setContext(dto.getContext());com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();TranslateResponseBodyDataFromThirdPartDTO result = new TranslateResponseBodyDataFromThirdPartDTO();result.setRequestKey(dto.getRequestKey());resultList.add(result);try {TranslateResponse translateResponse = client.translateWithOptions(translateRequest, runtime);log.info("调用翻译 输入参数:{}",JSONUtil.parse(dto));if(ObjectUtil.isNotNull(translateResponse)){log.info("调用翻译 得到的结果为:{}", JSONUtil.parse(translateResponse.getBody()));if(200==translateResponse.getStatusCode()){TranslateResponseBody.TranslateResponseBodyData data = translateResponse.getBody().getData();BeanUtils.copyProperties(data, result);}else {log.error("调用翻译出错了,statusCode:{}",translateResponse.getStatusCode());}}} catch (TeaException error) {log.error("调用阿里云翻译出错了,errorMsg:{}",error.getMessage());com.aliyun.teautil.Common.assertAsString(error.message);} catch (Exception _error) {TeaException error = new TeaException(_error.getMessage(), _error);System.out.println(error.getMessage());log.error("调用阿里云翻译出错了 exception ,msg:{}",error.getMessage());com.aliyun.teautil.Common.assertAsString(error.message);}});stopWatch.stop();log.info(stopWatch.getLastTaskName()+"耗时:{} 毫秒",stopWatch.getLastTaskTimeMillis());return resultList;}
}
其中 请求的dto结构如下:其中,scene是识别翻译的使用场景,是商品标题还是描述异或者是客服沟通过程中的交流文字?不同场景的设置使翻译更贴近我们的预期翻译结果。
context也是很有用的,上下文语境,我们翻译某一段内容在不同场景下,可能前后与其相搭配的额外词汇。比如title 下我们可以加上 "我在网上商城搜索了 商品标题是"+****+“的商品”。
总之这两个参数的设置都是为了设置商品不同属性, 指定其大概范围的,从而能更准确的获得翻译结果。可以自己多调试下,找到适合自己业务的一些词汇。
public class AliYunTranslateDTO implements Serializable {public static String FROMTYPE_HTML ="html";public static String FROMTYPE_TEXT ="text";// from 语言public static String SOURCELANGUAGE_ZH ="zh";// 翻译目标语言public static String TARGETLANGUAGE_EN ="en";public static String TARGETLANGUAGE_AR ="ar";// 场景可选取值:商品标题(title),商品描述(description),商品沟通(communication),医疗(medical),社交(social),金融(finance)public static String SCENE_TITLE ="title";public static String SCENE_DESCRIPTION ="description";public static String SCENE_COMMUNICATION ="communication";public static String SCENE_MEDICAL ="medical";public static String SCENE_SOCIAL ="social";public static String SCENE_FINANCE ="finance";/*** 用于标注 翻译的请求唯一标识**/@ApiModelProperty(hidden = true)private String requestKey = "";/*** 翻译文本的格式,html( 网页格式。设置此参数将对待翻译文本以及翻译后文本按照 html 格式进行处理)、text(文本格式。设置此参数将对传入待翻译文本以及翻译后结果不做文本格式处理,统一按纯文本格式处理。**/@ApiModelProperty(name = "译文本的格式html 或text")private String FormatType;/**** 原文语言-from* 英语 - en* 中文 - zh* 阿拉伯语 - ar**/@ApiModelProperty(name = "原文语言-from")private String SourceLanguage;/*** 译文语言 -to* 英语 - en* 中文 - zh* 阿拉伯语 - ar**/@ApiModelProperty(name = "译文语言 -to")private String TargetLanguage;/*** 待翻译内容**/@ApiModelProperty(name = "待翻译内容")private String SourceText;/*** 场景可选取值:商品标题(title),商品描述(description),商品沟通(communication),医疗(medical),社交(social),金融(finance)**/@ApiModelProperty(name = "场景可选取值:商品标题(title),商品描述(description),商品沟通(communication),医疗(medical),社交(social),金融(finance)")private String Scene;/*** 上下文信息,可选填 (语境)* 如 我在商城买了一件 */@ApiModelProperty(name = "上下文信息,可选填 (语境)")private String Context;}
返回结果 dto
public class TranslateResponseBodyDataFromThirdPartDTO {/*** 请求中携带的请求唯一标识,这是我们自定义的一个批次id**/private String requestKey;/*** zh 源语言传入auto时,语种识别后的源语言代码*/public String detectedLanguage;/*** 翻译结果*/public String translated;/*** 总单词数*/public String wordCount;
}
相关文章:
阿里云专业翻译api对接
最近我们一个商城项目涉及多语言切换,默认中文。用户切换语言可选英语和阿拉伯语言,前端APP和后端返回动态数据都要根据用户选择语言来展示。前端静态内容都做了三套语言,后端商品为了适用这种多语言我们也进行了改造。每一件商品名称&#x…...
基于Spring Boot的能源管理系统+建筑能耗+建筑能耗监测系统+节能监测系统+能耗监测+建筑能耗监测
介绍 建筑节能监测系统是基于计算机网络、物联网、大数据和数据可视化等多种技术融合形成的一套节能监测系统。 系统实现了对建筑电、水、热,气等能源、资源消耗情况的实时监测和预警、动态分析和评估,为用户建立了科学、系统的节能分析方法,…...
大数据新视界 --大数据大厂之 Cassandra 分布式数据库:高可用数据存储的新选择
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...
ROS第五梯:ROS+VSCode+C++单步调试
解决问题:在ROS项目中进行断点调试。 第一步:创建一个ROS项目或者打开一个现有的ROS项目。 第二步:修改c_cpp_properties.json 增加一段命令: "compileCommands": "${workspaceFolder}/build/compile_commands.json"第三…...
SLA 概念和计算方法
SLA 概念和计算方法 SLA SLA:服务等级协议(简称:SLA,全称:service level agreement) 网站服务可用性的一个保证 9越多代表全年服务可用时间越长服务更可靠,停机时间越短,反之亦然…...
C++比大小游戏
目录 开头程序程序的流程图程序游玩的效果下一篇博客要说的东西 开头 大家好,我叫这是我58。 程序 #include <iostream> #include <Windows.h> using namespace std; int main() {int ir 1;char chparr[2] { 0 };int ip1 0;int ip2 0;int i 1;c…...
PCIe进阶之TL:Memory, I/O, and Configuration Request Rules TPH Rules
1 Memory, I/O, and Configuration Request Rules 下述规则适用于 Memory 请求、IO 请求和配置请求。 除了公共的 header 字段外,所有 Memory 请求、IO 请求和配置请求还包括以下字段: (1)Requester ID[15:0] 和 Tag[9:0],组成了 Transaction ID 。 (2)Last DW BE[3:0]…...
【初阶数据结构】一文讲清楚 “堆” 和 “堆排序” -- 树和二叉树(二)(内含TOP-K问题)
文章目录 前言1. 堆1.1 堆的概念1.2 堆的分类 2. 堆的实现2.1 堆的结构体设置2.2 堆的初始化2.3 堆的销毁2.4 添加数据到堆2.4.1 "向上调整"算法 2.5 从堆中删除数据2.5.1 “向下调整”算法 2.6 堆的其它各种方法接口函数 3. 堆排序3.1 堆排序的代码实现 4. TOP-K问题…...
sqli-lab靶场学习(二)——Less8-10(盲注、时间盲注)
Less8 第八关依然是先看一般状态 http://localhost/sqli-labs/Less-8/?id1 然后用单引号闭合: http://localhost/sqli-labs/Less-8/?id1 这关的问题在于报错是不显示,那没办法通过上篇文章的updatexml大法处理。对于这种情况,需要用“盲…...
Dijkstra算法和BFS算法(单源最短路径)
基于你设计的带权有向图,从某一结点出发,执行Dijkstra算法求单源最短路径。用文字描述每一轮执行的过程 文字描述:用BFS算法求单源最短路径的过程 Dijkstra 算法 BFS算法 广度优先算法...
在WordPress中最佳Elementor主题推荐:专家级指南
对于已经在WordPress和Elementor上有丰富经验的用户来说,选择功能强大且高度灵活的主题,能大大提升网站的表现和定制能力。今天,我们来介绍六款适合用户的专家级Elementor主题:Sydney、Blocksy、Rife Free、Customify、Deep和Laye…...
关于RabbitMQ消息丢失的解决方案
RabbitMQ如何保证消息的可靠性传输 一、消息丢失的原因 1. 生产者端 网络问题: 原因:生产者与RabbitMQ服务器之间的网络连接不稳定或中断,导致消息在传输过程中丢失。解决方案:确保网络连接稳定,监控网络状态&#x…...
c语言动态内存分配
前言 我们已经掌握的内存开辟⽅式有: int val 20;//在栈空间上开辟四个字节 char arr[10] {0};//在栈空间上开辟10个字节的连续空间 但是上述的开辟空间的⽅式有两个特点: • 空间开辟⼤⼩是固定的。 • 数组在申明的时候,必须指定数组的…...
零基础制作一个ST-LINK V2 附PCB文件原理图 AD格式
资料下载地址:零基础制作一个ST-LINK V2 附PCB文件原理图 AD格式 ST-LINK/V2是一款可以在线仿真以及下载STM8以及STM32的开发工具。支持所有带SWIM接口的STM8系列单片机;支持所有带JTAG / SWD接口的STM32系列单片机。 基本属性 ST-LINK/V2是ST意法半导体为评估、开…...
nginx基础篇(一)
文章目录 学习链接概图一、Nginx简介1.1 背景介绍名词解释 1.2 常见服务器对比IISTomcatApacheLighttpd其他的服务器 1.3 Nginx的优点(1)速度更快、并发更高(2)配置简单,扩展性强(3)高可靠性(4)热部署(5)成本低、BSD许可证 1.4 Nginx的功能特性及常用功能基本HTTP服…...
监控系列之-Grafana面板展示及制作
一 Grafana设置添加数据源 1、设置Grafana中文显示 最后保存退出,数据源添加完毕 2、导入node_exporter主机监控面板 此处 有外网的情况下,直接输入对应面板的ID号,然后点击加载即可;无无外网的话,则考虑使用上传仪表…...
值传递和地址传递
值传递 我们从下面这段代码开始: point(char*pt); void main(){char b[4]{m,n,o,p},*ptb;point(pt);printf("%c\n",*pt); } point(char *p){p3; }这段代码定义了一个函数 point 和一个主函数 main。 在 main 函数中,定义了一个字符数组 b 并…...
Docker vs. containerd 深度剖析容器运行时
随着容器技术的日益普及,Docker 和 containerd 这两个名词频繁出现在我们的视野中。它们都是容器化技术的重要组成部分,但各自扮演着不同的角色。本文将深入探讨 Docker 和 containerd 的区别与联系,帮助大家更好地理解容器技术的底层原理。 …...
ARM32 base instruction -- blx
BLX 带返回和状态切换的跳转指令,此指令只适用 ARMv5T*, ARMv6*, ARMv7。 BLX (immediate) Branch with Link calls a subroutine at a PC-relative address. Branch with Link and Exchange Instruction Sets (immediate) calls a subroutine at a PC-relativ…...
sql数据库
目录 一. 数据库的概念 二. 常用的数据库 三. SQL基础 四. SQL语句的使用 一. 数据库的概念 数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。 数据库是存放数据的仓库。它的存储空…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!
目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...
Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践
前言:本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中,跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南,你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案,并结合内网…...
