From 41363b153ebe83898fc0a4ec4aa47cb4ae56f5ae Mon Sep 17 00:00:00 2001 From: 2379278408 <78773982+2379278408@users.noreply.github.com> Date: Mon, 3 Aug 2026 07:20:32 +0000 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=9A=E6=9C=AC=E5=9C=B0?= =?UTF-8?q?=E5=8C=96=20AI=20=E6=8F=90=E9=97=AE=E7=9A=84=E5=85=B6=E5=AE=83?= =?UTF-8?q?=E9=80=89=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../console/task/ask-user-option-label.ts | 12 ++++ .../task/message-ask-user-question.tsx | 5 +- frontend/src/i18n/resources/cn.ts | 1 + frontend/src/i18n/resources/en.ts | 1 + .../test/task-ask-user-option-i18n.test.ts | 62 +++++++++++++++++++ 5 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 frontend/src/components/console/task/ask-user-option-label.ts create mode 100644 frontend/test/task-ask-user-option-i18n.test.ts diff --git a/frontend/src/components/console/task/ask-user-option-label.ts b/frontend/src/components/console/task/ask-user-option-label.ts new file mode 100644 index 000000000..9dd7e099f --- /dev/null +++ b/frontend/src/components/console/task/ask-user-option-label.ts @@ -0,0 +1,12 @@ +const OTHER_OPTION_LABELS = new Set(["其它", "其他", "Other"]) + +export function getAskUserOptionDisplayLabel( + label: string | null | undefined, + otherLabel: string, +): string { + if (!label) { + return "" + } + + return OTHER_OPTION_LABELS.has(label.trim()) ? otherLabel : label +} diff --git a/frontend/src/components/console/task/message-ask-user-question.tsx b/frontend/src/components/console/task/message-ask-user-question.tsx index b331f1d7b..a566f724e 100644 --- a/frontend/src/components/console/task/message-ask-user-question.tsx +++ b/frontend/src/components/console/task/message-ask-user-question.tsx @@ -9,6 +9,7 @@ import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { useTranslation } from "react-i18next" +import { getAskUserOptionDisplayLabel } from "./ask-user-option-label" type AskUserQuestionStatus = "pending" | "queued" | "submitting" | "completed" | "expired" @@ -189,7 +190,7 @@ export const AskUserQuestionMessageItem = ({ message, onResponse }: { message: M htmlFor={`${message.data.askId}-${questionIndex}-${option.label}`} className={cn("font-normal truncate", (!isInteractive && !isCheckboxChecked(questionIndex, option.label)) ? "text-muted-foreground/50" : "")} > - {option.label} + {getAskUserOptionDisplayLabel(option.label, t("taskDetail.askUser.other"))} ))} @@ -262,7 +263,7 @@ export const AskUserQuestionMessageItem = ({ message, onResponse }: { message: M htmlFor={`${message.data.askId}-${questionIndex}-${option.label}`} className={cn("font-normal truncate", (!isInteractive && selectedRadioValue !== option.label) ? "text-muted-foreground/50" : "")} > - {option.label} + {getAskUserOptionDisplayLabel(option.label, t("taskDetail.askUser.other"))} ))} diff --git a/frontend/src/i18n/resources/cn.ts b/frontend/src/i18n/resources/cn.ts index 25461b3d4..a70530c6c 100644 --- a/frontend/src/i18n/resources/cn.ts +++ b/frontend/src/i18n/resources/cn.ts @@ -4320,6 +4320,7 @@ const cn = { expired: "问题已过期", custom: "其他 - 自定义", customPlaceholder: "请输入其他答案", + other: "其他", submit: "提交", submitIncomplete: "提交 (未完成)", }, diff --git a/frontend/src/i18n/resources/en.ts b/frontend/src/i18n/resources/en.ts index 04cdb6ac7..b6d79d3f8 100644 --- a/frontend/src/i18n/resources/en.ts +++ b/frontend/src/i18n/resources/en.ts @@ -4320,6 +4320,7 @@ const en = { expired: "Question expired", custom: "Other - custom", customPlaceholder: "Enter another answer", + other: "Other", submit: "Submit", submitIncomplete: "Submit (incomplete)", }, diff --git a/frontend/test/task-ask-user-option-i18n.test.ts b/frontend/test/task-ask-user-option-i18n.test.ts new file mode 100644 index 000000000..e5cd40d6f --- /dev/null +++ b/frontend/test/task-ask-user-option-i18n.test.ts @@ -0,0 +1,62 @@ +import assert from "node:assert/strict"; +import { readFileSync } from "node:fs"; +import test from "node:test"; + +import { getAskUserOptionDisplayLabel } from "../src/components/console/task/ask-user-option-label.ts"; +import cn from "../src/i18n/resources/cn.ts"; +import en from "../src/i18n/resources/en.ts"; + +const source = readFileSync( + new URL( + "../src/components/console/task/message-ask-user-question.tsx", + import.meta.url, + ), + "utf8", +); + +test("AI 提问的其它选项按界面语言显示", () => { + assert.equal( + getAskUserOptionDisplayLabel("其它", en.taskDetail.askUser.other), + "Other", + ); + assert.equal( + getAskUserOptionDisplayLabel("其他", en.taskDetail.askUser.other), + "Other", + ); + assert.equal( + getAskUserOptionDisplayLabel("Other", cn.taskDetail.askUser.other), + "其他", + ); + assert.equal( + getAskUserOptionDisplayLabel(" 其它 ", en.taskDetail.askUser.other), + "Other", + ); +}); + +test("普通 AI 选项保持原始显示文本", () => { + assert.equal( + getAskUserOptionDisplayLabel("方案 A", en.taskDetail.askUser.other), + "方案 A", + ); + assert.equal( + getAskUserOptionDisplayLabel(" Option A ", en.taskDetail.askUser.other), + " Option A ", + ); + assert.equal( + getAskUserOptionDisplayLabel(undefined, en.taskDetail.askUser.other), + "", + ); +}); + +test("单选和多选只转换显示文本并保留原始选项值", () => { + const displayCalls = + source.match( + /getAskUserOptionDisplayLabel\(option\.label, t\("taskDetail\.askUser\.other"\)\)/g, + ) || []; + assert.equal(displayCalls.length, 2); + assert.match( + source, + /handleCheckboxClick\(questionIndex, option\.label, checked === true\)/, + ); + assert.match(source, /value=\{option\.label\}/); +});