Uh oh!
There was an error while loading. Please reload this page.
fix(plugin-detail): 把记录详情抽屉拖拽手柄的硬编码英文接入 i18n (objectstack#5733) - #3429
Merged
Conversation
RecordDetailDrawer 左边缘的拖拽调宽手柄带着一个 aria-label="Resize drawer"
硬编码字面量,与 objectstack#5506 刚从 NavigationOverlay 移除的那个逐字节相同
——#5506 的改动范围只圈了 packages/components,这份副本因此漏网。
该手柄没有任何可见标签,所以这个字符串对读屏软件而言"就是"这个控件本身:
zh/ja/de 会话在一个整体已本地化的抽屉里只有这一处英文。它也不是死代码,
resizable 默认为 true,plugin-kanban / plugin-calendar / plugin-gantt 点开的
就是它。
现改为 t('common.resizeDrawer'),刻意复用 #5506 给另一个手柄的同一个 key
(十个语言包里都已存在),而不是新造一个 detail.resizeDrawer 孪生 key ——
同一个控件从两个包渲染,不应该拿到两份会各自漂移的翻译。
common.resizeDrawer 同时加入 DETAIL_DEFAULT_TRANSLATIONS,即
createSafeTranslation 在没有 I18nProvider 时回退的那张表;缺了这一条,
所有无 provider 的宿主都会退化成显示原始 key。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GTRjn8xBqp75dk7kFupVRtThe latest updates on your projects. Learn more about Vercel for GitHub. |
Contributor
✅ Console Performance Budget
📦 Bundle Size Report
Size Limits
|
yinlianghui
marked this pull request as ready for review
August 6, 2026 03:29
Uh oh!
There was an error while loading. Please reload this page.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixesobjectstack-ai/objectstack#5733
问题
packages/plugin-detail/src/RecordDetailDrawer.tsx:277带着一个aria-label="Resize drawer"硬编码字面量,与 objectstack#5506(objectui #3423)刚从packages/components/src/custom/navigation-overlay.tsx移除的那个逐字节相同。#5506 的改动范围只圈了packages/components,packages/plugin-detail不在其中,这份副本因此漏网。两处是同一个控件形态:抽屉左边缘的拖拽调宽手柄,
role="separator"+aria-orientation="vertical",没有任何可见标签——所以这个字符串对读屏软件而言"就是"这个控件本身。结果是 zh / ja / de 会话在一个整体已本地化的抽屉里,只有这一处念英文。也不是死代码:
resizable默认为true,plugin-kanban 的ObjectKanban、plugin-calendar 的ObjectCalendar点开的就是它(plugin-gantt 在测试里把它 mock 掉)。前提核验(基于 origin/main@5dd012776)
Issue 只是线索,三条前提逐条在
origin/main上验过:RecordDetailDrawer.tsx:277,且是该文件里唯一的aria-label。common.resizeDrawer已在十个语言包全部落地(fix(components,i18n): 把记录浮层与页签计数徽标的剩余硬编码英文接入 i18n (objectstack#5506) #3423 已合入):enResize drawer/ zh调整面板宽度/ dePanelbreite anpassen/ jaパネル幅を調整/ ar es fr ko pt ru。useDetailTranslation.ts的DETAIL_DEFAULT_TRANSLATIONS存在,RecordDetailDrawer.tsx:136已经拿到t(第 321 行在用),无需新接线。顺带确认探针 key
detail.back在 en/zh/de/ja 包里都在——挂了 provider 时createSafeTranslation才会走真t,common.resizeDrawer才解析得到语言包的值。改动
两行实质改动:
RecordDetailDrawer.tsx—— 字面量换成t('common.resizeDrawer')。useDetailTranslation.ts—— 往DETAIL_DEFAULT_TRANSLATIONS加一条'common.resizeDrawer': 'Resize drawer'。刻意复用 #5506 的同一个 key,而不是新造
detail.resizeDrawer孪生 key。 这是本 PR 唯一一处有取舍的地方:它让DETAIL_DEFAULT_TRANSLATIONS出现了第一个common.*条目(其余全是detail.*)。但同一个控件从两个包渲染,不该拿到两份会各自漂移的翻译;新造 key 还要再动十个语言包(而packages/i18n本来就不该由这个 PR 碰)。代码里留了注释说明这一条。那条 defaults 是无 provider 时的回退表——缺了它,所有没挂 I18nProvider 的宿主会退化成显示原始 key
common.resizeDrawer。测试(两个文件,方向先预测后运行)
这不是一个"全红转全绿"的改动,三个方向分开说清楚:
Resize drawer后两行是如实记录:它们钉的是"回退没被改坏",不是这次修复本身。
en一行证明把名字接进t()没有改变英文会话听到的内容;无 provider 一行钉的是 defaults 表——少了那条会渲染出原始 key 而变红,那正是它存在的理由。反向验证真跑了:把两处源码改动 stash 掉、只留新测试,得到
与预测完全一致。
为什么是两个文件而不是一个 describe:
createI18n会调instance.use(initReactI18next),把该实例注册成 react-i18next 的模块级全局默认,这个注册在 unmount 和cleanup()之后依然存在。所以只要文件里有任何一个用例挂过 provider,同文件里之后所有"无 provider"渲染都会静默地解析到那个实例上——要么绿得毫无意义,要么红得莫名其妙。无 provider 的断言因此单独成文件,且该文件不 import provider;vitest 的domproject 是isolate: true,能保证它拿到干净的全局。这一条在文件头注释里写死了。两个文件都把
DetailView/InlineEditSaveBarmock 掉(沿用同目录RecordDetailDrawer.capability.test.tsx的做法),这样树里唯一的role="separator"就是被测手柄。另外补了一个resizable: false的用例——否则上面几条 locale 断言在"手柄整个不渲染"的情况下也可能因为查不到东西而误绿。消费半径排查
按规则的调用方而不是按改动的包来扫:
grep全仓Resize drawer/resizeDrawer/role="separator"断言,RecordDetailDrawer的三个宿主包(kanban / calendar / gantt)的 fixture 与 spec 里,没有任何一处按英文名寻址这个抽屉的手柄。packages/components下命中的三处都是 NavigationOverlay 自己的测试,是另一个组件。验证输出
另按字节纪律对五个改动文件做了门禁之外的自查(
grep -naP扫控制字符),无命中。changeset 按 #3423 的先例补了一个(patch,
@object-ui/plugin-detail),因为这是十个 locale 下用户可见的可访问名变化。Generated by Claude Code