Repository navigation
Description
Found while sweeping the consumption radius for objectstack#5506 (objectui PR objectstack-ai/objectui#3423). Outside that task's file fence (packages/plugin-detail was not in it), so filed rather than fixed there.
(Note for whoever edits this issue: the body below deliberately avoids writing a JSX open-tag literally. GitHub's body sanitizer strips a left-angle-bracket followed by a letter as an HTML tag at rest and silently truncates everything after it — the first version of this issue was cut off mid-sentence at a div tag. Describe tags, don't paste them.)
The finding
packages/plugin-detail/src/RecordDetailDrawer.tsx:277 carries a byte-identical twin of the literal #5506 just removed from packages/components/src/custom/navigation-overlay.tsx:
- guarded by
{resizable && (…)} - a plain
divelement carryingrole="separator",aria-orientation="vertical",aria-label="Resize drawer", andonPointerDown={handleResizePointerDown} - className
"hidden sm:block absolute left-0 top-0 h-full w-1.5 cursor-col-resize …"
Same control (a drag-resize handle on a record drawer's left edge), same shape (a separator with no visible label, so the literal is the control to a screen reader), same defect: a zh/ja/de session gets one English string in an otherwise localized drawer.
This is not dormant code — RecordDetailDrawer is the detail drawer the console renders, and the handle is only gated on resizable.
Why this should be a one-liner
Two halves of the fix already exist once objectui PR objectstack-ai/objectui#3423 merges:
- The key
common.resizeDrawerlands in all ten locale packs in that PR (en "Resize drawer", zh "调整面板宽度", de "Panelbreite anpassen", …). RecordDetailDrawer.tsxalready has the hook wired —const { t } = useDetailTranslation();at line 136, used elsewhere in the same file.
So the change is: add 'common.resizeDrawer': 'Resize drawer' to DETAIL_DEFAULT_TRANSLATIONS in packages/plugin-detail/src/useDetailTranslation.ts (that map is what keeps the no-provider path English), then swap the literal for t('common.resizeDrawer') at line 277.
Acceptance
-
RecordDetailDrawer's separator announces the session locale's value; a zh session sees no "Resize drawer" anywhere. -
With no
I18nProvidermounted it still resolves to English —plugin-detail's existing suites and the live e2e specs address this chrome by English accessible name with no provider. -
A test under
packages/plugin-detail/src/__tests__/, in the shape of objectui'spackages/components/src/__tests__/navigation-overlay-chrome-i18n.test.tsx.Note the trap that PR hit and paid for:
createI18ncallsinstance.use(initReactI18next), andinitReactI18nextregisters that instance as react-i18next's module-global default. The registration survives unmount andcleanup(), so once any test in a file mounts a provider withdefaultLanguage: 'de', every later "no provider" render in that same file silently resolves against the German instance. Any no-provider assertion must therefore live in its own test file that never imports the provider — never in a describe block after a provider mount.
Blocked-by: the common.resizeDrawer key, which lands in objectstack-ai/objectui#3423 (objectstack#5506). Trivially unblockable by adding the key in the same PR if this is picked up first.
Activity
[-]objectui: a second hardcoded `aria-label="Resize drawer"` in plugin-detail's RecordDetailDrawer — same literal #5506 localized in NavigationOverlay[/-][+]objectui: a second hardcoded `aria-label` of "Resize drawer" in plugin-detail's RecordDetailDrawer — same literal #5506 localized in NavigationOverlay[/+]yinlianghui commentedon Aug 6, 2026
分诊:
bug+pm:queue+repo:objectui(objectui 分片 PM,会话session_01GTRjn8xBqp75dk7kFupVRt)。判级理由:具名落点(
packages/plugin-detail/src/RecordDetailDrawer.tsx:277,role="separator"拖拽手柄的英文aria-label)、与 objectstack#5506 同类同证据链。该文件:136已接useDetailTranslation(),common.resizeDrawer键随 objectui PR #3423 落地(auto-merge 已挂)后为一行修。派发前置:以 origin/main 为准确认 #3423 已合并、
common.resizeDrawer在十包齐;文件面packages/plugin-detail,与队内 #3419(app-shell)/#3422(fields)互不相交,可同批。Generated by Claude Code
yinlianghui commentedon Aug 6, 2026
认领:objectui 分片 PM 并行批第 28 单
会话:
session_01GTRjn8xBqp75dk7kFupVRt分支:
claude/issue-5733-detaildrawer-resize-i18n(落地仓 objectui,repo:objectui 路由)Worktree:
objectui-issue-5733文件面:
packages/plugin-detail/src/RecordDetailDrawer.tsx+ 该包测试 + changeset(不动 i18n 包——common.resizeDrawer已随 objectui PR #3423 落 main@5dd012776;越界即停,报告说明)与在飞第 26 单(#3419,app-shell)、第 27 单(#3422,fields)文件面互不相交。
Generated by Claude Code
yinlianghui commentedon Aug 6, 2026
验收:ACCEPT → objectui PR #3429(并行批第 28 单,会话
session_01GTRjn8xBqp75dk7kFupVRt),CI 16/16 绿,已转 ready + auto-merge,合并后本单自动关闭。复核要点:
common.resizeDrawer而非新造detail.resizeDrawer的取舍正确——同一控件形态从两个包渲染不该有两份会漂移的翻译;成为DETAIL_DEFAULT_TRANSLATIONS首个common.*条目已留注释说明。resizable:false用例堵了空树误绿。git stashis repo-GLOBAL across worktrees — two parallel agents popped each other's stashes today; AGENTS.md's worktree discipline never warns about it #5742(AGENTS.md/os-dev 定义侧,已分诊)。Generated by Claude Code