# Content localization for Next.js: One document, in several languages.

Translate collections, singles and components, with a fallback language when a translation is missing. With drafts on, publish each language’s translated fields on its own.

Localization is built into Nextly’s core; no plugin.

[Start building](https://nextlyhq.com/docs/getting-started/quick-start.md) · [Read the docs](https://nextlyhq.com/docs/localization.md)

```bash
npx create-nextly-app@alpha my-app
```

## What it does

### Translate side by side

Translate collections, singles and components, with a fallback language when a translation is missing.

Nextly gives you Copy from language, side-by-side panes and the Translations page, and it doesn’t translate text for you.

![A post being translated into Deutsch from English: the English fields on the left, the German excerpt and content in the middle, and the document's languages on the right.](https://nextlyhq.com/captures/translation-side-by-side-light.png)

[Choose what gets translated](https://nextlyhq.com/docs/localization.md)

### Publish each language on its own

With drafts on, publish each language’s translated fields on its own.

Limit: A field that isn’t translated holds one value for every language; password fields are never translated.

![The post open in the entry editor in Deutsch, with the English text above the excerpt and the languages panel showing English published and Deutsch as a draft.](https://nextlyhq.com/captures/translation-editor-light.png)

[Publishing one language at a time](https://nextlyhq.com/docs/localization.md#publishing-one-language-at-a-time)

### See what is left to translate

A Translations page lists one language’s untranslated, draft, translated, published or out-of-date documents, across up to 20 collections.

![The translation worklist for Deutsch: the posts not yet translated, with filters for each status.](https://nextlyhq.com/captures/translation-worklist-light.png)

[The Translations page](https://nextlyhq.com/docs/localization.md)

### Versions, compared in one language

Compare two versions of the same language and restore an earlier one from the admin; restoring saves the current state first.

Limit: Comparing versions across languages is refused.

![Two versions of a post compared side by side, showing only the three fields that changed: the excerpt, an added paragraph and the release version.](https://nextlyhq.com/captures/version-compare-light.png)

[Versions](https://nextlyhq.com/docs/versions.md)

## In the admin

- People write each language.
- With drafts on, publish each language’s translated fields on its own. [Docs](https://nextlyhq.com/docs/localization.md#publishing-one-language-at-a-time)

## In your code

- Translation is off until you turn it on for a collection, Single or component, and each field can override it. [Docs](https://nextlyhq.com/docs/localization.md#choose-what-gets-translated)
- Languages can be managed in code or, without redeploying, through the languages API; a localization block in the config locks them. [Docs](https://nextlyhq.com/docs/localization.md#or-keep-the-list-out-of-your-code)

`nextly.config.ts`

```ts
import { defineConfig } from "nextly";

export default defineConfig({
  localization: {
    locales: ["en", { code: "de", label: "Deutsch" }],
    defaultLocale: "en",
    fallback: true,
  },
});
```

`collections/posts.ts`

```ts
import { defineCollection, text } from "nextly/config";

export const Posts = defineCollection({
  slug: "posts",
  localized: true,
  fields: [
    text({ name: "title" }),
    // Not worth translating: the same value in every language.
    text({ name: "externalId", localized: false }),
  ],
});
```

## What ships today: in 0.0.2-alpha.70

- **Built in:** Nextly’s core, no plugin
- **Release:** `0.0.2-alpha.70` · 25 Oct 2026
- **Translates:** Collections, singles and components
- **Missing text:** A fallback language
- **Publishing:** Each language’s translated fields, with drafts on
- **Scheduling:** Whole documents, never one language
- **Licence:** MIT

## Where it stops

- **Fields that aren’t translated:** A field that isn’t translated holds one value for every language; password fields are never translated. [Docs](https://nextlyhq.com/docs/localization.md)
- **Scheduling:** A Content Release schedules whole documents, never one language. [Docs](https://nextlyhq.com/docs/releases.md)
- **Comparing languages:** Comparing versions across languages is refused. [Docs](https://nextlyhq.com/docs/versions.md)
- **Autosave:** Autosave keeps one recovery point per document and author, not per language. [Docs](https://nextlyhq.com/docs/versions.md)
- **Visual Page Builder pages:** The official Pages collection is not translated; a blocks field in a collection you make translatable can be. [Docs](https://nextlyhq.com/docs/page-builder.md)

Nextly is in alpha. APIs may change before 1.0. Pin exact versions in production.

## Questions

### What happens when a translation is missing?

Translate collections, singles and components, with a fallback language when a translation is missing.

### Can I publish one language before the others?

With drafts on, publish each language’s translated fields on its own. A field that isn’t translated holds one value for every language; password fields are never translated.

### Can I schedule one language?

A Content Release schedules whole documents, never one language.

### Does Nextly translate the text for me?

No. People write each language. Nextly gives you Copy from language, side-by-side panes and the Translations page, and it doesn’t translate text for you.

### Where are the languages set?

Languages can be managed in code or, without redeploying, through the languages API; a localization block in the config locks them.

### Are Visual Page Builder pages translated?

The official Pages collection is not translated; a blocks field in a collection you make translatable can be.

## More of Nextly

- [Publishing](https://nextlyhq.com/publishing): Working drafts, version history and Content Releases.
- [CMS for Next.js](https://nextlyhq.com/nextjs-cms): Runs inside your own Next.js app, on your own PostgreSQL or MySQL database.
- [Visual Page Builder](https://nextlyhq.com/page-builder): Twenty blocks out of the box, and the page renderer takes your own React blocks.
