import { SettingProvider } from "../../hooks/Setting"; import ThemeProvider from "../../hooks/Theme"; import DraggableResizable from "./DraggableResizable"; import Header from "../Popup/Header"; import Stack from "@mui/material/Stack"; import TextField from "@mui/material/TextField"; import MenuItem from "@mui/material/MenuItem"; import Grid from "@mui/material/Grid"; import Box from "@mui/material/Box"; import Divider from "@mui/material/Divider"; import Alert from "@mui/material/Alert"; import CircularProgress from "@mui/material/CircularProgress"; import { useI18n } from "../../hooks/I18n"; import { OPT_TRANS_ALL, OPT_LANGS_FROM, OPT_LANGS_TO, DEFAULT_TRANS_APIS, OPT_TRANS_BAIDU, } from "../../config"; import { useEffect, useState, useRef } from "react"; import { apiTranslate } from "../../apis"; import { isValidWord } from "../../libs/utils"; const exchangeMap = { word_third: "第三人称单数", word_ing: "现在分词", word_done: "过去式", word_past: "过去分词", word_pl: "复数", word_proto: "原词", }; function DictCont({ dictResult }) { if (!dictResult) { return; } return (

{dictResult.simple_means?.word_name}

{Object.entries(dictResult.simple_means?.exchange || {}).map( ([key, val]) => ( {`${exchangeMap[key] || key}: ${val.join( "," )}; `} ) )}

{Object.values(dictResult.simple_means?.tags || {}) .map((vals) => vals.join(", ")) .join(", ")}

{dictResult.simple_means?.symbols?.map(({ ph_en, ph_am, parts }, idx) => (

{`英: [${ph_en}] 美: [${ph_am}]`}

{parts.map(({ part, means }, idx) => (

{`[${part}]: ${means.join("; ")}`}

))}
))}
); } function TranCont({ text, translator, fromLang, toLang, transApis }) { const i18n = useI18n(); const [trText, setTrText] = useState(""); const [loading, setLoading] = useState(false); const [error, setError] = useState(""); const [dictResult, setDictResult] = useState(null); useEffect(() => { (async () => { try { setLoading(true); setTrText(""); setError(""); setDictResult(null); const apis = { ...transApis, ...DEFAULT_TRANS_APIS }; const apiSetting = apis[translator]; const tranRes = await apiTranslate({ text, translator, fromLang, toLang, apiSetting, }); setTrText(tranRes[0]); // 词典 if (isValidWord(text) && toLang.startsWith("zh")) { if (fromLang === "en" && translator === OPT_TRANS_BAIDU) { setDictResult(tranRes[2]); } else { const dictRes = await apiTranslate({ text, translator: OPT_TRANS_BAIDU, fromLang: "en", toLang: "zh-CN", apiSetting: apis[OPT_TRANS_BAIDU], }); setDictResult(dictRes[2].dict_result); } } } catch (err) { setError(err.message); } finally { setLoading(false); } })(); }, [text, translator, fromLang, toLang, transApis]); return ( <> {loading && } {error && {error}} {dictResult && } ); } function TranForm({ text, setText, tranboxSetting, transApis }) { const i18n = useI18n(); const [editMode, setEditMode] = useState(false); const [editText, setEditText] = useState(""); const [translator, setTranslator] = useState(tranboxSetting.translator); const [fromLang, setFromLang] = useState(tranboxSetting.fromLang); const [toLang, setToLang] = useState(tranboxSetting.toLang); const inputRef = useRef(null); return ( { setFromLang(e.target.value); }} > {OPT_LANGS_FROM.map(([lang, name]) => ( {name} ))} { setToLang(e.target.value); }} > {OPT_LANGS_TO.map(([lang, name]) => ( {name} ))} { setTranslator(e.target.value); }} > {OPT_TRANS_ALL.map((item) => ( {item} ))} { setEditText(e.target.value); }} onClick={() => { setEditMode(true); setEditText(text); const timer = setTimeout(() => { clearTimeout(timer); inputRef.current?.focus(); }, 100); }} onBlur={() => { setEditMode(false); setText(editText.trim()); }} /> ); } export default function TranBox({ text, setText, setShowBox, tranboxSetting, transApis, boxSize, setBoxSize, boxPosition, setBoxPosition, }) { return ( } onChangeSize={setBoxSize} onChangePosition={setBoxPosition} > ); }