I want to add MT Enhanced Provider - Microsoft Translator to Trados via code programmatically

In the UI interface, It only has need to insert the Microsoft translator key, but in the MT Enchanced provider dll API, it has to deal with client ID and client Key. It is confusing and embarrassing. It seems a bug.

I don't know how to add the plugin to Trados and add credential, how to use with Traods via code API, it is a disaster and frustrating. 

Who has experience on that and can share your solution for me? Great thanks!

Screenshot of MT Enhanced using Microsoft Translator settings window with options to choose MT provider, enter Microsoft Translator Key, and checkboxes for saving credentials and using category ID.

    public class MtTranslationProviderWinFormsUI : ITranslationProviderWinFormsUI
    {
		private readonly Constants _constants = new Constants();
		private Logger _logger = LogManager.GetCurrentClassLogger();

		/// <summary>
		/// Show the plug-in settings form when the user is adding the translation provider plug-in
		/// through the GUI of SDL Trados Studio
		/// </summary>
		/// <param name="owner"></param>
		/// <param name="languagePairs"></param>
		/// <param name="credentialStore"></param>
		/// <returns></returns>

		private TranslationProviderCredential GetMyCredentials(ITranslationProviderCredentialStore credentialStore, string uri)
        {
			var myUri = new Uri(uri);
            TranslationProviderCredential cred = null;

            if (credentialStore.GetCredential(myUri) != null)
            {
                //get the credential to return
                cred = new TranslationProviderCredential(credentialStore.GetCredential(myUri).Credential, credentialStore.GetCredential(myUri).Persist);
            }

            return cred;

        }

        private void SetMstCredentials(ITranslationProviderCredentialStore credentialStore, GenericCredentials creds, bool persistCred)
        { //used to set credentials
            // we are only setting and getting credentials for the uri with no parameters...kind of like a master credential
            var myUri = new Uri("mtenhancedprovidermst:///");

            var cred = new TranslationProviderCredential(creds.ToCredentialString(), persistCred);
            credentialStore.RemoveCredential(myUri);
            credentialStore.AddCredential(myUri, cred);
        }

        private void SetGoogleCredentials(ITranslationProviderCredentialStore credentialStore, string apiKey, bool persistKey)
        { //used to set credentials
            // we are only setting and getting credentials for the uri with no parameters...kind of like a master credential
            var myUri = new Uri("mtenhancedprovidergt:///");
            var cred = new TranslationProviderCredential(apiKey, persistKey);
            credentialStore.RemoveCredential(myUri);
            credentialStore.AddCredential(myUri, cred);
        }

        public ITranslationProvider[] Browse(IWin32Window owner, LanguagePair[] languagePairs, ITranslationProviderCredentialStore credentialStore)
        {
            //construct options to send to form
            var loadOptions = new MtTranslationOptions();
            //get saved key if there is one and put it into options
            //get google credentials
            var getCredGt = GetMyCredentials(credentialStore, "mtenhancedprovidergt:///");
            if (getCredGt != null)
            {
                loadOptions.ApiKey = getCredGt.Credential;
                loadOptions.PersistGoogleKey = getCredGt.Persist;
            }
            
            //get microsoft credentials
            var getCredMt = GetMyCredentials(credentialStore, "mtenhancedprovidermst:///");
            if (getCredMt != null)
            {
                try
                {
                    var creds = new GenericCredentials(getCredMt.Credential); //parse credential into username and password
                    loadOptions.ClientId = creds.UserName;
                    loadOptions.ClientSecret = creds.Password;
                    loadOptions.PersistMicrosoftCreds = getCredMt.Persist;
                }
                catch(Exception ex) //swallow b/c it will just fail to fill in instead of crashing the whole program
				{
					_logger.Error($"{_constants.Browse} {ex.Message}\n { ex.StackTrace}");

				} 
			}

			var apiConnecter = new ApiConnecter(loadOptions);
			var allSupportedLanguages = ApiConnecter.SupportedLangs;
			var correspondingLanguages = languagePairs.Where(lp => allSupportedLanguages.Contains(lp.TargetCultureName.Substring(0,2))).ToList();

			//loadOptions.LanguagesSupported = correspLanguages.ToDictionary(lp => lp.TargetCultureName, lp=>"MS Translator");
            //construct form
            var dialog = new MtProviderConfDialog(loadOptions, credentialStore, correspondingLanguages);
            //we are letting user delete creds but after testing it seems that it's ok if the individual credentials are null, b/c our method will re-add them to the credstore based on the uri
            if (dialog.ShowDialog(owner) == DialogResult.OK)
            {
                var testProvider = new MtTranslationProvider(dialog.Options);
                var apiKey = dialog.Options.ApiKey;
                
                //we are setting credentials selectively based on the chosen provider to avoid saving the other if it is blank
                if (dialog.Options.SelectedProvider == MtTranslationOptions.ProviderType.GoogleTranslate)
                {
                    //set google credential
                    SetGoogleCredentials(credentialStore, apiKey, dialog.Options.PersistGoogleKey);
                }
                else if (dialog.Options.SelectedProvider == MtTranslationOptions.ProviderType.MicrosoftTranslator)
                {
                    //set mst cred
                    var creds2 = new GenericCredentials(dialog.Options.ClientId, dialog.Options.ClientSecret);
                    SetMstCredentials(credentialStore, creds2, dialog.Options.PersistMicrosoftCreds);
                }

                return new ITranslationProvider[] { testProvider };
            }
            return null;
        }

        /// <summary>
        /// Determines whether the plug-in settings can be changed
        /// by displaying the Settings button in SDL Trados Studio.
        /// </summary>

        public bool SupportsEditing
        {
            get { return true; }
        }

        /// <summary>
        /// If the plug-in settings can be changed by the user,
        /// SDL Trados Studio will display a Settings button.
        /// By clicking this button, users raise the plug-in user interface,
        /// in which they can modify any applicable settings, in our implementation
        /// the delimiter character and the list file name.
        /// </summary>
        /// <param name="owner"></param>
        /// <param name="translationProvider"></param>
        /// <param name="languagePairs"></param>
        /// <param name="credentialStore"></param>
        /// <returns></returns>

        public bool Edit(IWin32Window owner, ITranslationProvider translationProvider, LanguagePair[] languagePairs, ITranslationProviderCredentialStore credentialStore)
        {
            var editProvider = translationProvider as MtTranslationProvider;
            if (editProvider == null)
            {
                return false;
            }

            //get saved key if there is one and put it into options
            //get google credentials
            var getCredGt = GetMyCredentials(credentialStore, "mtenhancedprovidergt:///");
            if (getCredGt != null)
            {
                editProvider.Options.ApiKey = getCredGt.Credential;
                editProvider.Options.PersistGoogleKey = getCredGt.Persist;
            }

            //get microsoft credentials
            var getCredMt = GetMyCredentials(credentialStore, "mtenhancedprovidermst:///");
            if (getCredMt != null)
            {
                try
                {
                    var creds = new GenericCredentials(getCredMt.Credential); //parse credential into username and password
                    editProvider.Options.ClientId = creds.UserName;
                    editProvider.Options.ClientSecret = creds.Password;
                    editProvider.Options.PersistMicrosoftCreds = getCredMt.Persist;
                }
                catch(Exception ex) //swallow b/c it will just fail to fill in instead of crashing the whole program 
				{
					_logger.Error($"{_constants.Edit} {ex.Message}\n { ex.StackTrace}");
				}
			}

            var apiConnecter = new ApiConnecter(editProvider.Options);
            var allSupportedLanguages = ApiConnecter.SupportedLangs;
            var correspondingLanguages = languagePairs.Where(lp => allSupportedLanguages.Contains(lp.TargetCultureName.Substring(0,2))).ToList();

            var dialog = new MtProviderConfDialog(editProvider.Options, credentialStore, correspondingLanguages);
            //we are letting user delete creds but after testing it seems that it's ok if the individual credentials are null, b/c our method will re-add them to the credstore based on the uri
            if (dialog.ShowDialog(owner) == DialogResult.OK)
            {
                editProvider.Options = dialog.Options;

                var apiKey = editProvider.Options.ApiKey;
                
                //we are setting credentials selectively based on the chosen provider to avoid saving the other if it is blank
                if (dialog.Options.SelectedProvider == MtTranslationOptions.ProviderType.GoogleTranslate)
                {
                    //set google credential
                    SetGoogleCredentials(credentialStore, apiKey, dialog.Options.PersistGoogleKey);
                }
                else if (dialog.Options.SelectedProvider == MtTranslationOptions.ProviderType.MicrosoftTranslator)
                {
                    //set mst cred
                    var credentials = new GenericCredentials(dialog.Options.ClientId, dialog.Options.ClientSecret);
                    SetMstCredentials(credentialStore, credentials, dialog.Options.PersistMicrosoftCreds);
                }
                return true;
            }

            return false;
        }

        /// <summary>
        /// This gets called when a TranslationProviderAuthenticationException is thrown
        /// Since SDL Studio doesn't pass the provider instance here and even if we do a workaround...
        /// any new options set in the form that comes up are never saved to the project XML...
        /// so there is no way to change any options, only to provide the credentials
        /// </summary>
        /// <param name="owner"></param>
        /// <param name="translationProviderUri"></param>
        /// <param name="translationProviderState"></param>
        /// <param name="credentialStore"></param>
        /// <returns></returns>

        public bool GetCredentialsFromUser(IWin32Window owner, Uri translationProviderUri, string translationProviderState, ITranslationProviderCredentialStore credentialStore)
        {
            
            var options = new MtTranslationOptions(translationProviderUri);
            var caption = "Credentials"; //default in case any problem retrieving localized resource below
            if (options.SelectedProvider == MtTranslationOptions.ProviderType.GoogleTranslate)
                caption = PluginResources.PromptForCredentialsCaption_Google;
            else if (options.SelectedProvider == MtTranslationOptions.ProviderType.MicrosoftTranslator)
                caption = PluginResources.PromptForCredentialsCaption_Microsoft;
            
            var dialog = new MtProviderConfDialog(options, caption, credentialStore);
            dialog.DisableForCredentialsOnly(); //only show controls for setting credentials, as that is the only thing that will end up getting saved

            if (dialog.ShowDialog(owner) == DialogResult.OK)
            {
                var apiKey = dialog.Options.ApiKey;

                if (options.SelectedProvider == MtTranslationOptions.ProviderType.GoogleTranslate)
                {
                    //set google credential
                    SetGoogleCredentials(credentialStore, apiKey, dialog.Options.PersistGoogleKey);
                }
                else if (options.SelectedProvider == MtTranslationOptions.ProviderType.MicrosoftTranslator)
                {
                    //set mst cred
                    var creds2 = new GenericCredentials(dialog.Options.ClientId, dialog.Options.ClientSecret);
                    SetMstCredentials(credentialStore, creds2, dialog.Options.PersistMicrosoftCreds);
                }
                return true;
            }
            return false;
        }

        /// <summary>
        /// Used for displaying the plug-in info such as the plug-in name,
        /// tooltip, and icon.
        /// </summary>
        /// <param name="translationProviderUri"></param>
        /// <param name="translationProviderState"></param>
        /// <returns></returns>

        public TranslationProviderDisplayInfo GetDisplayInfo(Uri translationProviderUri, string translationProviderState)
        {

            var info = new TranslationProviderDisplayInfo();
            var options = new MtTranslationOptions(translationProviderUri);
            info.TranslationProviderIcon = PluginResources.my_icon;
            
            if (options.SelectedProvider == MtTranslationOptions.ProviderType.GoogleTranslate)
            {
                info.Name = PluginResources.Google_NiceName;
                info.TooltipText = PluginResources.Google_Tooltip;
                info.SearchResultImage = PluginResources.my_image;
            }
            else if (options.SelectedProvider == MtTranslationOptions.ProviderType.MicrosoftTranslator)
            {
                info.Name = PluginResources.Microsoft_NiceName;
                info.TooltipText = PluginResources.Microsoft_Tooltip;
                info.SearchResultImage = PluginResources.microsoft_image;
            }
            else
            {
                info.Name = PluginResources.Plugin_NiceName;
                info.TooltipText = PluginResources.Plugin_Tooltip;
            }
            return info;
        }

        public bool SupportsTranslationProviderUri(Uri translationProviderUri)
        {
            if (translationProviderUri == null)
            {
                throw new ArgumentNullException(PluginResources.UriNotSupportedMessage);
            }
            return String.Equals(translationProviderUri.Scheme, MtTranslationProvider.ListTranslationProviderScheme, StringComparison.CurrentCultureIgnoreCase);
        }

        public string TypeDescription => PluginResources.Plugin_Description;

        public string TypeName => PluginResources.Plugin_NiceName;

    }
}



