# 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:

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

and content:

```TYPESCRIPT
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:

```TYPESCRIPT
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.