Skip to content

i18n(service-settings): ship the built-in settings pages in zh-Hant, ar, fr and pt-BR - #30870

Draft
objectstack-fleet[bot] wants to merge 2 commits into
mainfrom
claude/project-thread-1jep1s
Draft

objectstack-fleet[bot] wants to merge 2 commits into
mainfrom
claude/project-thread-1jep1s

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Elon · project thread

domain:server#1 · os-elon-musk · session_016WV4cya5ej5GQV86RPbRPK

Part of #30512 — package 6 of 11, first half (@objectstack/service-settings in zh-Hant, ar, fr, pt-BR). The card stays open: the second half (ru, de, ko) and platform-objects follow, and the last PR of the series makes the bundle check read the platform locale table.

Clause-②: no
Metadata-protocol: none

维护者速读

  • 改了什么: 「设置」里内置的设置页(邮件、短信、品牌、公司、本地化、认证、文件存储、AI 与向量、知识库,以及 @objectstack/objectql 注册的数据生命周期页)的页标题和说明、分组、字段名和帮助、选项、提示条、操作按钮和来源标记,补上繁中、阿语、法语、巴葡 4 种。俄语、德语、韩语在下半包。
  • 为什么改: 平台语言表要求每个界面带齐 11 种语言;这是第 3 期按包补齐的第 6 个包的上半。用这 4 种语言的管理员打开「设置」不再看到英文。
  • 风险与回滚: 只加 4 个翻译文件和注册行,不动逻辑、schema、接口;原有 4 种语言一字未改。交接提交里改 localization-currency-lock / localization-locale-options 文案表的部分按席位裁决整段去掉:Settings actions and refusals: seven module-local copy tables still carry four languages and resolve zh-TW to Simplified; the SMS test and two built-in answers are English only #30630(已作为 fix(settings): settings copy is written in all eleven platform languages, zh-TW reads Traditional, and sms/test answers in the caller's language (#30630) #30734 落地)拥有这两张表,且已带齐 11 种语言。测试改动只是覆盖测试把 4 种新语言加进列表(覆盖变宽,没有放宽断言)。回滚即撤 PR。
  • 先看: src/translations/index.ts(按表标签注册,zh-CN 在 zh-Hant 前),再看 settings-translation-coverage.test.ts,然后抽看任一新语言文件。
  • 两分钟验证: pnpm --filter @objectstack/service-settings exec vitest run src/translations/settings-translation-coverage.test.ts 全绿。
  • 需要你做的: 无,席位落地。

What changes

Tests

  • settings-translation-coverage.test.ts lists every shipped non-English locale; it now holds the four new ones to the same full coverage of every built-in manifest (its header comment says "every shipped non-English locale" instead of naming three). No assertion changed.

