From 2bd7e9ae22fc3a6f4a58d8fbf7d5032b9d7b1f9e Mon Sep 17 00:00:00 2001 From: Ma Date: Tue, 7 Jul 2026 17:23:03 +0800 Subject: [PATCH] feat(studio): bilingual chat dynamic content MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增 app-language 全局语言工具(tr/getAppLanguage,非 React 模块用); 工具执行块、工具状态、agent/工具徽标、聊天错误提示、生成物抽屉、 error-copy 全部双语。默认 zh,现有断言不变 --- .../src/components/ai-elements/tool.tsx | 21 +++-- .../components/chat/ProjectArtifactDrawer.tsx | 17 ++-- .../components/chat/ToolExecutionSteps.tsx | 87 ++++++++++--------- .../chat/__tests__/ToolExecutionSteps.test.ts | 80 ++++++++++++++++- packages/studio/src/lib/app-language.ts | 18 ++++ packages/studio/src/lib/error-copy.ts | 4 + packages/studio/src/pages/ChatPage.tsx | 13 +-- .../chat/__tests__/message-parts.test.ts | 69 ++++++++++++++- .../studio/src/store/chat/parts-builder.ts | 53 ++++++----- .../src/store/chat/slices/message/action.ts | 13 ++- .../src/store/chat/slices/message/runtime.ts | 55 +++++++----- .../chat/slices/message/stream-events.ts | 17 ++-- 12 files changed, 326 insertions(+), 121 deletions(-) create mode 100644 packages/studio/src/lib/app-language.ts diff --git a/packages/studio/src/components/ai-elements/tool.tsx b/packages/studio/src/components/ai-elements/tool.tsx index 255c0d58..d08f4b62 100644 --- a/packages/studio/src/components/ai-elements/tool.tsx +++ b/packages/studio/src/components/ai-elements/tool.tsx @@ -20,6 +20,7 @@ import type { ComponentProps, ReactNode } from "react"; import { isValidElement } from "react"; import { CodeBlock } from "./code-block"; +import { tr } from "@/lib/app-language"; export type ToolProps = ComponentProps; @@ -44,14 +45,16 @@ export type ToolHeaderProps = { } ); -const statusLabels: Record = { - "approval-requested": "等待确认", - "approval-responded": "已响应", - "input-available": "执行中", - "input-streaming": "处理中", - "output-available": "已完成", - "output-denied": "已拒绝", - "output-error": "出错", +// [zh, en] tuples resolved through tr() at render time so the badge follows +// the current app language instead of the language active at module load. +const statusLabels: Record = { + "approval-requested": ["等待确认", "Awaiting approval"], + "approval-responded": ["已响应", "Responded"], + "input-available": ["执行中", "Running"], + "input-streaming": ["处理中", "Processing"], + "output-available": ["已完成", "Completed"], + "output-denied": ["已拒绝", "Denied"], + "output-error": ["出错", "Error"], }; const statusIcons: Record = { @@ -67,7 +70,7 @@ const statusIcons: Record = { export const getStatusBadge = (status: ToolPart["state"]) => ( {statusIcons[status]} - {statusLabels[status]} + {tr(statusLabels[status][0], statusLabels[status][1])} ); diff --git a/packages/studio/src/components/chat/ProjectArtifactDrawer.tsx b/packages/studio/src/components/chat/ProjectArtifactDrawer.tsx index c1e75b33..98d5af65 100644 --- a/packages/studio/src/components/chat/ProjectArtifactDrawer.tsx +++ b/packages/studio/src/components/chat/ProjectArtifactDrawer.tsx @@ -3,6 +3,7 @@ import { cjk } from "@streamdown/cjk"; import { AlertCircle, Loader2, Pencil, Save, X } from "lucide-react"; import { Streamdown } from "streamdown"; import { fetchJson } from "../../hooks/use-api"; +import { tr } from "../../lib/app-language"; import { useChatStore } from "../../store/chat"; interface ProjectArtifactPayload { @@ -104,7 +105,7 @@ export function ProjectArtifactDrawer() {
)} {editing && ( @@ -146,7 +147,7 @@ export function ProjectArtifactDrawer() { disabled={saving} className="rounded-lg border border-border/60 px-3 py-2 text-[14px] font-medium text-muted-foreground transition hover:bg-secondary/50 disabled:opacity-60" > - 取消 + {tr("取消", "Cancel")} )} @@ -163,7 +164,7 @@ export function ProjectArtifactDrawer() { type="button" onClick={close} className="rounded-lg border border-border/50 p-2 text-muted-foreground transition hover:bg-secondary/60 hover:text-foreground" - aria-label="关闭" + aria-label={tr("关闭", "Close")} > @@ -181,7 +182,7 @@ export function ProjectArtifactDrawer() { {loading ? (
- 正在读取生成物... + {tr("正在读取生成物...", "Loading artifact...")}
) : editing ? (