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.ftlcatalogs keyed bydisplay_name_key-> localized string. - Customize handler resolves
display_name_key-> localized string per worker locale (default en); init JSON carriespanel_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.