Exam Area: Area 1 – Product Knowledge (15%) Reference: https://docs.developers.optimizely.com/content-management-system/docs/multilingual-content
CMS 12 natively supports multilingual content. Each content item can have:
| Term | Meaning |
|---|---|
| Master language | The language in which content is first created |
| Language branch | A language version of a content item |
| Translation | Creating content in a secondary language |
| Fallback | Serving master language when translation is missing |
| Language selector | Code object specifying which language to load |
Access to edit/publish content can be restricted per language:
Admin → Languages → Swedish (sv)
→ Edit permissions:
WebEditors: ✅ can edit Swedish content
GermanEditors: ❌ cannot edit Swedish content
// Check if user can edit a specific language
var canEditSwedish = _contentAccessEvaluator.HasAccess(
page,
PrincipalInfo.CurrentPrincipal,
AccessLevel.Edit,
CultureInfo.GetCultureInfo("sv"));
// Option 1: Load a specific language version
var swedish = _contentLoader.Get<ArticlePage>(
contentRef,
new LanguageSelector("sv"));
// Option 2: Load with auto-fallback
var page = _contentLoader.Get<ArticlePage>(
contentRef,
new LanguageSelector("sv", enableFallback: true));
// Option 3: Load ALL language versions
var allVersions = _contentLoader.GetAllLanguageVersions(contentRef);
// Option 4: Use current thread culture
var current = _contentLoader.Get<ArticlePage>(
contentRef,
LanguageSelector.AutoDetect());
// Create a Swedish translation of an existing page
public ContentReference CreateTranslation(
ContentReference originalRef,
string targetLanguage)
{
// Get existing English version
var original = _contentLoader.Get<ArticlePage>(
originalRef,
new LanguageSelector("en"));
// Create writable clone for Swedish
var swedishVersion = (ArticlePage)original.CreateWritableClone();
// Set language
swedishVersion.Language = CultureInfo.GetCultureInfo(targetLanguage);
// Set translated content
swedishVersion.Heading = "Om oss"; // Swedish heading
// Save (creating new language branch)
return _contentRepository.Save(
swedishVersion,
SaveAction.Publish,
AccessLevel.NoAccess);
}
{
"EPiServer": {
"CMS": {
"LanguageFallbackEnabled": true
}
}
}
Fallback chain example:
nb (Norwegian Bokmål)
→ no (Norwegian)
→ en (English) ← master language
Shared blocks also support language branches:
Block: "Call to Action Button"
en: "Book a Demo" [Published]
sv: "Boka Demo" [Published]
de: [Not created] → falls back to en
Edit View → Language picker (top toolbar)
→ Switch to Swedish
→ Page tree shows Swedish status badges per page
→ "Not translated" badge = this page has no Swedish version
→ "Add translation" button = create a new language branch
// A property with CultureSpecific(false) has only one value
// regardless of language — e.g. a sort order or numeric ID
[CultureSpecific(false)]
[Display(Name = "Sort Order")]
public virtual int SortOrder { get; set; }
_contentLoader.Get<T>(ref, new LanguageSelector("sv")))[CultureSpecific(false)] do? (Makes the property shared across all language branches — not translated per language)_contentLoader.GetAllLanguageVersions(contentRef))