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() {
-
-
-
-