Table of Contents
Table of Contents
- What Makes a CMS "Multilingual-Ready"?
- Step 1: Design Your Content Models
- Collections vs. Singletons
- Choosing the Right Field Types
- Per-Field Localization
- Step 2: Build Your Editorial Workflow
- The Status Lifecycle
- Bulk Operations for Scale
- Step 3: Integrate via the REST API
- Core Endpoints
- Query Parameters That Matter
- Authentication
- Step 4: Use AI Content Generation Strategically
- Where AI Generation Adds Value
- Where to Keep Human Judgment
- Step 5: Plan Your Content Architecture
- Recommended Models
- Translation Workflow
- Common Pitfalls to Avoid
- Getting Started
Managing content in one language is already a challenge. Add three, five, or twenty languages and you have a problem that most CMS platforms were never designed to solve. Headless CMS architecture offers a path forward, but only if multilingual support is built into the foundation — not bolted on as a plugin.
This guide walks through how to build a multilingual headless CMS strategy that scales, using Better i18n's content platform as a practical reference.
What Makes a CMS "Multilingual-Ready"?
Before diving into implementation, it helps to define what genuine multilingual support looks like. A CMS is multilingual-ready when it satisfies three requirements:
Content structure is language-aware. The schema distinguishes between fields that need translation (titles, descriptions, body text) and fields that are universal (dates, booleans, numeric values, media assets).
The API serves localized content natively. You can request content in any language with a query parameter — not by maintaining separate content trees or duplicating entries per locale.
Translation status is visible. Editors can see which entries have been translated, which are pending, and which are missing for a given language without leaving the CMS dashboard.
If your current CMS requires custom code or third-party services to meet any of these three criteria, you are building on a foundation that will create friction as you scale.
Step 1: Design Your Content Models
A content model is the schema that defines what your content looks like. Think of it as a blueprint — it specifies the fields, their types, and their validation rules.
Collections vs. Singletons
Most content falls into two categories:
Collections are models with multiple entries. Blog posts, product pages, FAQs, team member profiles, and changelog entries are all collections. Each collection can have hundreds or thousands of entries sharing the same field structure.
Singletons are models with a single entry. Your homepage hero section, global site settings, or an "About Us" page are singletons. They have the same field flexibility as collections, but they represent a single instance.
Starting with the right model type saves rework later. Ask: "Will there ever be more than one of these?" If yes, use a collection.
Choosing the Right Field Types
Better i18n provides 19+ field types so you can model content precisely without resorting to workarounds like storing structured data in a textarea.
Here is a practical breakdown by category:
Text fields:
- Text — Single-line strings for titles, labels, and short values
- Textarea — Multi-line plain text for descriptions and summaries
- Rich Text — A full Plate.js editor for formatted content with headings, lists, embeds, and inline styles
Data fields:
- Number — Integer or decimal values (pricing, quantities, ratings)
- Boolean — True/false toggles (featured flags, visibility controls)
- Date / DateTime — Date pickers with optional time precision
- Enum — Single-select or multi-select from predefined options (categories, tags, status labels)
Contact and link fields:
- URL — Validated URL fields for links and references
- Email — Validated email address fields
- Phone — Phone number fields with format validation
Media and files:
- Files / Media — Upload images, PDFs, videos, and other assets directly to entries
Relational fields:
- Relations — Link entries across models (e.g., a blog post's author, a product's category)
- Rollups — Aggregate data from related entries (e.g., count of posts per author)
- Formulas — Computed values based on other fields in the same entry
System fields:
- Unique ID — Auto-generated identifier for each entry
- Status — Built-in workflow state (draft, pending_review, published, archived)
- Created / Last Edited — Automatic timestamps for audit trails
Per-Field Localization
This is where multilingual CMS design gets interesting. Not every field needs to be translated. A product's price is the same in every language. A publication date does not change per locale. An image URL is usually universal.
Better i18n lets you mark each field as localizable or non-localizable at the model level. Localizable fields get a separate value per language. Non-localizable fields are shared across all translations.
This distinction matters because it:
- Reduces translation workload (translators only see the fields they need to translate)
- Prevents data inconsistency (universal values are stored once, not duplicated)
- Keeps the API response clean (non-localizable fields appear once regardless of requested language)
Step 2: Build Your Editorial Workflow
Raw CRUD operations are not enough for teams managing multilingual content. You need a workflow that enforces quality without creating bottlenecks.
The Status Lifecycle
Every entry in Better i18n follows a four-stage lifecycle:
| Status | Meaning | API Visibility |
|---|---|---|
| Draft | Work in progress | Not returned by default |
| Pending Review | Ready for editorial sign-off | Not returned by default |
| Published | Live content | Returned in API queries |
| Archived | Retained but inactive | Not returned by default |
This lifecycle applies per-entry, not per-language. An entry can be published even if some translations are still in draft. The API respects the status query parameter, so your frontend only ever receives content in the state you request.
Bulk Operations for Scale
When you are managing hundreds of entries across multiple languages, one-at-a-time updates do not scale. Better i18n supports bulk operations:
- Bulk status updates — Select multiple entries and move them from draft to published (or any other transition) in one action
- Bulk delete — Remove outdated entries in batch
These operations are available in the dashboard and through the management API, so you can integrate them into your CI/CD pipeline or content automation scripts.
Step 3: Integrate via the REST API
The headless part of "headless CMS" means your content is delivered through an API, not a coupled frontend. Better i18n provides a public REST API with three core endpoints:
Core Endpoints
GET /v1/content/:orgSlug/:projectSlug/models
GET /v1/content/:orgSlug/:projectSlug/entries
GET /v1/content/:orgSlug/:projectSlug/entries/:entrySlug
Query Parameters That Matter
The API's query parameters are where the real power lives:
Language filtering:
GET /entries?language=fr
Returns all content in French. Fields marked as non-localizable return their universal value. Localizable fields return the French translation if available.
Status filtering:
GET /entries?status=published
Only returns published entries. Combine with language for production queries:
GET /entries?language=de&status=published
Field selection (sparse fieldsets):
GET /entries?fields=title,slug,excerpt
Reduce payload size by requesting only the fields your frontend needs.
Relation expansion:
GET /entries?expand=author,category
Resolve related entries inline instead of making follow-up requests. This eliminates the N+1 query problem that plagues many headless CMS integrations.
Filtering by custom fields:
GET /entries?filter[page_type]=feature
Filter entries by any custom field value. Combine multiple filters for precise queries.
Pagination and sorting:
GET /entries?page=2&limit=10&sort=createdAt&order=desc
Standard pagination with flexible sorting. The response includes total count for building pagination UI.
Authentication
All API requests require an API key passed in the x-api-key header. You can create multiple keys with different permissions — for example, a read-only key for your frontend and a full-access key for your CMS integration scripts.
curl -H "x-api-key: your-api-key" \
"https://api.better-i18n.com/v1/content/acme/website/entries?language=en&status=published"
Step 4: Use AI Content Generation Strategically
Better i18n includes AI-powered content generation at the field level. The generateFieldContent capability analyzes your model structure and existing content to suggest values for individual fields.
Where AI Generation Adds Value
- SEO meta descriptions — Generate descriptions based on the entry's title and body content
- Excerpts and summaries — Condense long-form content into concise previews
- Initial drafts — Get a starting point for body content that matches your model's structure
- Alt text for images — Generate descriptive alt text based on the image context
Where to Keep Human Judgment
AI generation is a starting point, not a final output. Use it to eliminate blank-field paralysis, then edit to match your brand voice and factual requirements. The field-level approach means you control exactly which fields use AI suggestions and which are written manually.
Step 5: Plan Your Content Architecture
With the building blocks in place, here is a practical architecture for a multilingual site:
Recommended Models
| Model | Type | Use Case |
|---|---|---|
pages | Collection | Marketing pages, landing pages |
blog-posts | Collection | Articles, tutorials, announcements |
navigation | Singleton | Site navigation structure |
site-settings | Singleton | Global configuration (logo, footer, social links) |
faq | Collection | Frequently asked questions |
changelog | Collection | Product updates and release notes |
Translation Workflow
- Create content in your source language. Write the entry in your team's primary language.
- Use the translation status dashboard to identify entries missing translations.
- Add translations per field using the entry editor or the API.
- Publish when ready — the status lifecycle lets you publish the source language immediately and add translations as they become available.
Common Pitfalls to Avoid
Duplicating entries per language. This is the most common mistake. If you create separate entries for English, French, and German versions of the same page, you lose the connection between them. Use a single entry with per-field translations instead.
Ignoring non-localizable fields. Not marking universal fields (prices, dates, boolean flags) as non-localizable means translators see fields they should not touch, and you risk data inconsistency.
Skipping the status workflow. Publishing content directly without review stages works for a solo blogger, but it breaks down for teams. Use the draft-to-published lifecycle to maintain quality.
Over-fetching from the API. Use fields parameter to request only what your frontend needs. Use expand to resolve relations in a single request instead of chaining multiple API calls.
Getting Started
Building a multilingual content strategy does not require months of infrastructure work. With Better i18n's headless CMS:
- Define your content models in the Model Builder
- Create entries in your source language
- Add translations using the entry editor or API
- Query localized content through the REST API
- Use AI generation to accelerate content creation
The entire workflow — from model creation to API delivery — is designed for teams that ship content in multiple languages as a core part of their product, not as an afterthought.