import { useMemo } from "react"; import { useDevice } from "@/contexts/DeviceContext"; import { isLikelyNetworkFetchError } from "@/lib/networkError"; import { Loader2, Wifi } from "lucide-react"; import BottomNav from "@/components/BottomNav"; import localeZh from "@/locales/data-zh.json"; import { getUiLanguageOverride, isKnownLanguage, resolveLocalePack } from "@/locales/resolveLocale"; type ConnectLocale = (typeof localeZh)["connect"]; function pickConnectLocale(effectiveLanguage: number): ConnectLocale { // 前端语言覆盖(de/es/fr)优先;否则沿用 URL ?lang=(设备语言);最后回退到生效语言。 const override = getUiLanguageOverride(); if (override != null) return resolveLocalePack(override).connect as ConnectLocale; const params = new URLSearchParams(window.location.search); const langParam = Number(params.get("lang")); const lang = isKnownLanguage(langParam) ? langParam : effectiveLanguage; return resolveLocalePack(lang).connect as ConnectLocale; } function fmt(template: string, vars: Record): string { let s = template; for (const [k, v] of Object.entries(vars)) { s = s.split(`{${k}}`).join(v); } return s; } /** 自动连接设备时的占位(替代原 ConnectScreen) */ export default function ConnectionPlaceholder() { const { ip, isConnecting, error, ipMissing, effectiveLanguage } = useDevice(); const text = useMemo(() => pickConnectLocale(effectiveLanguage), [effectiveLanguage]); return (
{ipMissing ? ( <>

{text.ipMissingTitle}

{text.ipMissingDesc}

?ip=

) : isConnecting ? ( <>

{fmt(text.connecting, { ip })}

) : ( <>

{text.failedTitle}

{error && !isLikelyNetworkFetchError(error) ? error : text.failedDesc}

{fmt(text.failedHint, { ip })}

)}
); }