<?xml version="1.0" encoding="utf-8"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><language>en</language><title>Blog posts by Deepmala S</title> <link>https://world.optimizely.com/blogs/deepmala-s/</link><description></description><ttl>60</ttl><generator>Optimizely World</generator><item> <title>Alt text is retrieved for images imported from CMP-DAM in Optimizely CMS 12.</title>            <link>https://world.optimizely.com/blogs/deepmala-s/dates/2025/12/alt-text-is-retrieved-for-images-imported-from-cmpdam-in-optimizely-cms-12/</link>            <description>&lt;p&gt;&lt;span style=&quot;text-decoration: underline;&quot;&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Although image alt text is stored as metadata in CMP/DAM, it is not automatically rendered in browser HTML. This document outlines the solution implemented in Optimizely CMS to retrieve and render this metadata correctly.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;text-decoration: underline;&quot;&gt;&lt;strong&gt;Steps :&amp;nbsp;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;1) Create image file class and inherit with ImageData.&lt;/p&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;public class ImageFile : ImageData
{
    [Display(Name = &quot;Alt text&quot;, Order = 10)]
    public virtual string AltText { get; set; }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2) Create image file view model&lt;/p&gt;
&lt;div&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;public class ImageFileViewModel
{
    public string AltText { get; set; }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;3) Create image file request and paas in-built &lt;strong&gt;DAMAssetIdentity&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;public class ImageFileRequest : IRequest&amp;lt;ImageFileViewModel&amp;gt;
{
    public ImageFileRequest(DAMAssetIdentity damAsset, CultureInfo culture)
    {
        Culture = culture;
        ImageFileReference = damAsset;
    }
    public DAMAssetIdentity ImageFileReference { get; set; }
    public CultureInfo Culture { get; }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;4)&amp;nbsp;Create image file request handler and fetch Alt text from Dam using &lt;strong&gt;DAMAssetIdentity metadata&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;
