mirror of
https://github.com/Jerryplusy/rc-plugin.git
synced 2025-10-14 08:09:19 +00:00
126 lines
4.3 KiB
JavaScript
126 lines
4.3 KiB
JavaScript
import { transMap, tencentTransMap } from "../constants/constant.js";
|
|
import md5 from "md5";
|
|
import fetch from "node-fetch";
|
|
import _ from 'lodash'
|
|
|
|
// 定义翻译策略接口
|
|
class TranslateStrategy {
|
|
async translate(query, targetLanguage) {
|
|
throw new Error("This method should be implemented by subclasses");
|
|
}
|
|
}
|
|
|
|
// 百度翻译策略
|
|
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 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) {
|
|
try {
|
|
const sourceLanguage = await this.detectLanguage(query);
|
|
const response = await fetch(this.url, {
|
|
method: "POST",
|
|
headers: this.commonHeaders,
|
|
body: JSON.stringify({
|
|
"header": {
|
|
"fn": "auto_translation",
|
|
"client_key": this.clientKey
|
|
},
|
|
"type": "plain",
|
|
"model_category": "normal",
|
|
"text_domain": "general",
|
|
"source": {
|
|
"lang": sourceLanguage,
|
|
"text_list": ["", query, ""]
|
|
},
|
|
"target": {
|
|
"lang": tencentTransMap[targetLanguage]
|
|
}
|
|
})
|
|
});
|
|
const data = await response.json();
|
|
return data.header.ret_code === 'succ' ? data.auto_translation?.[1] : "翻译失败";
|
|
} catch (error) {
|
|
logger.error("Error translating text:", error);
|
|
return "翻译失败";
|
|
}
|
|
}
|
|
}
|
|
|
|
// 百度翻译策略
|
|
class BaiduTranslateStrategy extends TranslateStrategy {
|
|
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 }`;
|
|
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 "翻译失败";
|
|
}
|
|
}
|
|
}
|
|
|
|
// 主逻辑
|
|
export default class Translate {
|
|
constructor(config) {
|
|
this.config = config;
|
|
this.strategy = this.selectStrategy();
|
|
}
|
|
|
|
selectStrategy() {
|
|
if (!_.isEmpty(this.config.translateAppId) && !_.isEmpty(this.config.translateSecret)) {
|
|
logger.info("[R插件][翻译策略]:当前选择 百度翻译")
|
|
return new BaiduTranslateStrategy(this.config);
|
|
} else {
|
|
logger.info("[R插件][翻译策略]:当前选择 企鹅翻译")
|
|
return new TencentTranslateStrategy(this.config);
|
|
}
|
|
}
|
|
|
|
async translate(query, targetLanguage) {
|
|
if (!this.strategy) {
|
|
throw new Error("无翻译策略可用");
|
|
}
|
|
return this.strategy.translate(query, targetLanguage);
|
|
}
|
|
}
|