feat: localized panel titles via Fluent catalogs (resolve display_name_key)

PanelDef.display_name_key: String in canopy-composition manifests is an i18n catalog key, not a localized title. The customize page (#498 (closed)) currently uses the slug as the panel title in aria-labels (aria-label="Move panel <slug>"). canopy-portal already has Fluent infrastructure (LocaleManager + LocaleExt extractor); canopy-web needs the same.

Scope:

  • Wire Fluent into canopy-web matching the canopy-portal pattern.
  • Per-jurisdiction panel-titles.ftl catalogs keyed by display_name_key -> localized string.
  • Customize handler resolves display_name_key -> localized string per worker locale (default en); init JSON carries panel_titles: {slug: "Localized Name"} map.
  • Alpine panelTitle(slug) returns the localized name; falls back to slug if catalog miss.

Plan: xref:plans/worker-portal-redesign-stage5-customize-my-dashboard.adoc — FU-59.