Repository navigation
[i18n] PresenceAvatars 三处硬编码英文(控制台头部与记录详情实际在渲染) #3440
Description
Activity
分诊:
bug+pm:queue(objectui 分片 PM,会话session_01GTRjn8xBqp75dk7kFupVRt)。判级理由:具名落点(PresenceAvatars 三处英文串 + 同款编译进组件的英文复数),且非休眠代码——app-shell 的 AppHeader 与 RecordDetailView 实际渲染,zh 控制台用户直接可见。与 #3424(PR #3438,已验收)同族同证据链。
派发前置:等 PR #3438 落地后从新 main 切分支——
useCollaborationTranslation与collaboration.*键族届时已在,本单大概率是把 PresenceAvatars 接上同一条既有通道(新增键按双 key 复数约定、十包齐);文件面packages/collaboration+ 语言包,须与其它触包单错批。
Generated by Claude Code
认领:objectui 分片 PM 并行批第 35 单
会话:session_01GTRjn8xBqp75dk7kFupVRt
分支:claude/issue-3440-presence-avatars-i18n
Worktree:objectui-issue-3440
文件面:packages/collaboration/**(PresenceAvatars.tsx、useCollaborationTranslation.ts defaults map、测试)、packages/i18n/src/locales/*(十包,本批独占)、changeset。越界即停。PM 裁定(issue 留给维护者的 status 枚举问题):status 是数据值兼展示值——展示层入键翻译(
collaboration.statusOnline等,英文兜底),原始枚举值不动、不进任何数据路径。依据:与 fieldOptions 展示翻译同构;zh 控制台 tooltip 里裸拼(online)正是本族缺陷形状;翻译只发生在渲染出口,数据契约零改动,两轴同向。如有异议此处否决。
Generated by Claude Code
验收:ACCEPT → PR #3445(并行批第 35 单,会话
session_01GTRjn8xBqp75dk7kFupVRt),blocking 检查全绿(Live E2E check-run 红为已知 informational 形态,workflow run 结论 success),已转 ready + auto-merge。复核要点:issue 猜测的 status 枚举(online/away)被 dev 对着
usePresence.ts:18修正为 active/idle/away,键按真实枚举建——又一次前提复核优于 issue 自身;PM 裁定按展示层入键落实,raw 枚举保持数据身份(statusColors 查表不动),off-union 值透传原串(host 提供的 PresenceSource 使 off-union 运行时可达,类型上刻意放宽并有注);反向验证 10 红 14 绿与预测完全一致,no-provider 文件两侧全绿系设计(main 的三元式英文本就正确,移出的是复数规则,由 de/ru/ja 见证);另补了一条 #3438 声明未强制的 pin(defaults map 与 en 包 key/value 双向一致)。顺带发现 #3447(status 圆点无颜色回退,休眠)finding 留池。
Generated by Claude Code
- added a commit that references this issue
on Aug 6, 2026
实现 #3424(
@object-ui/collaboration整包接入 i18n)时发现,同包的PresenceAvatars.tsx还有三处硬编码英文。#3424 的完成范围只列了CommentThread,所以没有顺手改,按 Prime Directive #10 单独记录。位置
packages/collaboration/src/PresenceAvatars.tsx:'aria-label':模板字符串${users.length} user${users.length !== 1 ? 's' : ''} presenttitle:模板字符串${overflowCount} more user${overflowCount !== 1 ? 's' : ''}title:模板字符串${user.userName} (${user.status})为什么这个是用户真的会撞到的
和
CommentThread不同,PresenceAvatars在仓内有真实消费者,zh 会话下的控制台就在渲染它:packages/app-shell/src/layout/AppHeader.tsx:55packages/app-shell/src/views/RecordDetailView.tsx:20前两处是头像组的无障碍名 —— 头像组本身只有图片和首字母,对屏幕阅读器来说这个 label 就是这个控件。第三处
(${user.status})里的 status 也是英文枚举值(online/away/ …),直接拼进 tooltip。顺带:复数规则同样编译进了组件
两处都是
n !== 1 ? 's' : ''。英文输出是对的,但和 #3424 头部/tooltip 那两处一样,选单复数的语法被硬写进渲染路径,任何语言都套用不了自己的规则。修的时候应当直接用本仓的双 key 约定(xxxCount/xxxCountOne),不要用 i18next 的_one/_other后缀 —— zh/ja/ko 没有独立单数形式,那几个包会合理地缺_one半边,all-locales-key-parity会把它读成丢键。改起来应该很轻
#3424 已经把包级的 i18n 接线做完了:
@object-ui/i18n已是packages/collaboration的 dependency,包内也已有唯一翻译入口useCollaborationTranslation/COLLAB_DEFAULT_TRANSLATIONS(packages/collaboration/src/useCollaborationTranslation.ts)。这个单只需要往那张 defaults map 和十个语言包里加键,再把三处字面量换掉。status 枚举值要不要一并入键(
collaboration.statusOnline之类),还是保持原样只翻译外层措辞,建议由维护者定 —— 它同时是数据值和展示值。Refs #3424,objectstack-ai/objectstack#5506