From 83e826e034cd35e3dfffd7f351fa44a1043e6a7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A5=87=E8=B6=A3=E4=BF=9D=E7=BD=97?= Date: Wed, 12 Nov 2025 14:49:43 +0800 Subject: [PATCH] =?UTF-8?q?Feat:=20=E6=96=B0=E5=A2=9E=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E9=80=89=E6=8B=A9=E6=A8=A1=E5=9E=8B=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/biz/ai-translate-modal.tsx | 5 +++-- src/components/biz/project-settings-modal.tsx | 22 +++++++++++++++++-- src/lib/db.ts | 1 + src/pages/editor.tsx | 8 ++++--- 4 files changed, 29 insertions(+), 7 deletions(-) diff --git a/src/components/biz/ai-translate-modal.tsx b/src/components/biz/ai-translate-modal.tsx index fd706ec..78858a5 100644 --- a/src/components/biz/ai-translate-modal.tsx +++ b/src/components/biz/ai-translate-modal.tsx @@ -25,6 +25,7 @@ type Props = { languages: string[]; paths: string[]; prompt: string | undefined; + model?: string | undefined; initialSelectedLanguages?: string[]; getExistingByPath?: (path: string) => Record; onConfirm: ( @@ -33,7 +34,7 @@ type Props = { ) => Promise | void; }; -function AiTranslateModalImpl({ open, onOpenChange, languages, paths, prompt, initialSelectedLanguages, getExistingByPath, onConfirm }: Props) { +function AiTranslateModalImpl({ open, onOpenChange, languages, paths, prompt, model, initialSelectedLanguages, getExistingByPath, onConfirm }: Props) { const [inputsByKey, setInputsByKey] = useState>({}); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); @@ -92,7 +93,7 @@ function AiTranslateModalImpl({ open, onOpenChange, languages, paths, prompt, in setLoading(true); setError(null); try { - const result = await requestTranslations({ items, languages: selectedLangs, prompt }); + const result = await requestTranslations({ items, languages: selectedLangs, prompt, model }); await onConfirm(result, { overwrite, selectedLanguages: selectedLangs }); setInputsByKey({}); onOpenChange(false); diff --git a/src/components/biz/project-settings-modal.tsx b/src/components/biz/project-settings-modal.tsx index 01e684e..19d4c7f 100644 --- a/src/components/biz/project-settings-modal.tsx +++ b/src/components/biz/project-settings-modal.tsx @@ -8,13 +8,14 @@ type Props = { open: boolean; onOpenChange: (v: boolean) => void; project: Project | null; - onSave: (update: { name: string; preferences: { aiPrompt?: string } }) => Promise | void; + onSave: (update: { name: string; preferences: { aiPrompt?: string; aiModel?: string } }) => Promise | void; onDelete: () => Promise | void; }; function ProjectSettingsModalImpl({ open, onOpenChange, project, onSave, onDelete }: Props) { const [name, setName] = useState(""); const [aiPrompt, setAiPrompt] = useState(""); + const [aiModel, setAiModel] = useState(""); const [saving, setSaving] = useState(false); const [err, setErr] = useState(null); @@ -22,6 +23,7 @@ function ProjectSettingsModalImpl({ open, onOpenChange, project, onSave, onDelet if (open) { setName(project?.name ?? ""); setAiPrompt(project?.preferences?.aiPrompt ?? ""); + setAiModel(project?.preferences?.aiModel ?? ""); setSaving(false); setErr(null); } @@ -35,7 +37,7 @@ function ProjectSettingsModalImpl({ open, onOpenChange, project, onSave, onDelet try { await onSave({ name: trimmed, - preferences: { aiPrompt }, + preferences: { aiPrompt, aiModel }, }); onOpenChange(false); } catch (e) { @@ -69,6 +71,22 @@ function ProjectSettingsModalImpl({ open, onOpenChange, project, onSave, onDelet setName(e.target.value)} placeholder="输入项目名称" /> +
+ + setAiModel(e.target.value)} + placeholder="例如:openai/gpt-5" + /> + + +