百度翻译 API 的申请 与 百度通用翻译 API 的接入

百度翻译 API 的申请 与 百度通用翻译 API 的接入

申请

  • 进入百度翻译开放平台,选择 立刻使用
    在这里插入图片描述

  • 选择我的服务,开通 通用翻译,填信息后秒过。
    在这里插入图片描述

  • 建议 实名认证,提高免费额度。
    在这里插入图片描述

  • 通过后,可以在开发者信息中查看所有信息,如:APPID、密钥 等等。
    在这里插入图片描述

IDEA 翻译插件 translate 换成 百度翻译引擎

  • 文件(File) -> 设置(Settings) -> 工具(Tools) -> 翻译(Translate) 进入翻译设置界面。
    在这里插入图片描述

  • 设置翻译引擎为百度翻译。

  • 输入应用程序 ID 和 密钥
    在这里插入图片描述

用 Java 的代码方式接入 百度通用翻译 API

API 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,同时以类的形式上传参数

输入参数

字段名类型是否必填描述备注
qString查询的、需要翻译的字段UTF-8 编码
fromString字段 q 的语言代码名称,源语言代码名称可设置为 auto(根据字段 q 自动输出)
toString目标语言代码名称不可设置为 auto
appidStringAPP ID个人信息处查看
saltString随机数可为字母或数字的字符串
signString签名(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 格式,包含以下字段
字段名类型描述备注
fromString源语言代码名称实际的代码名称(auto 也会解析)
toString目标语言代码名称实际的代码名称
trans_resultString翻译结果数组包括 src 和 dst 字段
srcString翻译原文中文字段会以
dstString翻译译文实际的代码名称
error_codeInteger错误码仅出现错误时显示
error_msgString错误含义、信息仅出现错误时显示
  • 如果是正确的情况,返回的 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)
自行编写
  • 引入 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() 函数同时支持 正确 和 错误信息的输出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十⑧

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值