Skip to content

feat(i18n): make action resultDialog copy translatable (schema slot + resolver + platform bundles) - #3347

Merged
os-zhuang merged 3 commits into
mainfrom
claude/user-creation-i18n-601fe8
Jul 20, 2026
Merged

os-zhuang merged 3 commits into
mainfrom
claude/user-creation-i18n-601fe8

Conversation

@baozhoutao

Copy link
Copy Markdown
Contributor

Problem

The post-success resultDialog (create-user temporary password, 2FA backup codes, OAuth client secrets) always rendered hardcoded English — even on fully-translated locales. Root cause: the translation protocol had no slot for Action.resultDialog, so neither the bundles nor any resolver could localize the dialog's title, description, acknowledge button, or field labels.

Changes

  • spec — _actions.<action> (object + object-first node) and globalActions.<action> gain an optional resultDialog translation node (ActionResultDialogTranslationSchema): title, description, acknowledge, and fields keyed by the literal result-field path (e.g. "user.email" — keys may contain dots; resolvers index the record directly, never split on .). New resolveActionResultDialog overlay resolver, wired into translateAction. json-schema manifest regenerated.
  • cli — os i18n extract emits the new resultDialog.title/description/acknowledge and resultDialog.fields.<path> entries (dotted paths stay one segment), so coverage/skeleton generation see them.
  • platform-objects — en / zh-CN / ja-JP / es-ES bundles ship resultDialog copy for all six shipped dialogs: sys_user.create_user, sys_user.set_user_password, sys_two_factor.enable_two_factor, sys_two_factor.regenerate_backup_codes, sys_oauth_application.create_oauth_application, sys_oauth_application.rotate_client_secret.

Purely additive — untranslated locales keep falling back to the metadata literals. Client-side rendering lands in objectstack-ai/objectui (actionResultDialog resolver + result-dialog handlers).

Testing

  • spec 138 / cli 27 / platform-objects 213 tests pass; full-repo pnpm build (71 tasks) green
  • End-to-end against a live showcase instance + objectui HMR console: create-user and set-password dialogs render fully localized in zh-CN (title 「用户已创建」, fields 「邮箱/临时密码」, acknowledge 「我已保存该密码」), user actually created and temporary password minted

🤖 Generated with Claude Code

@vercel

vercel Bot commented Jul 20, 2026 •

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
spec Ready Ready Preview, Comment Jul 20, 2026 5:46am

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation protocol:system tests tooling labels Jul 20, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 3 package(s): @objectstack/cli, @objectstack/platform-objects, @objectstack/spec.

