- Fills 9 keys missing from fr.json (AI categorization, billing, account
deletion, and catch-all budget strings added to main after #532 branched)
and repairs 25 entries whose Laravel :placeholders had been translated
(e.g. :count -> :compte), which would break interpolation at runtime.
- Wires 'fr' into the SetLocale middleware allowlists and Accept-Language
detection (the original PR left these at en/es, so fr was rejected), and
drives the landing language switcher from LANGUAGE_OPTIONS.
- Generalizes LocalizationTest across locales: Spanish stays enforced, while
French gaps mark the test incomplete (warn, exit 0) so an incomplete
community translation never blocks CI. Adds SetLocaleTest.