Repository navigation
fix(service-settings): the Default timezone help says what the setting does, in every locale - #22174
Merged
objectstack-fleet[bot] merged 1 commit intoOct 8, 2026
Conversation
…locale The timezone help named formula functions (today(), daysFromNow) and an analytics term to administrators. The manifest description and the en, es-ES, ja-JP and zh-CN help now say what the setting does, keeping the IANA hint as a short second sentence because the field accepts any zone. A pin reads the served layers (the bundles the plugin loads into i18n at kernel:ready, and GET /api/settings/localization) and holds the help to naming no function identifier in every loaded locale. Claude-Session: https://claude.ai/code/session_01WkL6Eijt432S1Y7ekb6ovQ Co-authored-by: Claude <noreply@anthropic.com>
Contributor
📓 Docs Drift CheckNothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 1 changed package(s)), so this run has no opinion about the docs. What this run could not see
Coarse fallback — 8 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
objectstack-fleet
Bot
deleted the
claude/issue-22136-timezone-help-plain
branch
October 8, 2026 05:04
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 free
to 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.
Fixes #22136
Clause-②: no
The Default timezone help that an administrator reads in Settings → Localization and in the first-run timezone prompt (objectstack-ai/objectui#11758) named formula functions and an analytics term. It now says what the setting does, in plain words, in the manifest and in all four built-in packs. This is the wording half of the maintainer's ask; the browser-zone pre-selection half already shipped in objectui. The maintainer's words:
What changed, per served string
description(localization.manifest.ts)enhelpes-EShelpja-JPhelpzh-CNhelpWhy "IANA" stays, as a second sentence: the field is a free-text combobox (objectui
SettingsField'sDomainCombobox, because the key declaresvalueDomain: 'iana_time_zone'), and the server accepts any IANA zone, not only the 17 listed. An administrator who types a zone needs to know the format. The first sentence carries no standard name.No setting key, default (
UTC), accepted value or behaviour changes. Nopackages/spec, nosettings-service*.ts.Which layer is served (and so where the pin reads)
The console's
useSettingsLabel().fieldHelpresolvessettings.localization.keys.timezone.helpfrom the bundles the settings plugin loads into the i18n service atkernel:ready, and falls back to the manifestdescriptionthatGET /api/settings/localizationserves. Both layers carried the developer wording, so both are rewritten and both are pinned. The four packs are hand-written: no generator feedsservice-settings/src/translations/*.ts(no*.generated.tsthere;check:i18nandcheck:i18n-stale-fillscan only the generated bundle sets).The pin
packages/services/service-settings/src/localization-timezone-help.pin.test.tsboots the realSettingsServicePlugin(its default manifests and translations) on aLiteKernelbeside a stubi18nservice that records everyloadTranslations(locale, data)call. It then reads:descriptionfromGET /api/settings/localization, mounted on the service that boot registered.It asserts each names no function identifier: no name directly followed by an opening parenthesis, and no lowerCamelCase name. A detector control asserts the old wording is flagged (
today(anddaysFromNow), so the detector cannot pass vacuously. The new wording itself is not pinned.Reverse verification, at commit
40fd214174, both legs throughscripts/ablation-replace.mjs(anchor hit 1 → 0, blob changed, restore proven blob == HEAD andgit diff HEADempty):× the translated help, in every locale the plugin loadswithja-JP: today()/daysFromNow の解決… expected [ 'today(', 'daysFromNow' ] to deeply equal [];Tests 1 failed | 3 passed (4).× the manifest description served by GET /api/settings/localizationwithexpected [ 'today(', 'daysFromNow' ] to deeply equal [];Tests 1 failed | 3 passed (4).Both went red in the expected direction. The tests import the subject by relative
src/paths, so nodist/rebuild was involved.Verification (head
40fd214174)pnpm --filter @objectstack/service-settings exec vitest run --maxWorkers=2:Test Files 37 passed (37),Tests 632 passed (632).pnpm --filter @objectstack/service-settings typecheck: exit 0;tsc --noEmit --listFilesincludes the new pin and all five edited files (37 test files in the program).pnpm --filter @objectstack/service-settings build:check-dts-emitted: @objectstack/service-settings - 2/2 declared declaration file(s) present.turbo run build --filter='@objectstack/service-settings^...', 15/15 tasks.node scripts/pm/dispatch-gates.mjs --commands(no paths) derived 63 families; all 63 run. 62 exit 0. One is NOT MEASURED:check:dual-build-cjs-loadsexit 3PREREQUISITE NOT MET(it reads every package'sdist/, and only the closure was built here).--ranreconciliation:63 derived famil(ies) accounted for — 62 run, 1 NOT-MEASURED. Also run, all exit 0:check:i18n(OK (9 package(s) — all bundles in sync…)),check:i18n-stale-fill(OK (10 bundle set(s) — no new stale fills, 0 baselined)),check:i18n-coverage(OK (13 config(s), 621 baselined untranslated string(s), none new)),check:i18n-walk-parity,check:settings-bind-window,check:nul-bytes.eslint --no-inline-config --format jsonon the six touched.tsfiles gives 6 files, 0 errors, 0 warnings (no "file ignored" warning, so all six are in the linted set). This repo'seslint.config.mjsenables no type-aware linting (noparserOptions.project), so this diff cannot change the verdict on any untouched file. The repo-widepnpm lintis left to CI.Acceptance notes
locale("BCP-47 locale for message catalogs and number/date formatting"),currency("…render code-less amounts as plain numbers"),default_country("ISO 3166-1 alpha-2 code"). They are not changed here. The bounded in-place rule needs all four conditions, and its second one (a mechanical fix whose shape a ruling already fixed) does not hold: each needs new wording in four locales, and forlocalethe new wording would first need its "message catalogs" claim checked. The new pin covers only the timezone key. Rewording the others is a ruling for the seat.currencyhas noenhelp (enshows the two-sentence manifest literal), and zh-CN / ja-JP / es-ES carry only its first sentence.default_countrycarries "Used for address and phone defaults." in es-ES and ja-JP, but not in en or zh-CN.Generated by Claude Code