import { memo, useState } from "react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { requestTranslations } from "@/lib/ai"; type Props = { open: boolean; onOpenChange: (next: boolean) => void; languages: string[]; path: string; prompt: string | undefined; onConfirm: (result: Record) => Promise | void; }; function AiTranslateModalImpl({ open, onOpenChange, languages, path, prompt, onConfirm }: Props) { const [text, setText] = useState(""); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); async function handleSubmit(e: React.FormEvent) { e.preventDefault(); const payload = text.trim(); if (!payload) { setError("请输入待翻译文本"); return; } if (languages.length === 0) { setError("当前项目暂无目标语言"); return; } setLoading(true); setError(null); try { const result = await requestTranslations({ text: payload, languages, prompt }); // 二次校验 keys 完整性 for (const l of languages) { if (!Object.prototype.hasOwnProperty.call(result, l)) { throw new Error("AI 返回的 key 不完整"); } } await onConfirm(result); setText(""); onOpenChange(false); } catch (e) { setError((e as Error)?.message ?? "AI 翻译失败"); } finally { setLoading(false); } } return ( { if (!loading) { onOpenChange(v); if (!v) setError(null); } }} > {`AI 翻译 — ${path || "条目"}`}
setText(e.target.value)} placeholder="请输入原文本" aria-label="待翻译文本" />
目标语言:{languages.join(", ") || "无"}
{error && (
{error}
)}
); } export const AiTranslateModal = memo(AiTranslateModalImpl);