Skip to content

[i18n] PresenceAvatars 三处硬编码英文(控制台头部与记录详情实际在渲染) #3440

Description

@yinlianghui

实现 #3424(@object-ui/collaboration 整包接入 i18n)时发现,同包的 PresenceAvatars.tsx 还有三处硬编码英文。#3424 的完成范围只列了 CommentThread,所以没有顺手改,按 Prime Directive #10 单独记录。

位置

packages/collaboration/src/PresenceAvatars.tsx:

  • L116 'aria-label': 模板字符串 ${users.length} user${users.length !== 1 ? 's' : ''} present
  • L122 title: 模板字符串 ${overflowCount} more user${overflowCount !== 1 ? 's' : ''}
  • L133 title: 模板字符串 ${user.userName} (${user.status})

为什么这个是用户真的会撞到的

和 CommentThread 不同,PresenceAvatars 在仓内有真实消费者,zh 会话下的控制台就在渲染它:

  • packages/app-shell/src/layout/AppHeader.tsx:55
  • packages/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

Activity

  1. yinlianghui commented on Aug 6, 2026

    @yinlianghui
    CollaboratorAuthor

    分诊: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

  2. self-assigned this
    on Aug 6, 2026
  3. yinlianghui commented on Aug 6, 2026

    @yinlianghui
    CollaboratorAuthor

    认领: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

  4. yinlianghui commented on Aug 6, 2026

    @yinlianghui
    CollaboratorAuthor

    验收: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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions