Skip to content

[i18n] @object-ui/collaboration 整包接入 i18n:CommentThread 全部 13 处硬编码英文(承接 objectstack#5506 第 5 处) #3424

Description

@yinlianghui

Part of objectstack-ai/objectstack#5506(该单 5 处中 4 处已由 PR #3423 落地;第 5 处——CommentThread reaction tooltip——按 PM 裁定归入本单,与同文件其余 12 处一并处理)。

PM 裁定与依据(两轴,veto 窗口开放)

dev 上报的问题:@object-ui/collaboration 当前唯一依赖是 @object-ui/types,接入 i18n 需在 packages/collaboration/package.json 加 "@object-ui/i18n": "workspace:*"(i18next + react-i18next 进入该发布包的传递运行时依赖图);且同文件另有 12 处硬编码英文,只翻一处会更不自洽。

裁定:整包一次接入(方案 A),不做单串补丁(B),不做 formatter prop 兜底(D)。

  • 项目长远合理性:该包任何一个字符串要本地化,依赖代价都得付;付一次覆盖全文件是唯一收敛的版本。B 用同样的公共契约代价换 1/13 的收益,且保证第二个 PR 重摸同一批行。
  • 防 AI 犯错:A 把每个字符串放进 all-locales-key-parity 强制的声明键——缺翻译是红构建,不是 zh 控制台里漏一个英文词。D 正是 AGENTS.md #0.1 禁止的消费端宽容形状:英文没消掉,只是把默认值搬进组件,让每个宿主自己重解一遍 i18n,且无任何门禁。
  • 两轴同向,无需交维护者权衡;如有异议请在本单否决。

完成范围

  1. packages/collaboration/package.json 加 @object-ui/i18n: workspace:* + pnpm-lock.yaml importers 条目;
  2. COLLAB_DEFAULT_TRANSLATIONS 走 createSafeTranslation(data-table / form / filter-builder 既有模式;defaults map 即无 provider 时英文兜底的来源);
  3. 全部 13 处字符串入键、十包全补真实译文:reaction tooltip + just now、{n}m ago、Save、Cancel、Reply、Edit、Delete、Add thumbs up、 · Resolved、Reopen/Resolve、Sort comments、Add a comment... (use @ to mention)。

约束(违反即返工)

  • reaction tooltip 用专属键对 collaboration.reactionCount / reactionCountOne——既有 detail.reactionCount 插值 {{emoji}},此 tooltip 无 emoji 可传,不得复用;
  • 双 key 复数约定,⛔ 不用 i18next _one/_other 后缀(zh/ja/ko 无独立单数,parity gate 会判丢键);
  • react-i18next 模块级默认实例陷阱:createI18n 的 initReactI18next 注册不随 cleanup 撤销,无 provider 断言必须放在从不 import I18nProvider 的独立测试文件(踩坑记录见 PR fix(components,i18n): 把记录浮层与页签计数徽标的剩余硬编码英文接入 i18n (objectstack#5506) #3423 正文与测试);
  • 相对时间(just now/{n}m ago)若涉及格式而非纯词条,按包内最小改动处理,不引入新的日期库。

Generated by Claude Code

Activity

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

    @yinlianghui
    CollaboratorAuthor

    认领:objectui 分片 PM 并行批第 30 单
    会话:session_01GTRjn8xBqp75dk7kFupVRt
    分支:claude/issue-3424-collaboration-i18n
    Worktree:objectui-issue-3424
    文件面:packages/collaboration/**(package.json 加依赖 + 源码)、packages/i18n/src/locales/*(十包,本批独占)、pnpm-lock.yaml(importers 条目,本批独占)、测试、changeset。越界即停。


    Generated by Claude Code

  3. yinlianghui commented on Aug 6, 2026

    @yinlianghui
    CollaboratorAuthor

    验收:ACCEPT → PR #3438(并行批第 30 单,会话 session_01GTRjn8xBqp75dk7kFupVRt),blocking 检查全绿(Live E2E 红为 informational:base 早于 #3432 的 lane 修复且系 #3434 既有内容问题,非阻塞)。转 ready + 入队因 GraphQL 配额排队,恢复即执行。

    复核要点:

    1. 范围核实优于 issue 自身:issue 按 dev 扫描列了 13 处,实现者逐行重数得 20 处全部入键(漏掉的 7 处:{n}h/{n}d ago、(edited)、评论计数、排序选项、Replying to、Send);Save/Cancel/Edit/Delete 复用既有 common.* 真键而非在 collaboration 下重拼——正确的去重方向。
    2. 预测方向错误的处理堪称范本:预测 en 单数用例红(类比 fix(components,i18n): 把记录浮层与页签计数徽标的剩余硬编码英文接入 i18n (objectstack#5506) #3423 的 "1 items"),反向验证证明 origin/main 本有三元式复数、en 一直正确——真缺陷是复数规则编译进组件(ru 三形式/ja 无形式均无法表达),de/zh/ja 13 例钉住这一点。dev 把 changeset、commit message、测试文件头、行内注释全部改正后才交单,predicted_directions_confirmed:false 如实上报。这正是「报告证伪自己的框架是好运行」。
    3. 专属 collaboration.reactionCount/reactionCountOne 键对(无 {{emoji}})、count 以字符串插值绕开 i18next 自带复数、no-provider 断言独立成文件——三条约束全部兑现;toLocaleDateString() 的 ≥7d 分支刻意不动并写明 RangeError 陷阱,另立 [finding] CommentThread 遗留两处:纯 emoji 按钮没有无障碍名;7 天以上时间戳不跟随会话语言 #3441。
    4. 消费半径:app-shell 四个 mock 该包的测试跑过;十包 parity 绿;lockfile 仅 importers 条目。

    顺带发现:#3440(PresenceAvatars 三处英文串,zh 控制台实际渲染)已分诊 bug+pm:queue;#3441(emoji 按钮无可访问名 + 时间戳不随会话语言)按 dev 判 finding 留池。


    Generated by Claude Code

  4. added 3 commits that reference this issue on Aug 6, 2026
    94c5b7c
    ca0fa8f
    65516ba
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