i18n FR sweep: members areas (per-area, audit-in-context, auto-merge)

Seen in 1 project by 1 person

About

Continue translating remaining hardcoded English in the web app's user-facing chrome to FR (+ EN keys when missing), proactively scanning area-by-area, applying the audit-in-context rule from memory (audit-in-context-before-commit).

Per-area procedure

  1. Pick an unswept area. Priority order: OptionDefinitionEditor interior (when "+ Nouvelle définition" opens) + OptionDefinitionForm + PropertySchemaEditor; option detail page (members /app/options/[id]); DayView; project page chrome; DuplicateModal interior; admin pages (admin/* — lower priority). Skip apps/web/app/app/(protected)/projects/[projectId]/settings/page.tsx (other-session WIP).
  2. Render in FR: log in as [email protected]/test1234 via Playwright on this box's dev server (http://$(tailscale ip -4):50101); navigate to the area; dump document.body.innerText; grep for English chrome. ALSO grep the area's source files for hardcoded English (regex like >[A-Z][a-zA-Z ]+<, aria-label="[A-Z], title="[A-Z], placeholder="[A-Z]).
  3. Translate: add EN+FR keys to packages/shared/src/i18n/locales/{en,fr}/common.json; wire useTranslations + t(). ICU rules: escape FR apostrophes as '' inside select/plural branches; make every select branch multi-word (e.g. other {Public collections} not other {Public}) so the naive i18n:check placeholder regex doesn't false-flag mismatches.
  4. AUDIT IN CONTEXT (memory rule — CRITICAL): screenshot the WHOLE section/page, check sibling consistency (label style, alignment, terminology, density, ordering). If your fix is correct in isolation but inconsistent with siblings (e.g. one field uses uppercase LABEL_STYLE while its sibling uses an inline label), refactor (often: add a showLabel / compact prop to the shared primitive) and re-screenshot. Don't ship "fixed in isolation, broken in context".
  5. Verify: pnpm i18n:check (parity, 0 TODO); web tsc --noEmit clean; full pnpm --filter web test green (wrap copy-asserting tests in @/test-utils/intl-render or update assertions).
  6. Commit per area with descriptive message ending Closes pickism/dev/<slug>. Auto-merge eligible (no excluded paths in translations) → FF-merge to develop, push, cleanup. Loop to next area.

Hard exclude

  • supabase/migrations/, apps/web/middleware.ts, app/api/auth/, packages/shared/src/auth/**, payment code, any RLS policy SQL.
  • option_definitions table + createOptionDefinition / updateOptionDefinition code — the coordinator is implementing locale tracking there in parallel. Don't touch those files.

Loop until

  • No more visible English in unswept members areas, OR
  • Three consecutive areas yield no translations needed, OR
  • You hit a real blocker (record in a comment + exit cleanly).

Links

No links shared yet.

Listed in

Bookmarked in

Not in any public bookmark categories yet.