Files
kiss-translator/src/views/Selection/TranCont.js

160 lines
4.2 KiB
JavaScript
Raw Normal View History

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} />}
</>
);
}