&lt;div&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;public async Task&amp;lt;ImageFileViewModel&amp;gt; Handle(ImageFileRequest request, CancellationToken cancellationToken)
 {
     if (request?.ImageFileReference != null)
     {
               temp.AltText = request?.ImageFileReference?.Metadata?.DAMAssetInfo?.AltText;
     }
     return temp;
 }&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;5) If in case while fetching alt text from Dam and if we will get&amp;nbsp;&lt;strong&gt;DAMAssetInfo &lt;/strong&gt;is null due to unaxpected behavior then we will use &lt;strong&gt;IDAMAssetMetadataService &lt;/strong&gt;showing below&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;language-csharp&quot;&gt;&lt;code&gt;if (temp.Metadata?.DAMAssetInfo == null)
{
           var temp2 = ServiceProviderExtensions.GetInstance&amp;lt;IDAMAssetMetadataService&amp;gt;(ServiceLocator.Current).GetAssetMetadata(ExtractAssetGuid(temp).Value).Result;
        altText = temp2?.AltText;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;6) After fetching Alt text successfully then we will pass in view.&lt;br /&gt;&lt;br /&gt;Above i have added only neccesary code other can add according to requirements.&lt;br /&gt;Below references added for CMP-DAM configuration and assets sync.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;text-decoration: underline;&quot;&gt;Important Links&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;text-decoration: underline;&quot;&gt;&lt;a href=&quot;https://docs.developers.optimizely.com/content-management-system/v1.0.0-CMS-SaaS/docs/manage-assets-with-dam&quot;&gt;https://docs.developers.optimizely.com/content-management-system/v1.0.0-CMS-SaaS/docs/manage-assets-with-dam&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;text-decoration: underline;&quot;&gt;&lt;a href=&quot;/link/2fe7c7fbd7fb4251b60de7cc4c5447c7.aspx&quot;&gt;https://world.optimizely.com/blogs/robert-svallin/dates/2025/2/cmp-dam-asset-graph-self-service/&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;text-decoration: underline;&quot;&gt;&lt;a href=&quot;https://docs.developers.optimizely.com/content-management-system/docs/cmp-dam-in-cms&quot;&gt;https://docs.developers.optimizely.com/content-management-system/docs/cmp-dam-in-cms&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;</description>            <guid>https://world.optimizely.com/blogs/deepmala-s/dates/2025/12/alt-text-is-retrieved-for-images-imported-from-cmpdam-in-optimizely-cms-12/</guid>            <pubDate>Fri, 16 Jan 2026 10:47:34 GMT</pubDate>           <category>Blog post</category></item><item> <title>Custom Deepl Glossary Translation in Optimizely CMS </title>            <link>https://world.optimizely.com/blogs/deepmala-s/dates/2025/9/custom-deepl-glossary-translation-in-optimizely-cms-/</link>            <description>&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-size: 9.5pt; line-height: 107%; font-family: &#39;Cascadia Mono&#39;; color: black; background: white; mso-highlight: white;&quot;&gt;Introduction in this post, I have created a custom DeepL glossary translation for specific words. For example, when translating from English to German, the standard translation for &quot;Hello&quot; is &quot;Hallo.&quot; However, using my custom DeepL glossary, I want &quot;Hello&quot; to be translated as a custom word like &quot;Ollha.&quot; This custom translation will override the normal Optimizely auto-translation and ensure that the glossary-defined terms are used instead.&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-size: 9.5pt; line-height: 107%; font-family: &#39;Cascadia Mono&#39;; color: black; background: white; mso-highlight: white;&quot;&gt;Repository link for reference&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-size: 9.5pt; line-height: 107%; font-family: &#39;Cascadia Mono&#39;; color: black; background: white; mso-highlight: white;&quot;&gt;&lt;a href=&quot;https://github.com/mattpallatt/MP.LanguageManager.DeepLTranslate&quot;&gt;https://github.com/mattpallatt/MP.LanguageManager.DeepLTranslate&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;MsoListParagraph&quot; style=&quot;text-indent: -18.0pt; mso-list: l0 level1 lfo2;&quot;&gt;&lt;!-- [if !supportLists]--&gt;&lt;span style=&quot;font-size: 12.0pt; mso-bidi-font-size: 11.0pt; line-height: 107%; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;&quot;&gt;&lt;span style=&quot;mso-list: Ignore;&quot;&gt;1)&lt;span style=&quot;font: 7.0pt &#39;Times New Roman&#39;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span style=&quot;font-size: 12.0pt; line-height: 107%;&quot;&gt;Install nuget &lt;/span&gt;package &lt;strong style=&quot;mso-bidi-font-weight: normal;&quot;&gt;MP.LanguageManager.DeepLTranslate&lt;/strong&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 9.5pt; line-height: 107%; font-family: Consolas; color: white; background: #002440;&quot;&gt;dotnet add package MP.LanguageManager.DeepLTranslate --version 1.0.9&lt;/span&gt;&lt;br style=&quot;mso-special-character: line-break;&quot; /&gt;&lt;!-- [if !supportLineBreakNewLine]--&gt;&lt;!--[endif]--&gt;&lt;/p&gt;
