Problem
frontend/src/app/** and frontend/src/components/ui/** have all user-facing copy (labels, error text from friendlyError(), ProgressSteps step names, etc.) written as inline English strings — there's no extraction layer or locale switching, so the app is only usable in English.
Why it matters
A shielded wallet aimed at consumer-grade UX and broad adoption (per README.md) is unnecessarily limited to English-speaking users; this is a straightforward, well-understood gap with no cryptographic or protocol risk, making it a good substantial contribution for someone building frontend familiarity with the codebase.
Scope
- Add an i18n library (e.g.
next-intl or react-i18next) as a frontend/package.json dependency.
- New
frontend/src/messages/en.json plus at least two additional locales (e.g. es.json, fr.json) covering every user-facing string.
- Extract inline strings from
frontend/src/app/deposit/page.tsx, withdraw/page.tsx, compliance/page.tsx, history/page.tsx, and frontend/src/components/ui/*.tsx into the message catalog.
frontend/src/lib/errors.ts: route friendlyError() messages through the same catalog so translated errors stay in sync with translated UI.
- New locale-switcher component in the UI (e.g. added near existing header/nav elements).
frontend/src/middleware.ts (new, if using a routing-based i18n library) or equivalent config for locale detection/routing.
- Tests: a snapshot/lint check that no new hardcoded English string lands outside the message catalog (e.g. an ESLint rule or a script check wired into CI).
Acceptance criteria
- The full deposit → withdraw → compliance flow is usable in at least two non-English locales with no untranslated strings visible.
- A CI check catches new hardcoded strings added outside the message catalog going forward.
Problem
frontend/src/app/**andfrontend/src/components/ui/**have all user-facing copy (labels, error text fromfriendlyError(),ProgressStepsstep names, etc.) written as inline English strings — there's no extraction layer or locale switching, so the app is only usable in English.Why it matters
A shielded wallet aimed at consumer-grade UX and broad adoption (per
README.md) is unnecessarily limited to English-speaking users; this is a straightforward, well-understood gap with no cryptographic or protocol risk, making it a good substantial contribution for someone building frontend familiarity with the codebase.Scope
next-intlorreact-i18next) as afrontend/package.jsondependency.frontend/src/messages/en.jsonplus at least two additional locales (e.g.es.json,fr.json) covering every user-facing string.frontend/src/app/deposit/page.tsx,withdraw/page.tsx,compliance/page.tsx,history/page.tsx, andfrontend/src/components/ui/*.tsxinto the message catalog.frontend/src/lib/errors.ts: routefriendlyError()messages through the same catalog so translated errors stay in sync with translated UI.frontend/src/middleware.ts(new, if using a routing-based i18n library) or equivalent config for locale detection/routing.Acceptance criteria