Graph → SDK
TypeScript SDK reads the graph by project + locale. Use it from any server runtime.
Your CMS doesn't translate. Your framework's i18n doesn't know about your CMS. Paragraphs lives in the gap, feeding both.
Modern headless stacks are excellent at locale routing (next-intl, Astro i18n, @nuxtjs/i18n) and at delivering content (Sanity, headless WP, Payload). Where they fall down is the bit in the middle: how does CMS-sourced content become a locale-correct message that a framework runtime can read? That's the gap we live in.
TypeScript SDK reads the graph by project + locale. Use it from any server runtime.
@paragraphs/next, /astro, /nuxt. Each exports the idioms its framework community already knows.
Output written in the format your framework's i18n library expects. next-intl gets messages/. Astro gets content collections.
import { syncToNextIntl } from "@paragraphs/next";
await syncToNextIntl({
apiKey: process.env.PARAGRAPHS_API_KEY!,
projectId: process.env.PARAGRAPHS_PROJECT_ID!,
outputDir: "./messages",
locales: ["en", "es", "fr"],
}); import paragraphs from "@paragraphs/astro";
export default defineConfig({
integrations: [
paragraphs({
locales: ["en", "es", "fr"],
mode: "at-build",
}),
],
}); export default defineNuxtConfig({
modules: ["@paragraphs/nuxt"],
paragraphs: {
apiKey: process.env.PARAGRAPHS_API_KEY,
projectId: process.env.PARAGRAPHS_PROJECT_ID,
locales: ["en", "es", "fr"],
},
});
Paragraphs emits webhooks on translation events: translation.created, translation.approved, translation.rejected. Wire them to your framework's revalidation API to keep static pages fresh in seconds, not minutes.
No credit card. 100,000 words on the free tier. Self-serve onboarding.