Coverage
- UI: the entire interface across all five portals is translated; no hardcoded UI strings — everything goes through next-intl
t(). - API: 100+ API routes return localized error messages via
getApiTranslations(request). - Dates & numbers: formatted with the active locale via
useLocale()(client) /getLocale()(server) — never a hardcodedpt-BR. - LLM prompts:
PromptTemplatehas alocalefield;loadPrompt()resolves with a locale cascade, and the tutor injects a language rule for non-pt-BR locales.
Quality gate
A CI script (check-translations.ts) validates key parity, placeholder parity and detects empty/untranslated entries across the four locale files. pt-BR is the locale of record; other locales fall back to it if a key is missing.
Docs in 4 languages
The public documentation itself is published in all four locales — Spanish and French pages are LLM-assisted translations of the pt-BR/en-US sources and carry an "AI-assisted translation" badge.