---
title: Optimizely Languages
slug: cms-12/docs/optimizely-languages
createdAt: 2026-08-10T15:56:02.000Z
---

![](https://api.archbee.com/api/optimize/BrbvVORKJ5iIeSMZye5kI/dQH7PdborlKVxfDpIWZFJ-20260722-194645.png)

Use Optimizely Languages to export and import XLIFF files that can be sent to in-house translators or localization agencies.

`ITranslationPackageExporter` and `ITranslationPackageImporter` are interfaces used for the import and export of translation packages to a project. The default implementations are `XLIFFTranslationPackageImporter` and `XLIFFTranslationPackageExporter`.

## Requirements

- No additional license fee.
- An Optimizely Content Management System (CMS) or Optimizely Customized Commerce installation.
- See [Add-ons platform compatibility](docId\:qlMSwdEfyS4CJlGWdudqk) for package and version information.

## Install

- Versions 7.5 and higher are [installed through NuGet](https://nuget.episerver.com/package/?id=EPiServer.Labs.LanguageManager).
- Version 7 is installed and updated through one-click installation.

## Documentation

- Developer guide:
  - [Configure auto-translation](docId:2WLfDCHJczSyPR913gU8d)
  - [Breaking changes Optimizely Languages 2.0](docId:2WLfDCHJczSyPR913gU8d)
- [User guide Optimizely Languages](docId\:vKU2-nQv1hNV16PCIpBbI)

## Configure auto-translation

This section describes configuring an auto-translation service for the Optimizely Languages app. Optimizely Languages is used as its translation provider Microsoft Translator, part of the Microsoft Cognitive Services collection of APIs, available in the [Azure portal](https://azure.microsoft.com/en-us/). The following steps show how to configure the auto-translate option.

### Connect to the auto-translation service

1. [Subscribe to Azure](https://azure.microsoft.com/en-us/), if you haven’t done so already.
2. Configure the auto-translate component in Optimizely Languages.
   1. Go to admin view > **Config** > **Tool Settings** > **Language Manager**.
   2. In the **Translator Provider**, select **Cognitive Service Translator**.
   3. In the **Subscription Key** box, enter your Microsoft subscription key (Key 1).
   4. In **Subscription Region**, enter the Location value from the Azure subscription service.
   5. Save your changes.

See also: [Reminder: Move Translator API subscriptions from DataMarket to Azure before April 30, 2017](https://www.microsoft.com/en-us/translator/blog/2017/04/10/reminder-move-translator-api-subscriptions-from-datamarket-to-azure-before-april-30-2017/).

## Translate content (new UI in 5.3.0)

Starting from 5.3.0, you do not need to setup your `TranslateOrCopyContentAreaChildrenBlockForTypes` config in `appsettings.json`. Optimizely provides it in a more intuitive UI.

![Translate content (new UI in 5.3.0)](https://api.archbee.com/api/optimize/BrbvVORKJ5iIeSMZye5kI/uqFDB5Kxu0Ci_UEY6omIW-20260722-184804.png "episerverlanguages.png")

It has the following options:

- **Add all children**  – When translating a parent page, translate all of it children and subpages. For example, selecting this option when translating Page 1 will translate all the pages in the following image:
  ![](https://api.archbee.com/api/optimize/BrbvVORKJ5iIeSMZye5kI/oCyr_ZR-QhweifYQ_6GIC-20260722-184804.png "episerverlanguages.png")
- **Add related content(s)** – When translating a parent page, translate all of contents inside `ContentArea`, but also in `ContentReference` and `XhtmlString`. This includes `Ilist<ContentReference>` and `Ilist<XhtmlString>`.
- **Publish added content(s)** – Only appears if either of the two options above is selected. Determine whether to publish the newly added content or retain it as a draft. Notably, the root content will remain in draft status.
  ![](https://api.archbee.com/api/optimize/BrbvVORKJ5iIeSMZye5kI/uakX3cKi7SSFbv_WA1pzW-20260722-184804.png "episerverlanguages.png")

### Customize the translation process

If you do not want to use the provided translation process configuration, you can implement your one with the `IChildrenContentLoader` interface, as shown in the following code.

```csharp
public interface IChildrenContentLoader {
    /// <summary>
    /// Get children from a parent/root content
    /// </summary>
    /// <param name="content">The parent or root content</param>
    /// <param name="languageId">Id of the source language</param>
    /// <param name="includeDescendents">Flag to indicate whether including descendants or not</param>
    /// <param name="includeRelatedContents">Flag to indicate whether including related content or not</param>
    /// <returns>List of content link that will get translated alongside root</returns>
    IEnumerable<ContentReference> GetChildrenContentsNeedToCopyOrTranslate(ContentReference content, string languageId, bool includeDescendents, bool includeRelatedContents);
}
```

:::hint{type="info"}
**Note**
The return content list does not include the root. Be sure to register your new implementation in `Startup.cs`.
:::

## Breaking changes for Languages version 2

This topic describes API changes in version 2 of Episerver Languages.

:::hint{type="info"}
**Note**
Episerver Languages was renamed to Optimizely Languages.
:::

### Changed

Introduced methods in the `ILanguageBranchManager` interface and its implementation, `LanguageBranchManager`. Compared with old methods, the difference is that the method returns newly created content as an `out` parameter (`createdContentLink`):

```csharp
bool CopyDataFromMasterBranch(ContentReference contentReference, string fromLanguageID,
  string toLanguageID, Func<object, object> transformOnCopyingValue,
  out ContentReference createdContentLink, bool autoPublish = false);

bool CreateLanguageBranch(ContentReference contentLink, string languageID,
  out ContentReference createdContentLink);

bool TranslateAndCopyDataFromMasterBranch(ContentReference contentReference,
  string fromLanguageID, string fromTwoLetterLanguageName, string toLanguageID,
  string toTwoLetterLanguageName, out ContentReference createdContentLink,
  bool autoPublish = false);
```

### Marked as obsolete

bsolete]ThThe following functions in `ILanguageBranchManager` and its default implementation `LanguageBranchManager` are obsolete:

```csharp
bool CopyDataFromMasterBranch(ContentReference contentReference, string fromLanguageID,  
  string toLanguageID, Func<object, object> transformOnCopyingValue,  
  bool autoPublish = false);

bool CreateLanguageBranch(ContentReference contentLink, string languageID);

bool TranslateAndCopyDataFromMasterBranch(ContentReference contentReference,  
  string fromLanguageID, string fromTwoLetterLanguageName, string toLanguageID,  
  string toTwoLetterLanguageName, bool autoPublish = false);
```

bsolete] T This section describes how to configure Optimizely Languages to translate child blocks in a `ContentArea` attribute. To archive this, add the Optimizely Languages section in `appsettings.json` like this:

```json
{
  "Episerver": {
    "CmsUI": {
      "LanguageManager": {
        "TranslateOrCopyContentAreaChildrenBlockForTypes": [
          "AlloyTemplates.Models.Pages.ExamplePage1",
          "AlloyTemplates.Models.Pages.ExamplePage2"
        ]
      }
    }
  }
}
```

The value in the array can be a regex so you can write a single `"AlloyTemplates.Models.Pages.*"` to enable this to contents that have the namespace `AlloyTemplates.Models.Pages`.

### New dependencies

Languages 2.0 depends on packages: `EPiServer.CMS.Core` 9.8, `EPiServer.CMS.UI` 9.5.0
