Summary
The app currently has no internationalization support. All UI strings are hardcoded in English. Add lightweight i18n to support multiple languages.
Proposed Approach
Locale resolution (priority order):
- Query param override (
?lang=fr)
Accept-Language request header
- Default fallback (
en)
Translation system:
- Simple JSON key-value files per locale (e.g.
locales/en.json, locales/fr.json)
- Thin
t(key, locale) helper function for string lookup
- No heavy frameworks — keep it minimal and aligned with the project's KISS principle
Integration:
- Read locale in Hono middleware, attach to context
- Use
t() in JSX components for all user-facing strings
- Extract existing hardcoded English strings into
locales/en.json
Relevant Standards
- BCP 47 for language tags (
en-US, fr-FR)
- Accept-Language header (RFC 9110) for browser negotiation
- ICU MessageFormat for plurals/interpolation if needed later
Tasks
Summary
The app currently has no internationalization support. All UI strings are hardcoded in English. Add lightweight i18n to support multiple languages.
Proposed Approach
Locale resolution (priority order):
?lang=fr)Accept-Languagerequest headeren)Translation system:
locales/en.json,locales/fr.json)t(key, locale)helper function for string lookupIntegration:
t()in JSX components for all user-facing stringslocales/en.jsonRelevant Standards
en-US,fr-FR)Tasks
locales/en.jsonwith all existing UI stringst(key, locale)lookup helpert()instead of hardcoded strings