64 lines
1.6 KiB
JavaScript
64 lines
1.6 KiB
JavaScript
import { useEffect } from "react";
|
|
import { useState } from "react";
|
|
import { tryDetectLang } from "../libs";
|
|
import { apiTranslate } from "../apis";
|
|
import { DEFAULT_TRANS_APIS } from "../config";
|
|
import { kissLog } from "../libs/log";
|
|
|
|
/**
|
|
* 翻译hook
|
|
* @param {*} q
|
|
* @param {*} rule
|
|
* @param {*} setting
|
|
* @returns
|
|
*/
|
|
export function useTranslate(q, rule, setting) {
|
|
const [text, setText] = useState("");
|
|
const [loading, setLoading] = useState(false);
|
|
const [sameLang, setSamelang] = useState(false);
|
|
|
|
const { translator, fromLang, toLang, detectRemote, skipLangs = [] } = rule;
|
|
|
|
useEffect(() => {
|
|
(async () => {
|
|
try {
|
|
setLoading(true);
|
|
|
|
if (!q.replace(/\[(\d+)\]/g, "").trim()) {
|
|
setText(q);
|
|
setSamelang(false);
|
|
return;
|
|
}
|
|
|
|
const deLang = await tryDetectLang(
|
|
q,
|
|
detectRemote === "true",
|
|
setting.langDetector
|
|
);
|
|
if (deLang && (toLang.includes(deLang) || skipLangs.includes(deLang))) {
|
|
setSamelang(true);
|
|
} else {
|
|
const [trText, isSame] = await apiTranslate({
|
|
translator,
|
|
text: q,
|
|
fromLang,
|
|
toLang,
|
|
apiSetting: {
|
|
...DEFAULT_TRANS_APIS[translator],
|
|
...(setting.transApis[translator] || {}),
|
|
},
|
|
});
|
|
setText(trText);
|
|
setSamelang(isSame);
|
|
}
|
|
} catch (err) {
|
|
kissLog(err, "translate");
|
|
} finally {
|
|
setLoading(false);
|
|
}
|
|
})();
|
|
}, [q, translator, fromLang, toLang, detectRemote, skipLangs, setting]);
|
|
|
|
return { text, sameLang, loading };
|
|
}
|