diff --git a/src/config/index.js b/src/config/index.js index 9b75f61..2d22dee 100644 --- a/src/config/index.js +++ b/src/config/index.js @@ -402,34 +402,64 @@ export const DEFAULT_TRANS_APIS = { [OPT_TRANS_GOOGLE]: { url: "https://translate.googleapis.com/translate_a/single", key: "", + fetchLimit: DEFAULT_FETCH_LIMIT, // 最大任务数量 + fetchInterval: DEFAULT_FETCH_INTERVAL, // 任务间隔时间 + }, + [OPT_TRANS_MICROSOFT]: { + fetchLimit: DEFAULT_FETCH_LIMIT, + fetchInterval: DEFAULT_FETCH_INTERVAL, + }, + [OPT_TRANS_BAIDU]: { + fetchLimit: DEFAULT_FETCH_LIMIT, + fetchInterval: DEFAULT_FETCH_INTERVAL, + }, + [OPT_TRANS_TENCENT]: { + fetchLimit: DEFAULT_FETCH_LIMIT, + fetchInterval: DEFAULT_FETCH_INTERVAL, }, [OPT_TRANS_DEEPL]: { url: "https://api-free.deepl.com/v2/translate", key: "", + fetchLimit: 1, + fetchInterval: 500, + }, + [OPT_TRANS_DEEPLFREE]: { + fetchLimit: 1, + fetchInterval: 500, }, [OPT_TRANS_DEEPLX]: { url: "http://localhost:1188/translate", key: "", + fetchLimit: 1, + fetchInterval: 500, }, [OPT_TRANS_OPENAI]: { url: "https://api.openai.com/v1/chat/completions", key: "", model: "gpt-4", prompt: `You will be provided with a sentence in ${PROMPT_PLACE_FROM}, and your task is to translate it into ${PROMPT_PLACE_TO}.`, + fetchLimit: 1, + fetchInterval: 500, }, [OPT_TRANS_GEMINI]: { url: "https://generativelanguage.googleapis.com/v1/models", key: "", model: "gemini-pro", prompt: `Translate the following text from ${PROMPT_PLACE_FROM} to ${PROMPT_PLACE_TO}:\n\n${PROMPT_PLACE_TEXT}`, + fetchLimit: 1, + fetchInterval: 500, }, [OPT_TRANS_CLOUDFLAREAI]: { url: "https://api.cloudflare.com/client/v4/accounts/{ACCOUNT_ID}/ai/run/@cf/meta/m2m100-1.2b", key: "", + fetchLimit: 1, + fetchInterval: 500, }, [OPT_TRANS_CUSTOMIZE]: { url: "", key: "", + fetchLimit: DEFAULT_FETCH_LIMIT, + fetchInterval: DEFAULT_FETCH_INTERVAL, }, }; @@ -459,8 +489,8 @@ export const DEFAULT_BLACKLIST = [ export const DEFAULT_SETTING = { darkMode: false, // 深色模式 uiLang: "en", // 界面语言 - fetchLimit: DEFAULT_FETCH_LIMIT, // 最大任务数量 - fetchInterval: DEFAULT_FETCH_INTERVAL, // 任务间隔时间 + // fetchLimit: DEFAULT_FETCH_LIMIT, // 最大任务数量(移至transApis,作废) + // fetchInterval: DEFAULT_FETCH_INTERVAL, // 任务间隔时间(移至transApis,作废) minLength: TRANS_MIN_LENGTH, maxLength: TRANS_MAX_LENGTH, newlineLength: TRANS_NEWLINE_LENGTH, diff --git a/src/libs/translator.js b/src/libs/translator.js index fbfa521..c132bb9 100644 --- a/src/libs/translator.js +++ b/src/libs/translator.js @@ -13,6 +13,8 @@ import { OPT_TIMING_PAGEOPEN, OPT_TIMING_MOUSEOVER, DEFAULT_TRANS_APIS, + DEFAULT_FETCH_LIMIT, + DEFAULT_FETCH_INTERVAL, } from "../config"; import Content from "../views/Content"; import { updateFetchPool, clearFetchPool } from "./fetch"; @@ -104,9 +106,19 @@ export class Translator { }; }; - constructor(rule, setting) { - const { fetchInterval, fetchLimit } = setting; + _updatePool(translator) { + if (!translator) { + return; + } + + const { + fetchInterval = DEFAULT_FETCH_INTERVAL, + fetchLimit = DEFAULT_FETCH_LIMIT, + } = this._setting.transApis[translator] || {}; updateFetchPool(fetchInterval, fetchLimit); + } + + constructor(rule, setting) { this._overrideAttachShadow(); this._setting = setting; @@ -120,6 +132,8 @@ export class Translator { .map((item) => item.split(",").map((item) => item.trim())) .filter(([term]) => Boolean(term)); + this._updatePool(rule.translator); + if (rule.transOpen === "true") { this._register(); } @@ -156,6 +170,7 @@ export class Translator { updateRule = (obj) => { this.rule = { ...this.rule, ...obj }; + this._updatePool(obj.translator); }; toggle = () => { diff --git a/src/views/Options/Apis.js b/src/views/Options/Apis.js index ed1424e..6c56ce9 100644 --- a/src/views/Options/Apis.js +++ b/src/views/Options/Apis.js @@ -14,6 +14,8 @@ import { OPT_TRANS_CLOUDFLAREAI, OPT_TRANS_CUSTOMIZE, URL_KISS_PROXY, + DEFAULT_FETCH_LIMIT, + DEFAULT_FETCH_INTERVAL, } from "../../config"; import { useState } from "react"; import { useI18n } from "../../hooks/I18n"; @@ -28,6 +30,7 @@ import { useApi } from "../../hooks/Api"; import { apiTranslate } from "../../apis"; import Box from "@mui/material/Box"; import Link from "@mui/material/Link"; +import { limitNumber } from "../../libs/utils"; function TestButton({ translator, api }) { const i18n = useI18n(); @@ -88,10 +91,26 @@ function TestButton({ translator, api }) { function ApiFields({ translator }) { const i18n = useI18n(); const { api, updateApi, resetApi } = useApi(translator); - const { url = "", key = "", model = "", prompt = "" } = api; + const { + url = "", + key = "", + model = "", + prompt = "", + fetchLimit = DEFAULT_FETCH_LIMIT, + fetchInterval = DEFAULT_FETCH_INTERVAL, + } = api; const handleChange = (e) => { - const { name, value } = e.target; + let { name, value } = e.target; + switch (name) { + case "fetchLimit": + value = limitNumber(value, 1, 100); + break; + case "fetchInterval": + value = limitNumber(value, 0, 5000); + break; + default: + } updateApi({ [name]: value, }); @@ -137,6 +156,7 @@ function ApiFields({ translator }) { /> )} + {(translator === OPT_TRANS_OPENAI || translator === OPT_TRANS_GEMINI) && ( <> )} + + + + - {!buildinTranslators.includes(translator) && ( - - )} + {translator === OPT_TRANS_CUSTOMIZE && ( diff --git a/src/views/Options/Setting.js b/src/views/Options/Setting.js index d82d435..e2c7995 100644 --- a/src/views/Options/Setting.js +++ b/src/views/Options/Setting.js @@ -89,8 +89,6 @@ export default function Settings() { const { uiLang, - fetchLimit, - fetchInterval, minLength, maxLength, clearCache, @@ -121,24 +119,6 @@ export default function Settings() { - - - -