Full Brazilian-Portuguese localization via next-intl
brauliogusmao converted the entire frontend from hardcoded English strings to `next-intl` translation keys across 15 commits, targeting Brazilian legal market deployments. Every user-visible string from auth pages through tabular review now lives in `frontend/messages/pt-BR.json`.
The first commit installs next-intl ^4.11.2, creates frontend/messages/pt-BR.json with an initial 39 keys, and wires the plugin into next.config.ts via withNextIntl(). After that, 13 more commits work through 41 components in order: shared modals and auth pages first, then assistant and tabular UI, then workflows, the sidebar, the tracked-changes panel in AssistantMessage, and account settings.
The refactoring is mechanical -- hardcoded strings become t("key") calls, with useTranslations("namespace") in client components and getTranslations("namespace") in server components. The toolCallLabel() function in AssistantMessage.tsx was restructured to accept a TFunc parameter rather than returning hardcoded strings, which is the correct approach for a function that needs to be called from within a component context.
Several commits make product-level decisions for the Brazilian legal market beyond translation. ab9b0d7 renames the "Tabular Reviews" nav item to "Dados" and sets the page heading to "Extração e comparação de dados entre documentos". 937d816 replaces all 19 PRACTICE_OPTIONS with Brazilian legal practice areas and adds a comment noting per-instance customization. Multiple commits rename "Workflows" to "Fluxos de trabalho" system-wide, followed by a fix commit (a9e0d67) correcting a key mismatch in ChatInput that the rename left behind.
Two artifacts worth flagging: 1f6b152 accidentally committed a .claude/worktrees/jolly-yalow-35b729 submodule pointer and TRADUCAO.md from a Claude Code session -- both were later excluded via .gitignore. The lock file bump in a096a76 added "license": "AGPL-3.0-only" to both package.json metadata entries, which is the only change there worth noticing.
There is no en.json fallback. Any component that calls t("key") against a key that isn't in pt-BR.json will silently render nothing or a key-path string. The fork hit this once and needed a follow-up commit.
Spotted something wrong? Or know the PR text has fresher detail than the writeup above?