feat: harden support, localize knowledge and add operator availability [skip ci]

Source-only publication of reviewed commit 64e96a7f423673dc29ad56485be9fc79bce8af1c.

Passed in isolation: focused frontend/backend tests, race checks, TypeScript typecheck, lint, Go compilation, Flowgram build, and deterministic SDK build/tests.

Not accepted as a production release: Next.js export/native assembly remains blocked by environment memory limits; browser interaction and MySQL staging acceptance remain unverified. No production server, database/schema, runtime configuration, deployment, release tag, or workflow execution was performed.

Expected source tree: 0a4a7528e9.
This commit is contained in:
2026-10-16 15:21:42 +00:00
parent 299ea50fb5
commit 2f7a491666
176 changed files with 11869 additions and 2716 deletions

View File

@@ -26,7 +26,11 @@
"actions": "操作",
"name": "名称",
"saving": "保存中...",
"reset": "重置"
"reset": "重置",
"operationFailed": "操作失败,请重试。",
"loadFailed": "加载数据失败,请重试。",
"enabled": "启用",
"disabled": "禁用"
},
"language": {
"enUS": "English (英文)",
@@ -531,9 +535,9 @@
"messageSummary": "[消息]",
"closedTitle": "会话已结束",
"closedDescription": "当前客服会话已关闭,感谢您的使用。",
"connecting": "连接中",
"connected": "在线服务",
"disconnected": "连接已断开",
"connecting": "聊天连接中",
"connected": "聊天已连接",
"disconnected": "聊天已断开",
"retry": "重新连接",
"moreActions": "更多操作",
"minimize": "收起窗口",
@@ -583,7 +587,12 @@
"startFirstRequest": "开始第一个请求",
"openRequestCount": "进行中 {open} / 共 {total}",
"loadConversationsFailed": "加载请求列表失败",
"createConversationFailed": "创建请求失败"
"createConversationFailed": "创建请求失败",
"dismissedTitle": "聊天窗口已关闭",
"dismissedDescription": "您的支持请求尚未结束,您可以返回继续对话。",
"returnToChat": "返回聊天",
"sendUnavailable": "当前对话不可用,请返回对话或重试后再发送。",
"sendInProgress": "正在发送消息,请稍候。"
},
"dashboardHome": {
"rangeToday": "今天",
@@ -2493,7 +2502,23 @@
"debugAnswer": "调试问答",
"answerResult": "回答结果",
"searchHits": "检索命中",
"hitsSummary": "命中 {count} 条 · {latency}ms"
"hitsSummary": "命中 {count} 条 · {latency}ms",
"unknownType": "未知类型",
"unknownStatus": "未知状态",
"indexFailureSummary": "索引失败。请检查索引配置后重试。",
"requestId": "请求 ID",
"rerank": "重排序",
"topScore": "最高得分",
"promptTokens": "输入 Token",
"completionTokens": "输出 Token",
"traceData": "追踪数据",
"chunkNumber": "分块 #{number}",
"providerValue": "策略:{value}",
"scoreValue": "得分:{value}",
"rerankValue": "重排序得分:{value}",
"historyRecordedNotice": "历史回答和片段按记录时的原文显示。切换界面语言不会改写历史。",
"faqNumber": "FAQ #{number}",
"documentNumber": "文档 #{number}"
},
"scaffold": {
"moduleBoard": "模块推进看板",
@@ -3370,8 +3395,8 @@
"statusReady": "已就绪,可正常接待请求",
"statusNeedsSetup": "配置未就绪(已完成 {ready}/{total} 步)",
"stepsProgress": "已就绪 {ready} / {total} 步",
"quickSetupAll": "一键完成全部基础配置",
"quickSetupRunning": "正在应用配置...",
"quickSetupAll": "预览缺失的默认配置",
"quickSetupRunning": "正在准备预览…",
"quickFixSuccess": "配置已自动修复并重新检测",
"refresh": "重新检测",
"openSettings": "前往设置",
@@ -3394,12 +3419,12 @@
"description": "至少需要一个处于启用状态的人工客服组,用于聚合坐席人员并配置值班排班。"
},
"schedules": {
"title": "实时值班排班",
"description": "客服组必须拥有覆盖当前时段的有效值班排班;非工作时间段的请求将排队等待。"
"title": "当前支持工作时间",
"description": "团队当前必须处于所选日历的工作时间内,可使用日期班次或每周时间模式。非工作时间的请求保留在队列中。"
},
"operators": {
"title": "坐席档案与服务容量",
"description": "坐席需启用档案、归属有效客服组、开启自动分配、处于空闲状态且并发会话未达上限。"
"description": "接待人员需要已启用的账户和资料、处于团队工作时间内、与平台保持活动连接、状态为可接待、未处于休假期间、启用自动分配且有可用容量。"
},
"ai_agents": {
"title": "AI 智能体与人工转接",
@@ -3433,7 +3458,15 @@
"channel_no_agent": "接入渠道未关联 AI 智能体。",
"channel_agent_disabled": "接入渠道关联的 AI 智能体已被禁用或不存在。",
"channel_zero_rollout": "接入渠道的 AI 智能体分流比例为 0%。",
"no_end_to_end_path": "当前没有任何渠道能成功连通到空闲可用的人工坐席。"
"no_end_to_end_path": "当前没有任何渠道能成功连通到空闲可用的人工坐席。",
"agent_unpublished": "Agent 尚无已发布版本,请先在 Agent 设置中发布后再用于渠道。",
"channel_agent_unpublished": "渠道指向未发布的 Agent。请发布该 Agent,或明确选择已发布的 Agent。",
"operator_offline": "接待人员没有与支持平台的活动连接。",
"operator_break": "接待人员正在休息,无法接收新分配。",
"operator_unavailable": "接待人员无法接收新分配。",
"operator_vacation": "接待人员当前处于计划休假期间。",
"operator_outside_hours": "接待人员当前不在计划工作时间内。",
"operator_availability_unavailable": "无法确定接待人员当前的可用性。"
},
"operatorBlockers": {
"not_authenticated": "您尚未登录系统。",
@@ -3443,25 +3476,31 @@
"team_off_hours": "您所在的客服组当前处于非工作时段(无生效排班)。",
"auto_assign_disabled": "您的坐席档案未开启自动分配。",
"status_busy": "您的服务状态为「忙碌」。",
"at_capacity": "您的当前接待会话量已达上限。"
"at_capacity": "您的当前接待会话量已达上限。",
"offline": "没有与支持平台的活动连接。",
"break": "休息中,已暂停新分配。",
"unavailable": "不可接收新分配。",
"vacation": "处于计划休假期间。",
"availability_unavailable": "无法确定当前可用性。",
"user_disabled": "账户已禁用或删除。"
},
"quickFixLabels": {
"quick_setup_all": "一键完成全部基础配置",
"ensure_team_and_schedule": "创建/启用客服组及 24/7 排班",
"quick_setup_all": "预览缺失的默认配置",
"ensure_team_and_schedule": "预览客服组设置",
"enable_my_operator_profile": "启用我的坐席并设为空闲",
"fix_ai_agent_handoff": "修复 AI 转人工模式并绑定客服组",
"ensure_default_channel": "创建/修复默认 Web 渠道"
},
"simulator": {
"title": "人工坐席路由模拟器",
"description": "模拟客户通过指定渠道进线后的完整路由流转过程,逐级查看每个节点的调度决策。",
"description": "只读检查当前仅人工路由的接待条件。不模拟 AI 行为或部分灰度,不会发送消息。",
"selectChannelPlaceholder": "选择要模拟的渠道...",
"runSimulation": "开始模拟分发",
"running": "正在模拟...",
"outcomeSuccess": "请求将成功分配给坐席:{operator}",
"outcomeBlocked": "请求无法到达人工坐席",
"outcomeSuccess": "当前符合条件的客服:{operator}",
"outcomeBlocked": "未确认可送达人工客服",
"outcomes": {
"assigned_to_operator": "成功:会话将分配给处于空闲状态的就绪坐席。",
"assigned_to_operator": "仅人工路由当前有符合条件的客服。这是只读检查,不保证实际送达。",
"blocked_no_channel": "受阻:系统中没有可用渠道或指定的渠道不存在。",
"blocked_channel_disabled": "受阻:该接入渠道已被禁用。",
"blocked_zero_rollout": "受阻:该渠道的 AI 智能体分流比例为 0%。",
@@ -3469,7 +3508,10 @@
"blocked_ai_only_mode": "受阻:AI 智能体为纯 AI 模式,禁止转接人工。",
"blocked_agent_no_teams": "受阻:AI 智能体未配置有效的转接客服组。",
"queued_off_hours_no_schedule": "排队中:目标客服组当前无生效排班(非工作时间)。",
"queued_no_eligible_operator": "排队中:当前处于工作排班内,但暂无可接待空闲坐席。"
"queued_no_eligible_operator": "排队中:当前处于工作排班内,但暂无可接待空闲坐席。",
"ai_execution_not_simulated": "未模拟 AI 行为,无法确认是否到达人工客服。",
"partial_rollout_not_simulated": "未模拟部分灰度,无法确认是否到达人工客服。",
"blocked_agent_unpublished": "未确认未发布 Agent 的人工路由,请先发布 Agent。"
},
"hops": {
"channel": "接入渠道",
@@ -3491,7 +3533,10 @@
"blocked_agent_no_teams": "AI 智能体未关联有效客服组",
"queued_off_hours_no_schedule": "当前时刻无生效中的工作排班(非工作时段)",
"queued_no_eligible_operator": "当前客服组内暂无空闲且容量充足的坐席",
"assigned_to_operator": "成功分配给符合条件的坐席"
"assigned_to_operator": "成功分配给符合条件的坐席",
"ai_execution_not_simulated": "未模拟 AI 行为,无法确认是否到达人工客服。",
"partial_rollout_not_simulated": "未模拟部分灰度,无法确认是否到达人工客服。",
"blocked_agent_unpublished": "未确认未发布 Agent 的人工路由,请先发布 Agent。"
},
"candidateTableTitle": "参评候选坐席明细",
"colOperator": "坐席",
@@ -3505,12 +3550,19 @@
"eligibleBadge": "符合条件",
"skipReasons": {
"profile_disabled": "档案已停用",
"user_disabled": "账号已停用",
"user_disabled": "账户已禁用或删除。",
"team_not_in_agent": "客服组未在智能体转接范围内",
"team_off_hours": "客服组处于非值班时段",
"auto_assign_off": "自动分配已关闭",
"status_busy": "处于忙碌状态",
"at_capacity": "接待量已达上限"
"at_capacity": "接待量已达上限",
"offline": "没有与支持平台的活动连接。",
"break": "休息中,已暂停新分配。",
"unavailable": "不可接收新分配。",
"vacation": "处于计划休假期间。",
"availability_unavailable": "无法确定当前可用性。",
"auto_assign_disabled": "自动分配已禁用。",
"no_team": "未分配已启用的团队。"
}
},
"banner": {
@@ -3520,6 +3572,185 @@
"headerIndicator": {
"readyLabel": "接单就绪",
"blockedLabel": "接单受阻 ({count})"
},
"preview": {
"review": "预览设置更改",
"title": "应用前确认具体更改",
"description": "仅更改下列具名记录和字段,不会添加排班。未列出的配置及灰度比例保持不变。更改提交后可能分配等待中的会话。",
"noChanges": "没有可安全自动应用的更改。请在对应设置中选择客服组、路由或工作时段。",
"apply": "应用已确认的更改",
"create": "创建",
"update": "更新",
"notApplied": "未应用已确认的更改。",
"manageSchedules": "管理明确的工作时段"
},
"repairFields": {
"name": "名称",
"leader_user_id": "组长 ID",
"status": "启用状态(0 启用,1 禁用)",
"user_id": "用户 ID",
"team_id": "客服组 ID / 新组名称",
"team_ids": "路由客服组",
"service_status": "接待状态(0 空闲,1 忙碌)",
"auto_assign_enabled": "自动分配",
"max_concurrent_count": "并发会话上限",
"priority_level": "分配优先级",
"receive_offline_message": "接收离线消息",
"service_mode": "服务模式(1 仅 AI,2 仅人工,3 AI 优先)",
"rollout_percent": "Agent 灰度比例(%)",
"handoff_mode": "转人工模式(2 客服组队列)",
"fallback_mode": "回退模式",
"auto_handoff_on_failure": "失败时自动转人工",
"reply_timeout_seconds": "回复超时(秒)",
"max_steps": "AI 最大步骤数",
"channel_id": "渠道标识",
"channel_type": "渠道类型",
"ai_agent_id": "Agent ID / 新 Agent 名称",
"ai_agent_rollout_percent": "渠道灰度比例(%)",
"config_json": "渠道配置"
},
"repairWarnings": {
"schedules_unchanged": "未更改工作时段。请明确配置排班;非值班时段不是配置错误。",
"active_team_required": "请先在客服组设置中选择或启用客服组,再关联新记录。",
"disabled_configuration_preserved": "所选配置已禁用或灰度比例为零,已保持不变。",
"agent_team_selection_required": "请在 Agent 设置中选择目标客服组;未自动添加任何组。",
"channel_selection_required": "请在渠道设置中选择目标 Agent 和灰度比例。已保留现有渠道路由。",
"existing_configuration_preserved": "已保留现有配置。请在对应设置中检查剩余的就绪问题。",
"dispatch_failed": "更改已保存,但等待会话分配失败。请检查队列,不要重复应用修复。",
"readiness_refresh_failed": "就绪状态刷新失败。请重新加载诊断以查看当前状态;已提交的更改未回滚。",
"agent_publication_required": "创建渠道前,请先在 Agent 设置中发布目标 Agent。设置向导不会发布 Agent 或绕过发布要求。"
}
},
"supportAvailability": {
"title": "支持可用性",
"description": "配置支持时间和时区。连接、工作状态和接待资格分别计算。",
"loading": "正在加载可用性…",
"myStatus": "我的可用性",
"retryStatus": "状态不可用,请重试",
"operatorStatus": "可用性:{name}",
"presenceHelp": "在线表示至少一个标签页或设备仍与支持平台连接,并不表示可以接待新请求。",
"online": "平台在线",
"offline": "未连接",
"workingStatus": "工作状态",
"statusHelp": "状态在会话间保留。忙碌、休息、不可用和休假期间停止新分配,登录不会重置状态。",
"statusSaved": "可用性已保存",
"saveFailed": "无法保存更改,表单输入已保留。",
"loadFailed": "无法加载可用性",
"saveStatus": "保存状态",
"saving": "正在保存…",
"cancel": "取消",
"retry": "重试",
"refresh": "刷新",
"discardTitle": "放弃未保存的更改?",
"discardDescription": "更改尚未保存。是否放弃并离开?",
"discard": "放弃更改",
"vacationStart": "休假开始",
"vacationEnd": "休假结束(不含结束时刻)",
"vacationTimezone": "请按浏览器时区输入日期:{timezone}。",
"vacationExact": "精确 UTC 时段:{start} → {end}。",
"vacationHelp": "此时段内即使登录也不会收到新分配。时段外恢复已保存的状态:{status}。现有会话不会自动转移。",
"cancelVacationHelp": "保存其他状态将取消已安排的休假。",
"invalidVacation": "请输入有效的开始和结束时间,结束时间必须晚于开始时间。夏令时跳过的时间无效。",
"calendar": "支持日历",
"editCalendar": "编辑日历",
"saveCalendar": "保存日历",
"calendarSaved": "支持日历已保存",
"readOnly": "您只有查看权限。",
"deploymentDefault": "部署默认设置",
"selectScope": "选择默认设置或团队",
"deploymentTimezone": "默认 IANA 时区",
"teamTimezone": "团队时区覆盖",
"timezoneHelp": "请使用 Europe/Moscow 或 America/New_York 等 IANA 名称,而不是固定 UTC 偏移量。",
"inheritTimezoneHelp": "留空以继承部署时区。时区覆盖不会修改已保存的日期班次。",
"effectiveTimezone": "生效时区:{timezone}",
"scheduleMode": "日历模式",
"legacy": "现有日期班次",
"recurring": "每周时间和例外",
"legacyHelp": "现有日期班次会保留,不会按新时区重新解释。只有明确选择并保存每周模式后,每周时间才会生效。",
"viewDatedShifts": "查看日期班次",
"legacyActive": "工作时间仍由现有日期班次决定,不会自动创建每周时间。",
"confirmCalendarTitle": "应用此支持日历?",
"confirmRecurring": "将此范围切换到每周时间和日期例外?现有日期班次会保留,但在此模式下不再决定可用性。",
"confirmCalendar": "这些设置会改变新请求可分配的时间。默认时区变更会影响继承该时区的团队,日期班次保持不变。",
"weeklyHours": "每周工作时间",
"hoursHelp": "分段班次可添加多个时段。结束早于开始表示跨到次日。起止时间不能相同,没有时段的日期为休息日。 全天请使用 00:00–24:00。",
"noWeeklyHours": "没有每周工作时间。在每周模式下,仅明确设为开放的日期例外可开放支持。",
"addPeriod": "添加时段",
"removePeriod": "删除时段",
"day": "星期",
"start": "开始",
"end": "结束",
"exceptions": "节假日和日期例外",
"exceptionsHelp": "日期例外替代该本地日期的每周时间。关闭日期会阻止全天接待,包括前一天跨夜延续的时段。",
"noExceptions": "没有日期例外",
"addException": "添加日期例外",
"removeException": "删除日期例外",
"date": "日期",
"closedDay": "全天关闭",
"preview": "日历预览",
"previewHelp": "无需保存即可预览表单。按浏览器时区({timezone})输入检查时间,留空则使用当前时间。结果按日历时区显示。",
"previewAt": "检查时间(可选)",
"runPreview": "检查日历",
"previewing": "正在检查…",
"previewFailed": "无法预览日历",
"previewStale": "表单已更改,请重新预览。",
"scheduleOpen": "此时日历处于开放时段。",
"scheduleClosed": "此时日历处于关闭时段。",
"nextOpening": "下次计划开放时间:{time}",
"noNextOpening": "预览范围内未找到下次计划开放时间。",
"notPresencePromise": "计划工作时间不保证届时有接待人员在线或可用。",
"invalidTimezone": "请输入有效的 IANA 时区。部署默认时区不能为空。",
"invalidHours": "请使用有效的 HH:mm 时段,起止时间不能相同。开放日期例外至少需要一个时段。",
"invalidExceptionDate": "每个例外必须有有效且不重复的日期。",
"invalidPreviewTime": "请按浏览器时区输入有效的检查时间。",
"noPermission": "您无权查看日历设置,但仍可管理自己的工作状态。",
"noTeams": "没有可配置日历的团队。",
"publicChecking": "正在检查人工支持可用性…",
"publicNextOpening": "下次计划开放时间:{time},不保证届时有接待人员在线。",
"offlineDeprecated": "此旧设置为兼容性而保留,不允许向未连接的接待人员分配新请求。",
"manageStatus": "管理可用性",
"statusSeparate": "工作状态和计划休假与接待人员资料分别管理。",
"status": {
"ready": "可接待",
"busy": "忙碌",
"break": "休息中",
"unavailable": "不可用",
"vacation": "休假中",
"unknown": "未知状态"
},
"reason": {
"eligible": "可接收新分配",
"profile_disabled": "接待人员资料已被管理员禁用",
"user_disabled": "账户已禁用",
"team_disabled": "团队已禁用",
"outside_hours": "不在计划工作时间内",
"offline": "没有与支持平台的活动连接",
"busy": "忙碌:已暂停新分配",
"break": "休息中:已暂停新分配",
"unavailable": "不可接收新分配",
"vacation": "处于计划休假期间",
"auto_assign_disabled": "自动分配已禁用",
"capacity": "已达到同时接待会话上限",
"unknown": "无法确定接待资格"
},
"public": {
"available": "人工支持当前可用",
"outside_hours": "当前不在人工支持计划工作时间内",
"temporarily_absent": "当前没有接待人员可处理新请求",
"capacity": "接待人员当前已满负荷",
"unknown": "人工支持可用性未知"
},
"weekday": {
"1": "星期一",
"2": "星期二",
"3": "星期三",
"4": "星期四",
"5": "星期五",
"6": "星期六",
"7": "星期日"
},
"dstOccurrence": "{field}:此时间出现两次。请选择准确的 UTC 时刻。",
"chooseOccurrence": "选择时间实例",
"datedShiftsNotice": "这些日期班次仅对使用现有日期班次模式的团队生效。在每周模式下它们会保留但不生效;切回后将原样重新生效。"
}
}