From 8335970e2e9d3cb417233d551e961626a78da096 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A5=87=E8=B6=A3=E4=BF=9D=E7=BD=97?= Date: Fri, 13 Feb 2026 17:48:38 +0800 Subject: [PATCH] =?UTF-8?q?Feat:=20=E5=8D=95=E6=AC=A1=E7=BF=BB=E8=AF=91?= =?UTF-8?q?=E8=B4=A8=E9=87=8F=E4=BC=98=E5=8C=96=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/biz/add-entry-modal.tsx | 19 ++++--- src/components/biz/ai-translate-modal.tsx | 61 ++++++++++++++++++----- src/lib/ai.ts | 3 ++ 3 files changed, 61 insertions(+), 22 deletions(-) diff --git a/src/components/biz/add-entry-modal.tsx b/src/components/biz/add-entry-modal.tsx index 9426aee..cdeba2d 100644 --- a/src/components/biz/add-entry-modal.tsx +++ b/src/components/biz/add-entry-modal.tsx @@ -9,7 +9,6 @@ import { DialogHeader, DialogTitle, } from "@/components/ui/dialog"; -import { toast } from "sonner"; import { ClipboardPaste } from "lucide-react"; type Props = { @@ -34,7 +33,7 @@ function AddEntryModalImpl({ open, onOpenChange, position, onConfirm, validate, setErr(null); setSaving(false); setUseClipboard(false); - + // 尝试读取剪贴板内容 checkClipboard(); } @@ -44,12 +43,12 @@ function AddEntryModalImpl({ open, onOpenChange, position, onConfirm, validate, try { const text = await navigator.clipboard.readText(); const parsed = JSON.parse(text); - + // 验证是否是有效的语言值对象 if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) { const keys = Object.keys(parsed); const allStrings = keys.every(key => typeof parsed[key] === 'string'); - + if (allStrings && keys.length > 0) { setClipboardValues(parsed); setUseClipboard(true); @@ -59,7 +58,7 @@ function AddEntryModalImpl({ open, onOpenChange, position, onConfirm, validate, } catch { // 剪贴板内容不是有效的 JSON 或无法访问,忽略 } - + setClipboardValues(null); setUseClipboard(false); } @@ -73,7 +72,7 @@ function AddEntryModalImpl({ open, onOpenChange, position, onConfirm, validate, const msg = validate(trimmed); if (msg) return setErr(msg); } - + setSaving(true); try { const values = useClipboard && clipboardValues ? clipboardValues : undefined; @@ -103,7 +102,7 @@ function AddEntryModalImpl({ open, onOpenChange, position, onConfirm, validate, aria-label="名称" /> - + {clipboardValues && (
@@ -120,7 +119,7 @@ function AddEntryModalImpl({ open, onOpenChange, position, onConfirm, validate, 使用剪贴板中的翻译值
- + {useClipboard && (
检测到以下语言的翻译:
@@ -156,9 +155,9 @@ function AddEntryModalImpl({ open, onOpenChange, position, onConfirm, validate, )}
)} - + {err &&
{err}
} - +