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

阿里云专业翻译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&amp;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对接

最近我们一个商城项目涉及多语言切换&#xff0c;默认中文。用户切换语言可选英语和阿拉伯语言&#xff0c;前端APP和后端返回动态数据都要根据用户选择语言来展示。前端静态内容都做了三套语言&#xff0c;后端商品为了适用这种多语言我们也进行了改造。每一件商品名称&#x…...

基于Spring Boot的能源管理系统+建筑能耗+建筑能耗监测系统+节能监测系统+能耗监测+建筑能耗监测

介绍 建筑节能监测系统是基于计算机网络、物联网、大数据和数据可视化等多种技术融合形成的一套节能监测系统。 系统实现了对建筑电、水、热&#xff0c;气等能源、资源消耗情况的实时监测和预警、动态分析和评估&#xff0c;为用户建立了科学、系统的节能分析方法&#xff0c…...

大数据新视界 --大数据大厂之 Cassandra 分布式数据库:高可用数据存储的新选择

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

ROS第五梯:ROS+VSCode+C++单步调试

解决问题&#xff1a;在ROS项目中进行断点调试。 第一步&#xff1a;创建一个ROS项目或者打开一个现有的ROS项目。 第二步&#xff1a;修改c_cpp_properties.json 增加一段命令: "compileCommands": "${workspaceFolder}/build/compile_commands.json"第三…...

SLA 概念和计算方法

SLA 概念和计算方法 SLA SLA&#xff1a;服务等级协议&#xff08;简称&#xff1a;SLA&#xff0c;全称&#xff1a;service level agreement&#xff09; 网站服务可用性的一个保证 9越多代表全年服务可用时间越长服务更可靠&#xff0c;停机时间越短&#xff0c;反之亦然…...

C++比大小游戏

目录 开头程序程序的流程图程序游玩的效果下一篇博客要说的东西 开头 大家好&#xff0c;我叫这是我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 然后用单引号闭合&#xff1a; http://localhost/sqli-labs/Less-8/?id1 这关的问题在于报错是不显示&#xff0c;那没办法通过上篇文章的updatexml大法处理。对于这种情况&#xff0c;需要用“盲…...

Dijkstra算法和BFS算法(单源最短路径)

基于你设计的带权有向图&#xff0c;从某一结点出发&#xff0c;执行Dijkstra算法求单源最短路径。用文字描述每一轮执行的过程 文字描述&#xff1a;用BFS算法求单源最短路径的过程 Dijkstra 算法 BFS算法 广度优先算法...

在WordPress中最佳Elementor主题推荐:专家级指南

对于已经在WordPress和Elementor上有丰富经验的用户来说&#xff0c;选择功能强大且高度灵活的主题&#xff0c;能大大提升网站的表现和定制能力。今天&#xff0c;我们来介绍六款适合用户的专家级Elementor主题&#xff1a;Sydney、Blocksy、Rife Free、Customify、Deep和Laye…...

关于RabbitMQ消息丢失的解决方案

RabbitMQ如何保证消息的可靠性传输 一、消息丢失的原因 1. 生产者端 网络问题&#xff1a; 原因&#xff1a;生产者与RabbitMQ服务器之间的网络连接不稳定或中断&#xff0c;导致消息在传输过程中丢失。解决方案&#xff1a;确保网络连接稳定&#xff0c;监控网络状态&#x…...

c语言动态内存分配

前言 我们已经掌握的内存开辟⽅式有&#xff1a; int val 20;//在栈空间上开辟四个字节 char arr[10] {0};//在栈空间上开辟10个字节的连续空间 但是上述的开辟空间的⽅式有两个特点&#xff1a; • 空间开辟⼤⼩是固定的。 • 数组在申明的时候&#xff0c;必须指定数组的…...

零基础制作一个ST-LINK V2 附PCB文件原理图 AD格式

资料下载地址&#xff1a;零基础制作一个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)配置简单&#xff0c;扩展性强(3)高可靠性(4)热部署(5)成本低、BSD许可证 1.4 Nginx的功能特性及常用功能基本HTTP服…...

监控系列之-Grafana面板展示及制作

一 Grafana设置添加数据源 1、设置Grafana中文显示 最后保存退出&#xff0c;数据源添加完毕 2、导入node_exporter主机监控面板 此处 有外网的情况下&#xff0c;直接输入对应面板的ID号&#xff0c;然后点击加载即可&#xff1b;无无外网的话&#xff0c;则考虑使用上传仪表…...

值传递和地址传递

值传递 我们从下面这段代码开始&#xff1a; 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 函数中&#xff0c;定义了一个字符数组 b 并…...

Docker vs. containerd 深度剖析容器运行时

随着容器技术的日益普及&#xff0c;Docker 和 containerd 这两个名词频繁出现在我们的视野中。它们都是容器化技术的重要组成部分&#xff0c;但各自扮演着不同的角色。本文将深入探讨 Docker 和 containerd 的区别与联系&#xff0c;帮助大家更好地理解容器技术的底层原理。 …...

ARM32 base instruction -- blx

BLX 带返回和状态切换的跳转指令&#xff0c;此指令只适用 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 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用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 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 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+内网穿透技术部署实践

前言&#xff1a;本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中&#xff0c;跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南&#xff0c;你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案&#xff0c;并结合内网…...