From 2ae98780deb61905d0a81fa5dad63da712e4ffae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A5=87=E8=B6=A3=E4=BF=9D=E7=BD=97?= Date: Sat, 15 Nov 2025 18:14:14 +0800 Subject: [PATCH] =?UTF-8?q?Feat:=20=E5=A2=9E=E5=8A=A0=E8=AF=AD=E8=A8=80?= =?UTF-8?q?=E8=BF=87=E6=BB=A4=E5=8A=9F=E8=83=BD=EF=BC=8C=E4=B8=B4=E6=97=B6?= =?UTF-8?q?=E6=80=A7=E4=B8=8D=E6=98=BE=E7=A4=BA=E5=AF=B9=E5=BA=94=E8=AF=AD?= =?UTF-8?q?=E8=A8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib/ai.ts | 2 +- src/pages/editor.tsx | 54 +++++++++++++++++++++++++++++++++++++++----- 2 files changed, 49 insertions(+), 7 deletions(-) diff --git a/src/lib/ai.ts b/src/lib/ai.ts index 3735b49..536cadb 100644 --- a/src/lib/ai.ts +++ b/src/lib/ai.ts @@ -35,7 +35,7 @@ export async function requestTranslations({ const keysJson = JSON.stringify(items.map((it) => it.key)); const instruction = [ "你是一个专业的翻译助手。", - `请将多条原文同时翻译为这些目标语言:${targetList},注意英语的首字母务必是大写。`, + `请使用当地人的习惯用语,将多条原文同时翻译为这些目标语言:${targetList},注意英语的首字母务必是大写。`, "翻译偏好:", prompt, "严格要求:", diff --git a/src/pages/editor.tsx b/src/pages/editor.tsx index eb0100e..fa1f6c5 100644 --- a/src/pages/editor.tsx +++ b/src/pages/editor.tsx @@ -17,7 +17,7 @@ import { updateProject, deleteProjectDeep, } from "@/lib/db"; -import { ArrowBigDownDash, ArrowBigUpDash, ArrowLeft, Brackets, CaseSensitive, Languages, LocateFixed, MoreVertical, PencilLine, Trash2 } from "lucide-react"; +import { ArrowBigDownDash, ArrowBigUpDash, ArrowLeft, Brackets, CaseSensitive, Filter, Languages, LocateFixed, MoreVertical, PencilLine, Trash2 } from "lucide-react"; import { useTranslationInlineEdit } from "@/hooks/biz/use-translation-inline-edit"; import { flattenEntries, type FlatEntry, insertEntrySibling, removeEntryAtPath, renameEntryAtPath } from "@/lib/i18n-structure"; import { ImportLanguageModal } from "@/components/biz/import-language-modal"; @@ -31,6 +31,7 @@ import { DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, + DropdownMenuCheckboxItem, DropdownMenuSeparator, } from "@/components/ui/dropdown-menu"; import { useClipboard } from "@/hooks/use-clipboard"; @@ -59,6 +60,7 @@ export default function Editor() { const [aiBulkOpen, setAiBulkOpen] = useState(false); const [settingsOpen, setSettingsOpen] = useState(false); const [selected, setSelected] = useState>(new Set()); + const [visibleLangs, setVisibleLangs] = useState>(new Set()); const { copy } = useClipboard(); @@ -139,7 +141,14 @@ export default function Editor() { onError: (m) => setPageError(m), }); - const tableWidth = useMemo(() => (languages.length * 200) + 36 + 60 + 300, [languages.length]); + // 同步可见语言集合 + useEffect(() => { + setVisibleLangs(new Set(languages)); + }, [languages]); + + const displayedLanguages = useMemo(() => languages.filter((l) => visibleLangs.has(l)), [languages, visibleLangs]); + + const tableWidth = useMemo(() => (displayedLanguages.length * 200) + 36 + 60 + 300, [displayedLanguages.length]); function computeSuggestedLanguages(pathsInput: string[]): string[] { if (languages.length === 0 || pathsInput.length === 0) return []; @@ -204,12 +213,12 @@ export default function Editor() { /> 翻译条目名称 - {languages.map((lang) => ( + {displayedLanguages.map((lang) => ( {lang} ))} 操作 - ), [languages, allSelected, entries]); + ), [displayedLanguages, allSelected, entries]); const renderItemContent = useCallback((_idx: number, entry: FlatEntry) => { const handleCopy = () => { @@ -236,7 +245,7 @@ export default function Editor() { {entry.path} - {languages.map((lang) => { + {displayedLanguages.map((lang) => { const isEditing = inline.isEditingCell(entry.path, lang); const isSaving = inline.isSavingCell(entry.path, lang); const displayValue = inline.getDisplayValue(entry.path, lang); @@ -324,7 +333,7 @@ export default function Editor() { ); - }, [languages, inline, projectId, structure, setStructure, setValuesByLang, copy, selected]); + }, [displayedLanguages, inline, projectId, structure, setStructure, setValuesByLang, copy, selected]); useEffect(() => { if (!projectId || languages.length === 0) return; @@ -414,6 +423,39 @@ export default function Editor() {
+ + + + + + setVisibleLangs(new Set(languages))}> + 全部显示 + + + {languages.map((lang) => { + const checked = visibleLangs.has(lang); + return ( + e.preventDefault()} + checked={checked} + onCheckedChange={(v) => { + setVisibleLangs((prev) => { + const next = new Set(prev); + if (v) next.add(lang); else next.delete(lang); + return next; + }); + }} + > + {lang} + + ); + })} + +