百度翻译源代码
package org.example;
import okhttp3.*;
import org.json.JSONObject;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
/**
* 需要添加依赖
* <!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp -->
* <dependency>
* <groupId>com.squareup.okhttp3</groupId>
* <artifactId>okhttp</artifactId>
* <version>4.12.0</version>
* </dependency>
*/
public class TranslatorGUI {
public static final String API_KEY = "TtVVlE0nR3Gj05Bi65F3HEo0";
public static final String SECRET_KEY = "tGrbq6QtltoeYyAiwy9ufRD6lYbhWtCZ";
static final OkHttpClient HTTP_CLIENT = new OkHttpClient().newBuilder().build();
public static void main(String[] args) {
// 创建主窗口
JFrame frame = new JFrame("百度翻译");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 400);
frame.setLayout(new BorderLayout());
// 创建面板
JPanel panel = new JPanel();
panel.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(10, 10, 10, 10); // 给组件之间增加间距
// 翻译方向选择
gbc.gridx = 0;
gbc.gridy = 0;
panel.add(new JLabel("选择翻译方向:"), gbc);
String[] languages = {"英译中", "中译英"};
JComboBox<String> langComboBox = new JComboBox<>(languages);
gbc.gridx = 1;
panel.add(langComboBox, gbc);
// 文本输入框
gbc.gridx = 0;
gbc.gridy = 1;
panel.add(new JLabel("请输入要翻译的内容:"), gbc);
JTextArea textArea = new JTextArea(5, 30);
textArea.setLineWrap(true);
JScrollPane scrollPane = new JScrollPane(textArea);
gbc.gridx = 1;
panel.add(scrollPane, gbc);
// 翻译按钮
gbc.gridx = 0;
gbc.gridy = 2;
gbc.gridwidth = 2;
JButton translateButton = new JButton("开始翻译");
translateButton.setPreferredSize(new Dimension(120, 30)); // 设置按钮大小
panel.add(translateButton, gbc);
// "翻译结果"标签放在左侧中间
gbc.gridx = 0;
gbc.gridy = 3;
gbc.gridwidth = 1;
gbc.anchor = GridBagConstraints.CENTER; // 垂直居中
panel.add(new JLabel("翻译结果:"), gbc);
// 翻译结果显示框
gbc.gridx = 1;
gbc.gridy = 3;
gbc.gridwidth = 2;
JTextArea resultArea = new JTextArea(5, 30);
resultArea.setLineWrap(true);
resultArea.setEditable(false);
JScrollPane resultScrollPane = new JScrollPane(resultArea);
panel.add(resultScrollPane, gbc);
// 添加面板到框架
frame.add(panel, BorderLayout.CENTER);
// 显示窗口
frame.setVisible(true);
// 按钮事件处理
translateButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String fromLang = langComboBox.getSelectedIndex() == 0 ? "en" : "zh";
String toLang = langComboBox.getSelectedIndex() == 0 ? "zh" : "en";
String textToTranslate = textArea.getText().trim();
if (!textToTranslate.isEmpty()) {
try {
String translatedText = translate(fromLang, toLang, textToTranslate);
resultArea.setText(translatedText);
} catch (IOException ex) {
resultArea.setText("翻译失败: " + ex.getMessage());
}
} else {
resultArea.setText("请输入文本进行翻译!");
}
}
});
}
/**
* 翻译文本
*
* @param fromLang 源语言
* @param toLang 目标语言
* @param text 要翻译的内容
* @return 翻译后的文本
* @throws IOException IO异常
*/
static String translate(String fromLang, String toLang, String text) throws IOException {
MediaType mediaType = MediaType.parse("application/json");
// 构建请求体
String jsonBody = String.format("{\"from\":\"%s\",\"to\":\"%s\",\"q\":\"%s\"}", fromLang, toLang, text);
RequestBody body = RequestBody.create(mediaType, jsonBody);
// 构建请求
Request request = new Request.Builder()
.url("https://aip.baidubce.com/rpc/2.0/mt/texttrans/v1?access_token=" + getAccessToken())
.method("POST", body)
.addHeader("Content-Type", "application/json")
.addHeader("Accept", "application/json")
.build();
// 执行请求并获取响应
Response response = HTTP_CLIENT.newCall(request).execute();
// 获取响应的字符串内容
String responseBody = response.body().string();
System.out.println("API响应: " + responseBody); // 打印原始响应,帮助调试
// 解析返回的JSON,检查字段是否存在
JSONObject jsonResponse = new JSONObject(responseBody);
// 检查返回数据的结构
if (jsonResponse.has("result") && jsonResponse.getJSONObject("result").has("trans_result")) {
// 从 result 中提取 trans_result
return jsonResponse.getJSONObject("result")
.getJSONArray("trans_result")
.getJSONObject(0)
.getString("dst");
} else {
// 如果没有 "trans_result" 字段,打印出其他可能的字段
System.out.println("错误信息: " + jsonResponse.optString("error_msg"));
return "翻译失败,请检查API响应";
}
}
/**
* 从用户的AK,SK生成鉴权签名(Access Token)
*
* @return 鉴权签名(Access Token)
* @throws IOException IO异常
*/
static String getAccessToken() throws IOException {
MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
RequestBody body = RequestBody.create(mediaType, "grant_type=client_credentials&client_id=" + API_KEY
+ "&client_secret=" + SECRET_KEY);
Request request = new Request.Builder()
.url("https://aip.baidubce.com/oauth/2.0/token")
.method("POST", body)
.addHeader("Content-Type", "application/x-www-form-urlencoded")
.build();
Response response = HTTP_CLIENT.newCall(request).execute();
return new JSONObject(response.body().string()).getString("access_token");
}
}