实现 #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
实现 #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,最后一档: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