Localization

Localization in BCMS allows you to manage and serve content in multiple languages across your entire project. Once a new language is added from the Settings, it becomes available across all entries, templates, groups, and widgets.


Adding languages

To add a new language, go to Settings → General Settings, and use the Add Language dropdown. Select the language you want to support. Once added:

  • The language appears in your entry editor.

  • You can now input localized content for every field.

  • Each entry in every template becomes translatable.

🧠 You don’t need to reconfigure templates or widgets. The new language applies universally.


How localization works

Each time you add a language (e.g., French), all BCMS entries gain a new language version of their fields. For example, in your code:

post.meta.en.title // English title
post.meta.fr.title // French title

and content:

post.content.en.nodes // English content
post.content.fr.nodes // French content

✏️ All content is scoped per language. You are responsible for translating it in the entry editor.


Required fields and languages

Field validations (like required) apply for all languages language. This means if a field is required, it must be filled out in every language variation of the entry before saving.

For example, if a blog post requires a category, both the English and French versions must include a category before the entry can be saved.


Language is for the whole entry

In BCMS, localization is handled at the entry level, not the individual field level—by design.

This means:

  • Each entry is fully duplicated for every language.

  • You manage complete, isolated versions per language.

  • Partial translations are not possible - every localized version must be complete before publishing.

While some systems let you localize individual fields, this often creates confusion, edge cases, and messy validation logic - especially as projects grow.

With BCMS, this clear separation keeps your content model clean, scalable, and predictable. Large projects with dozens of languages and editors won’t become a patchwork of missing or inconsistent fields. Instead, every language version of an entry is a fully-formed, reliable unit of content.

✅ Clear boundaries = fewer bugs, simpler logic, and happier editors.


Output structure example

Let’s say you added English (default) and French:

const post = await bcms.entry.get('blog', 'my-post');

console.log(post.meta.en.title); // "Welcome to our blog"
console.log(post.meta.fr.title); // "Bienvenue sur notre blog"

console.log(post.content.en.nodes); // [...English content...]
console.log(post.content.fr.nodes); // [...French content...]

This makes rendering localized content on your frontend straightforward.