mirror of
https://github.com/Jerryplusy/rc-plugin.git
synced 2025-10-14 16:19:18 +00:00
🎈 pref: 优化翻译功能
- 增加了对翻译请求中缺少文本的处理逻辑 - 移除了不再使用的Google翻译策略 - 优化了语言检测和翻译的异常处理 - 清理了代码,移除了未使用的import和类定义
This commit is contained in:
parent
7d5694a88d
commit
90f8373c60
@ -272,7 +272,7 @@ export class tools extends plugin {
|
||||
// 翻译插件
|
||||
async trans(e) {
|
||||
const languageReg = /翻(.)/s;
|
||||
const msg = e.msg.trim();
|
||||
let msg = e.msg.trim();
|
||||
const language = languageReg.exec(msg);
|
||||
if (!(language[1] in transMap)) {
|
||||
e.reply(
|
||||
@ -280,7 +280,16 @@ export class tools extends plugin {
|
||||
);
|
||||
return;
|
||||
}
|
||||
const place = msg.slice(1 + language[1].length)
|
||||
let place = msg.slice(1 + language[1].length)
|
||||
if (_.isEmpty(place)) {
|
||||
const reply = await e?.getReply();
|
||||
if (reply !== undefined) {
|
||||
logger.info(reply);
|
||||
place = reply.message.find(item => item.text !== undefined).text;
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
}
|
||||
// 如果没有百度那就Google
|
||||
const translateResult = await this.translateEngine.translate(place, language[1]);
|
||||
e.reply(translateResult.trim(), true);
|
||||
|
@ -1,7 +1,6 @@
|
||||
import {transMap, tencentTransMap, googleTransMap} from "../constants/constant.js";
|
||||
import { transMap, tencentTransMap } from "../constants/constant.js";
|
||||
import md5 from "md5";
|
||||
import fetch from "node-fetch";
|
||||
import HttpProxyAgent from "https-proxy-agent";
|
||||
import _ from 'lodash'
|
||||
|
||||
// 定义翻译策略接口
|
||||
@ -16,20 +15,22 @@ class TencentTranslateStrategy extends TranslateStrategy {
|
||||
constructor(config) {
|
||||
super();
|
||||
this.config = config;
|
||||
this.url = "https://transmart.qq.com/api/imt";
|
||||
this.commonHeaders = {
|
||||
"USER-AGENT": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/111.0"
|
||||
};
|
||||
this.clientKey = "browser-firefox-111.0.0-Mac OS-d35fca23-eb48-45ba-9913-114f1177b02b-1679376552800";
|
||||
}
|
||||
|
||||
async translate(query, targetLanguage) {
|
||||
// 腾讯翻译的具体实现
|
||||
const url = `https://transmart.qq.com/api/imt`
|
||||
const sourceLanguage = await fetch(url, {
|
||||
async detectLanguage(query) {
|
||||
try {
|
||||
const response = await fetch(this.url, {
|
||||
method: "POST",
|
||||
headers: {
|
||||
"USER-AGENT": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/111.0"
|
||||
},
|
||||
headers: this.commonHeaders,
|
||||
body: JSON.stringify({
|
||||
"header": {
|
||||
"fn": "text_analysis",
|
||||
"client_key": "browser-firefox-111.0.0-Mac OS-d35fca23-eb48-45ba-9913-114f1177b02b-1679376552800"
|
||||
"client_key": this.clientKey
|
||||
},
|
||||
"text": query,
|
||||
"type": "plain",
|
||||
@ -37,105 +38,64 @@ class TencentTranslateStrategy extends TranslateStrategy {
|
||||
"merge_broken_line": false
|
||||
}
|
||||
})
|
||||
}).then(async resp => {
|
||||
const data = JSON.parse(await resp.text());
|
||||
if (data.header.ret_code !== 'succ') {
|
||||
return "en"
|
||||
});
|
||||
const data = await response.json();
|
||||
return data.header.ret_code === 'succ' ? data.language : "en";
|
||||
} catch (error) {
|
||||
logger.error("Error detecting language:", error);
|
||||
return "en";
|
||||
}
|
||||
return data.language;
|
||||
})
|
||||
return fetch(url, {
|
||||
}
|
||||
|
||||
async translate(query, targetLanguage) {
|
||||
try {
|
||||
const sourceLanguage = await this.detectLanguage(query);
|
||||
const response = await fetch(this.url, {
|
||||
method: "POST",
|
||||
headers: {
|
||||
"USER-AGENT": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/111.0"
|
||||
},
|
||||
headers: this.commonHeaders,
|
||||
body: JSON.stringify({
|
||||
"header": {
|
||||
"fn": "auto_translation",
|
||||
"client_key": "browser-firefox-111.0.0-Mac OS-d35fca23-eb48-45ba-9913-114f1177b02b-1679376552800"
|
||||
"client_key": this.clientKey
|
||||
},
|
||||
"type": "plain",
|
||||
"model_category": "normal",
|
||||
"text_domain": "general",
|
||||
"source": {
|
||||
"lang": sourceLanguage,
|
||||
"text_list": [
|
||||
"",
|
||||
query,
|
||||
""
|
||||
]
|
||||
"text_list": ["", query, ""]
|
||||
},
|
||||
"target": {
|
||||
"lang": tencentTransMap[targetLanguage]
|
||||
}
|
||||
})
|
||||
}).then(async resp => {
|
||||
const data = JSON.parse(await resp.text());
|
||||
if (data.header.ret_code !== 'succ') {
|
||||
return "翻译失败"
|
||||
});
|
||||
const data = await response.json();
|
||||
return data.header.ret_code === 'succ' ? data.auto_translation?.[1] : "翻译失败";
|
||||
} catch (error) {
|
||||
logger.error("Error translating text:", error);
|
||||
return "翻译失败";
|
||||
}
|
||||
return data.auto_translation?.[1];
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// 百度翻译策略
|
||||
class BaiduTranslateStrategy extends TranslateStrategy {
|
||||
|
||||
config = {
|
||||
/**
|
||||
* 百度翻译appid
|
||||
*/
|
||||
translateAppId: "",
|
||||
/**
|
||||
* 百度翻译密匙
|
||||
*/
|
||||
translateSecret: "",
|
||||
/**
|
||||
* 魔法
|
||||
*/
|
||||
proxy: ""
|
||||
}
|
||||
|
||||
constructor(config) {
|
||||
super();
|
||||
this.config = config;
|
||||
}
|
||||
|
||||
async translate(query, targetLanguage) {
|
||||
// 百度翻译的具体实现
|
||||
const url = `http://api.fanyi.baidu.com/api/trans/vip/translate?from=auto&to=${
|
||||
transMap[targetLanguage]
|
||||
}&appid=${this.config.translateAppId}&salt=rconsole&sign=${md5(
|
||||
this.config.translateAppId + query + "rconsole" + this.config.translateSecret,
|
||||
)}&q=${query}`;
|
||||
return fetch(url)
|
||||
.then(resp => resp.json())
|
||||
.then(text => text.trans_result)
|
||||
.then(res => res[0].dst)
|
||||
.catch(err => logger.error(err));
|
||||
const url = `http://api.fanyi.baidu.com/api/trans/vip/translate?from=auto&to=${ transMap[targetLanguage] }&appid=${ this.config.translateAppId }&salt=rconsole&sign=${ md5(this.config.translateAppId + query + "rconsole" + this.config.translateSecret) }&q=${ query }`;
|
||||
try {
|
||||
const response = await fetch(url);
|
||||
const data = await response.json();
|
||||
return data.trans_result[0].dst;
|
||||
} catch (error) {
|
||||
logger.error("Error translating text:", error);
|
||||
return "翻译失败";
|
||||
}
|
||||
}
|
||||
|
||||
class GoogleTranslateStrategy extends TranslateStrategy {
|
||||
constructor(config) {
|
||||
super();
|
||||
this.config = config;
|
||||
}
|
||||
|
||||
async translate(query, targetLanguage) {
|
||||
// 谷歌翻译的具体实现
|
||||
const url = `https://translate.googleapis.com/translate_a/single?client=gtx&dt=t&sl=auto&tl=${googleTransMap[targetLanguage]}&q=${query}`;
|
||||
return fetch(url, {
|
||||
method: "GET",
|
||||
headers: {
|
||||
"USER-AGENT": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36",
|
||||
},
|
||||
agent: new HttpProxyAgent(this.config.proxy || "http://127.0.0.1:7890"),
|
||||
})
|
||||
.then(resp => resp.text())
|
||||
.then(res => JSON.parse(res))
|
||||
.then(res => res[0][0][0])
|
||||
}
|
||||
}
|
||||
|
||||
@ -143,17 +103,23 @@ class GoogleTranslateStrategy extends TranslateStrategy {
|
||||
export default class Translate {
|
||||
constructor(config) {
|
||||
this.config = config;
|
||||
this.strategy = null;
|
||||
this.strategy = this.selectStrategy();
|
||||
}
|
||||
|
||||
selectStrategy() {
|
||||
if (!_.isEmpty(this.config.translateAppId) && !_.isEmpty(this.config.translateSecret)) {
|
||||
this.strategy = new BaiduTranslateStrategy(this.config);
|
||||
logger.info("[R插件][翻译策略]:当前选择 百度翻译")
|
||||
return new BaiduTranslateStrategy(this.config);
|
||||
} else {
|
||||
// 根据配置选择其他策略,例如 Tencent 或 Google
|
||||
this.strategy = new TencentTranslateStrategy(this.config);
|
||||
logger.info("[R插件][翻译策略]:当前选择 企鹅翻译")
|
||||
return new TencentTranslateStrategy(this.config);
|
||||
}
|
||||
}
|
||||
|
||||
async translate(query, targetLanguage) {
|
||||
if (!this.strategy) {
|
||||
throw new Error("无翻译策略可用");
|
||||
}
|
||||
return this.strategy.translate(query, targetLanguage);
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user