// 多语言切换 import { Select } from 'antd'; import { history, useIntl, useLocale, useLocation, useSearchParams, useSiteData } from 'dumi'; import { useCallback, type FC } from 'react'; import useAdditionalThemeConfig from '../../hooks/useAdditionalThemeConfig'; import { getTargetLocalePath } from '../../utils'; import SwitchBtn from '../Header/SwitchBtn'; const { Option } = Select; const LangSwitch: FC = () => { const [searchParams] = useSearchParams(); const { localesEnhance } = useAdditionalThemeConfig(); const { locales } = useSiteData(); const { locale } = useIntl(); const current = useLocale(); const { pathname } = useLocation(); const handleLangChange = useCallback( (lang: string) => { let path = getTargetLocalePath({ pathname, current, // eslint-disable-next-line @typescript-eslint/no-non-null-assertion target: locales.find(({ id }) => id === lang)! }); // 多多语言首页做特殊处理 eg. /index-en if (path.startsWith('/-')) { path = `/index${path.substring(1)}`; } else if (path.endsWith('/index')) { path = path.replace('/index', '/'); } history.push({ pathname: path, search: searchParams.toString() }); }, [pathname, current, locales, searchParams] ); const onLangChange = useCallback(() => { handleLangChange(locales.filter((item) => item.id !== locale)[0].id); }, [locale, handleLangChange, locales]); let LangSwitchJSX; // do not render in single language if (locales.length > 2 || (!localesEnhance && locales.length > 2)) { const langOptions = locales.map((lang) => ( )); LangSwitchJSX = ( ); } else if (locales.length === 2 && Array.isArray(localesEnhance) && localesEnhance.length > 1) { // 按 locales 顺序展示 const switchValue = locales[0].id === locale ? 1 : 2; LangSwitchJSX = ( ); } return LangSwitchJSX; }; export default LangSwitch;