feat(i18n): add spanish and french message catalogs - #604
Conversation
Extracted with pybabel from the marked strings and filled with initial es and fr translations so the negotiated locales serve real content. The translations are LLM-authored and pending native-speaker review; the .pot template and compiled .mo files stay git-ignored build artifacts, so deployments must run make i18n.compile. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
@claude-review |
|
Claude finished @hamza-56's task in 2m 48s —— View job Review: Spanish & French message catalogs
Overall: LGTM to merge. These are clean, complete, and technically correct catalogs. The remaining items are cosmetic/native-review nits — none are blocking, which matches the PR's own "pending native-speaker review" note. What I verified
Suggestions (all Low / non-blocking)
Test coverageNo new logic is introduced (these are data files), and |
| "Project-Id-Version: sparkth VERSION\n" | ||
| "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" | ||
| "POT-Creation-Date: 2026-08-14 07:25+0500\n" | ||
| "PO-Revision-Date: 2026-08-14 07:25+0500\n" | ||
| "Last-Translator: Hamza Shafique <hamza.shafique1@arbisoft.com>\n" | ||
| "Language: es\n" | ||
| "Language-Team: es <LL@li.org>\n" |
There was a problem hiding this comment.
Nit (Low): the pybabel-init placeholder headers are left unfilled here — Project-Id-Version: sparkth VERSION, Report-Msgid-Bugs-To: EMAIL@ADDRESS, and Language-Team: es <LL@li.org> (same in the fr catalog). These are cosmetic and don't affect runtime lookup, but since the header is the one place a translator's metadata lives, consider filling in a real project version / bugs-to address (or dropping the noise). Non-blocking.
Part of: Sparkth UI, emails, API errors, and AI-generated content are English-only
Fourth layer of the i18n stack (#601 → #602 → #603 → #604 → #606 → #607).
What
Ships the Spanish and French message catalogs for the 117 strings marked in the layers below, so
Accept-Language: esandfractually serve translated content.Changes
sparkth/locale/{es,fr}/LC_MESSAGES/messages.po, pybabel-initialized from the extracted template and fully filled (117 messages each)How to Test
make i18n.compile(required — the runtime loads the compiled.mo, which stays git-ignored)make run.backend, thencurl -s -X POST localhost:8000/api/v1/auth/login -H 'Content-Type: application/json' -H 'Accept-Language: es' -d '{"username":"ghost","password":"nope"}'→{"detail":"Usuario o contraseña incorrectos"}; repeat withAccept-Language: fr→{"detail":"Nom d'utilisateur ou mot de passe incorrect"}uv run pyteststays green with the compiled catalogs present (1760 passed)Notes
The translations are LLM-authored and pending native-speaker review (the
SUPPORTED_LANGUAGEScomment's review bar). Spanish uses informal address (tú), French formal (vous). Deployment note: serving translations requires compiled catalogs; #606 (stacked on this PR) compiles them into the Docker image at build time.This PR description and the initial translations were written with the assistance of an LLM (Claude).