feat: mutual translation effect with the target language
This commit is contained in:
@@ -215,6 +215,14 @@ export const I18N = {
|
|||||||
zh: `目标语言`,
|
zh: `目标语言`,
|
||||||
en: `Target Language`,
|
en: `Target Language`,
|
||||||
},
|
},
|
||||||
|
to_lang2: {
|
||||||
|
zh: `第二目标语言`,
|
||||||
|
en: `Target Language 2`,
|
||||||
|
},
|
||||||
|
to_lang2_helper: {
|
||||||
|
zh: `设定后,与目标语言产生互译效果,但依赖远程语言识别。`,
|
||||||
|
en: `After setting, it will produce mutual translation effect with the target language, but it relies on remote language recognition.`,
|
||||||
|
},
|
||||||
text_style: {
|
text_style: {
|
||||||
zh: `文字样式`,
|
zh: `文字样式`,
|
||||||
en: `Text Style`,
|
en: `Text Style`,
|
||||||
|
|||||||
@@ -345,6 +345,7 @@ export const DEFAULT_TRANBOX_SETTING = {
|
|||||||
translator: OPT_TRANS_MICROSOFT,
|
translator: OPT_TRANS_MICROSOFT,
|
||||||
fromLang: "auto",
|
fromLang: "auto",
|
||||||
toLang: "zh-CN",
|
toLang: "zh-CN",
|
||||||
|
toLang2: "en",
|
||||||
tranboxShortcut: DEFAULT_TRANBOX_SHORTCUT,
|
tranboxShortcut: DEFAULT_TRANBOX_SHORTCUT,
|
||||||
btnOffsetX: 10,
|
btnOffsetX: 10,
|
||||||
btnOffsetY: 10,
|
btnOffsetY: 10,
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ export default function Tranbox() {
|
|||||||
translator,
|
translator,
|
||||||
fromLang,
|
fromLang,
|
||||||
toLang,
|
toLang,
|
||||||
|
toLang2 = "en",
|
||||||
tranboxShortcut,
|
tranboxShortcut,
|
||||||
btnOffsetX,
|
btnOffsetX,
|
||||||
btnOffsetY,
|
btnOffsetY,
|
||||||
@@ -112,6 +113,22 @@ export default function Tranbox() {
|
|||||||
))}
|
))}
|
||||||
</TextField>
|
</TextField>
|
||||||
|
|
||||||
|
<TextField
|
||||||
|
select
|
||||||
|
size="small"
|
||||||
|
name="toLang2"
|
||||||
|
value={toLang2}
|
||||||
|
label={i18n("to_lang2")}
|
||||||
|
helperText={i18n("to_lang2_helper")}
|
||||||
|
onChange={handleChange}
|
||||||
|
>
|
||||||
|
{[["none", "None"], ...OPT_LANGS_TO].map(([lang, name]) => (
|
||||||
|
<MenuItem key={lang} value={lang}>
|
||||||
|
{name}
|
||||||
|
</MenuItem>
|
||||||
|
))}
|
||||||
|
</TextField>
|
||||||
|
|
||||||
<TextField
|
<TextField
|
||||||
size="small"
|
size="small"
|
||||||
label={i18n("tranbtn_offset_x")}
|
label={i18n("tranbtn_offset_x")}
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ function TranForm({ text, setText, tranboxSetting, transApis }) {
|
|||||||
const [translator, setTranslator] = useState(tranboxSetting.translator);
|
const [translator, setTranslator] = useState(tranboxSetting.translator);
|
||||||
const [fromLang, setFromLang] = useState(tranboxSetting.fromLang);
|
const [fromLang, setFromLang] = useState(tranboxSetting.fromLang);
|
||||||
const [toLang, setToLang] = useState(tranboxSetting.toLang);
|
const [toLang, setToLang] = useState(tranboxSetting.toLang);
|
||||||
|
const [toLang2, setToLang2] = useState(tranboxSetting.toLang2);
|
||||||
const inputRef = useRef(null);
|
const inputRef = useRef(null);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -150,6 +151,9 @@ function TranForm({ text, setText, tranboxSetting, transApis }) {
|
|||||||
translator={translator}
|
translator={translator}
|
||||||
fromLang={fromLang}
|
fromLang={fromLang}
|
||||||
toLang={toLang}
|
toLang={toLang}
|
||||||
|
toLang2={toLang2}
|
||||||
|
setToLang={setToLang}
|
||||||
|
setToLang2={setToLang2}
|
||||||
transApis={transApis}
|
transApis={transApis}
|
||||||
/>
|
/>
|
||||||
</Stack>
|
</Stack>
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import Stack from "@mui/material/Stack";
|
|||||||
import { useI18n } from "../../hooks/I18n";
|
import { useI18n } from "../../hooks/I18n";
|
||||||
import { DEFAULT_TRANS_APIS, OPT_TRANS_BAIDU } from "../../config";
|
import { DEFAULT_TRANS_APIS, OPT_TRANS_BAIDU } from "../../config";
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import { apiTranslate } from "../../apis";
|
import { apiTranslate, apiBaiduLangdetect } from "../../apis";
|
||||||
import { isValidWord } from "../../libs/utils";
|
import { isValidWord } from "../../libs/utils";
|
||||||
import CopyBtn from "./CopyBtn";
|
import CopyBtn from "./CopyBtn";
|
||||||
import DictCont from "./DictCont";
|
import DictCont from "./DictCont";
|
||||||
@@ -16,6 +16,9 @@ export default function TranCont({
|
|||||||
translator,
|
translator,
|
||||||
fromLang,
|
fromLang,
|
||||||
toLang,
|
toLang,
|
||||||
|
toLang2 = "en",
|
||||||
|
setToLang,
|
||||||
|
setToLang2,
|
||||||
transApis,
|
transApis,
|
||||||
}) {
|
}) {
|
||||||
const i18n = useI18n();
|
const i18n = useI18n();
|
||||||
@@ -32,6 +35,16 @@ export default function TranCont({
|
|||||||
setError("");
|
setError("");
|
||||||
setDictResult(null);
|
setDictResult(null);
|
||||||
|
|
||||||
|
// 互译
|
||||||
|
if (toLang !== toLang2 && toLang2 !== "none") {
|
||||||
|
const detectLang = await apiBaiduLangdetect(text);
|
||||||
|
if (detectLang === toLang) {
|
||||||
|
setToLang(toLang2);
|
||||||
|
setToLang2(toLang);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const apiSetting =
|
const apiSetting =
|
||||||
transApis[translator] || DEFAULT_TRANS_APIS[translator];
|
transApis[translator] || DEFAULT_TRANS_APIS[translator];
|
||||||
const tranRes = await apiTranslate({
|
const tranRes = await apiTranslate({
|
||||||
@@ -63,7 +76,16 @@ export default function TranCont({
|
|||||||
setLoading(false);
|
setLoading(false);
|
||||||
}
|
}
|
||||||
})();
|
})();
|
||||||
}, [text, translator, fromLang, toLang, transApis]);
|
}, [
|
||||||
|
text,
|
||||||
|
translator,
|
||||||
|
fromLang,
|
||||||
|
toLang,
|
||||||
|
toLang2,
|
||||||
|
setToLang,
|
||||||
|
setToLang2,
|
||||||
|
transApis,
|
||||||
|
]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
|||||||
Reference in New Issue
Block a user