rc-plugin/utils/trans-strategy.js
zhiyu1998 90f8373c60 🎈 pref: 优化翻译功能
- 增加了对翻译请求中缺少文本的处理逻辑
- 移除了不再使用的Google翻译策略
- 优化了语言检测和翻译的异常处理
- 清理了代码,移除了未使用的import和类定义
2024-09-08 14:47:26 +08:00

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);
}
}