Exam Area: Area 1 – Product Knowledge (15%)
Reference: https://docs.developers.optimizely.com/content-management-system/docs/multilingual-content
Each page can exist in multiple languages as language branches:
Each language branch is a translation of the same content item.
[ContentType(GUID = "...")]
public class ArticlePage : PageData
{
// Translatable - each language has its own value
[CultureSpecific]
public virtual string Heading { get; set; }
[CultureSpecific]
public virtual XhtmlString MainBody { get; set; }
// Shared - all languages share the same value
// (no [CultureSpecific])
public virtual ContentReference RelatedPage { get; set; }
public virtual int SortOrder { get; set; }
}
// If content does not exist in the current language:
// CMS will fall back according to configured language settings
// Configured in Admin → Languages → Language Settings
// → Enable fallback to: English
// → Or "Return empty string" if no fallback
public class TranslationService
{
private readonly IContentRepository _contentRepository;
public void CreateLanguageBranch(ContentReference link, string language)
{
// Load existing (English/master)
var masterPage = _contentRepository.Get<ArticlePage>(link);
// Create language branch
var branchPage = _contentRepository.CreateLanguageBranch<ArticlePage>(
link,
new LanguageSelector(language));
var writableBranch = (ArticlePage)branchPage.CreateWritableClone();
writableBranch.Heading = "Translated heading";
writableBranch.MainBody = new XhtmlString("<p>Translated body</p>");
_contentRepository.Save(writableBranch, SaveAction.Publish);
}
}
URL: /en/products/article
URL: /sv/produkter/artikel
URL: /de/produkte/artikel
└── Mapped via SiteDefinition.StartPage + LanguageBranch URL segment
// ILanguageBranchRepository
public class LanguageService
{
private readonly ILanguageBranchRepository _languageBranchRepository;
public LanguageService(ILanguageBranchRepository languageBranchRepository)
{
_languageBranchRepository = languageBranchRepository;
}
public IEnumerable<LanguageBranch> GetEnabledLanguages()
{
return _languageBranchRepository.ListEnabled();
}
public bool IsLanguageEnabled(string languageCode)
{
return _languageBranchRepository.IsEnabled(languageCode);
}
}
Page → Edit View → Language Selector dropdown
→ Shows all languages for current page
→ Indicators:
✅ Green: Translated and published
🟡 Yellow: Draft exists but not published
❌ Red: Not translated yet
[CultureSpecific] attribute do? (Property has a different value for each language)[CultureSpecific], what is the property? (Shared – used across all languages)IContentRepository.CreateLanguageBranch<T>())