The .po catalogs and extracted messages.
Copy uses useExtracted in client components and getExtracted on the server. Do not use useTranslations.
The next-intl compiler only rewrites a t({ id, message }) call when t comes from useExtracted or getExtracted in the same file and scope. Do not pass t as a prop, a function argument, a hook return value or a column extra. The call then stays uncompiled, the build logs MISSING_MESSAGE: c.split is not a function, and the text renders blank. Call useExtracted in the component or hook that renders the copy, or pass the resolved strings instead.
An empty msgstr renders as blank text in the app. When you add or change copy, fill in the entry in every .po catalog under apps/saas/translations/, including de.po. German uses the formal address Sie. Dutch stays informal.
A running SaaS dev server re-extracts messages and can rewrite en.po, nl.po and de.po with entries removed. Before you run tests or commit, check git diff on those files. If you did not change copy, restore them with git checkout HEAD -- apps/saas/translations/en.po apps/saas/translations/nl.po apps/saas/translations/de.po.
Last updated on