feat: Support for multiple translation services in tranbox
This commit is contained in:
@@ -56,6 +56,13 @@ export const OPT_ALL_TYPES = [
|
||||
OPT_TRANS_CUSTOMIZE,
|
||||
];
|
||||
|
||||
export const OPT_LANGDETECTOR_ALL = [
|
||||
OPT_TRANS_GOOGLE,
|
||||
OPT_TRANS_MICROSOFT,
|
||||
OPT_TRANS_BAIDU,
|
||||
OPT_TRANS_TENCENT,
|
||||
];
|
||||
|
||||
// 翻译引擎特殊集合
|
||||
export const API_SPE_TYPES = {
|
||||
// 内置翻译
|
||||
@@ -114,15 +121,9 @@ export const API_SPE_TYPES = {
|
||||
OPT_TRANS_OPENROUTER,
|
||||
OPT_TRANS_CUSTOMIZE,
|
||||
]),
|
||||
detector: new Set(OPT_LANGDETECTOR_ALL),
|
||||
};
|
||||
|
||||
export const OPT_LANGDETECTOR_ALL = [
|
||||
OPT_TRANS_GOOGLE,
|
||||
OPT_TRANS_MICROSOFT,
|
||||
OPT_TRANS_BAIDU,
|
||||
OPT_TRANS_TENCENT,
|
||||
];
|
||||
|
||||
export const BUILTIN_STONES = [
|
||||
"formal", // 正式风格
|
||||
"casual", // 口语风格
|
||||
|
||||
@@ -344,6 +344,11 @@ export const I18N = {
|
||||
en: `Translate Service`,
|
||||
zh_TW: `翻譯服務`,
|
||||
},
|
||||
translate_service_multiple: {
|
||||
zh: `翻译服务 (支持多选)`,
|
||||
en: `Translation service (multiple supported)`,
|
||||
zh_TW: `翻譯服務 (支援多選)`,
|
||||
},
|
||||
translate_timing: {
|
||||
zh: `翻译时机`,
|
||||
en: `Translate Timing`,
|
||||
|
||||
@@ -74,7 +74,7 @@ export const OPT_TRANBOX_TRIGGER_ALL = [
|
||||
export const DEFAULT_TRANBOX_SHORTCUT = ["AltLeft", "KeyS"];
|
||||
export const DEFAULT_TRANBOX_SETTING = {
|
||||
transOpen: true, // 是否启用划词翻译
|
||||
apiSlug: OPT_TRANS_MICROSOFT,
|
||||
apiSlugs: [OPT_TRANS_MICROSOFT],
|
||||
fromLang: "auto",
|
||||
toLang: "zh-CN",
|
||||
toLang2: "en",
|
||||
@@ -127,7 +127,7 @@ export const DEFAULT_SETTING = {
|
||||
injectRules: true, // 是否注入订阅规则
|
||||
fabClickAction: 0, // 悬浮按钮点击行为
|
||||
// injectWebfix: true, // 是否注入修复补丁(作废)
|
||||
detectRemote: false, // 是否使用远程语言检测 (从rule移回)
|
||||
// detectRemote: false, // 是否使用远程语言检测 (从rule移回)
|
||||
// contextMenus: true, // 是否添加右键菜单(作废)
|
||||
contextMenuType: 1, // 右键菜单类型(0不显示,1简单菜单,2多级菜单)
|
||||
// transTag: DEFAULT_TRANS_TAG, // 译文元素标签(移至rule,作废)
|
||||
@@ -146,7 +146,7 @@ export const DEFAULT_SETTING = {
|
||||
// disableLangs: [], // 不翻译的语言(移至rule,作废)
|
||||
skipLangs: [], // 不翻译的语言(从rule移回)
|
||||
transInterval: 100, // 翻译等待时间
|
||||
langDetector: OPT_TRANS_MICROSOFT, // 远程语言识别服务
|
||||
langDetector: "-", // 远程语言识别服务
|
||||
mouseHoverSetting: DEFAULT_MOUSE_HOVER_SETTING, // 鼠标悬停翻译
|
||||
preInit: true, // 是否预加载脚本
|
||||
transAllnow: false, // 是否立即全部翻译
|
||||
|
||||
@@ -5,6 +5,7 @@ import {
|
||||
OPT_TRANS_TENCENT,
|
||||
OPT_LANGS_TO_CODE,
|
||||
OPT_LANGS_MAP,
|
||||
API_SPE_TYPES,
|
||||
} from "../config";
|
||||
import { browser } from "./browser";
|
||||
import {
|
||||
@@ -27,15 +28,11 @@ const langdetectFns = {
|
||||
* @param {*} text
|
||||
* @returns
|
||||
*/
|
||||
export const tryDetectLang = async (
|
||||
text,
|
||||
detectRemote = true,
|
||||
langDetector = OPT_TRANS_MICROSOFT
|
||||
) => {
|
||||
export const tryDetectLang = async (text, langDetector = "-") => {
|
||||
let deLang = "";
|
||||
|
||||
// 远程识别
|
||||
if (detectRemote && langDetector) {
|
||||
if (API_SPE_TYPES.detector.has(langDetector)) {
|
||||
try {
|
||||
const lang = await langdetectFns[langDetector](text);
|
||||
if (lang) {
|
||||
|
||||
@@ -849,14 +849,9 @@ export class Translator {
|
||||
// 提前进行语言检测
|
||||
let deLang = "";
|
||||
const { fromLang = "auto", toLang } = this.#rule;
|
||||
const { detectRemote, skipLangs = [] } = this.#setting;
|
||||
const { langDetector, skipLangs = [] } = this.#setting;
|
||||
if (fromLang === "auto") {
|
||||
const { langDetector } = this.#setting;
|
||||
deLang = await tryDetectLang(
|
||||
node.textContent,
|
||||
detectRemote,
|
||||
langDetector
|
||||
);
|
||||
deLang = await tryDetectLang(node.textContent, langDetector);
|
||||
if (
|
||||
deLang &&
|
||||
(toLang.slice(0, 2) === deLang.slice(0, 2) ||
|
||||
|
||||
@@ -13,7 +13,6 @@ import {
|
||||
UI_LANGS,
|
||||
TRANS_NEWLINE_LENGTH,
|
||||
CACHE_NAME,
|
||||
OPT_TRANS_MICROSOFT,
|
||||
OPT_LANGDETECTOR_ALL,
|
||||
OPT_SHORTCUT_TRANSLATE,
|
||||
OPT_SHORTCUT_STYLE,
|
||||
@@ -118,10 +117,10 @@ export default function Settings() {
|
||||
blacklist = DEFAULT_BLACKLIST.join(",\n"),
|
||||
csplist = DEFAULT_CSPLIST.join(",\n"),
|
||||
transInterval = 100,
|
||||
langDetector = OPT_TRANS_MICROSOFT,
|
||||
langDetector = "-",
|
||||
preInit = true,
|
||||
skipLangs = [],
|
||||
detectRemote = true,
|
||||
// detectRemote = true,
|
||||
transAllnow = false,
|
||||
} = setting;
|
||||
const { isHide = false, fabClickAction = 0 } = fab || {};
|
||||
@@ -315,7 +314,7 @@ export default function Settings() {
|
||||
<MenuItem value={true}>{i18n("mk_pageopen")}</MenuItem>
|
||||
</TextField>
|
||||
</Grid>
|
||||
<Grid item xs={12} sm={12} md={6} lg={3}>
|
||||
{/* <Grid item xs={12} sm={12} md={6} lg={3}>
|
||||
<TextField
|
||||
select
|
||||
size="small"
|
||||
@@ -328,7 +327,7 @@ export default function Settings() {
|
||||
<MenuItem value={true}>{i18n("enable")}</MenuItem>
|
||||
<MenuItem value={false}>{i18n("disable")}</MenuItem>
|
||||
</TextField>
|
||||
</Grid>
|
||||
</Grid> */}
|
||||
<Grid item xs={12} sm={12} md={6} lg={3}>
|
||||
<TextField
|
||||
select
|
||||
@@ -336,9 +335,10 @@ export default function Settings() {
|
||||
size="small"
|
||||
name="langDetector"
|
||||
value={langDetector}
|
||||
label={i18n("detect_lang_service")}
|
||||
label={i18n("detect_lang_remote")}
|
||||
onChange={handleChange}
|
||||
>
|
||||
<MenuItem value={"-"}>{i18n("disable")}</MenuItem>
|
||||
{OPT_LANGDETECTOR_ALL.map((item) => (
|
||||
<MenuItem value={item} key={item}>
|
||||
{item}
|
||||
|
||||
@@ -51,7 +51,7 @@ export default function Tranbox() {
|
||||
|
||||
const {
|
||||
transOpen,
|
||||
apiSlug,
|
||||
apiSlugs,
|
||||
fromLang,
|
||||
toLang,
|
||||
toLang2 = "en",
|
||||
@@ -88,15 +88,18 @@ export default function Tranbox() {
|
||||
|
||||
<Box>
|
||||
<Grid container spacing={2} columns={12}>
|
||||
<Grid item xs={12} sm={12} md={6} lg={3}>
|
||||
<Grid item xs={12} sm={12} md={12} lg={6}>
|
||||
<TextField
|
||||
select
|
||||
fullWidth
|
||||
size="small"
|
||||
name="apiSlug"
|
||||
value={apiSlug}
|
||||
label={i18n("translate_service")}
|
||||
name="apiSlugs"
|
||||
value={apiSlugs}
|
||||
label={i18n("translate_service_multiple")}
|
||||
onChange={handleChange}
|
||||
SelectProps={{
|
||||
multiple: true,
|
||||
}}
|
||||
>
|
||||
{enabledApis.map((api) => (
|
||||
<MenuItem key={api.apiSlug} value={api.apiSlug}>
|
||||
|
||||
@@ -287,7 +287,7 @@ function TranForm({
|
||||
/>
|
||||
)}
|
||||
|
||||
{enDict !== "-" && (
|
||||
{enDict !== "-" && isValidWord(text) && (
|
||||
<>
|
||||
<DictCont text={text} />
|
||||
<SugCont text={text} />
|
||||
|
||||
@@ -18,7 +18,7 @@ export default function TranCont({
|
||||
toLang,
|
||||
toLang2 = "en",
|
||||
transApis,
|
||||
simpleStyle,
|
||||
simpleStyle = false,
|
||||
langDetector,
|
||||
}) {
|
||||
const i18n = useI18n();
|
||||
@@ -27,6 +27,10 @@ export default function TranCont({
|
||||
const [error, setError] = useState("");
|
||||
|
||||
useEffect(() => {
|
||||
if (!text?.trim()) {
|
||||
return;
|
||||
}
|
||||
|
||||
(async () => {
|
||||
try {
|
||||
setLoading(true);
|
||||
|
||||
Reference in New Issue
Block a user