110 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/ai/agents.mdx (via @objectstack/spec)
  • content/docs/ai/skills-reference.mdx (via packages/cli, @objectstack/spec)
  • content/docs/ai/skills.mdx (via @objectstack/spec)
  • content/docs/api/client-sdk.mdx (via @objectstack/cli, @objectstack/spec)
  • content/docs/api/data-flow.mdx (via @objectstack/cli)
  • content/docs/api/environment-routing.mdx (via @objectstack/cli, @objectstack/spec)
  • content/docs/api/error-catalog.mdx (via @objectstack/cli, @objectstack/spec)
  • content/docs/api/error-handling-client.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-server.mdx (via @objectstack/spec)
  • content/docs/api/index.mdx (via @objectstack/spec)
  • content/docs/automation/approvals.mdx (via packages/spec)
  • content/docs/automation/flows.mdx (via @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx (via packages/cli, packages/spec)
  • content/docs/automation/hooks.mdx (via @objectstack/spec)
  • content/docs/automation/index.mdx (via @objectstack/spec)
  • content/docs/automation/webhooks.mdx (via @objectstack/spec)
  • content/docs/automation/workflows.mdx (via @objectstack/spec)
  • content/docs/concepts/architecture.mdx (via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx (via packages/spec)
  • content/docs/concepts/index.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-driven.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-lifecycle.mdx (via packages/spec)
  • content/docs/concepts/north-star.mdx (via packages/spec)
  • content/docs/data-modeling/analytics.mdx (via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx (via @objectstack/spec)
  • content/docs/data-modeling/external-datasources.mdx (via @objectstack/spec)
  • content/docs/data-modeling/field-types.mdx (via @objectstack/spec)
  • content/docs/data-modeling/fields.mdx (via @objectstack/spec)
  • content/docs/data-modeling/formulas.mdx (via @objectstack/spec)
  • content/docs/data-modeling/index.mdx (via @objectstack/spec)
  • content/docs/data-modeling/objects.mdx (via @objectstack/spec)
  • content/docs/data-modeling/queries.mdx (via @objectstack/spec)
  • content/docs/data-modeling/schema-design.mdx (via @objectstack/spec)
  • content/docs/data-modeling/seed-data.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation-rules.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation.mdx (via @objectstack/spec)
  • content/docs/deployment/backup-restore.mdx (via @objectstack/cli)
  • content/docs/deployment/self-hosting.mdx (via @objectstack/cli)
  • content/docs/deployment/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/getting-started/build-with-claude-code.mdx (via @objectstack/spec)
  • content/docs/getting-started/cli.mdx (via @objectstack/cli, @objectstack/spec)
  • content/docs/getting-started/common-patterns.mdx (via @objectstack/spec)
  • content/docs/getting-started/examples.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-reference.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx (via @objectstack/spec)
  • content/docs/getting-started/validating-metadata.mdx (via @objectstack/spec)
  • content/docs/getting-started/your-first-project.mdx (via @objectstack/cli, @objectstack/spec)
  • content/docs/kernel/cluster.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/auth-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/cache-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/data-engine.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/index.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/metadata-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/storage-service.mdx (via packages/spec)
  • content/docs/kernel/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/data-service.mdx (via packages/cli)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/index.mdx (via packages/cli, packages/spec)
  • content/docs/kernel/runtime-services/queue-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sharing-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx (via packages/spec)
  • content/docs/kernel/services-checklist.mdx (via @objectstack/spec)
  • content/docs/permissions/authentication.mdx (via @objectstack/cli)
  • content/docs/permissions/authorization.mdx (via @objectstack/spec)
  • content/docs/permissions/permission-sets.mdx (via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx (via @objectstack/spec)
  • content/docs/permissions/positions.mdx (via @objectstack/spec)
  • content/docs/permissions/rls.mdx (via @objectstack/spec)
  • content/docs/permissions/sharing-rules.mdx (via @objectstack/spec)
  • content/docs/plugins/adding-a-metadata-type.mdx (via @objectstack/spec)
  • content/docs/plugins/development.mdx (via @objectstack/spec)
  • content/docs/plugins/index.mdx (via @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/cli, @objectstack/platform-objects, @objectstack/spec)
  • content/docs/protocol/backward-compatibility.mdx (via @objectstack/spec)
  • content/docs/protocol/diagram.mdx (via packages/spec)
  • content/docs/protocol/kernel/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/index.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/lifecycle.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/plugin-spec.mdx (via @objectstack/cli, @objectstack/spec)
  • content/docs/protocol/kernel/realtime-protocol.mdx (via @objectstack/cli)
  • content/docs/protocol/kernel/runtime-capabilities.mdx (via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/query-syntax.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/schema.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/security.mdx (via packages/spec)
  • content/docs/protocol/objectql/state-machine.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/actions.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/concept.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/layout-dsl.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/record-alert.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx (via @objectstack/spec)
  • content/docs/releases/implementation-status.mdx (via @objectstack/cli, @objectstack/spec)
  • content/docs/releases/index.mdx (via @objectstack/spec)
  • content/docs/releases/v12.mdx (via @objectstack/spec)
  • content/docs/releases/v13.mdx (via @objectstack/spec)
  • content/docs/releases/v16.mdx (via @objectstack/cli, @objectstack/spec)
  • content/docs/releases/v9.mdx (via @objectstack/spec)
  • content/docs/ui/actions.mdx (via @objectstack/spec)
  • content/docs/ui/create-vs-edit-form.mdx (via @objectstack/spec)
  • content/docs/ui/dashboards.mdx (via @objectstack/spec)
  • content/docs/ui/forms.mdx (via @objectstack/spec)
  • content/docs/ui/index.mdx (via @objectstack/spec)
  • content/docs/ui/public-data-collection.mdx (via @objectstack/spec)
  • content/docs/ui/setup-app.mdx (via @objectstack/platform-objects, @objectstack/spec)
  • content/docs/ui/translations.mdx (via @objectstack/spec)
  • content/docs/ui/views.mdx (via @objectstack/spec)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

baozhoutao and others added 3 commits July 20, 2026 01:12
… resolver + platform bundles)

The one-shot secret-reveal dialogs (create-user temporary password, 2FA
backup codes, OAuth client secrets) always rendered hardcoded English:
the translation protocol had no slot for Action.resultDialog, so neither
the bundles nor any resolver could localize the dialog's title,
description, acknowledge button, or field labels.

- spec: add ActionResultDialogTranslationSchema and hang it off object
  `_actions`, `globalActions`, and the object-first `_actions` node.
  `fields` is keyed by the LITERAL result-field path ("user.email") —
  keys may contain dots, resolvers index the record directly. New
  resolveActionResultDialog overlay resolver, wired into translateAction.
- cli: `os i18n extract` emits resultDialog.title/description/acknowledge
  and resultDialog.fields.<path> entries (dotted paths stay one segment).
- platform-objects: fill the en / zh-CN / ja-JP / es-ES bundles for all
  six shipped resultDialogs (sys_user create_user + set_user_password,
  sys_two_factor enable + regenerate backup codes, sys_oauth_application
  register + rotate secret).

Client-side rendering lands in objectui (@object-ui/i18n
actionResultDialog + result-dialog handlers). Verified end-to-end against
a live showcase instance: the create-user and set-password dialogs render
fully localized in zh-CN.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… reference doc

- The dots-preserved assertion in i18n-extract.test.ts embedded two raw
  NUL bytes (0x00) as join separators, tripping the raw-NUL-byte guard --
  use the unicode escape sequence instead (byte-identical at runtime).
- Regenerate content/docs/references/system/translation.mdx for the new
  resultDialog translation node (gen:schema + gen:docs).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…I surface snapshot

Additive only (4 new exports, 0 breaking) -- the resultDialog translation
schema/type and its slots on the action translation nodes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
akarma-synetal pushed a commit to akarma-synetal/framework that referenced this pull request Jul 20, 2026
…d + Console)

Continues the v16 page from the latest front/back-end code. Since the rc.0 cut,
9 backend changesets landed and the objectui pin advanced 94d4876 -> af1b0db
(objectui objectstack-ai#2706-objectstack-ai#2736). Sourced from each repo's own changesets.

- Retitles the now-stale 'pending the next console pin' subsection: those 4
  frontend items (objectui#2701/objectstack-ai#2706/objectstack-ai#2707/objectstack-ai#2708) are now bundled as the pin
  advanced; points to the new running section.
- Adds a 'Landed since 16.0.0-rc.0' section:
  - Breaking/behavior: aiStudio/aiSeat alias removal (objectstack-ai#3308); date-arithmetic
    now a build-time error (objectstack-ai#3306); checkboxes per-option visibleWhen + string
    option matching (objectstack-ai#3350).
  - New backend: formula null-guard/floor/ceil (objectstack-ai#3306); engine-owned managedBy
    bucket (ADR-0103 addendum, objectstack-ai#3343); approvals viewer gating (objectstack-ai#3344) +
    decision attachments (objectstack-ai#3332); discovery transactionalBatch bit (objectstack-ai#3298);
    action resultDialog i18n (objectstack-ai#3347); collab-notification/storage localization
    + wired notifications REST routes (objectstack-ai#3354).
  - Console (now bundled): option-widget visibleWhen parity, approvals-inbox
    server-viewer gating + composer retirement, related-list pagination,
    inline-analytics renderer retirement, authenticated api-fetch threading,
    result-dialog i18n, engine-owned bucket UI, write-failure surfacing.
- Adds aiStudio/aiSeat and date-arithmetic to the upgrade checklist; updates
  the Console-section intro for the advanced pin.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AHVoqyH9VAjmbyMN1Ri2jf
akarma-synetal pushed a commit to akarma-synetal/framework that referenced this pull request Aug 17, 2026
…ectstack-ai#8886) (objectstack-ai#8912)

The v16 page and its index entry still described the train as published as
`16.0.0-rc.0`. Tags say otherwise: `@objectstack/spec@16.0.0-rc.0` (2026-07-19),
`-rc.1` (2026-07-20), `16.0.0` (2026-07-21), `16.1.0` (2026-07-22). The series
went GA, took a minor, and closed when 17.0.0 shipped on 2026-08-14.

Four stale surfaces on the page, not one:

1. The release-status blockquote — rewritten as shipped, following the shape
   objectstack-ai#8882 set for v17. The "section headings say 16.0.0 for brevity" sentence is
   dropped (it explained a pre-mode convention that no longer exists); the
   trailing 15.1.1 cross-reference is kept verbatim — it is still true.
2. "Console vs. pin" said the pin "has since advanced to `af1b0db` on `main`".
   That advance released: changeset 1965549 bundles `af1b0db96e44` in
   `@objectstack/console` 16.0.0-rc.1.
3. "Console changes after the `rc.0` pin" carried the same `on main` framing.
4. The `Landed since 16.0.0-rc.0` window was left **open** ("roll into the next
   16.0 RC"). It is closed against what actually released it, in the shape the
   v17 windows use. Every entry in it maps to a changeset consumed at the
   `16.0.0-rc.1` cut — objectstack-ai#3308 (06ff734), objectstack-ai#3347 (6289ec3), objectstack-ai#3298 (bfa3c3f),
   objectstack-ai#3306 (7125007), objectstack-ai#3343 (62a2117), objectstack-ai#3350 (674457a), objectstack-ai#3332 (e412fb6),
   objectstack-ai#3344 (8efa395), objectstack-ai#3354 (ee0a499) and the console pin (1965549) — and the
   16.0.0 GA changelog sections re-list rc.0 + rc.1, the signature of
   `changeset pre exit`, so the window shipped in 16.0.0.

The 16.1.0 minor is named as the line's final release but deliberately not
documented: its content is out of this PR's scope.


Claude-Session: https://claude.ai/code/session_011RB4waLuNbdruCo6X9oobm

Co-authored-by: Claude <noreply@anthropic.com>

This branch was successfully deployed

1 active deployment
Preview — 18bd530e Deployed Jul 20, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/l tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants