🎈 pref: 优化翻译功能

- 增加了对翻译请求中缺少文本的处理逻辑
- 移除了不再使用的Google翻译策略
- 优化了语言检测和翻译的异常处理
- 清理了代码,移除了未使用的import和类定义
This commit is contained in:
zhiyu1998 2024-09-08 14:47:26 +08:00
parent 7d5694a88d
commit 90f8373c60
2 changed files with 90 additions and 115 deletions

View File

@ -272,7 +272,7 @@ export class tools extends plugin {
// 翻译插件 // 翻译插件
async trans(e) { async trans(e) {
const languageReg = /(.)/s; const languageReg = /(.)/s;
const msg = e.msg.trim(); let msg = e.msg.trim();
const language = languageReg.exec(msg); const language = languageReg.exec(msg);
if (!(language[1] in transMap)) { if (!(language[1] in transMap)) {
e.reply( e.reply(
@ -280,7 +280,16 @@ export class tools extends plugin {
); );
return; 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 // 如果没有百度那就Google
const translateResult = await this.translateEngine.translate(place, language[1]); const translateResult = await this.translateEngine.translate(place, language[1]);
e.reply(translateResult.trim(), true); e.reply(translateResult.trim(), true);

View File

@ -1,7 +1,6 @@
import {transMap, tencentTransMap, googleTransMap} from "../constants/constant.js"; import { transMap, tencentTransMap } from "../constants/constant.js";
import md5 from "md5"; import md5 from "md5";
import fetch from "node-fetch"; import fetch from "node-fetch";
import HttpProxyAgent from "https-proxy-agent";
import _ from 'lodash' import _ from 'lodash'
// 定义翻译策略接口 // 定义翻译策略接口
@ -16,126 +15,87 @@ class TencentTranslateStrategy extends TranslateStrategy {
constructor(config) { constructor(config) {
super(); super();
this.config = config; 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 detectLanguage(query) {
try {
const response = await fetch(this.url, {
method: "POST",
headers: this.commonHeaders,
body: JSON.stringify({
"header": {
"fn": "text_analysis",
"client_key": this.clientKey
},
"text": query,
"type": "plain",
"normalize": {
"merge_broken_line": false
}
})
});
const data = await response.json();
return data.header.ret_code === 'succ' ? data.language : "en";
} catch (error) {
logger.error("Error detecting language:", error);
return "en";
}
} }
async translate(query, targetLanguage) { async translate(query, targetLanguage) {
// 腾讯翻译的具体实现 try {
const url = `https://transmart.qq.com/api/imt` const sourceLanguage = await this.detectLanguage(query);
const sourceLanguage = await fetch(url, { const response = await fetch(this.url, {
method: "POST", method: "POST",
headers: { headers: this.commonHeaders,
"USER-AGENT": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/111.0" body: JSON.stringify({
}, "header": {
body: JSON.stringify({ "fn": "auto_translation",
"header": { "client_key": this.clientKey
"fn": "text_analysis", },
"client_key": "browser-firefox-111.0.0-Mac OS-d35fca23-eb48-45ba-9913-114f1177b02b-1679376552800" "type": "plain",
}, "model_category": "normal",
"text": query, "text_domain": "general",
"type": "plain", "source": {
"normalize": { "lang": sourceLanguage,
"merge_broken_line": false "text_list": ["", query, ""]
} },
}) "target": {
}).then(async resp => { "lang": tencentTransMap[targetLanguage]
const data = JSON.parse(await resp.text()); }
if (data.header.ret_code !== 'succ') { })
return "en" });
} const data = await response.json();
return data.language; return data.header.ret_code === 'succ' ? data.auto_translation?.[1] : "翻译失败";
}) } catch (error) {
return fetch(url, { logger.error("Error translating text:", error);
method: "POST", return "翻译失败";
headers: { }
"USER-AGENT": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/111.0"
},
body: JSON.stringify({
"header": {
"fn": "auto_translation",
"client_key": "browser-firefox-111.0.0-Mac OS-d35fca23-eb48-45ba-9913-114f1177b02b-1679376552800"
},
"type": "plain",
"model_category": "normal",
"text_domain": "general",
"source": {
"lang": sourceLanguage,
"text_list": [
"",
query,
""
]
},
"target": {
"lang": tencentTransMap[targetLanguage]
}
})
}).then(async resp => {
const data = JSON.parse(await resp.text());
if (data.header.ret_code !== 'succ') {
return "翻译失败"
}
return data.auto_translation?.[1];
})
} }
} }
// 百度翻译策略 // 百度翻译策略
class BaiduTranslateStrategy extends TranslateStrategy { class BaiduTranslateStrategy extends TranslateStrategy {
config = {
/**
* 百度翻译appid
*/
translateAppId: "",
/**
* 百度翻译密匙
*/
translateSecret: "",
/**
* 魔法
*/
proxy: ""
}
constructor(config) { constructor(config) {
super(); super();
this.config = config; this.config = config;
} }
async translate(query, targetLanguage) { 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 }`;
const url = `http://api.fanyi.baidu.com/api/trans/vip/translate?from=auto&to=${ try {
transMap[targetLanguage] const response = await fetch(url);
}&appid=${this.config.translateAppId}&salt=rconsole&sign=${md5( const data = await response.json();
this.config.translateAppId + query + "rconsole" + this.config.translateSecret, return data.trans_result[0].dst;
)}&q=${query}`; } catch (error) {
return fetch(url) logger.error("Error translating text:", error);
.then(resp => resp.json()) return "翻译失败";
.then(text => text.trans_result) }
.then(res => res[0].dst)
.catch(err => logger.error(err));
}
}
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 { export default class Translate {
constructor(config) { constructor(config) {
this.config = config; this.config = config;
this.strategy = null; this.strategy = this.selectStrategy();
}
selectStrategy() {
if (!_.isEmpty(this.config.translateAppId) && !_.isEmpty(this.config.translateSecret)) { if (!_.isEmpty(this.config.translateAppId) && !_.isEmpty(this.config.translateSecret)) {
this.strategy = new BaiduTranslateStrategy(this.config); logger.info("[R插件][翻译策略]:当前选择 百度翻译")
return new BaiduTranslateStrategy(this.config);
} else { } else {
// 根据配置选择其他策略,例如 Tencent 或 Google logger.info("[R插件][翻译策略]:当前选择 企鹅翻译")
this.strategy = new TencentTranslateStrategy(this.config); return new TencentTranslateStrategy(this.config);
} }
} }
async translate(query, targetLanguage) { async translate(query, targetLanguage) {
if (!this.strategy) {
throw new Error("无翻译策略可用");
}
return this.strategy.translate(query, targetLanguage); return this.strategy.translate(query, targetLanguage);
} }
} }