Skip to content

[finding] CommentThread 遗留两处:纯 emoji 按钮没有无障碍名;7 天以上时间戳不跟随会话语言 #3441

Description

@yinlianghui

实现 #3424(把 CommentThread 全部硬编码英文接入 i18n)时看到的两处,都不属于该单的范围(它治的是硬编码英文),所以没有顺手改。

finding:CommentThread 在本仓没有任何消费者(全仓只有 packages/collaboration/ 内部引用它;app-shell 用的是同包的 PresenceAvatars / usePresence / useRealtimeSubscription / useConflictResolution),所以今天没有用户经由 ObjectUI 自己的应用撞到它。但它是已发布的导出组件,包外宿主直接用得到 —— 严重度请 PM 自行判定,不要因为我贴了 finding 就当成不重要。

一、三个纯 emoji / 符号按钮没有无障碍名

packages/collaboration/src/CommentThread.tsx:

  • 每条评论下的快捷回应按钮,内容分别就是 '👍''❤️',没有 aria-label、没有 title。屏幕阅读器只能念出 emoji 本身的 Unicode 名称(还依赖 AT 实现),完全说不出这个按钮是干什么的。
  • 回复提示条右侧的关闭按钮内容是 '✕',同样没有名字。

注意旁边那颗加号按钮(表情选择器)是有名字的 —— 它走 title,#3424 已经把它接进了 collaboration.addThumbsUp。所以这三颗是明确的遗漏,不是设计如此。

修的时候可以直接用 #3424 已经建好的接线:useCollaborationTranslation / COLLAB_DEFAULT_TRANSLATIONS(packages/collaboration/src/useCollaborationTranslation.ts),新键十个语言包全补即可。

二、7 天以上的评论时间戳不跟随会话语言

同文件 formatTimestamp,最后一档:

if (days < 7) return t('collaboration.daysAgo', { count: String(days) });
return date.toLocaleDateString();

toLocaleDateString() 不带参数用的是运行时默认 locale(浏览器/Node 的),不是会话语言。所以 zh 会话下,同一条评论列表里 6 天前的显示"6 天前",8 天前的却可能显示 8/1/2026

不是硬编码英文(它本来就跟随环境),所以 #3424 有意没动它。要修的话有个真实的坑,请在实现时考虑:整个函数体外面包着 try { … } catch { return iso; },而 toLocaleDateString(tag) 遇到不认识的语言 tag 会抛 RangeError —— 直接把 language 传进去,会让异常静默落进那个 catch,渲染出原始 ISO 串,比现在更糟。要么先校验 tag,要么就地单独 try/catch 回退到无参调用。

language 是现成的:createSafeTranslation 返回的对象里就带(const { t, language } = useCollaborationTranslation()),不需要额外的 hook,也不需要引入日期库。

Refs #3424,objectstack-ai/objectstack#5506

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions