持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第 5 天,点击查看活动详情
百度翻译 API 的申请 与 百度通用翻译 API 的接入
申请
-
进入百度翻译开放平台,选择 立刻使用。
-
选择我的服务,开通 通用翻译,填信息后秒过。
-
建议 实名认证,提高免费额度。
-
通过后,可以在开发者信息中查看所有信息,如:APPID、密钥 等等。
IDEA 翻译插件 translate 换成 百度翻译引擎
-
文件(File) -> 设置(Settings) -> 工具(Tools) -> 翻译(Translate)进入翻译设置界面。 -
设置
翻译引擎为百度翻译。 -
输入
应用程序 ID 和 密钥。
用 Java 的代码方式接入 百度通用翻译 API
-
API 的信息建议看官方文档,更全面。百度通用翻译 API 接入文档
-
主要查找到
API url、输入参数、输出参数。
API URL
-
通用翻译的对外 API 接口
-
https 版:api.fanyi.baidu.com/api/trans/v…
-
完整的、拼接好的 URL 是怎样的呢?
// 为了方便观看,直接用 get 请求的 URL 来展示
// [] 表示要用实际的值进行填充
http://api.fanyi.baidu.com/api/trans/vip/translate?q=[]&from=[]&to=[]&appid=[]&salt=[]&sign=[]
https://fanyi-api.baidu.com/api/trans/vip/translate?q=[]&from=[]&to=[]&appid=[]&salt=[]&sign=[]
- post 请求需要
将 Content-Type 请指定为:application/x-www-form-urlencoded,同时以类的形式上传参数
输入参数
| 字段名 | 类型 | 是否必填 | 描述 | 备注 |
|---|---|---|---|---|
| q | String | 是 | 查询的、需要翻译的字段 | UTF-8 编码 |
| from | String | 是 | 字段 q 的语言代码名称,源语言代码名称 | 可设置为 auto(根据字段 q 自动输出) |
| to | String | 是 | 目标语言代码名称 | 不可设置为 auto |
| appid | String | 是 | APP ID | 个人信息处查看 |
| salt | String | 是 | 随机数 | 可为字母或数字的字符串 |
| sign | String | 是 | 签名 | (appid + q + salt + 密钥)的 MD5 值 |
-
注意:
字段名是规定好的。 -
例子:我要
将 '苹果' 翻译成 英文。q = "苹果",from = "auto"或"zh",to = "en",appid = [APP ID],salt = [随机数],sign = [签名]。
下表是 常见的语种 的代码名称
| 名称 | 代码名称 | 名称 | 代码名称 | 名称 | 代码名称 | ||
|---|---|---|---|---|---|---|---|
| 自动检测 | auto | 中文 | zh | 英文 | en | ||
| 粤语 | yue | 文言文 | wyw | 日语 | jp | ||
| 韩语 | kor | 法语 | fra | 西班牙语 | spa | ||
| 泰语 | th | 阿拉伯语 | ara | 俄语 | ru | ||
| 葡萄牙语 | pt | 德语 | de | 意大利语 | it | ||
| 希腊语 | el | 荷兰语 | nl | 波兰语 | pl | ||
| 保加利亚语 | bul | 爱沙尼亚语 | est | 丹麦语 | dan | ||
| 芬兰语 | fin | 捷克语 | cs | 罗马尼亚语 | rom | ||
| 斯洛文尼亚语 | slo | 瑞典语 | swe | 匈牙利语 | hu | ||
| 繁体中文 | cht | 越南语 | vie |
输出参数
- 返回的结果是
JSON 格式,包含以下字段:
| 字段名 | 类型 | 描述 | 备注 |
|---|---|---|---|
| from | String | 源语言代码名称 | 实际的代码名称(auto 也会解析) |
| to | String | 目标语言代码名称 | 实际的代码名称 |
| trans_result | String | 翻译结果数组 | 包括 src 和 dst 字段 |
| src | String | 翻译原文 | 中文字段会以 |
| dst | String | 翻译译文 | 实际的代码名称 |
| error_code | Integer | 错误码 | 仅出现错误时显示 |
| error_msg | String | 错误含义、信息 | 仅出现错误时显示 |
- 如果是
正确的情况,返回的 JSON 字符串应该只有from、to、trans_result、src、dst五个字段。
{
"from": "en",
"to": "zh",
"trans_result": [
{
"src": "apple",
"dst": "苹果"
}
]
}
- 如果是
错误的情况,返回的 JSON 字符串应该只有error_code、error_msg两个字段。
{
"error_code": "54001",
"error_msg": "Invalid Sign"
}
错误码列表
| 错误码 | 含义 | 解决方案 |
|---|---|---|
| 52000 | 成功 | |
| 52001 | 请求超时 | 请重试 |
| 52002 | 系统错误 | 请重试 |
| 52003 | 未授权用户 | 请检查appid是否正确或者服务是否开通 |
| 54000 | 必填参数为空 | 请检查是否少传参数 |
| 54001 | 签名错误 | 请检查您的签名生成方法 |
| 54003 | 访问频率受限 | 请降低您的调用频率,或进行身份认证后切换为高级版/尊享版 |
| 54004 | 账户余额不足 | 请前往管理控制台为账户充值 |
| 54005 | 长 query 请求频繁 | 请降低长 query 的发送频率,3s后再试 |
| 58000 | 客户端 IP 非法 | 检查个人资料里填写的 IP 地址是否正确,可前往开发者信息-基本信息修改 |
| 58001 | 译文语言方向不支持 | 检查译文语言是否在语言列表里 |
| 58002 | 服务当前已关闭 | 请前往管理控制台开启服务 |
| 90107 | 认证未通过或未生效 | 请前往我的认证查看认证进度 |
代码实现
下载百度通用翻译 API 接入文档中的 demo 代码
- 代码中,是自行创建了一个 GET 请求类来创建 GET 请求访问 API。
HttpGet.get(TRANS_API_HOST, params)
- 同样创建了一个 MD5 工具类来加密 签名。
MD5.md5(src)
- 下载链接:Java 版 Demo
自行编写
- 引入
hutool-all(一个 Java 工具类库)来创建 HTTP请求 和 MD5 加密 签名。
<dependencies>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.5</version>
</dependency>
</dependencies>
-
创建 GET 请求:
HttpUtil.get(TRANS_API_HOST_HTTP, map); -
创建 POST 请求:
HttpUtil.post(TRANS_API_HOST_HTTP, map); -
API URL 是 HTTP 还是 HTTPS 都一样。
package com.example.demo.service;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.http.HttpUtil;
import com.example.demo.entity.TranslateResults;
import com.google.gson.Gson;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
/**
* 百度通用翻译 工具类
* <p>
* 接入 百度翻译 API
*
*/
public class BaiduTranslationUtils {
/**
* 对接 百度通用翻译 API(https)
*/
private static final String TRANS_API_HOST_HTTPS = "https://fanyi-api.baidu.com/api/trans/vip/translate";
/**
* 对接 百度通用翻译 API(http)
*/
private static final String TRANS_API_HOST_HTTP = "http://api.fanyi.baidu.com/api/trans/vip/translate";
/**
* 百度翻译 APP ID
*/
private static final String APP_ID = "20220930001363960";
/**
* 百度翻译 APP 密钥
*/
private static final String SECURITY_KEY = "ZWgAN0_8hngJPzuZbCRt";
/**
* JSON 字符串工具类
*/
private static final Gson GSON = new Gson();
public static void main(String[] args) {
String result = BaiduTranslationUtils.getUniversalTranslation("苹果", "auto", "en");
// System.out.println(result);
TranslateResults translateResults = toTranslateResults(result);
translateResults.outputDisplay();
String result1 = BaiduTranslationUtils.getUniversalTranslations("Apple", "auto", "zh");
TranslateResults translateResults1 = toTranslateResults(result1);
translateResults1.outputDisplay();
String result2 = BaiduTranslationUtils.postUniversalTranslation("苹果", "auto", "en");
TranslateResults translateResults2 = toTranslateResults(result2);
translateResults2.outputDisplay();
String result3 = BaiduTranslationUtils.postUniversalTranslations("Apple", "auto", "zh");
TranslateResults translateResults3 = toTranslateResults(result3);
translateResults3.outputDisplay();
}
/**
* 用 GET 请求访问 通用翻译 http API
*
* @param query 查询的字段
* @param from 源语言代码名称
* @param to 目标语言代码名称
*
* @return JSON
*/
public static String getUniversalTranslation(String query, String from, String to) {
return getHttpUniversalTranslation(query, from, to);
}
/**
* 用 GET 请求访问 通用翻译 https API
*
* @param query 查询的字段
* @param from 源语言代码名称
* @param to 目标语言代码名称
*
* @return JSON
*/
public static String getUniversalTranslations(String query, String from, String to) {
return getHttpsUniversalTranslation(query, from, to);
}
/**
* 用 POST 请求访问 通用翻译 http API
*
* @param query 查询的字段
* @param from 源语言代码名称
* @param to 目标语言代码名称
*
* @return JSON
*/
public static String postUniversalTranslation(String query, String from, String to) {
return postHttpUniversalTranslation(query, from, to);
}
/**
* 用 POST 请求访问 通用翻译 https API
*
* @param query 查询的字段
* @param from 源语言代码名称
* @param to 目标语言代码名称
*
* @return JSON
*/
public static String postUniversalTranslations(String query, String from, String to) {
return postHttpsUniversalTranslation(query, from, to);
}
/**
* 用 GET 请求访问 通用翻译 http API
*
* @param query 查询的字段
* @param from 源语言代码名称
* @param to 目标语言代码名称
*
* @return JSON
*/
private static String getHttpUniversalTranslation(String query, String from, String to) {
Map<String, Object> map = assemble(query, from, to);
return HttpUtil.get(TRANS_API_HOST_HTTP, map);
}
/**
* 用 GET 请求访问 通用翻译 https API
*
* @param query 查询的字段
* @param from 源语言代码名称
* @param to 目标语言代码名称
*
* @return JSON
*/
private static String getHttpsUniversalTranslation(String query, String from, String to) {
Map<String, Object> map = assemble(query, from, to);
return HttpUtil.get(TRANS_API_HOST_HTTPS, map);
}
/**
* 用 POST 请求访问 通用翻译 http API
*
* @param query 查询的字段
* @param from 源语言代码名称
* @param to 目标语言代码名称
*
* @return JSON
*/
private static String postHttpUniversalTranslation(String query, String from, String to) {
Map<String, Object> map = assemble(query, from, to);
return HttpUtil.post(TRANS_API_HOST_HTTP, map);
}
/**
* 用 POST 请求访问 通用翻译 https API
*
* @param query 查询的字段
* @param from 源语言代码名称
* @param to 目标语言代码名称
*
* @return JSON
*/
private static String postHttpsUniversalTranslation(String query, String from, String to) {
Map<String, Object> map = assemble(query, from, to);
return HttpUtil.post(TRANS_API_HOST_HTTPS, map);
}
/**
* 将 输入参数 组装到 Map 中
*
* @param query 查询的字段
* @param from 源语言代码名称
* @param to 目标语言代码名称
*
* @return Map<String, Object>
*/
private static Map<String, Object> assemble(String query, String from, String to) {
if(query == null || query.isEmpty()) {
query = "中国";
}
if(from == null || from.isEmpty()) {
from = "auto";
}
if(to == null || to.isEmpty()) {
to = "en";
}
Map<String, Object> params = new HashMap<>(5);
// 查询的字段
params.put("q", new String(query.getBytes(StandardCharsets.UTF_8)));
// 源语言代码名称
params.put("from", from);
// 目标语言代码名称
params.put("to", to);
// APP ID
params.put("appid", APP_ID);
// 随机数
String salt = String.valueOf(System.currentTimeMillis());
params.put("salt", salt);
// 加密前的原文
String src = APP_ID + query + salt + SECURITY_KEY;
// 签名
params.put("sign", SecureUtil.md5(src));
return params;
}
/**
* 将 JSON 字符串 转换成 类对象
*
* @param json JSON 字符串
*
* @return 类对象
*/
public static TranslateResults toTranslateResults(String json) {
return GSON.fromJson(json, TranslateResults.class);
}
}
- 在 实例中,没有为输入参数配置相应的类对象。
添加上类对象后可能更好。
解析输出的 JSON 字符串
- 我使用的类库是:
com.google.code.gson。
<dependencies>
<!-- Gson JSON 工具类库 -->
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.9</version>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
<optional>true</optional>
</dependency>
</dependencies>
- 使用
gson.fromJson(json, class)的形式解析 JSON
public class BaiduTranslationUtils {
/**
* JSON 字符串工具类
*/
private static final Gson GSON = new Gson();
public static TranslateResults toTranslateResults(String json) {
return GSON.fromJson(json, TranslateResults.class);
}
}
TranslateResults是自定义的输出参数类对象。
package com.example.demo.entity;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.util.Arrays;
/**
* 翻译结果 类
*/
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class TranslateResults {
/**
* 源语言代码名称
*/
private String from;
/**
* 目标语言代码名称
*/
private String to;
/**
* 翻译结果数组
*/
private TransResult[] trans_result;
/**
* 错误码
*/
private Integer error_code;
/**
* 错误含义、信息
*/
private String error_msg;
@Override
public String toString() {
return "TranslateResults{" +
"from='" + from + '\'' +
", to='" + to + '\'' +
", trans_result=" + Arrays.toString(trans_result) +
", error_code=" + error_code +
", error_msg='" + error_msg + '\'' +
'}';
}
/**
* 输出指点的内容
*/
public void outputDisplay() {
StringBuilder builder = new StringBuilder();
if(error_code == null && error_msg == null) {
builder.append("[");
for(TransResult transResult : trans_result) {
builder.append(transResult.outputDisplay()).append(",");
}
builder.append("]");
} else if(trans_result == null) {
builder.append("{")
.append("错误码 = ").append(error_code)
.append(" , ")
.append("错误信息提示 = ").append(error_msg)
.append("}");
} else {
builder.append("返回值异常请检查!").append(this.toString());
}
System.out.println(builder.toString());
}
}
package com.example.demo.entity;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.net.URLEncoder;
/**
* 翻译原文译文 类
*/
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class TransResult {
/**
* 翻译原文
*/
private String src;
/**
* 翻译译文
*/
private String dst;
@Override
public String toString() {
return "TransResult{" +
"src='" + src + '\'' +
", dst='" + dst + '\'' +
'}';
}
/**
* 输出指点的内容
*/
public String outputDisplay() {
return "{" +
"原文 = '" + src + '\'' +
", 译文 = '" + dst + '\'' +
'}';
}
}
- 查询成功的结果是这样的。其中:
中文用 URL 编码来表示。
{
"from": "zh",
"to": "en",
"trans_result": [
{
"src": "\u82f9\u679c",
"dst": "Apple"
}
]
}
-
添加了
类对象及其方法可以更便捷的输出目标信息。 -
因为,
查询成功时,error_code 和 error_msg 一定为 null,其它字段均有值;查询失败时,error_code 和 error_msg 不为 null,而其它字段均为 null; -
故,public void outputDisplay() 函数
同时支持 正确 和 错误信息的输出。