Acceptance notes

  • Quality bar ([Decision] Repeater row-property localisation: 604 catalog leaves across four locales — who authors the translated copy? #17508 / PR feat(spec): a repeater property panel names its columns in every locale, not only English #19345): every leaf written for the reader; placeholders, code spans, URLs and identifiers byte-identical, checked mechanically per leaf against en and against zh-CN (which carries the inline-manifest keys en.ts does not): key set, {{holes}}, {holes}, backtick spans, angle tokens, all four locales zero diffs. Arabic is RTL prose with identifiers, hosts and URLs left in Latin script. zh-Hant was checked literal by literal (391) against OpenCC's Traditional (Taiwan) conversion: no Simplified-only character remains; its only remark is 台 in 主控台 / 平台, the Taiwan usage.
  • Leaves equal to English, on purpose: provider, product and protocol names (SMTP, S3, OpenAI, Anthropic, Vercel AI Gateway, Turso / libSQL, RAGFlow, …); the terms the existing zh-CN / ja-JP / es-ES also leave in English (Base URL, Embedder, Bucket, Backend, Endpoint); words spelled the same in the language (fr Port, Contact, Finance, Sessions, Local, Global; pt-BR Host, Local, Global); and country names whose local spelling is the English one.
  • No cross-locale coincidence: check:i18n-stale-fill passes with the baseline untouched.
  • No string opens with os followed by a lowercase word (check-cli-command-ids passes), and the whole "Lint · docs & code guards" lane was run locally before opening.

Verification

Package suite, typecheck, build (verify lock)
turbo run build --filter=!@objectstack/docs: 118/118 tasks successful, exit 0   (at head 9c22c667, on main a2f523aa)
pnpm --filter @objectstack/service-settings test && typecheck   (at head 9c22c667)
 Test Files  71 passed (71)
      Tests  1313 passed (1313)
os-verify-lock: VERDICT command-exit 0
same patch at f8d192f9 (on main ae82d057): 70 files, 1254 passed, VERDICT command-exit 0
  (main's #30720 and #30835 added service-settings tests in between; neither touches translations/ or the manifests)
i18n gates, the derived families and the docs & code guards lane
node scripts/check-i18n-bundles.mjs (all packages; service-settings has no extract config)   (at 9c22c667)
check-i18n-bundles: OK (10 package(s) — all bundles in sync, no undeclared authoring keys).   EXIT 0
node scripts/check-i18n-stale-fill.mjs                          (at 9c22c667)
check-i18n-stale-fill: OK (11 bundle set(s) — no new stale fills, 1 baselined).   EXIT 0
node scripts/check-cli-command-ids.mjs                          (at 9c22c667)   EXIT 0
dispatch-gates --commands (at f8d192f9): 60 families, each run and recorded with its exit code: 60 x exit 0
dispatch-gates --ran: 60 derived, 60 run, 0 NOT-MEASURED (a derived zero)
re-derived at 9c22c667: the identical 60-command list
pnpm lint (repo-wide, at f8d192f9): exit 0
CI lane "Lint · docs & code guards", every command run locally   (at f8d192f9)
  56 commands (lane-verdict excepted), 56 x exit 0, check-cli-command-ids included
changed lines 2697 (+2694 / -3), 7 files: under the 3000-line human-merge threshold

The branch is one commit on main a2f523aa (after #30856 landed). Its diff has the same patch id (8ef6d611) as f8d192f9, where the derived families, pnpm lint and the docs & code guards lane ran on main ae82d057. The package suite, the whole-tree build and the three i18n / command-id checks were re-run on this head. (The first bundle check at this head, before the rebuild, read a stale @objectstack/spec build and refused platform-objects' requiresFeature field group from #30810; after the rebuild it passes.)

Dogfood: not run — content-only package PR, no ! in the title and no (narrowing) arm.


Generated by Claude Code

…ar, fr and pt-BR

Four new locales for the built-in Setup settings pages (page titles and
descriptions, groups, field labels and help, option labels, banners,
actions and source badges), registered in settingsBuiltinTranslations
under the platform-table tags (zh-CN before zh-Hant). The settings
coverage test holds each new locale to the same full coverage.

Carried from the released handover commit 70f9870 (written by
session_01Utp6Cai5CRdAs4u9gTipWU) without its localization-currency-lock
and localization-locale-options hunks: #30630 (landed as #30734) owns
those copy tables and already carries all eleven languages there. The
zh-Hant file writes the provider brands in Traditional script
(阿里通義, 矽基流動, 智譜).

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016WV4cya5ej5GQV86RPbRPK
@github-actions github-actions Bot added size/xl documentation Improvements or additions to documentation tests tooling Fix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface labels Nov 6, 2026
@github-actions

github-actions Bot commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/service-settings, touching 7 documentable anchor(s).

4 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:

  • content/docs/data-modeling/objects.mdx (via expireAfter (literal, a string literal in settings), maxAge (literal, a string literal in settings))
  • content/docs/deployment/production-readiness.mdx (via maxAge (literal, a string literal in settings))
  • content/docs/protocol/kernel/i18n-standard.mdx (via settingsCommon (symbol, a field of const object ar; a field of const object fr; a field of const object ptBR; a field of const object zhHant))
  • content/docs/ui/translations.mdx (via settingsCommon (symbol, a field of const object ar; a field of const object fr; a field of const object ptBR; a field of const object zhHant))

⛔ 1 release-owned page(s) also name something this change touched. These are read-only:

  • content/docs/releases/v17/17-5.mdx (via expireAfter (literal, a string literal in settings))

content/docs/releases/ is RELEASE-OWNED (AGENTS.md "Documentation Guardrails"): release
notes are written centrally at release time, and a code PR that edits them is the exact PR
that guardrail exists to stop. They are still audited — read-only. If one of them is actually
wrong, file an issue or open a dedicated docs-only PR; do not edit it here.

What this run could not see
  • 1 anchor(s) matched too much of the corpus to be a work list: /api/v1 (route, 118 pages)
  • 1 name(s) were too generic to anchor anything (single lowercase words)
  • the SDK route bridge reached 63 of 222 client-bound route-ledger rows — the other 159 have no registrar path: tail to select them, so pages documenting THEIR client methods cannot appear above, on this or any run. Of those 159: 0 are remediable by widening that discovery convention (an in-repo file declares the path; the convention did not scan it); 55 are structural — on a ledger where NOT ONE row is declared in-repo, so no discovery change reaches them at any price; 104 are undecided (no in-repo declaration, on a ledger that has other in-repo registrars — absence and an unreadable spelling are not distinguishable here). The rows themselves: node scripts/docs-audit/affected-docs.mjs --bridge-coverage
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.
  • a key NAME is not a key, so the hand re-read the line above prescribes can land on the wrong schema. The same spelling is authorable on one governed type and a [REMOVED] tombstone on another for each of active, aria, joins, objects, template, tools and version (censused on [finding] tools is a key on BOTH AgentSchema (tombstoned, dead) and SkillSchema (live, cloud-attested), so a name-based search attributes skill examples to the agent key — it produced a false stop-the-line alarm on PR #19059 #19093 over the liveness ledger's governed types, top-level keys); nothing in a search result distinguishes the two, so a grep hit on a LIVE example reads as evidence about the DEAD key. Measured on fix(spec): the agent.tools liveness row says dead — it claimed live on a key the schema tombstoned #19059: content/docs/ai/agents.mdx was reported as contradicting the agent.tools tombstone over its tools: example at :161, which is inside the defineSkill({ block opened at :155 — the page was already correct. Settle ownership by PARSING the value against both schemas, never by the name: that literal PASSES SkillSchema, and as an AgentSchema it FAILS at tools with the tombstone prescription. ⛔ These names are not the whole class — a key retired through a .strict() guidance map leaves no tombstone in the walked shape and none of them here (tool.category, live as AIToolDefinition.category).

Coarse fallback — 9 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json cf478ea3398e90e97e73f421fd7f0842a6bd04bd → packageMentionDocs.

Which tree this was computed on

This run read content/docs from 5f9d9a8a22d8ca310c9231db20bbd50472a92365 — the merge of head 9e0f2cd6bd29011ca692d21d4672673d3e032e82 into base cf478ea3398e90e97e73f421fd7f0842a6bd04bd, which is what actions/checkout gives a pull_request run. Not the PR head.

A worktree cut from an older main holds a different content/docs, so re-deriving there can legitimately return a different list — that is a different tree, not a wrong row. To answer on the same tree:

# while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 5f9d9a8a22d8ca310c9231db20bbd50472a92365 && git checkout 5f9d9a8a22d8ca310c9231db20bbd50472a92365
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin cf478ea3398e90e97e73f421fd7f0842a6bd04bd 9e0f2cd6bd29011ca692d21d4672673d3e032e82 && git checkout -B drift-repro cf478ea3398e90e97e73f421fd7f0842a6bd04bd && git merge --no-ff 9e0f2cd6bd29011ca692d21d4672673d3e032e82

node scripts/docs-audit/affected-docs.mjs --json cf478ea3398e90e97e73f421fd7f0842a6bd04bd

⚠️ That checkout carried uncommitted changes, so the commit above does not fully identify what was read.

Advisory only, and a precision-first one (#9192): a page is listed because it names a
symbol, wire route or SDK method this diff touched — not because it mentions a changed
package. Each row says which anchor put it there, so a wrong row is reportable rather than
merely annoying. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs cf478ea3398e90e97e73f421fd7f0842a6bd04bd → pass the list as
args.docs, on the commit named under Which tree this was computed on.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:server#1 · os-elon-musk · session_016WV4cytLmJxfAmgPVjUbbW

席位核对 · CI note · 2026-11-06T08:04Z · #30512

Test Core (6/8) is red on 9c22c667 (job 127778628692), and the failure is not this PR's. The failing case is one case in packages/rest/src/meta-write-door-capability-enumeration.test.ts: the record-currency backfill door's capability control (about :674), with Test timed out in 5000ms. That test came in with PR #30809, and this PR touches only service-settings translations. main push CI is green at cf478ea3, so the timeout depends on runner load. The fix is carded as #30873. The relay cannot re-run a job, so the card thread merges current main into this branch, which gives the PR a fresh run on an updated base, and the seat checks the delta before the ACCEPT.

Brings the branch up to main cf478ea so CI re-runs on the current base.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016WV4cya5ej5GQV86RPbRPK

This branch has not been deployed

No deployments
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/xl tests tooling Fix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants