HomeDev GuideAPI Reference
Dev GuideAPI ReferenceUser GuideGitHubNuGetDev CommunitySubmit a ticketLog In
GitHubNuGetDev CommunitySubmit a ticket

Optimizely Languages

Describes Optimizely Languages, which provides easy access to a single interface for managing multiple languages and translations of content, with a built-in feature for managing automated translations.

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 for package and version information. 

Install

  • Versions 7.5 and higher are installed through NuGet.
  • Version 7 is installed and updated through one-click installation.

Documentation

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. The following steps show how to configure the auto-translate option.

Connect to the auto-translation service

  1. Subscribe to Azure, 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.

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.

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:
  • Add all children – 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.

Customize the translation process

This section is ob

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.

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);
}

📘

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.

📘

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

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

[Obsolete]The following functions in ILanguageBranchManager and its default implementation LanguageBranchManager are obsolete:

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);

[Obsolete] 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:

{
  "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