PR #4262 introduced a DataGrid view-toggle button with two hardcoded
English tooltip strings ("Switch to table view" / "Switch to card view")
and explicitly deferred translation to a follow-up. Without the keys in
the locale JSON files, next-intl would surface the raw label paths at
runtime for any non-English user once the strings move to t().
Adds switchToTableView and switchToCardView label entries in
messages.ts, swaps the hardcoded strings in DataGrid.tsx for
t(labels.x), and populates "switch-to-table-view" and
"switch-to-card-view" in all 52 locale JSON files with proper
translations (no English fallbacks).
Verified in Playwright that the toggle tooltip renders the expected
translated string in en-US, fr-FR and ja-JP via the same useMessages
pipeline already used for the search field placeholder, with no
MISSING_MESSAGE errors in the console.
This introduces a user-scoped dashboard with board-style view/edit pages while keeping it unavailable in team context, and moves website targeting to component config so dashboard components can each select their own website.
12 batch translation scripts covering all language families: East Asian, Romance,
Germanic, Nordic, Slavic, Other European, South/Southeast Asian, Tamil, Sinhala,
Urdu, and Burmese. Remaining untranslated keys are intentional loanwords (URL, UTM,
SMS, etc.) and en-GB which is intentionally identical to en-US.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
These keys existed in messages.ts but were missing from the JSON files,
previously relying on react-intl defaultMessage fallback.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Rewrite messages.ts to plain string key maps (remove MessageDescriptor)
- Rewrite useMessages hook to expose t from useTranslations() directly
- Rename formatMessage → t across 193 consumer files
- Replace custom FormattedMessage component with next-intl t.rich()
- Update 52 language files to use rich text tags (<b>, <a>)
- Remove all direct imports from @/components/messages in favor of useMessages()
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Migrate i18n from react-intl to next-intl, eliminating the formatjs
compilation pipeline. Translation files now live as nested JSON in
public/intl/messages/ (single source of truth), removing the duplicated
src/lang/ directory and the copy/compile build steps. The useMessages()
hook API is preserved so all 195+ consumer components are unchanged.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>