Skip to content

fix(i18n): es 的 preview.draftBar 统一 usted,横幅不再在发布后换人称 (#3844) - #3874

Merged
yinlianghui merged 2 commits into
mainfrom
claude/issue-3844-es-draftbar-register
Aug 8, 2026
Merged

fix(i18n): es 的 preview.draftBar 统一 usted,横幅不再在发布后换人称 (#3844)#3874
yinlianghui merged 2 commits into
mainfrom
claude/issue-3844-es-draftbar-register

Conversation

@yinlianghui

@yinlianghui yinlianghui commented Aug 8, 2026

Copy link
Copy Markdown
Collaborator

Fixes #3844

现象

DraftPreviewBar同一条横幅的同一行渲染两句互斥文案:有待发布变更时是 message,没有时是 messageClean(packages/app-shell/src/preview/DraftPreviewBar.tsx:104-111)。es 包里这两句的第二人称不一致:

key 修前 es 值 人称
preview.draftBar.message Vista previa de borrador — estás viendo cambios sin publicar. Nada está en producción hasta que publiques. (estáspubliques)
preview.draftBar.messageClean Vista previa del borrador: no hay cambios sin publicar; todo lo que ve aquí ya está activo. usted(ve)
preview.draftBar.sampleDataBody Está viendo la estructura de su aplicación. Publíquela para cargar registros de ejemplo y activarla. usted

后果:西语用户按下「发布」之后,横幅当场从 tú 切到 usted —— 同一个组件、同一个位置、同一次会话。

前提已在本单基线复核(base 39136cccb69cd33482fe6886e7142def87e4493c):三个值逐字节如上,分隔符分歧也在(messagemessageClean:,而 en 两条都是 )。

为什么三道 i18n 门禁都看不见

这是 #3582 / #3625 之后值域盲区的第三类:两条 es 译文都正确表达了各自 en 原意,不缺 key、不陈旧、也没有存英文;不一致是同一语言包内部、同一 UI 表面上的语域分裂

方向 A:改 message,依据是包里它周围本来就说 usted

三条独立读数,都是量出来的:

  1. 包默认语域 —— es 全包普查 usted 102 : tú 30。tú 是有标记的例外,集中在 258 个 t() 调用点引用的 key 在任何语言包里都不存在(#3530 守卫首跑实测),其中 8 处直接把 raw key 渲染给用户 #3546 切片二明确裁定为非正式的 auth 登录/注册、report editor、organizations 几个邻域;preview 不在其中。
  2. 同一条横幅一个声音 —— 同一个对象里另外三条(messageCleansampleDataBodypublishCta)本来就是 usted。对齐这一处离群值,比给整个命名空间重新配音小得多,而且它正是消除「用户眼前切换」的那一处改动。
  3. 姐妹横幅 —— 258 个 t() 调用点引用的 key 在任何语言包里都不存在(#3530 守卫首跑实测),其中 8 处直接把 raw key 渲染给用户 #3546 切片五给新增的 19 个 preview.unpublishedBar.* / preview.history.* 定 usted,最强依据是结构孪生 home.pendingDrafts.published(¡Publicado! Sus cambios están activos.)。留着 draftBar.message 是 tú,会让旧横幅和刚翻好的姐妹横幅互相矛盾。

改了什么(两个值,一个文件)

packages/i18n/src/locales/es.ts:

message:      Vista previa del borrador — está viendo cambios sin publicar. Nada de lo que ve aquí está activo hasta que publique.
messageClean: Vista previa del borrador — no hay cambios sin publicar; todo lo que ve aquí ya está activo.

messageClean 的全部 diff 就是分隔符 : 还原为 (与 en 对齐,en 两句都以 Draft preview — 起头)。message 除敬称形态(estás viendoestá viendopubliquespublique)外,一并收口同一句内另外两处措辞分歧,使横幅两半不再连用词也互相矛盾:

  • 「live」用 activo 而不是 en producción —— 这个概念在包里四处邻近位置都写 activo,含同一对象内的 publishCta(Publicar para verlo activo)、home.pendingDrafts.publishedsampleDataBodyactivarla;而 producción 在包里留给真正的生产环境(environment.entitlement.planLockedBody:un entorno de producción),所以原值不只是不一致,还有歧义。
  • 共同开头统一为 Vista previa del borrador —— delmessageClean 本来就在用的形式(两种形式在包里各只出现在这两个 key 上,是这条横幅自己跟自己不一致);因为 messageClean 只许动分隔符,统一只能落在 message 一侧。

em dash 已核为与 en 同一码位 U+2014(四条值全部 —=U+2014)。调用点只传 defaultValue、无插值参数,占位符形状不受影响。

钉子

新增 packages/i18n/src/__tests__/draftBar-es-register-3844.test.ts(独立文件,名带 3844),10 个用例:四个 es 值按修后终值逐字节精确断言,加 en 两条原文的 tripwire(将来任何一次 en 改写会在改写它的那个 PR 里当场红),外加 presence 防空转、退役拼写字面量、横幅两半同开头/同 em dash、activ 词干在位。注释写明语域裁定依据(102:30 普查、同横幅一致性、切片五的 19 个 key、#3844)。

不做敬称形态学检测:识别 usted / tú 需要真正的形态学,而 token 级正则实测做不到 —— 同一个 token revisaconsole.ai.empty.build(es.ts:1365,…y usted revisa y publica.,带显式主语 usted 的陈述式)是 usted,在 auth.forgotPassword.successTitle(es.ts:1918,Revisa tu correo electrónico,命令式)是 —— 同样八个字母、敬称相反,任何字符串正则都分不开。反向误判同样容易:粗正则扫 approvalsInbox 得到的 5 个「usted」全是假阳性(puede 说的是第三人称的申请人 / 被指派人,No se puede determinar 是无人称),而该命名空间的第二人称称呼实为一致 tú(9 条)—— 属于切片二「按邻域裁定」的正当情形,已在注释里写明以免下一个人误伤。而这种门禁要 police 的邻域边界本身得人来划(#3546 切片二「同一规则、不同答案」的先例)。

退役拼写检查是从这一个 key 的修前值里摘出的精确子串(与 viewReadonlyTooltip-semantics-3625.test.ts 同一手法),不推广到任何别处。

自查更正:第一版注释照抄了 #3844 正文那句未复核的「普查正则把命令式 Revisa 误算成 tú 标记」。实测机制不是这样(:1918 的 Revisa 是真 tú 命令式,真正的假阳性是 :1365 的 usted 陈述式),已在第二个提交里改正 —— 不把没验证过的断言固化进永久注释。

反向验证(方向先判后跑,两次都与预判一致)

预判:钉子是对修后终值的正向逐字节断言,加 presence 防空转,所以两次都只能是朴素的红(不存在反转,也不存在「诊断变多」的方向)。

  • 还原 message 为 tú 旧值 → 预判 4 红且逐条点名 message。实跑正是 4 红:byte pin expected 'Vista previa de borrador — estás vien…' to be 'Vista previa del borrador — está vien…';退役拼写 es preview.draftBar.message reintroduced "estás viendo";横幅同开头检查红;es preview.draftBar.message lost the pack's word for "live"Tests 4 failed | 6 passed (10)
  • 还原 messageClean 分隔符为 : → 预判 2 红。实跑 2 红:byte pin expected 'Vista previa del borrador: no hay cam…' to be 'Vista previa del borrador — no hay ca…',以及横幅同开头/同 em dash(内含 not.toContain('borrador:'))。Tests 2 failed | 8 passed (10)

两次实验后均已还原,最终 diff 只有两个值行。

验证

  • node scripts/check-i18n-en-drift.mjs0 en value(s) changed (0 key(s) added, 0 removed),No en value changed in this range.(本单不碰 en)
  • 仓根 vitest:packages/i18n 全包 + packages/app-shell/src/preview(横幅自己的消费者测试)→ 35 文件 / 554 用例全绿(更正提交后复跑同样 35/554 绿);新钉子单跑 10/10 绿;all-locales-key-paritymarketplace-preview-namespace-3546objectView-value-language-3582viewReadonlyTooltip-semantics-3625 一并绿(只改值不改键,parity 按构造不受影响)。
  • 全仓 turbo run type-check --concurrency=278/78 successful(两次编辑后各跑一次)。
  • 改动文件控制字节 grep 零命中(CI 的 Control Byte Scan 亦绿)。

刻意不做

协调

`DraftPreviewBar` 在同一条横幅的同一行渲染两句互斥文案:有待发布变更时是
`message`,没有时是 `messageClean`。es 包里这两句的第二人称不一致 ——
`message` 是 tú(`estás viendo`、`publiques`),而 `messageClean`(`ve`)与
`sampleDataBody`(`Está`、`su`、`Publíquela`)是 usted。后果:西语用户按下
「发布」之后,横幅当场从 tú 切到 usted —— 同一个组件、同一个位置、同一次会话。

这是 #3582 / #3625 之后值域盲区的第三类,三道 i18n 门禁都看不见:两条 es 译文
都正确表达了各自的 en 原意,不缺 key、不陈旧、也没有存英文;不一致是**同一
语言包内部、同一 UI 表面上的语域分裂**。`check-i18n-call-site-keys.mjs` 只问
key 在 en 存不存在;`all-locales-key-parity` 只比键名集合与占位符形状,从不读
值;`check-i18n-en-drift.mjs` 只在 en 值变化时要求九包跟改,而这两条 en 值静止
不动。

改 `message` 而不是改另外两条,依据是包里它周围本来就说 usted:es 全包普查
usted 102 : tú 30(tú 是有标记的例外,集中在 #3546 切片二明确裁定为非正式的
auth、report editor、organizations 几个邻域);同一个对象里另外三条本来就是
usted;#3546 切片五给新增的 19 个 `preview.unpublishedBar.*` /
`preview.history.*` 定 usted,依据是结构孪生 `home.pendingDrafts.published`
(「¡Publicado! Sus cambios están activos.」)。同一句内另外两处小分歧一并收口,
使横幅两半不再连措辞也互相矛盾:

- `messageClean` 的分隔符 `:` 还原为 `—`,与 en 对齐(en 两句都以
  `Draft preview — ` 起头)。这就是 `messageClean` 全部的 diff。
- 「live」用包里的 `activo` 而不是 `en producción`。这个概念在包里四处邻近位置
  都写 `activo`,含同一对象内的 `publishCta`(「Publicar para verlo activo」);
  而 producción 在包里留给真正的生产环境
  (`environment.entitlement.planLockedBody`),所以原值不只是不一致,还有歧义。
- 共同的开头统一为 `Vista previa del borrador`,`del` 是 `messageClean` 本来
  就在用的形式。

未动任何 en 值(en-drift 门禁报 0 处变化),未增删任何 key(`all-locales-key-parity`
按构造不受影响),其余九个语言包一律不碰。diff 是一个文件里的两个值。

把整个 `preview` 命名空间改成 tú 的方向经权衡后否决:改动面大得多,且会与紧邻的
`marketplace.*`(9:0 usted)与 `console.ai.*` 冲突。因此
`preview.empty.notReadyDescription` 刻意保持 tú —— 它是另一个表面(空态,不是这条
横幅),不存在会话中途在用户眼前切换的问题,#3844 正文已记录在案。「同一命名空间
一个语域」的门禁刻意**不做**:识别 usted / tú 需要真正的形态学(本次普查用的临时
正则就把命令式 `Revisa` 误算成 tú 标记),而这种门禁要police的邻域边界本身得人来划
—— 即 #3546 切片二「同一规则、不同答案」的先例。改为新增
`draftBar-es-register-3844.test.ts`,把四个 es 值连同两条 en 原文逐字节钉住,
这样将来任何一次 en 改写都会在改写它的那个 PR 里当场红,而不是悄悄把译文孤立掉。

Claude-Session: https://claude.ai/code/session_01GTRjn8xBqp75dk7kFupVRt
@vercel

vercel Bot commented Aug 8, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectui Ignored Ignored Aug 8, 2026 11:22pm

Request Review

@github-actions github-actions Bot added the tests label Aug 8, 2026
@github-actions

github-actions Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Main entry (gzip) 28.1 KB 350 KB
Entry file index-plOCGe7i.js
Status PASS

📦 Bundle Size Report

Package Size Gzipped
app-shell (index.js) 8.66KB 3.13KB
app-shell (runtime-config.js) 7.42KB 2.32KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 7.57KB 2.97KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 1.17KB 0.53KB
auth (AuthProvider.js) 22.10KB 4.37KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.13KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.64KB 2.21KB
auth (SocialSignInButtons.js) 9.60KB 3.89KB
auth (UserMenu.js) 3.40KB 1.22KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 35.76KB 9.11KB
auth (createAuthenticatedFetch.js) 4.37KB 1.69KB
auth (index.js) 2.35KB 1.07KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 4.91KB 0.87KB
auth (useIsWorkspaceAdmin.js) 1.61KB 0.85KB
collaboration (CommentThread.js) 26.07KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.65KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 482.39KB 106.34KB
core (index.js) 2.96KB 1.13KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 139.61KB 35.99KB
fields (index.js) 230.82KB 56.70KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (currency.js) 1.22KB 0.64KB
i18n (i18n.js) 4.32KB 1.77KB
i18n (index.js) 2.65KB 1.06KB
i18n (pickLocalized.js) 1.70KB 0.83KB
i18n (provider.js) 9.48KB 3.27KB
i18n (useObjectLabel.js) 27.59KB 6.63KB
i18n (useSafeTranslation.js) 4.52KB 1.96KB
layout (index.js) 38.53KB 10.71KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.74KB
mobile (index.js) 1.50KB 0.62KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.71KB 0.42KB
mobile (useResponsiveConfig.js) 1.36KB 0.63KB
mobile (useSpecGesture.js) 4.32KB 1.64KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 8.75KB 3.06KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 3.67KB 1.12KB
permissions (evaluator.js) 4.41KB 1.44KB
permissions (index.js) 0.91KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.52KB
permissions (usePermissions.js) 1.55KB 0.71KB
plugin-ai (index.js) 15.71KB 3.79KB
plugin-calendar (index.js) 44.98KB 12.37KB
plugin-charts (index.js) 61.04KB 17.31KB
plugin-chatbot (index.js) 180.33KB 42.79KB
plugin-dashboard (index.js) 117.21KB 30.27KB
plugin-designer (index.js) 210.51KB 42.51KB
plugin-detail (index.js) 236.17KB 58.82KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 112.10KB 27.10KB
plugin-gantt (index.js) 162.55KB 39.57KB
plugin-grid (index.js) 187.63KB 49.66KB
plugin-kanban (index.js) 48.30KB 13.28KB
plugin-list (index.js) 105.12KB 25.48KB
plugin-map (index.js) 16.81KB 5.24KB
plugin-markdown (index.js) 13.72KB 4.69KB
plugin-report (index.js) 40.58KB 10.58KB
plugin-timeline (index.js) 25.76KB 7.33KB
plugin-tree (index.js) 8.50KB 2.88KB
plugin-view (index.js) 84.03KB 20.55KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.71KB 3.53KB
providers (index.js) 0.44KB 0.22KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.67KB 2.37KB
react (LazyPluginLoader.js) 3.77KB 1.33KB
react (SchemaRenderer.js) 19.28KB 6.38KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 1.02KB 0.55KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 4.09KB 1.74KB
sdui-parser (index.js) 4.47KB 2.03KB
sdui-parser (parse.js) 10.04KB 2.82KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 4.69KB 1.48KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 0.99KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 0.20KB 0.18KB
types (crud.js) 0.20KB 0.18KB
types (data-display.js) 0.20KB 0.18KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.87KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-retry.js) 4.32KB 2.02KB
types (index.js) 2.71KB 1.34KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 2.59KB 1.31KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (spec-report.js) 5.05KB 1.93KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 0.20KB 0.18KB
types (ui-action.js) 3.40KB 1.71KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

自查发现第一版注释照抄了 #3844 正文的一句未经复核的说法(「普查正则把命令式
`Revisa` 误算成 tú 标记」),而实测机制不是这样 —— 不该把一句没验证过的断言
固化进永久注释:

- es.ts:1918 `auth.forgotPassword.successTitle`(`Revisa tu correo electrónico`)
  的 `Revisa` 是**真的** tú 命令式,不是误判;
- 真正的假阳性在 es.ts:1365 `console.ai.empty.build`
  (`…y usted revisa y publica.`)—— 那里的 `revisa` 是带显式主语 `usted` 的
  陈述式,是 **usted** 串。同一个 token 在两处敬称相反,任何字符串正则都分不开。
- 反向误判同样容易:粗正则扫 `approvalsInbox` 得到 5 个「usted」全是假阳性
  (`puede` 说的是第三人称的申请人 / 被指派人,`No se puede determinar` 是无人称),
  而该命名空间的第二人称称呼实为一致 tú(9 条)—— 它属于切片二「按邻域裁定」的
  正当情形,注释里写明以免下一个人误伤。

这组实测比原说法更有力地支持否决方向 C(敬称门禁),故写进注释。

另一处更正:`preview.empty.notReadyDescription` 原注释写「不存在会话中途在用户
眼前切换」,过弱且不准 —— `PreviewDraftEmptyState`(`AppContent.tsx`,
`previewDrafts` 且应用未就绪时返回)渲染在 `DraftPreviewBar`
(`ConsoleLayout.tsx`)**下方的内容区**,两者会**同屏**:横幅 usted、下面的空态
tú。这比 #3844 本身的先后切换更尖,已单独立单 #3875(未认领、未打标,交 PM 分诊),
注释与 changeset 一并改为指向它。本单仍只改 draftBar 那两个值,不越界。

es.ts 两个值一字未动(本次提交只碰注释与 changeset 文案)。

Claude-Session: https://claude.ai/code/session_01GTRjn8xBqp75dk7kFupVRt
@github-actions

github-actions Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Main entry (gzip) 28.1 KB 350 KB
Entry file index-D8DbRrMg.js
Status PASS

📦 Bundle Size Report

Package Size Gzipped
app-shell (index.js) 8.66KB 3.13KB
app-shell (runtime-config.js) 7.42KB 2.32KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 7.57KB 2.97KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 1.17KB 0.53KB
auth (AuthProvider.js) 22.10KB 4.37KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.13KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.64KB 2.21KB
auth (SocialSignInButtons.js) 9.60KB 3.89KB
auth (UserMenu.js) 3.40KB 1.22KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 35.76KB 9.11KB
auth (createAuthenticatedFetch.js) 4.37KB 1.69KB
auth (index.js) 2.35KB 1.07KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 4.91KB 0.87KB
auth (useIsWorkspaceAdmin.js) 1.61KB 0.85KB
collaboration (CommentThread.js) 26.07KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.65KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 482.39KB 106.34KB
core (index.js) 2.96KB 1.13KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 139.61KB 35.99KB
fields (index.js) 230.82KB 56.70KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (currency.js) 1.22KB 0.64KB
i18n (i18n.js) 4.32KB 1.77KB
i18n (index.js) 2.65KB 1.06KB
i18n (pickLocalized.js) 1.70KB 0.83KB
i18n (provider.js) 9.48KB 3.27KB
i18n (useObjectLabel.js) 27.59KB 6.63KB
i18n (useSafeTranslation.js) 4.52KB 1.96KB
layout (index.js) 38.53KB 10.71KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.74KB
mobile (index.js) 1.50KB 0.62KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.71KB 0.42KB
mobile (useResponsiveConfig.js) 1.36KB 0.63KB
mobile (useSpecGesture.js) 4.32KB 1.64KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 8.75KB 3.06KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 3.67KB 1.12KB
permissions (evaluator.js) 4.41KB 1.44KB
permissions (index.js) 0.91KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.52KB
permissions (usePermissions.js) 1.55KB 0.71KB
plugin-ai (index.js) 15.71KB 3.79KB
plugin-calendar (index.js) 44.98KB 12.37KB
plugin-charts (index.js) 61.04KB 17.31KB
plugin-chatbot (index.js) 180.33KB 42.79KB
plugin-dashboard (index.js) 117.21KB 30.27KB
plugin-designer (index.js) 210.51KB 42.51KB
plugin-detail (index.js) 236.17KB 58.82KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 112.10KB 27.10KB
plugin-gantt (index.js) 162.55KB 39.57KB
plugin-grid (index.js) 187.63KB 49.66KB
plugin-kanban (index.js) 48.30KB 13.28KB
plugin-list (index.js) 105.12KB 25.48KB
plugin-map (index.js) 16.81KB 5.24KB
plugin-markdown (index.js) 13.72KB 4.69KB
plugin-report (index.js) 40.58KB 10.58KB
plugin-timeline (index.js) 25.76KB 7.33KB
plugin-tree (index.js) 8.50KB 2.88KB
plugin-view (index.js) 84.03KB 20.55KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.71KB 3.53KB
providers (index.js) 0.44KB 0.22KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.67KB 2.37KB
react (LazyPluginLoader.js) 3.77KB 1.33KB
react (SchemaRenderer.js) 19.28KB 6.38KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 1.02KB 0.55KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 4.09KB 1.74KB
sdui-parser (index.js) 4.47KB 2.03KB
sdui-parser (parse.js) 10.04KB 2.82KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 4.69KB 1.48KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 0.99KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 0.20KB 0.18KB
types (crud.js) 0.20KB 0.18KB
types (data-display.js) 0.20KB 0.18KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.87KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-retry.js) 4.32KB 2.02KB
types (index.js) 2.71KB 1.34KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 2.59KB 1.31KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (spec-report.js) 5.05KB 1.93KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 0.20KB 0.18KB
types (ui-action.js) 3.40KB 1.71KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

Copy link
Copy Markdown
Collaborator Author

✅ 验收(PM,session session_01GTRjn8xBqp75dk7kFupVRt)

实物核验:头 5a5565905,3 文件 +276/−2;es.ts diff 恰好两行值 —— message 按方向 A 改 usted(está viendo/publique),开头统一为 Vista previa del borrador、live 用词取包内既有 activo(publishCta/pendingDrafts.published/sampleDataBody 四处邻证,producción 留给真环境语义);messageClean:(U+2014 与 en 同码位)。trailer 0;未动 en(drift 脚本 0 changed)/棘轮/3546 家族测试,与在飞四单零相交。
CI 终态(独立复核):20 检查全部 completed,18 success + 2 skipped,零失败。

裁定要点:

  • 用词对齐(activo、开头统一)在「同一概念同一词」授权内且四处邻证充分,采纳;钉子 10 例全为逐字节/presence/tripwire,零形态学检测 —— 与 C 方案否决理由一致。
  • 反向验证两方向红数与点名全部预判中(4 红 / 2 红)。
  • 诚实度记正分:第一版注释照抄了卡片里未复核的「Revisa 误判」断言,dev 自查发现机制不同(真正假阳性是带显式 usted 的陈述式),用第二提交改正三处文案而非把未验证断言固化进永久注释;并把 approvalsInbox 是正当一致 tú 邻域(9 条)写明防误伤。
  • 越界 es 的 preview.empty.notReadyDescription 用 tú,与同屏的 preview.draftBar(usted)混用 —— 草稿预览未就绪时一屏两种敬称 #3875(preview.empty.notReadyDescription tú 与 draftBar usted 同屏混用,比本单更尖;本 PR 后 preview 为 23:1)独立立单不并入 —— 围栏正确,归分诊席。

转 ready 并挂 auto-merge。


Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

2 participants