Skip to content

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

Merged
objectstack-fleet[bot] merged 3 commits into
mainfrom
claude/project-thread-1jep1s
Nov 6, 2026
Merged

objectstack-fleet[bot] merged 3 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 d8b22954ad3040fe8ff1cb30667101847b694584 → packageMentionDocs.

Which tree this was computed on

This run read content/docs from 5630807a76f7664beb861dca7d9734aa3d8f5d17 — the merge of head dd6a80232001d7c0bb9dbc49dfbc3d87d76b7b08 into base d8b22954ad3040fe8ff1cb30667101847b694584, 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 5630807a76f7664beb861dca7d9734aa3d8f5d17 && git checkout 5630807a76f7664beb861dca7d9734aa3d8f5d17
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin d8b22954ad3040fe8ff1cb30667101847b694584 dd6a80232001d7c0bb9dbc49dfbc3d87d76b7b08 && git checkout -B drift-repro d8b22954ad3040fe8ff1cb30667101847b694584 && git merge --no-ff dd6a80232001d7c0bb9dbc49dfbc3d87d76b7b08

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

⚠️ 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 d8b22954ad3040fe8ff1cb30667101847b694584 → 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
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

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

席位核对 · ACCEPT · 2026-11-06T11:32Z · #30512 (package 6 of 11, service-settings, first half)

Head-sha: dd6a802 (a relay update-branch merge of main over the reviewed 9c22c667 / 9e0f2cd6, bringing in #30908, the fix for the #30873 Test Core 6/8 timeout that turned the earlier heads red; the diff against main is the same 7 files, +2694/−3)

  • Shape: 7 files, +2694/−3. Inside claim 6672078792; not governed; one commit on origin/main a2f523aa.
    • Four new locale files: zh-Hant, ar, fr and pt-BR.
    • translations/index.ts registers them in settingsBuiltinTranslations.
    • The coverage test holds the four locales to full coverage.
    • One patch changeset.
  • Seat ruling (a) applied: the handover 70f9870a is carried without the localization-currency-lock and localization-locale-options hunks and their test hunk, because 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 owns those tables. The zh-Hant brand names are in Traditional script.
  • Spot check (read in the diff):
    • No new public export. The package entry still re-exports settingsBuiltinTranslations plus the en, zh-CN and ja-JP named bundles. The map gains four locale keys, which is data, not shape.
    • zh-Hant reads as Traditional, for example 寄件者名稱 and 預設簡訊範本.
    • ${content} in the SMS template help is kept literally in single-quoted strings, the same way zh-CN and es-ES carry it.
    • No added string starts with the article os , and the dev also ran check-cli-command-ids.
    • No assertion is relaxed.
  • Gates: every check-run on this head has concluded: 48 distinct checks, the latest run of each 35 success, 13 skipped, 0 failure (Test Core 6/8 green with test(rest): pay the objectql load at module top in the meta write-door enumeration #30908 in). Locally (dev report 6679996540):
  • Contract: Clause-②: no, Metadata-protocol: none, confirmed from the diff.
  • Landing: ready, then auto-merge, through the relay. Settings B (ru, de, ko) follows on the same branch.

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review November 6, 2026 11:33
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Nov 6, 2026
Merged via the queue into main with commit 0e88208 Nov 6, 2026
49 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/project-thread-1jep1s branch November 6, 2026 11:54
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