2023-10-24 23:37:53 +08:00
|
|
|
import TextField from "@mui/material/TextField";
|
|
|
|
|
import Box from "@mui/material/Box";
|
|
|
|
|
import Alert from "@mui/material/Alert";
|
|
|
|
|
import CircularProgress from "@mui/material/CircularProgress";
|
2023-10-25 11:13:56 +08:00
|
|
|
import Chip from "@mui/material/Chip";
|
|
|
|
|
import Stack from "@mui/material/Stack";
|
2023-10-24 23:37:53 +08:00
|
|
|
import { useI18n } from "../../hooks/I18n";
|
|
|
|
|
import { DEFAULT_TRANS_APIS, OPT_TRANS_BAIDU } from "../../config";
|
|
|
|
|
import { useEffect, useState } from "react";
|
|
|
|
|
import { apiTranslate } from "../../apis";
|
|
|
|
|
import { isValidWord } from "../../libs/utils";
|
2023-10-26 12:24:24 +08:00
|
|
|
import CopyBtn from "./CopyBtn";
|
2023-10-26 17:32:55 +08:00
|
|
|
import FavBtn from "./FavBtn";
|
2023-10-24 23:37:53 +08:00
|
|
|
|
|
|
|
|
const exchangeMap = {
|
|
|
|
|
word_third: "第三人称单数",
|
|
|
|
|
word_ing: "现在分词",
|
|
|
|
|
word_done: "过去式",
|
|
|
|
|
word_past: "过去分词",
|
|
|
|
|
word_pl: "复数",
|
|
|
|
|
word_proto: "原词",
|
|
|
|
|
};
|
|
|
|
|
|
2023-10-26 17:32:55 +08:00
|
|
|
export function DictCont({ dictResult }) {
|
2023-10-24 23:37:53 +08:00
|
|
|
if (!dictResult) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<Box>
|
2023-10-26 17:32:55 +08:00
|
|
|
<Stack
|
|
|
|
|
direction="row"
|
|
|
|
|
justifyContent="space-between"
|
|
|
|
|
alignItems="flex-start"
|
|
|
|
|
>
|
|
|
|
|
<div style={{ fontWeight: "bold" }}>
|
|
|
|
|
{dictResult.simple_means?.word_name}
|
|
|
|
|
</div>
|
|
|
|
|
<FavBtn word={dictResult.simple_means?.word_name} />
|
|
|
|
|
</Stack>
|
|
|
|
|
|
2023-10-24 23:37:53 +08:00
|
|
|
{dictResult.simple_means?.symbols?.map(({ ph_en, ph_am, parts }, idx) => (
|
|
|
|
|
<div key={idx}>
|
2023-10-25 11:13:56 +08:00
|
|
|
<div>{`英[${ph_en}] 美[${ph_am}]`}</div>
|
2023-10-25 11:20:05 +08:00
|
|
|
<ul style={{ margin: "0.5em 0" }}>
|
2023-10-24 23:37:53 +08:00
|
|
|
{parts.map(({ part, means }, idx) => (
|
2023-10-24 23:50:07 +08:00
|
|
|
<li key={idx}>
|
|
|
|
|
{part ? `[${part}] ${means.join("; ")}` : means.join("; ")}
|
|
|
|
|
</li>
|
2023-10-24 23:37:53 +08:00
|
|
|
))}
|
|
|
|
|
</ul>
|
|
|
|
|
</div>
|
|
|
|
|
))}
|
2023-10-26 17:32:55 +08:00
|
|
|
|
2023-10-25 11:13:56 +08:00
|
|
|
<div>
|
|
|
|
|
{Object.entries(dictResult.simple_means?.exchange || {})
|
|
|
|
|
.map(([key, val]) => `${exchangeMap[key] || key}: ${val.join(", ")}`)
|
|
|
|
|
.join("; ")}
|
|
|
|
|
</div>
|
2023-10-26 17:32:55 +08:00
|
|
|
|
2023-10-25 11:13:56 +08:00
|
|
|
<Stack direction="row" spacing={1}>
|
|
|
|
|
{Object.values(dictResult.simple_means?.tags || {})
|
|
|
|
|
.flat()
|
|
|
|
|
.filter((item) => item)
|
|
|
|
|
.map((item) => (
|
|
|
|
|
<Chip label={item} size="small" />
|
|
|
|
|
))}
|
|
|
|
|
</Stack>
|
2023-10-24 23:37:53 +08:00
|
|
|
</Box>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export default 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) {
|
2023-10-25 11:13:56 +08:00
|
|
|
setDictResult(tranRes[2].dict_result);
|
2023-10-24 23:37:53 +08:00
|
|
|
} 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 (
|
|
|
|
|
<>
|
|
|
|
|
<Box>
|
|
|
|
|
<TextField
|
|
|
|
|
label={i18n("translated_text")}
|
2023-10-26 12:24:24 +08:00
|
|
|
// disabled
|
2023-10-24 23:37:53 +08:00
|
|
|
fullWidth
|
|
|
|
|
multiline
|
|
|
|
|
value={trText}
|
2023-10-26 12:24:24 +08:00
|
|
|
InputProps={{
|
|
|
|
|
endAdornment: (
|
|
|
|
|
<Stack
|
|
|
|
|
direction="row"
|
|
|
|
|
sx={{
|
|
|
|
|
position: "absolute",
|
|
|
|
|
right: 0,
|
|
|
|
|
top: 0,
|
|
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
<CopyBtn text={trText} />
|
|
|
|
|
</Stack>
|
|
|
|
|
),
|
|
|
|
|
}}
|
2023-10-24 23:37:53 +08:00
|
|
|
/>
|
|
|
|
|
</Box>
|
|
|
|
|
|
|
|
|
|
{loading && <CircularProgress size={24} />}
|
|
|
|
|
{error && <Alert severity="error">{error}</Alert>}
|
|
|
|
|
{dictResult && <DictCont dictResult={dictResult} />}
|
|
|
|
|
</>
|
|
|
|
|
);
|
|
|
|
|
}
|