FSB Showcase v0.9.63: Marketing Site i18n
Highlights
This release internationalizes the FSB marketing site (showcase/angular) across six locales: English, Spanish, German, Japanese, Simplified Chinese, and Traditional Chinese. English remains the source of truth. Copy drift is locked by hard-fail CI gates. Every marketing route renders at prerender time with correct hreflang and canonical fan-out, and a first-visit user landing on / is auto-redirected to the locale subpath that best matches their browser's Accept-Language header.
This is a showcase-only milestone. The Chrome extension, MCP server, and FSB Skill packages are unchanged from v0.9.62 and v0.9.0 respectively.
What's new
- Shared 6-locale registry (
en,es,de,ja,zh-CN,zh-TW) mirrored across the Angular ESM front-end and the Express CJS server, with averify-locale-sync.mjsCI invariant that fails the build on any drift. - 420 translatable strings across seven namespaces (
shell,picker,home,about,agents,privacy,support) marked viai18nattributes and$localizetagged templates, including TS-sideTitleandMetafor SEO. - AI-filled target XLIFFs for all five non-English locales.
i18nMissingTranslationis set toerrorinangular.json, so any unfilled<trans-unit>fails the build. - 30 prerendered
index.htmlfiles emitted per build (six marketing routes across five locale subpaths plus the English root). Each carries<link rel="alternate" hreflang>fan-out (includingx-default), a single locale-specific<link rel="canonical">, and<html lang>matching the served locale. - Server-side Accept-Language auto-detection middleware on
/. BCP-47 q-value parsing, alias resolution (e.g.zh-Hant-TW→zh-TW), cookie-respecting (existingfsb-localepicker choice wins), bot-safe (noAccept-Languageheader means no redirect, preserving the Googlebot crawl path). - Standalone
LanguagePickerComponentmounted in the desktop nav, mobile nav, and footer on every prerendered route. CJK font stacks scoped via:lang()selectors using system fonts only (no webfont download).
What changed in CI
lint:i18n(@angular-eslint/template/i18nwithcheckId/checkText/checkAttributes) promoted to a hard-fail step in the website job.extract-i18n-cleangate asserts the committedmessages.xlfis byte-equal to a freshng extract-i18noutput.verify-locale-syncruns pre-build and enforces parity between the Angular and Express locale registries.verify:hreflangruns post-build and asserts hreflang plus canonical correctness across all 30 prerendered HTMLs.verify-bundle-budgetschecks per-locale gzipped main-bundle sizes against the locked budget.
The full website CI chain runs install → verify-locale-sync → lint:i18n → extract-i18n-clean → ng build → verify:hreflang → verify-bundle-budgets on every push.
Compatibility
- Marketing site users see new locale subpaths (
/es/,/de/,/ja/,/zh-CN/,/zh-TW/). The English root canonical stays at the bare path, so existing SEO surfaces are preserved. - Server behavior change: a
GET /request with anAccept-Languageheader preferring a non-English supported locale now returns a302redirect to the matching subpath instead of serving the English root. Cookie-driven explicit picks (fsb-locale) override this. Bots and other clients with noAccept-Languageheader continue to receive the English root. - The Chrome extension, MCP server (
fsb-mcp-server@0.9.0), and FSB Skill packages are unchanged.
Verification
Milestone audit summary:
- 14 of 14 v0.9.63 requirements satisfied.
- 7 of 7 phases shipped with
VERIFICATION.mdartifacts (status: passed). - 12 of 12 cross-phase integration points verified.
- 3 of 3 end-to-end flows passing (first-visit Accept-Language redirect, picker cookie persistence, full CI gate chain).
- Full CI green on the merge commit: extension, MCP, and showcase jobs plus the
all-greengate.
Audit artifacts: .planning/milestones/v0.9.63-MILESTONE-AUDIT.md, .planning/phases/v0.9.63-INTEGRATION-CHECK.md, six per-phase VERIFICATION.md files under .planning/phases/{261,262,264,265,266,267}-*/.
Known caveats
- Picker cookie short-circuits the bare-
/redirect. Returning users whosefsb-localecookie is set will see the English prerender at the root on a fresh tab or shared link rather than being re-redirected to their preferred locale. This is intentional under the v0.9.63 cookie-wins rule (locked in267-CONTEXT.mdD-02 / T-267-03); revisit candidate for a future UX milestone. - Dashboard surface is intentionally untranslated in v0.9.63.
showcase/angular/src/app/pages/dashboard/**is carved out by--ignore-patterninpackage.json:lint:i18n; deferred to v0.9.65. - Extension UI, popup, and MCP server / skills text remain English-only by design.
Milestone scope
7 phases (261, 262, 264, 265, 266, 267, 268) -- 263 was dropped (dashboard deferred). Phase 268 was a post-audit cleanup that deduplicated the server.js supported-locale literal against the CJS registry and backfilled the six per-phase VERIFICATION.md artifacts the milestone template expects.
Branch feat/showcase-i18n merged to main via #42.