Skip to content

FSB Showcase v0.9.63: Marketing Site i18n

Choose a tag to compare

@LakshmanTurlapati LakshmanTurlapati released this 13 May 07:07

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 a verify-locale-sync.mjs CI invariant that fails the build on any drift.
  • 420 translatable strings across seven namespaces (shell, picker, home, about, agents, privacy, support) marked via i18n attributes and $localize tagged templates, including TS-side Title and Meta for SEO.
  • AI-filled target XLIFFs for all five non-English locales. i18nMissingTranslation is set to error in angular.json, so any unfilled <trans-unit> fails the build.
  • 30 prerendered index.html files emitted per build (six marketing routes across five locale subpaths plus the English root). Each carries <link rel="alternate" hreflang> fan-out (including x-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-TWzh-TW), cookie-respecting (existing fsb-locale picker choice wins), bot-safe (no Accept-Language header means no redirect, preserving the Googlebot crawl path).
  • Standalone LanguagePickerComponent mounted 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/i18n with checkId / checkText / checkAttributes) promoted to a hard-fail step in the website job.
  • extract-i18n-clean gate asserts the committed messages.xlf is byte-equal to a fresh ng extract-i18n output.
  • verify-locale-sync runs pre-build and enforces parity between the Angular and Express locale registries.
  • verify:hreflang runs post-build and asserts hreflang plus canonical correctness across all 30 prerendered HTMLs.
  • verify-bundle-budgets checks 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 an Accept-Language header preferring a non-English supported locale now returns a 302 redirect to the matching subpath instead of serving the English root. Cookie-driven explicit picks (fsb-locale) override this. Bots and other clients with no Accept-Language header 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.md artifacts (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-green gate.

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 whose fsb-locale cookie 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 in 267-CONTEXT.md D-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-pattern in package.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.