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>