Severity: Medium — found during a deep project review (2026-07-06). A full en/de key-parity diff across all 14 namespaces found only these mismatches (everything else has exact parity, and namespace registration in client/src/i18n/index.ts is clean).
Findings
photoAnnotator: 5 keys missing in de — client/src/i18n/de/photoAnnotator.json lacks reset, resetTitle, resetBody, resetConfirm, resetComplete (present in en). Note: no code references these keys (PhotoAnnotator.tsx/ToolPalette.tsx have no reset usage) — they are also orphaned in en. Either wire them up + translate, or remove from en.
budget: 2 dead de-only keys — client/src/i18n/de/budget.json has overview.costBreakdown.autoOriginBadge.label and .ariaLabel absent from en; no code references them. Remove from de.
usePhotos hardcodes English error strings, bypassing translateApiError — client/src/hooks/usePhotos.ts:55-59 sets 'Failed to load photos.', 'Network error: Unable to connect to the server.', 'An unexpected error occurred.' directly into UI state. Route through translateApiError() / translated keys.
Suggested guard
Add a key-parity unit test (compare key sets of every en/de namespace pair) so parity breaks fail CI instead of accumulating.
Severity: Medium — found during a deep project review (2026-07-06). A full en/de key-parity diff across all 14 namespaces found only these mismatches (everything else has exact parity, and namespace registration in
client/src/i18n/index.tsis clean).Findings
photoAnnotator: 5 keys missing inde—client/src/i18n/de/photoAnnotator.jsonlacksreset,resetTitle,resetBody,resetConfirm,resetComplete(present inen). Note: no code references these keys (PhotoAnnotator.tsx/ToolPalette.tsxhave noresetusage) — they are also orphaned inen. Either wire them up + translate, or remove fromen.budget: 2 deadde-only keys —client/src/i18n/de/budget.jsonhasoverview.costBreakdown.autoOriginBadge.labeland.ariaLabelabsent fromen; no code references them. Remove fromde.usePhotoshardcodes English error strings, bypassingtranslateApiError—client/src/hooks/usePhotos.ts:55-59sets'Failed to load photos.','Network error: Unable to connect to the server.','An unexpected error occurred.'directly into UI state. Route throughtranslateApiError()/ translated keys.Suggested guard
Add a key-parity unit test (compare key sets of every
en/denamespace pair) so parity breaks fail CI instead of accumulating.