When Strapi internationalization fits multilingual content
Strapi 5 internationalization localizes the content types and fields you select for each locale, then serves each locale's version through the REST and GraphQL APIs. If your team publishes the same content in several languages and every translation shares one structure, the free i18n feature may cover the job without a second content model. Confirm this fit before you build, because the choice shapes your schema, your editors' daily work and your front-end code.
Teams usually need Strapi internationalization when one product page, article or help topic exists in several languages with the same fields, the same relations and the same publishing rhythm. A good sign of fit is that editors open one entry and change only the text for each language. Before you commit, list every field and ask whether it differs by market. Slugs, legal notices, prices and images with embedded text often need a deliberate decision: shared across locales, or localized field by field. Also ask whether all locales publish on one schedule, because uneven schedules change how you review and release content.
A different content model is often the better fit when translations diverge in structure, not only in wording. Illustrative example: a regional catalog where each market sells different products, carries different regulatory copy and needs different required fields. In that case, separate content types per market, or a shared model with market-specific entries, may be easier to govern than locale variants of one entry. The same applies when each language has its own approval chain or translation vendor that works from exported files. In those cases, plan the export and import steps explicitly, and separate the admin panel language from the content locales, since they are configured independently.
The work breaks into three parts. Locale design covers the locale codes, the default locale, the fallback behavior when a translation is missing and the order in which locales go live. Editorial setup covers how a new locale entry is created from the default, who may edit which languages, and whether role permissions can be scoped per locale on your plan, which you should confirm with Strapi's current documentation. Front-end query changes cover passing the locale on every request, handling missing translations gracefully, and building a language switcher that maps to the same entry in each language.
The Community Edition is free, so the cost of this work is the time your team or a partner spends on locale design, editorial setup, front-end changes and testing, plus any translation services you buy. Ask for a quote that lists each of those parts separately and states whether it covers Strapi configuration only or the translation workflow around it. Also ask who maintains locale rules after launch, because adding a language later repeats part of the design work. Recurring costs will come from hosting, your translation providers and ongoing maintenance, not from the i18n feature itself.
Localization options and when each fits
This table compares the content modeling choices for Strapi internationalization, showing who translates what, what stays shared, what the front end must handle and where each choice breaks. Read each row as a decision made per content type before entries exist. The main takeaway is to localize the fewest fields that still let each market publish on its own schedule.
| Option | Editors translate and share | Front end must handle | Main risk and when it fits |
|---|---|---|---|
| Whole content type localized | Editors translate every field per locale. Nothing is shared across locales. | Locale-aware queries for every type, with a defined fallback when a translation is missing. | Duplicated effort and content drift. Fits content that differs fully by market. |
| Only selected fields localized | Editors translate text fields such as titles and body. Media and structure are entered once. | Read localized fields per locale and shared fields from any locale. | Teams may skip flagging a field early, so later changes need review. Fits most marketing and product content. |
| Shared fields kept non-localized inside a localized type | Editors set identifiers, prices, images and flags once. Translators see only the localized text. | Read shared values from any locale, so one change applies to every language. | A change made for one market applies to all markets. Fits codes, product attributes and legal references. |
| Separate content type per language | Editors work in separate types such as Article EN and Article DE. Shared data must be copied or referenced. | Select the type by language in every query and template, and map relations across types. | Structures and entries drift apart, and each new language adds a type. Fits few languages with different structures per market. |
| Relations to other content | Editors link related entries per locale, and the target must exist in that locale. | Resolve relations with the locale parameter and handle missing targets. | Links can break in a locale without a translated target. Confirm relation behavior in your Strapi version. |
How Strapi 5 stores one document across locales
In Strapi 5, one piece of content is a document with a shared identity, and each locale is a version of that document rather than a separate entry. The Document Service API is the layer that reads and writes these documents, and it replaced the Entity Service API used in v4. For planning, this matters because a French article and its English original are linked records under one document, not two unrelated entries. Teams that build front-end routes, search indexes or integration jobs should understand this link before writing any fetch logic, since it determines how they find the translation of a given item and how they detect that a translation is missing.
When a locale is added to a localized content type, the key question is what happens to documents that already exist. Strapi creates locale variants so the new language can be filled in, but the exact behavior, including whether variants appear immediately for existing documents, whether localized fields start empty or are prefilled, and which roles can add locales, should be confirmed in the current Strapi 5 internationalization documentation for the version you run. Plan a test on a staging instance: create a document before adding the locale, add the locale, and check what editors see in the admin panel and what the API returns for the new locale.
Fields that are not localized behave differently. A non-localized field holds one value that every locale shares, so changing it while editing one locale changes it for all of them. This suits identifiers, slugs that must stay stable across languages, prices, dates and media that does not need adaptation. Copy such as titles, summaries and body text should stay localized. Decide this per field before content goes live, because changing a field's localization setting after content exists can affect the values already stored, and the migration behavior for that change should be checked in the docs and on a copy of your data first.
Verify the model with a short test matrix before editors start work. Create a document in the default locale, add a second locale, change a localized field in each locale, change a non-localized field in one locale and confirm it appears in the other, then publish one locale and confirm the other is unaffected. Repeat the same checks through the API with the locale parameter your front end will use. Strapi 5 minor releases have shipped roughly weekly, so retest after each upgrade, and treat the official Strapi 5 i18n documentation for your exact version as the reference for storage and behavior details.
Setting up locales and localized content types in Strapi
This sequence takes a Strapi 5 project from a single-language setup to content that editors can write in several locales and that the API serves per locale. Each step ends with a check, so problems surface on test content before any translation work begins.
Plan the locale list and default
Decide which locales the project needs, which one is the default, and which content types will be translated at all. Record the locale codes you will use, since editors and API consumers will see them. The default locale is the fallback most teams rely on, so confirm which language the existing content is written in before you switch anything on. Ask your translation lead and front-end team to sign off on the list. The step is done when the locale list and default are written down and every content type is marked as localized or shared in one table.
Enable the internationalization feature
In the Strapi admin panel, open the settings area and enable the Internationalization feature, which is free in the Community Edition. Add the locales from your plan and set the default. Admin labels can change between releases, so confirm the exact menu names in the documentation for your Strapi version. Check that the locale selector appears on an existing entry and that the default locale matches your plan. Record the settings change in your change log so the same configuration can be reproduced in staging.
Mark content types and fields as localized
Open each content type in the content-type builder and mark it as localized where editorial content must differ by language. Then decide field by field. Text, rich text and media fields usually need localization, while identifiers, routing slugs, prices and status flags usually stay shared. Confirm each choice with the people who will translate the content. Check: after saving, open one entry in the default locale, add a second locale, and confirm the shared field shows the same value in both while the localized field starts empty.
Set editor and API permissions per locale
Set admin roles so editors can work only in the locales they translate, and set public and authenticated API permissions so requests can read only the locales the front end needs. Confirm in your Strapi version whether role permissions can be scoped per locale, and if they cannot, decide how you will control access instead. Check by signing in as a restricted editor and confirming they see only their locales, then calling the API with the public role for a locale it should not reach and confirming the request is refused.
Create test entries in each locale
Create one test entry per content type in every locale, using clearly labeled sample values such as 'Test EN' and 'Test FR' so they are easy to find and remove later. Include at least one entry where a localized field is left empty so you can see how the admin panel handles a missing translation. Check that each entry lists all of its locales in the locale selector. Also confirm whether publishing one locale affects the others in your version, since you need to know this before editors work on live content.
Verify locale-specific API output
Query the API for each locale using the locale parameter, and confirm that each response returns only that locale's localized values while shared fields are identical across responses. Also send a request without a locale to see which default is returned, and a request for a locale where an entry has no translation to see what the API returns. Check the parameter syntax against the documentation for your version. Save these responses as a baseline so you can compare them after future schema changes.
Querying the right locale from the front end
The front end decides which language a visitor sees, so the locale must be passed on every content request rather than assumed by the server. In Strapi 5, REST requests select a language with a locale parameter in the query string, and GraphQL requests pass the same choice as a locale argument on the collection or single-type field. Your front end should resolve the visitor's language once, from the URL path, a cookie or the Accept-Language header, then use that single value for every call on the page. Mixing locales within one page render is a common source of content that looks translated but is not.
Missing translations need an explicit rule. When a document has no entry in the requested locale, Strapi returns no content for that locale, so the front end must decide whether to show the default locale's entry, hide the item or display a notice. Strapi does not perform the fallback for you across every query shape, so confirm in the current docs how a request behaves when the locale is absent, and whether your chosen approach works for single types, collections and nested relations. Decide the fallback chain (for example, requested locale, then default locale) before building components, and write it down so editors know which fields will appear in the wrong language.
Populated relations need the same care. A related entry, component or media item may exist only in the default locale, and population settings determine whether the related item is returned in the requested locale at all. Test a page that pulls a linked article, a repeatable component and an image, in a language where some of those pieces are not yet translated. Confirm the exact populate syntax for your Strapi 5 version in the current documentation and in a test build of your front end, because query parameter names and nesting rules have changed between major versions and are easy to get subtly wrong.
Strapi 5 also changes the response shape compared with v4. Entries are returned flatter, with attributes at the top level of each object instead of nested under an attributes key, and the Document Service API replaces the Entity Service API behind the scenes. Front-end code that reads locale or translation data from the v4 structure will break or silently return undefined values. The Strapi-Response-Format: v4 header exists for backward compatibility during migration, and it is a useful aid while you move an existing front end across. Treat it as a temporary bridge, not a target format, and remove it once your parsers handle the Strapi 5 shape.
Before go-live, run a small checklist with your front-end team: request each page in every enabled locale, remove a translation on purpose and confirm the fallback behavior, and check that the language code in the URL, the locale parameter and the lang attribute on the page all agree. Record the results against the Strapi version you deploy, since minor releases ship frequently. Ask your implementation partner, or your own team, to include these cases in the test plan so that a locale mismatch is caught before editors and visitors find it.
Securing locales, roles and unpublished translations
Multilingual content adds access questions that a single-language Strapi project never faces: who may see and change each locale, who may publish it, and how schema changes reach every language at once. The cards below cover the controls to decide before launch and the checks to repeat after each change.
Role permissions per locale
Strapi's admin roles govern content types and actions, and locale access has to be planned on top of them. Map each editor and translator role to the locales they may read, create and edit, then test the mapping with a non-admin account in each role. Confirm in your Strapi version how locale-level restrictions are applied, because a role that can edit one language may still reach others if permissions are set only at the content type level.
Who can publish each locale
Separate the right to write a translation from the right to publish it, since a translator who can publish can release unreviewed text to the public API. Decide which roles publish each locale and record that decision in a simple matrix that owners sign off. Test publishing with a translator account to confirm that the Publish action is unavailable, and confirm how this separation interacts with review workflows if you use them.
Draft translations and public API tokens
Public and read-only API tokens return published content, but any token with broader read access can return drafts through the Content API. Review every token's scope, keep draft reads out of public front ends, and check that preview endpoints are not reachable without authentication. Ask your front-end team to confirm that unpublished locales are filtered in code and not only hidden in the interface.
Locale configuration under version control
Locales and the list of localized fields live in the project's schema files, so they belong in the same Git repository as the rest of the codebase. Review every change to locale settings through a pull request, and tag releases so you can reproduce the configuration on a new environment. Compare the repository with the running instance during deployment to catch edits made directly in the admin panel.
Backups before schema changes
Removing a locale or changing whether a field is localized can affect entries in every language, and the change may not be reversible through the admin panel. Take a database backup and a media backup immediately before each schema change, and test restoring it on a staging copy. Check that the backup covers the version history tables you rely on, and that the restore procedure has been rehearsed by someone other than the person who built it.
Change control for locale-wide edits
Adding a required field, renaming a localized field or removing a locale changes what every translator and API consumer sees. Require a written impact note listing affected content types, locales, API clients and front-end templates before approval. Schedule these changes in a window agreed with the translation team, and verify the result on staging against each locale's sample entries before production deployment.
Designing the translation workflow around the CMS
The first decision is where translation work happens. Strapi's free i18n feature gives translators a locale switcher in the admin panel, so a translator can open an entry, pick a target locale and fill in the localized fields of that entry. For a small team with a few locales and simple copy, that may be the whole workflow. For larger programs, many teams keep drafting and translation in an external process, such as a translation management system or a spreadsheet-based queue, and then write the results back into Strapi. Decide this before you configure locales, because it determines who needs admin accounts, which roles can edit which locales, and how you will know a translation is missing. Start by naming who creates the source content. In a typical setup, editors in the default locale write and publish the source entries, and translators work only on the other locales. Make that split explicit in the Users and Permissions and admin role settings so that translators can edit localized versions without changing the source language. Also decide whether a translated entry can be created from a source entry automatically when a new locale is added, or whether translators start from a blank localized version. The second option produces more gaps, which is why the tracking step below matters. Review is the second decision. Strapi's Review Workflows, which add stages such as a required approval before publishing, are an Enterprise feature, so do not design the process around them unless your plan includes them. On a Community or Growth plan, you must decide whether a second person checks each translation before publication by an agreed convention, such as a reviewer who edits the localized entry directly, or by a step in your external tool that gates the write back to Strapi. Confirm with your Strapi plan and your own process which of these you can enforce, and document who is responsible for each locale. Missing translations need a tracking method that does not depend on memory. Strapi shows locale variants of each entry, so an editor can see which locales exist for a document, but a site-wide report of untranslated fields is something you should plan yourself. Common approaches include a scheduled query against the API that compares locales per document, a filtered list in the admin panel reviewed by the content lead, or a status field in the content type that translators update. Test whether your front end falls back to the default locale when a field is empty, because that behavior decides whether a gap is visible to readers or hidden. Finally, decide whether approval happens inside Strapi or outside it. Approve inside Strapi when the editor who publishes is also the person who signs off, the team is small and the audit needs are modest. Approve outside when translations come from a vendor or a language review board that works in its own tools, and let Strapi receive only final content. Coordinated publishing of several locales together is handled by Strapi Releases, covered on the releases page, and audit trails for who changed what are an Enterprise feature covered elsewhere on this site. Write the decision down per content type, since a marketing page and a legal notice often need different approval paths.
Limits and migration checks to confirm before building
The checks below decide whether your content model, locale plan and database stack will hold up in Strapi 5. Several are cheaper to settle now than after content exists. The last two cards apply if you are moving an existing Strapi 4 project, where end of life and the lack of downgrade support set the timeline.
Content model fit for localized relations
Decide which content types, components and relations carry translated text and which stay shared across locales. Relations and components inside a localized type can behave differently from top-level fields, so map your most connected content before building. Ask your team to confirm the localization setting for each component and relation, then test one production-shaped entry in every locale you plan to launch.
How the locale list changes later
Plan the locale list as something that will change. Confirm how existing entries in a locale you retire will be handled: archived, deleted or kept for reference, and who approves that decision. Agree on locale code conventions early, because changing a code after content exists means updating API queries, front-end routing and stored translations together. Record the owner of the locale list in your change process.
Schema changes and existing translations
A field change made after translations exist can affect every locale that holds content for that field. Renaming, removing or switching a field between localized and shared may leave translated values behind or require a data step. Before editing a schema in production, rehearse the change on a copy of the database, record which locales and entries were affected, and agree who signs off on the result.
Database and Node.js version support
Strapi 5 supports PostgreSQL 14 or later, MySQL 8.0 or later, MariaDB 10.3 or later and SQLite 3. It does not support MongoDB or other NoSQL databases, and it runs only on Node.js versions with Active or Maintenance LTS status. Confirm that your database version and Node.js runtime appear on the current installation requirements list when you build, and check again before each upgrade.
Strapi 4 end of life and upgrade tooling
Strapi v4 reached end of life on April 30, 2026, and its final release, 4.26.2 of June 9, 2026, receives no further updates. Strapi provides an upgrade tool with codemods, data migration scripts that run on the first start of Strapi 5, and a breaking changes list. Review that list against your custom controllers, services and plugins, since Strapi 5 replaces the Entity Service API with the Document Service API.
Backup and no downgrade path
The migration documentation says to back up the database before upgrading, because downgrading is not supported. Treat that backup as your only rollback option. Confirm where the backup is stored, how long it is kept, and that a restore has been tested on a copy. Also confirm whether uploaded media and configuration files are covered by your backup plan, since a database backup alone may not include them.
Which Strapi plan the multilingual workflow needs
The Community Edition is free to self-host and includes the internationalization (i18n) feature, so you can define locales, localize selected fields and query content by locale without a license fee. Its self-hosted terms are listed as free with unlimited users, and the plan includes REST and GraphQL APIs with unlimited entries and API calls. The Community code is released under the MIT Expat license.
What you do not get on this plan is the editorial control layer that multilingual teams often need:
- Localization itself is covered. Locales, localized fields and locale-aware queries work without an upgrade.
- No review workflows. Translation approval stages and role-based movement between them are Enterprise features, so approval must be run through another process.
- No audit logs. Admin action history for compliance evidence is an Enterprise feature.
- No content history or releases on this tier. Both start at Growth, so version comparison and coordinated multi-locale publishing need a paid plan or an outside method.
- Your own operating cost. Hosting, database, backups, upgrades and monitoring are your responsibility.
Before choosing this plan, list the approval steps and evidence your localization process requires. If those steps can be run reliably in your ticketing or content operations tool, the Community Edition may be enough. Confirm the current terms on Strapi's self-hosted pricing page before you decide, and confirm whether SSO is available for administrator login on this tier.
The Growth plan is the entry paid tier for self-hosted Strapi. The self-hosted pricing page lists it at 45 US dollars per month including 3 users, with 15 US dollars per additional user per month. It adds content history and releases on top of the Community feature set, which matters for multilingual sites that publish coordinated batches across locales.
Key points for a multilingual team:
- Releases for coordinated locale batches. Grouping entries across content types and locales into one publish action reduces manual sequencing errors when several languages go live together.
- Content history. Earlier versions of a document can be compared and restored, which helps when a translation is overwritten by mistake.
- Single sign-on as an add-on. On Growth, SSO for administrator login is sold as an add-on. Check the price of that add-on as part of your quote.
- No review workflows or audit logs. Those remain Enterprise features, so a Growth site has no built-in translation approval stage and no audit trail of admin actions.
Cost is recurring. An illustrative team of 5 editors would cost 45 plus 2 extra users at 15 each, or 75 US dollars per month, before any add-ons, hosting or DeployOpen services. Ask for the current per-user terms, the add-on prices and whether your count of users includes translators who only need API or limited roles. Confirm everything against the pricing page before you commit to a budget.
The Enterprise plan is priced on request. It contains the full editorial and governance set that multilingual operations often need: review workflows, audit logs, SSO and everything in the lower tiers. Code under the ee directories is governed by a separate Strapi license, so the contract and the license terms should be read together before procurement.
What this tier changes for localization:
- Review workflows. You can define stages a translated entry must pass through, such as translation, linguistic review and legal sign-off, and limit which roles can move content into or out of each stage. A required approval stage before publishing can then be enforced inside Strapi.
- Audit logs. Admin actions are recorded, which supports internal investigations and compliance evidence. Confirm with Strapi what is captured, how long records are kept, and whether they can be exported to your SIEM.
- SSO included. Administrator login can be routed through your identity provider on this tier, without the add-on charge that applies on Growth. End-user authentication is handled separately by the Users and Permissions plugin.
- Custom pricing. Request a written quote that states user counts, support terms, the license scope and renewal conditions.
When you request a quote, ask for the written terms for each feature in your workflow. Confirm the exact audit log retention and export options, the stage configuration limits, and what support Strapi provides. DeployOpen can plan and build the review workflow and log export around those confirmed features, but the license terms and feature limits come from Strapi.
Questions buyers ask about Strapi i18n projects
What drives the cost of a Strapi i18n project?
Cost follows scope and process more than software. The i18n feature in Strapi is free, so most of the spend is people's time: deciding which content types and fields are localized, changing the content model, building locale-aware queries in the API and front end, and setting up the translation workflow. The main drivers are the number of content types and components, the number of locales, the front-end stack (a framework with built-in locale routing needs less custom work), and whether translation is done by in-house staff, a translation agency or machine translation with human review. The one-time build is separate from recurring work such as adding a locale, maintaining translations and upgrading Strapi. Ask any partner to split the quote into build, integration, translation support and ongoing support so you can see what recurs.
How long does a Strapi internationalization setup take?
No single duration fits every Strapi i18n project, so treat any figure you hear with caution until it is tied to a written scope. The time depends on how many content types and fields need localization, how many locales are in scope at launch, whether existing content must be moved into locales, how complete the front-end locale routing is, and how quickly reviewers and translators can approve content. Projects that begin with a locale list, a field-by-field localization map and a named content owner usually have fewer surprises. Ask for the timeline as milestones tied to deliverables, along with the client responsibilities that each milestone depends on.
What must our team provide before a Strapi i18n project starts?
Before work starts, your team needs to provide a locale list with codes and fallback rules, the owner of each content type who can approve which fields are localized, and the translators or translation vendor who will work in the admin panel or an agreed file process. The front-end team must confirm how the site routes by locale, which fallback behavior it expects, and how preview and SEO tags are handled. Platform owners should provide hosting access, development, staging and production environments, database backup arrangements, and a decision on which Node.js and database versions are approved for Strapi 5. Missing decisions in these areas are a common reason a fixed scope slips.
Can our in-house team set up Strapi internationalization ourselves?
Yes, an in-house team can enable the free i18n feature, provided it has someone comfortable with Strapi 5 content modeling, the Document Service API and the locale handling of your front-end framework. The configuration itself is modest. The harder work is consistency: deciding which fields are localized, keeping relations and media aligned across locales, writing queries that request the right locale with fallbacks, and testing that editors see what they expect. Teams where one developer also carries other work often postpone the translation workflow and governance until after launch. Check your skills against these tasks, and decide whether an outside review of the content model and API queries would help before you build.
Which Strapi plan do multilingual editorial teams need?
The i18n feature is part of the free Community Edition, but several editorial features that often accompany multilingual work depend on the plan. In Strapi's self-hosted plans, content history and releases start at the Growth plan, which is listed on Strapi's self-hosted pricing page at 45 US dollars per month including three users, plus 15 dollars per extra user. Review workflows and audit logs are Enterprise features, and Enterprise pricing is custom. If your translation process needs approval stages before publishing, or coordinated publishing across locales, confirm the plan before the content model is designed, because those needs shape the model. Check current prices on the pricing page, since list prices change.
What should a fixed-scope quote for Strapi i18n include?
A fixed-scope quote should state exactly what will be delivered so you can compare offers against your own requirements. Expect it to list the locales in scope, the content types and fields to be localized, the API query and front-end changes included, the translation workflow and any tooling for it, the environments covered, testing and acceptance criteria, handover documents, and a timeline tied to milestones. It should name exclusions and the client responsibilities each milestone depends on. If translation itself is not in scope, the quote should say so. Ask for one-time build work and any recurring support as separate lines, and check how changes requested after sign-off are priced.
What usually breaks in multilingual Strapi projects after launch?
Most problems come from decisions made late, especially changing which fields are localized after editors have entered content. Test how your Strapi version handles adding or removing localization on existing fields in a non-production environment, and back up the database before you rely on that change. Other common issues include front-end fallback logic that shows empty pages for untranslated items, slugs that collide across locales, relations that point to an entry in only one locale, media fields that editors assume are shared, and language alternate tags for SEO that are missing or wrong. Before launch, build a test matrix covering each locale, the default locale, a missing translation and a publish and unpublish cycle.
How DeployOpen scopes and delivers Strapi localization
DeployOpen scopes Strapi internationalization for multilingual content as a written, fixed-scope engagement inside your own infrastructure. We agree which locales, content types and fields are localized, build the locale-aware API queries and translation workflow, then document and hand over the result. Ongoing support, upgrades and continuous testing are available as a retainer.
How we scope
- The written scope names the locales, content types and fields that will be localized.
- It records which fields are translated per locale and which are shared across all locales.
- Editors, translators and developers agree on the default locale and how missing translations appear.
How we build
- Localization is enabled per content type and field, then tested on a staging instance first.
- Locale-aware API queries are written and checked against the response format your front end expects.
- Translation handoff steps around the CMS are designed with your translation process and tested end to end.
How we hand over
- Documentation covers locale setup, the field localization map, and the query patterns developers should follow.
- Editors receive a written walkthrough for adding a locale and publishing a translated entry.
- Test results and a list of open decisions are delivered with the environment, so your team can continue.
How we support
- Ongoing support, upgrades and continuous testing are available as a retainer after handover.
- Locale additions and new content types are scoped as written change requests before work starts.
- Strapi upgrades are planned with a database backup first, because the Strapi docs say downgrading is not supported.