Generated Image Alt-Text
[edited by: RWS Community AI at 12:49 PM (GMT 0) on 27 Mar 2025]
Parents
  • it is really a bad, really bad experience for using this plugin via code, always outputting the error: 

      <ExceptionData><SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <SOAP-ENV:Body>
    <a1:ProjectApiException id="ref-1" xmlns:a1="http://schemas.microsoft.com/clr/nsassem/Sdl.ProjectApi/Sdl.ProjectApi%2C%20Version%3D15.1.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dc28cdb26c445c888">
    <ClassName id="ref-4">Sdl.ProjectApi.ProjectApiException</ClassName>
    <Message id="ref-5">Unexpected exception when configuring file multiFileConverter for task 'Pre-translate Files': Failed to create an instance of translation provider 'mtenhancedprovider:///?sendplaintextonly=False&selectedprovider=Microsoft+Translator&usecatid=False&catid=&resenddrafts=False&usepreedit=False&usepostedit=False&prelookupfilename=&postlookupfilename='..</Message>
    <Data xsi:null="1"/>
    <InnerException href="#ref-6"/>
    <HelpURL xsi:null="1"/>
    <StackTraceString id="ref-7">   at Sdl.ProjectApi.Implementation.TaskExecution.ContentProcessingTaskImplementation.TaskFileExecuter.ConfigureConverter(IMultiFileConverter multiFileConverter, Language targetLanguage)
       at Sdl.ProjectApi.Implementation.TaskExecution.ContentProcessingTaskImplementation.TaskFileExecuter.CreateMultiFileConverter(IProjectFile tf, String filePath)
       at Sdl.ProjectApi.Implementation.TaskExecution.ContentProcessingTaskImplementation.TaskFileExecuter.Parse(String targetFilePath)</StackTraceString>
    <RemoteStackTraceString xsi:null="1"/>
    <RemoteStackIndex>0</RemoteStackIndex>
    <ExceptionMethod id="ref-8">8
    ConfigureConverter
    Sdl.ProjectApi.Implementation, Version=15.1.0.0, Culture=neutral, PublicKeyToken=c28cdb26c445c888
    Sdl.ProjectApi.Implementation.TaskExecution.ContentProcessingTaskImplementation+TaskFileExecuter
    Void ConfigureConverter(Sdl.FileTypeSupport.Framework.IntegrationApi.IMultiFileConverter, Sdl.Core.Globalization.Language)</ExceptionMethod>
    <HResult>-2146233088</HResult>
    <Source id="ref-9">Sdl.ProjectApi.Implementation</Source>
    <WatsonBuckets xsi:null="1"/>
    </a1:ProjectApiException>
    <a3:ProjectAutomationException id="ref-6" xmlns:a3="http://schemas.microsoft.com/clr/nsassem/Sdl.ProjectAutomation.Core/Sdl.ProjectAutomation.Core%2C%20Version%3D15.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dc28cdb26c445c888">
    <ClassName id="ref-10">Sdl.ProjectAutomation.Core.ProjectAutomationException</ClassName>
    <Message id="ref-11">Failed to create an instance of translation provider 'mtenhancedprovider:///?sendplaintextonly=False&selectedprovider=Microsoft+Translator&usecatid=False&catid=&resenddrafts=False&usepreedit=False&usepostedit=False&prelookupfilename=&postlookupfilename='.</Message>
    <Data xsi:null="1"/>
    <InnerException href="#ref-12"/>
    <HelpURL xsi:null="1"/>
    <StackTraceString id="ref-13">   at Sdl.ProjectAutomation.FileBased.Internal.AutomationServerEvents.HandleTranslationProviderException(TranslationProviderItem translationProviderItem, Exception exception)
       at Sdl.ProjectApi.Helpers.ProjectCascadeFactory.GetTranslationProviderLanguageDirection(TranslationProviderItem translationProviderItem, LanguagePair languageDirection, Boolean performUpdate, Boolean refreshCache)
       at Sdl.ProjectApi.Helpers.ProjectCascadeFactory.CreateProjectCascadeEntries(IList`1 projectCascadeEntryDataList, LanguagePair languagePair, Boolean readOnly, Boolean refreshCache)
       at Sdl.ProjectApi.Helpers.ProjectCascadeFactory.CreateCascade(ProjectCascadeSettings projectCascadeSettings, Boolean refreshCache)
       at Sdl.ProjectApi.Helpers.LanguageDirectionHelper.CreateCascade(ILanguageDirection languageDirection, ProjectCascadeEntryDataFilterFunction filter, IComparer`1 sort, Boolean readOnly, Boolean refreshCache)
       at Sdl.ProjectApi.Helpers.LanguageObjectsCache.GetLanguageResources(ILanguageDirection languageDirection)
       at Sdl.ProjectApi.Helpers.LanguageObjectsCache.<>c__DisplayClass3_0.<GetLanguageResources>b__0()
       at Sdl.ProjectApi.Helpers.LanguageObjectsCache.GetOrCreateObject(String key, Func`1 createObject)
       at Sdl.ProjectApi.Helpers.LanguageObjectsCache.GetLanguageResources(IProject project, Language language)
       at Sdl.ProjectApi.Helpers.LanguageObjectsCache.GetLanguageResources(ITranslatableFile file)
       at Sdl.ProjectApi.AutomaticTasks.AbstractContentProcessorTaskImplementation.AddSegmentorToConverter(IExecutingTaskFile executingTaskFile, IBilingualProcessorContainer multiFileConverter)
       at Sdl.ProjectApi.AutomaticTasks.AbstractTmContentProcessorTaskImplementation.ConfigureConverter(IExecutingTaskFile executingTaskFile, IMultiFileConverter multiFileConverter)
       at Sdl.ProjectApi.AutomaticTasks.Translate.TranslateTask.ConfigureConverter(IExecutingTaskFile executingTaskFile, IMultiFileConverter multiFileConverter)
       at Sdl.ProjectApi.Implementation.TaskExecution.ContentProcessingTaskImplementation.TaskFileExecuter.ConfigureConverter(IMultiFileConverter multiFileConverter, Language targetLanguage)</StackTraceString>
    <RemoteStackTraceString xsi:null="1"/>
    <RemoteStackIndex>0</RemoteStackIndex>
    <ExceptionMethod id="ref-14">8
    HandleTranslationProviderException
    Sdl.ProjectAutomation.FileBased, Version=15.0.0.0, Culture=neutral, PublicKeyToken=c28cdb26c445c888
    Sdl.ProjectAutomation.FileBased.Internal.AutomationServerEvents
    Void HandleTranslationProviderException(Sdl.ProjectApi.TranslationProviderItem, System.Exception)</ExceptionMethod>
    <HResult>-2146233088</HResult>
    <Source id="ref-15">Sdl.ProjectAutomation.FileBased</Source>
    <WatsonBuckets xsi:null="1"/>
    </a3:ProjectAutomationException>
    <a4:ArgumentException id="ref-12" xmlns:a4="http://schemas.microsoft.com/clr/ns/System">
    <ClassName id="ref-16">System.ArgumentException</ClassName>
    <Message id="ref-17">No translation provider factory found for uri 'mtenhancedprovider:///?sendplaintextonly=False&selectedprovider=Microsoft+Translator&usecatid=False&catid=&resenddrafts=False&usepreedit=False&usepostedit=False&prelookupfilename=&postlookupfilename='.</Message>
    <Data xsi:null="1"/>
    <InnerException xsi:null="1"/>
    <HelpURL xsi:null="1"/>
    <StackTraceString id="ref-18">   at Sdl.LanguagePlatform.TranslationMemoryApi.TranslationProviderManager.CreateTranslationProvider(Uri translationProviderUri, String translationProviderState, ITranslationProviderCredentialStore credentialStore)
       at Sdl.ProjectApi.TranslationProviderCache.CreateTranslationProvider(Uri translationProviderUri, String translationProviderState, ITranslationProviderCredentialStore credentialStore)
       at Sdl.ProjectApi.TranslationProviderCache.GetTranslationProvider(Uri translationProviderUri, String translationProviderState, ITranslationProviderCredentialStore credentialStore, Boolean performUpdate, Boolean refreshCache)
       at Sdl.ProjectApi.Helpers.ProjectCascadeFactory.GetTranslationProviderLanguageDirection(TranslationProviderItem translationProviderItem, LanguagePair languageDirection, Boolean performUpdate, Boolean refreshCache)</StackTraceString>
    <RemoteStackTraceString xsi:null="1"/>
    <RemoteStackIndex>0</RemoteStackIndex>
    <ExceptionMethod id="ref-19">8
    CreateTranslationProvider
    Sdl.LanguagePlatform.TranslationMemoryApi, Version=15.0.0.0, Culture=neutral, PublicKeyToken=c28cdb26c445c888
    Sdl.LanguagePlatform.TranslationMemoryApi.TranslationProviderManager
    Sdl.LanguagePlatform.TranslationMemoryApi.ITranslationProvider CreateTranslationProvider(System.Uri, System.String, Sdl.LanguagePlatform.TranslationMemoryApi.ITranslationProviderCredentialStore)</ExceptionMethod>
    <HResult>-2147024809</HResult>
    <Source id="ref-20">Sdl.LanguagePlatform.TranslationMemoryApi</Source>
    <WatsonBuckets xsi:null="1"/>
    <ParamName xsi:null="1"/>
    </a4:ArgumentException>
    </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>

Reply
  • it is really a bad, really bad experience for using this plugin via code, always outputting the error: 

      <ExceptionData><SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <SOAP-ENV:Body>
    <a1:ProjectApiException id="ref-1" xmlns:a1="http://schemas.microsoft.com/clr/nsassem/Sdl.ProjectApi/Sdl.ProjectApi%2C%20Version%3D15.1.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dc28cdb26c445c888">
    <ClassName id="ref-4">Sdl.ProjectApi.ProjectApiException</ClassName>
    <Message id="ref-5">Unexpected exception when configuring file multiFileConverter for task 'Pre-translate Files': Failed to create an instance of translation provider 'mtenhancedprovider:///?sendplaintextonly=False&selectedprovider=Microsoft+Translator&usecatid=False&catid=&resenddrafts=False&usepreedit=False&usepostedit=False&prelookupfilename=&postlookupfilename='..</Message>
    <Data xsi:null="1"/>
    <InnerException href="#ref-6"/>
    <HelpURL xsi:null="1"/>
    <StackTraceString id="ref-7">   at Sdl.ProjectApi.Implementation.TaskExecution.ContentProcessingTaskImplementation.TaskFileExecuter.ConfigureConverter(IMultiFileConverter multiFileConverter, Language targetLanguage)
       at Sdl.ProjectApi.Implementation.TaskExecution.ContentProcessingTaskImplementation.TaskFileExecuter.CreateMultiFileConverter(IProjectFile tf, String filePath)
       at Sdl.ProjectApi.Implementation.TaskExecution.ContentProcessingTaskImplementation.TaskFileExecuter.Parse(String targetFilePath)</StackTraceString>
    <RemoteStackTraceString xsi:null="1"/>
    <RemoteStackIndex>0</RemoteStackIndex>
    <ExceptionMethod id="ref-8">8
    ConfigureConverter
    Sdl.ProjectApi.Implementation, Version=15.1.0.0, Culture=neutral, PublicKeyToken=c28cdb26c445c888
    Sdl.ProjectApi.Implementation.TaskExecution.ContentProcessingTaskImplementation+TaskFileExecuter
    Void ConfigureConverter(Sdl.FileTypeSupport.Framework.IntegrationApi.IMultiFileConverter, Sdl.Core.Globalization.Language)</ExceptionMethod>
    <HResult>-2146233088</HResult>
    <Source id="ref-9">Sdl.ProjectApi.Implementation</Source>
    <WatsonBuckets xsi:null="1"/>
    </a1:ProjectApiException>
    <a3:ProjectAutomationException id="ref-6" xmlns:a3="http://schemas.microsoft.com/clr/nsassem/Sdl.ProjectAutomation.Core/Sdl.ProjectAutomation.Core%2C%20Version%3D15.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dc28cdb26c445c888">
    <ClassName id="ref-10">Sdl.ProjectAutomation.Core.ProjectAutomationException</ClassName>
    <Message id="ref-11">Failed to create an instance of translation provider 'mtenhancedprovider:///?sendplaintextonly=False&selectedprovider=Microsoft+Translator&usecatid=False&catid=&resenddrafts=False&usepreedit=False&usepostedit=False&prelookupfilename=&postlookupfilename='.</Message>
    <Data xsi:null="1"/>
    <InnerException href="#ref-12"/>
    <HelpURL xsi:null="1"/>
    <StackTraceString id="ref-13">   at Sdl.ProjectAutomation.FileBased.Internal.AutomationServerEvents.HandleTranslationProviderException(TranslationProviderItem translationProviderItem, Exception exception)
       at Sdl.ProjectApi.Helpers.ProjectCascadeFactory.GetTranslationProviderLanguageDirection(TranslationProviderItem translationProviderItem, LanguagePair languageDirection, Boolean performUpdate, Boolean refreshCache)
       at Sdl.ProjectApi.Helpers.ProjectCascadeFactory.CreateProjectCascadeEntries(IList`1 projectCascadeEntryDataList, LanguagePair languagePair, Boolean readOnly, Boolean refreshCache)
       at Sdl.ProjectApi.Helpers.ProjectCascadeFactory.CreateCascade(ProjectCascadeSettings projectCascadeSettings, Boolean refreshCache)
       at Sdl.ProjectApi.Helpers.LanguageDirectionHelper.CreateCascade(ILanguageDirection languageDirection, ProjectCascadeEntryDataFilterFunction filter, IComparer`1 sort, Boolean readOnly, Boolean refreshCache)
       at Sdl.ProjectApi.Helpers.LanguageObjectsCache.GetLanguageResources(ILanguageDirection languageDirection)
       at Sdl.ProjectApi.Helpers.LanguageObjectsCache.<>c__DisplayClass3_0.<GetLanguageResources>b__0()
       at Sdl.ProjectApi.Helpers.LanguageObjectsCache.GetOrCreateObject(String key, Func`1 createObject)
       at Sdl.ProjectApi.Helpers.LanguageObjectsCache.GetLanguageResources(IProject project, Language language)
       at Sdl.ProjectApi.Helpers.LanguageObjectsCache.GetLanguageResources(ITranslatableFile file)
       at Sdl.ProjectApi.AutomaticTasks.AbstractContentProcessorTaskImplementation.AddSegmentorToConverter(IExecutingTaskFile executingTaskFile, IBilingualProcessorContainer multiFileConverter)
       at Sdl.ProjectApi.AutomaticTasks.AbstractTmContentProcessorTaskImplementation.ConfigureConverter(IExecutingTaskFile executingTaskFile, IMultiFileConverter multiFileConverter)
       at Sdl.ProjectApi.AutomaticTasks.Translate.TranslateTask.ConfigureConverter(IExecutingTaskFile executingTaskFile, IMultiFileConverter multiFileConverter)
       at Sdl.ProjectApi.Implementation.TaskExecution.ContentProcessingTaskImplementation.TaskFileExecuter.ConfigureConverter(IMultiFileConverter multiFileConverter, Language targetLanguage)</StackTraceString>
    <RemoteStackTraceString xsi:null="1"/>
    <RemoteStackIndex>0</RemoteStackIndex>
    <ExceptionMethod id="ref-14">8
    HandleTranslationProviderException
    Sdl.ProjectAutomation.FileBased, Version=15.0.0.0, Culture=neutral, PublicKeyToken=c28cdb26c445c888
    Sdl.ProjectAutomation.FileBased.Internal.AutomationServerEvents
    Void HandleTranslationProviderException(Sdl.ProjectApi.TranslationProviderItem, System.Exception)</ExceptionMethod>
    <HResult>-2146233088</HResult>
    <Source id="ref-15">Sdl.ProjectAutomation.FileBased</Source>
    <WatsonBuckets xsi:null="1"/>
    </a3:ProjectAutomationException>
    <a4:ArgumentException id="ref-12" xmlns:a4="http://schemas.microsoft.com/clr/ns/System">
    <ClassName id="ref-16">System.ArgumentException</ClassName>
    <Message id="ref-17">No translation provider factory found for uri 'mtenhancedprovider:///?sendplaintextonly=False&selectedprovider=Microsoft+Translator&usecatid=False&catid=&resenddrafts=False&usepreedit=False&usepostedit=False&prelookupfilename=&postlookupfilename='.</Message>
    <Data xsi:null="1"/>
    <InnerException xsi:null="1"/>
    <HelpURL xsi:null="1"/>
    <StackTraceString id="ref-18">   at Sdl.LanguagePlatform.TranslationMemoryApi.TranslationProviderManager.CreateTranslationProvider(Uri translationProviderUri, String translationProviderState, ITranslationProviderCredentialStore credentialStore)
       at Sdl.ProjectApi.TranslationProviderCache.CreateTranslationProvider(Uri translationProviderUri, String translationProviderState, ITranslationProviderCredentialStore credentialStore)
       at Sdl.ProjectApi.TranslationProviderCache.GetTranslationProvider(Uri translationProviderUri, String translationProviderState, ITranslationProviderCredentialStore credentialStore, Boolean performUpdate, Boolean refreshCache)
       at Sdl.ProjectApi.Helpers.ProjectCascadeFactory.GetTranslationProviderLanguageDirection(TranslationProviderItem translationProviderItem, LanguagePair languageDirection, Boolean performUpdate, Boolean refreshCache)</StackTraceString>
    <RemoteStackTraceString xsi:null="1"/>
    <RemoteStackIndex>0</RemoteStackIndex>
    <ExceptionMethod id="ref-19">8
    CreateTranslationProvider
    Sdl.LanguagePlatform.TranslationMemoryApi, Version=15.0.0.0, Culture=neutral, PublicKeyToken=c28cdb26c445c888
    Sdl.LanguagePlatform.TranslationMemoryApi.TranslationProviderManager
    Sdl.LanguagePlatform.TranslationMemoryApi.ITranslationProvider CreateTranslationProvider(System.Uri, System.String, Sdl.LanguagePlatform.TranslationMemoryApi.ITranslationProviderCredentialStore)</ExceptionMethod>
    <HResult>-2147024809</HResult>
    <Source id="ref-20">Sdl.LanguagePlatform.TranslationMemoryApi</Source>
    <WatsonBuckets xsi:null="1"/>
    <ParamName xsi:null="1"/>
    </a4:ArgumentException>
    </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>

Children
No Data