&lt;p class=&quot;MsoListParagraph&quot; style=&quot;text-indent: -18.0pt; mso-list: l0 level1 lfo2;&quot;&gt;&lt;!-- [if !supportLists]--&gt;&lt;span style=&quot;font-size: 12.0pt; mso-bidi-font-size: 9.5pt; line-height: 107%; font-family: &#39;Cascadia Mono&#39;; mso-fareast-font-family: &#39;Cascadia Mono&#39;; color: black; background: white; mso-highlight: white;&quot;&gt;&lt;span style=&quot;mso-list: Ignore;&quot;&gt;2)&lt;span style=&quot;font: 7.0pt &#39;Times New Roman&#39;;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span style=&quot;font-size: 9.5pt; line-height: 107%; font-family: &#39;Cascadia Mono&#39;; color: black; background: white; mso-highlight: white;&quot;&gt;Create &lt;/span&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal;&quot;&gt;&lt;span style=&quot;background: white; mso-highlight: white;&quot;&gt;DeepLTranslateProvider class&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p class=&quot;MsoListParagraph&quot; style=&quot;text-indent: -18.0pt; mso-list: l0 level1 lfo2;&quot;&gt;&amp;nbsp;&lt;br /&gt;public class DeepLTranslateProvider : IMachineTranslatorProvider&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; private readonly Injected&amp;lt;IOptions&amp;lt;DeepLOptions&amp;gt;&amp;gt; _options;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; public string DisplayName =&amp;gt; &quot;DeepL Web Translator&quot;;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; public DeepL.Formality DLFormality = DeepL.Formality.Default;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; public string EnglishType = &quot;&quot;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; public string authkey = &quot;&quot;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; public string AutoGlossary = &quot;&quot;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; public string GlossaryList = &quot;&quot;;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; public bool Initialize(ITranslatorProviderConfig config)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var languageManagerOptions = new LanguageManagerOptions();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var languageManagerConfig = new LanguageManagerConfig(languageManagerOptions);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; authkey = languageManagerConfig.ActiveTranslatorProvider.SubscriptionKey;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var options = _options.Service.Value;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var dlfv = &quot;default&quot;;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; try&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dlfv = (options.Formality.ToLower() == &quot;default&quot; || options.Formality.ToLower() == &quot;more&quot; || options.Formality.ToLower() == &quot;less&quot; || options.Formality.ToLower() == &quot;preferless&quot; || options.Formality.ToLower() == &quot;prefermore&quot;) ? options.Formality.ToLower() : dlfv;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; EnglishType = (options.English.ToLower() == &quot;en-gb&quot; || options.English.ToLower() == &quot;en-us&quot;) ? options.English.ToLower() : &quot;en-gb&quot;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; AutoGlossary = (options.AutoGlossary == &quot;0&quot; || options.AutoGlossary == &quot;1&quot;) ? options.AutoGlossary : AutoGlossary;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; GlossaryList = options.GlossaryList;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; catch { }&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // free API authorisation keys end in :fx...&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (authkey.EndsWith(&quot;:fx&quot;))&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // ...set the formality to Default, as this is a Pro feature&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DLFormality = DeepL.Formality.Default;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DLFormality = dlfv.ToLower() switch&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;less&quot; =&amp;gt; DeepL.Formality.Less,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;more&quot; =&amp;gt; DeepL.Formality.More,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;preferless&quot; =&amp;gt; DeepL.Formality.PreferLess,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;prefermore&quot; =&amp;gt; DeepL.Formality.PreferMore,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; _ =&amp;gt; DeepL.Formality.Default,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; };&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return true;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; public TranslateTextResult Translate(string inputText, string sourceLanguage, string targetLanguage)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var translateTextResult = new TranslateTextResult&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; IsSuccess = true,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Text = &quot;&quot;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; };&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (string.IsNullOrWhiteSpace(inputText))&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return translateTextResult;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; try&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var n = DoTranslate(inputText, sourceLanguage, targetLanguage);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; n.Wait();&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; translateTextResult.Text = n.Result.ToString();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; translateTextResult.IsSuccess = true;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; catch (Exception ex)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; translateTextResult.IsSuccess = false;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; translateTextResult.Text = &quot;An unexpected error occurred: &quot; + ex.Message + ex.InnerException;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return translateTextResult;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; public async Task&amp;lt;TextResult&amp;gt; DoTranslate(string inputText, string sourceLanguage, string targetLanguage)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var slci = new CultureInfo(sourceLanguage);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var tlci = new CultureInfo(targetLanguage);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; string tl = tlci.TwoLetterISOLanguageName.ToString();&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // deal with PT, ZH (xx-xx) language codes&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (tl == &quot;pt&quot; || tl == &quot;zh&quot;)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; tl = targetLanguage;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // dealing with depreciated &quot;en&quot; target language code using default EN code&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else if (tl == &quot;en&quot;)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; tl = EnglishType;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // reset the glossary ID&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; string glossaryID = &quot;&quot;;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var translator = new DeepL.Translator(authkey);&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ((AutoGlossary == &quot;1&quot;) || (GlossaryList.Contains($&quot;[{slci}&amp;gt;{tlci}]&quot;)))&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; System.Threading.Tasks.Task&amp;lt;GlossaryInfo[]&amp;gt; n = translator.ListGlossariesAsync();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; n.Wait();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; List&amp;lt;GlossaryInfo&amp;gt; GI = n.Result.ToList();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; glossaryID = GI.FirstOrDefault(item =&amp;gt; item.SourceLanguageCode == slci.ToString() &amp;amp;&amp;amp; item.TargetLanguageCode == tlci.ToString())?.GlossaryId;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var translatedText = await translator.TranslateTextAsync(&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; inputText,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; slci.TwoLetterISOLanguageName.ToUpper(),&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; tl.ToUpper(),&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; new TextTranslateOptions { Formality = DLFormality, TagHandling = &quot;html&quot;, GlossaryId = glossaryID }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; );&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return translatedText;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public class DeepLOptions&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; public string Formality { get; set; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; public string English { get; set; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; public string AutoGlossary { get; set; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; public string GlossaryList { get; set; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; public string ignoreExistingPages { get; set; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;strong style=&quot;mso-bidi-font-weight: normal;&quot;&gt;&lt;span style=&quot;font-size: 9.5pt; line-height: 107%; font-family: &#39;Cascadia Mono&#39;; color: black; mso-fareast-language: EN-IN; mso-no-proof: yes;&quot;&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p class=&quot;MsoListParagraph&quot; style=&quot;margin-bottom: .0001pt; mso-add-space: auto; text-indent: -18.0pt; line-height: normal; mso-list: l0 level1 lfo2; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;&lt;!-- [if !supportLists]--&gt;&lt;span style=&quot;font-size: 12.0pt; mso-bidi-font-size: 9.5pt; font-family: &#39;Cascadia Mono&#39;; mso-fareast-font-family: &#39;Cascadia Mono&#39;; color: black; background: white; mso-highlight: white;&quot;&gt;&lt;span style=&quot;mso-list: Ignore;&quot;&gt;3)&lt;span style=&quot;font: 7.0pt &#39;Times New Roman&#39;;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span style=&quot;font-size: 9.5pt; font-family: &#39;Cascadia Mono&#39;; color: black; background: white; mso-highlight: white;&quot;&gt;Create API Controller&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;[HttpPost]&lt;br /&gt;&amp;nbsp;[Route(&quot;/api/v1/glossary/create&quot;)]&lt;br /&gt;&amp;nbsp;public async Task&amp;lt;ActionResult&amp;gt; Create([FromBody] GlossaryDTO glossaryDTO)&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;var timer = Stopwatch.StartNew();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;GlossaryInfo glossaryInfo = null;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;try&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (glossaryDTO != null)&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;glossaryInfo = await _glossary.CreateGlossaryAsync(glossaryDTO.Name, glossaryDTO.SourceLang, glossaryDTO.TargetLang, glossaryDTO.GlossaryEntries);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;catch (Exception ex)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;_logger.LogError(nameof(Index), ex, &quot;Error GlossaryController getting GlossaryController&quot;);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return StatusCode(500, new { message = ex.Message });&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;timer.Stop();&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;_logger.LogInformation(nameof(Index), $&quot;Timer took {timer.ElapsedMilliseconds}ms&quot;);&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;return new JsonResult(new { message = glossaryInfo != null ? &quot;Glossary has been created&quot; : &quot;Glossary is not created&quot;, glossary = glossaryInfo });&lt;/p&gt;
&lt;p&gt;&amp;nbsp;}&lt;/p&gt;
&lt;p class=&quot;MsoListParagraphCxSpFirst&quot; style=&quot;text-indent: -18.0pt; mso-list: l0 level1 lfo2;&quot;&gt;&lt;!-- [if !supportLists]--&gt;&lt;span style=&quot;font-size: 12.0pt; mso-bidi-font-size: 11.0pt; line-height: 107%; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;&quot;&gt;&lt;span style=&quot;mso-list: Ignore;&quot;&gt;4)&amp;nbsp; Do App setting configurations&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoListParagraphCxSpFirst&quot; style=&quot;text-indent: -18.0pt; mso-list: l0 level1 lfo2;&quot;&gt;&lt;img src=&quot;/link/33369184368046c2a0ced050c52e5474.aspx&quot; alt=&quot;&quot; width=&quot;259&quot; height=&quot;141&quot; /&gt;&lt;/p&gt;
&lt;p class=&quot;MsoListParagraphCxSpMiddle&quot; style=&quot;text-indent: -18.0pt; mso-list: l0 level1 lfo2;&quot;&gt;&lt;!-- [if !supportLists]--&gt;&lt;span style=&quot;font-size: 12.0pt; mso-bidi-font-size: 11.0pt; line-height: 107%; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;&quot;&gt;&lt;span style=&quot;mso-list: Ignore;&quot;&gt;5)&lt;span style=&quot;font: 7.0pt &#39;Times New Roman&#39;;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;Set up&amp;nbsp;&lt;strong&gt;Deepl Web Translator&lt;/strong&gt; in Language manager plug in.&lt;/p&gt;
&lt;p class=&quot;MsoListParagraphCxSpFirst&quot; style=&quot;text-indent: -18.0pt; mso-list: l0 level1 lfo2;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; To use the DeepL Translator to perform automated translations make sure it&#39;s selected as Translator Provider in the settings of the Language Manager&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;/link/13e251e79575475f9c037c2d8d032737.aspx&quot; alt=&quot;&quot; width=&quot;612&quot; height=&quot;189&quot; /&gt;&lt;/p&gt;
&lt;p class=&quot;MsoListParagraphCxSpMiddle&quot; style=&quot;text-indent: -18.0pt; mso-list: l0 level1 lfo2;&quot;&gt;6)&amp;nbsp; &amp;nbsp;Create Glossary block and on view create glossaries. Set access right on block hide from visitors.&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;MsoListParagraphCxSpMiddle&quot; style=&quot;text-indent: -18.0pt; mso-list: l0 level1 lfo2;&quot;&gt;6)&amp;nbsp; &amp;nbsp; Do auto translation from Language gadget.&lt;/p&gt;
&lt;p class=&quot;MsoListParagraphCxSpMiddle&quot; style=&quot;text-indent: -18.0pt; mso-list: l0 level1 lfo2;&quot;&gt;&lt;img src=&quot;/link/8b324cc53f8a470ab2c600dc2cf58982.aspx&quot; alt=&quot;&quot; width=&quot;461&quot; height=&quot;163&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;mso-fareast-language: EN-IN; mso-no-proof: yes;&quot;&gt;&lt;img src=&quot;/link/681b8d3697c0405cae6b60acba558dc2.aspx&quot; alt=&quot;&quot; width=&quot;322&quot; height=&quot;238&quot; /&gt;&lt;br /&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoListParagraphCxSpLast&quot; style=&quot;text-indent: -18.0pt; mso-list: l1 level1 lfo1;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>            <guid>https://world.optimizely.com/blogs/deepmala-s/dates/2025/9/custom-deepl-glossary-translation-in-optimizely-cms-/</guid>            <pubDate>Wed, 03 Sep 2025 09:29:08 GMT</pubDate>           <category>Blog post</category></item></channel>
</rss>