From d983661fb56ccd35b68d2d10b611afec530d6fa6 Mon Sep 17 00:00:00 2001 From: Emanuel Albu Date: Sat, 19 Oct 2024 18:48:17 +0300 Subject: [PATCH] Language Weaver Provider 2.0.3.1 - CRQ-40112: Standalone app support - TQE metadata --- .../Extensions/TranslationOriginExtension.cs | 6 +- .../LanguageWeaverProvider.csproj | 2 +- .../Model/StandaloneCredentials.cs | 22 +++--- .../Services/CredentialManager.cs | 2 +- .../BatchTask/ApplyMetadataProcessor.cs | 2 +- .../ViewModel/FeedbackViewModel.cs | 2 +- .../TranslationProviderLanguageDirection.cs | 72 +++++++++++-------- 7 files changed, 66 insertions(+), 42 deletions(-) diff --git a/LanguageWeaverProvider/Extensions/TranslationOriginExtension.cs b/LanguageWeaverProvider/Extensions/TranslationOriginExtension.cs index 4965dae06..5007de567 100644 --- a/LanguageWeaverProvider/Extensions/TranslationOriginExtension.cs +++ b/LanguageWeaverProvider/Extensions/TranslationOriginExtension.cs @@ -1,4 +1,5 @@ using LanguageWeaverProvider.Model; +using Sdl.FileTypeSupport.Framework.Core.Utilities.NativeApi; using Sdl.FileTypeSupport.Framework.NativeApi; using System; using System.Collections.Generic; @@ -16,7 +17,7 @@ public static class TranslationOriginExtension public static int GetLastTqeIndex(this ITranslationOrigin translationOrigin) { - var lastIndex = 1; + var lastIndex = 0; while (translationOrigin.MetaDataContainsKey(Constants.METADATA_EVALUATED_AT_PREFIX + (lastIndex + 1))) { lastIndex++; @@ -28,6 +29,9 @@ public static void SetMetaData(this ITranslationOrigin translationOrigin, Transl { var evaluationTime = DateTime.Now.ToUniversalTime(); + + + if (!string.IsNullOrWhiteSpace(translationData.QualityEstimation)) { translationOrigin.StoreTQEDataInMetaData(translationData.Index, Constants.METADATA_EVALUATED_AT_PREFIX, diff --git a/LanguageWeaverProvider/LanguageWeaverProvider.csproj b/LanguageWeaverProvider/LanguageWeaverProvider.csproj index 64872bc29..7a2d1c7b7 100644 --- a/LanguageWeaverProvider/LanguageWeaverProvider.csproj +++ b/LanguageWeaverProvider/LanguageWeaverProvider.csproj @@ -16,7 +16,7 @@ $(AppData)\Trados\Trados Studio\18\Plugins - C:\Code\SDL\Trados\Bin\Mixed Platforms\Debug + $(MSBuildProgramFiles32)\Trados\Trados Studio\Studio18 diff --git a/LanguageWeaverProvider/Model/StandaloneCredentials.cs b/LanguageWeaverProvider/Model/StandaloneCredentials.cs index 76fab2574..6e87a6bf7 100644 --- a/LanguageWeaverProvider/Model/StandaloneCredentials.cs +++ b/LanguageWeaverProvider/Model/StandaloneCredentials.cs @@ -33,18 +33,24 @@ public AuthenticationType AuthenticationType if (IsCloudCredential) { if (CloudCredentials.ClientID is not null) authenticationType = AuthenticationType.CloudAPI; - if (CloudCredentials.UserPassword is not null) authenticationType = AuthenticationType.CloudCredentials; - if (CloudCredentials.ConnectionCode is not null) authenticationType = AuthenticationType.CloudSSO; - - if (authenticationType != AuthenticationType.None) EdgeCredentials = null; + else if (CloudCredentials.UserPassword is not null) authenticationType = AuthenticationType.CloudCredentials; + else if (CloudCredentials.ConnectionCode is not null) authenticationType = AuthenticationType.CloudSSO; + + if (authenticationType != AuthenticationType.None) + { + EdgeCredentials = null; + return authenticationType; + } } - + CloudCredentials = null; - if (EdgeCredentials?.Host is not null) return AuthenticationType.EdgeApiKey; - if (EdgeCredentials?.Password is not null) return AuthenticationType.EdgeCredentials; + if (EdgeCredentials?.Host is not null) authenticationType = AuthenticationType.EdgeApiKey; + else if (EdgeCredentials?.Password is not null) authenticationType = AuthenticationType.EdgeCredentials; //if (EdgeCredentials is not null) return AuthenticationType.EdgeSSO; - return AuthenticationType.None; + + if (authenticationType == AuthenticationType.None) EdgeCredentials = null; + return authenticationType; } } diff --git a/LanguageWeaverProvider/Services/CredentialManager.cs b/LanguageWeaverProvider/Services/CredentialManager.cs index e473c84f6..c785657b8 100644 --- a/LanguageWeaverProvider/Services/CredentialManager.cs +++ b/LanguageWeaverProvider/Services/CredentialManager.cs @@ -54,7 +54,7 @@ public static void GetCredentials(ITranslationOptions translationOptions, bool a { var credentialStore = ApplicationInitializer.CredentialStore; - if (standaloneCredentials is not null) + if (ApplicationInitializer.IsStandalone && standaloneCredentials is not null && standaloneCredentials.AuthenticationType != AuthenticationType.None) { translationOptions.PluginVersion = standaloneCredentials.IsCloudCredential ? PluginVersion.LanguageWeaverCloud diff --git a/LanguageWeaverProvider/Studio/BatchTask/ApplyMetadataProcessor.cs b/LanguageWeaverProvider/Studio/BatchTask/ApplyMetadataProcessor.cs index bc7474aef..2470406bd 100644 --- a/LanguageWeaverProvider/Studio/BatchTask/ApplyMetadataProcessor.cs +++ b/LanguageWeaverProvider/Studio/BatchTask/ApplyMetadataProcessor.cs @@ -62,7 +62,7 @@ public override void ProcessParagraphUnit(IParagraphUnit paragraphUnit) ModelName = ratedSegment.ModelName, Model = ratedSegment.Model, AutoSendFeedback = ratedSegment.AutosendFeedback, - Index = translationOrigin.GetLastTqeIndex() + Index = translationOrigin.GetLastTqeIndex() + 1 }; translationOrigin.SetMetaData(translationData); diff --git a/LanguageWeaverProvider/Studio/FeedbackController/ViewModel/FeedbackViewModel.cs b/LanguageWeaverProvider/Studio/FeedbackController/ViewModel/FeedbackViewModel.cs index 03fe2edb7..277ecc685 100644 --- a/LanguageWeaverProvider/Studio/FeedbackController/ViewModel/FeedbackViewModel.cs +++ b/LanguageWeaverProvider/Studio/FeedbackController/ViewModel/FeedbackViewModel.cs @@ -336,7 +336,7 @@ private void SetSavedSegmentMetadata(ISegmentPairProperties segmentProperties) Translation = ratedSegment.Translation, ModelName = ratedSegment.ModelName, AutoSendFeedback = ratedSegment.AutosendFeedback, - Index = translationOrigin.GetLastTqeIndex() + Index = translationOrigin.GetLastTqeIndex() + 1 }; translationOrigin.SetMetaData(translationData); diff --git a/LanguageWeaverProvider/Studio/TranslationProvider/TranslationProviderLanguageDirection.cs b/LanguageWeaverProvider/Studio/TranslationProvider/TranslationProviderLanguageDirection.cs index db7b230f7..d8797a146 100644 --- a/LanguageWeaverProvider/Studio/TranslationProvider/TranslationProviderLanguageDirection.cs +++ b/LanguageWeaverProvider/Studio/TranslationProvider/TranslationProviderLanguageDirection.cs @@ -12,6 +12,7 @@ using LanguageWeaverProvider.XliffConverter.Converter; using LanguageWeaverProvider.XliffConverter.Model; using Sdl.Core.Globalization; +using Sdl.FileTypeSupport.Framework.Core.Utilities.BilingualApi; using Sdl.FileTypeSupport.Framework.NativeApi; using Sdl.LanguagePlatform.Core; using Sdl.LanguagePlatform.TranslationMemory; @@ -19,6 +20,7 @@ using Sdl.TranslationStudioAutomation.IntegrationApi; using TranslationUnit = Sdl.LanguagePlatform.TranslationMemory.TranslationUnit; using Sdl.FileTypeSupport.Framework.Core.Utilities.NativeApi; +using Sdl.FileTypeSupport.Framework.BilingualApi; namespace LanguageWeaverProvider { @@ -143,12 +145,19 @@ public SearchResults[] SearchTranslationUnitsMasked(SearchSettings settings, Tra var translatedSegment = translatedSegments[translatedSegmentsIndex++]; searchResults[i] = new SearchResults { SourceSegment = currentSegment.Duplicate() }; - searchResults[i].Add(CreateSearchResult(currentSegment, translatedSegment)); - var translationOrigin = _currentTranslationUnit.DocumentSegmentPair.Properties.TranslationOrigin; + var tuSearchResult = CreateTuSearchResult(currentSegment, translatedSegment); + + var translationOrigin = tuSearchResult.DocumentSegmentPair.Properties.TranslationOrigin; var lastTqeIndex = translationOrigin is not null ? translationOrigin.GetLastTqeIndex() + 1 : 1; - SetMetadataOnSegment(evaluatedSegment, mappedPair, fileName, lastTqeIndex); + SetMetadataOnSegment(evaluatedSegment, mappedPair, fileName, lastTqeIndex, translationOrigin); + + searchResults[i].Add(new SearchResult(tuSearchResult) + { + ScoringResult = new ScoringResult { BaseScore = 0 }, + TranslationProposal = new TranslationUnit(tuSearchResult) + }); } ManageBatchTaskWindow(); @@ -196,7 +205,14 @@ private SearchResults CreateDraftNotResentSearchResults(Segment segment) targetSegment.Add(PluginResources.TranslationDraftNotResent); var searchResults = new SearchResults { SourceSegment = segment.Duplicate() }; - searchResults.Add(CreateSearchResult(segment, targetSegment)); + var tuSearchResult = CreateTuSearchResult(segment, targetSegment); + + searchResults.Add(new SearchResult(tuSearchResult) + { + ScoringResult = new ScoringResult { BaseScore = 0 }, + TranslationProposal = new TranslationUnit(tuSearchResult) + }); + return searchResults; } @@ -242,11 +258,16 @@ private SearchResult TranslateSegment(Segment segment, Segment sourceSegment) var mappedPair = GetMappedPair(); var translation = CloudService.Translate(_translationOptions.AccessToken, mappedPair, xliff).Result; var translatedSegment = translation.GetTargetSegments().First(); - var searchResult = CreateSearchResult(segment, translatedSegment.Translation); - SetMetadataOnSegment(translatedSegment, mappedPair, null, 1); + var tuSearchResult = CreateTuSearchResult(segment, translatedSegment.Translation); - return searchResult; - } + SetMetadataOnSegment(translatedSegment, mappedPair, null, 1, tuSearchResult.DocumentSegmentPair.Properties.TranslationOrigin); + + return new SearchResult(tuSearchResult) + { + ScoringResult = new ScoringResult { BaseScore = 0 }, + TranslationProposal = new TranslationUnit(tuSearchResult) + }; + } private Xliff CreateXliffFile(IEnumerable segments) { @@ -272,10 +293,9 @@ private Xliff CreateXliffFile(IEnumerable segments) return xliffDocument; } - private void SetMetadataOnSegment(EvaluatedSegment evaluatedSegment, PairMapping pairMapping, string fileName, int index) + private void SetMetadataOnSegment(EvaluatedSegment evaluatedSegment, PairMapping pairMapping, string fileName, + int index, ITranslationOrigin translationOrigin) { - if (ApplicationInitializer.IsStandalone) return; - if (_batchTaskWindow is not null || _currentTranslationUnit.ConfirmationLevel == ConfirmationLevel.Draft) { StoreSegmentMetadata(evaluatedSegment, pairMapping, fileName); @@ -292,16 +312,7 @@ private void SetMetadataOnSegment(EvaluatedSegment evaluatedSegment, PairMapping Index = index }; - var editorController = SdlTradosStudio.Application.GetController(); - if (editorController.ActiveDocument is null) return; - - var currentSegmentId = _currentTranslationUnit.DocumentSegmentPair.Properties.Id; - var currentSegmentPair = editorController.ActiveDocument.SegmentPairs.First(p => p.Properties.Id == currentSegmentId); - - var translationOrigin = currentSegmentPair.Properties.TranslationOrigin; translationOrigin.SetMetaData(translationData); - - editorController.ActiveDocument.UpdateSegmentPairProperties(currentSegmentPair, currentSegmentPair.Properties); } private void StoreSegmentMetadata(EvaluatedSegment evaluatedSegment, PairMapping pairMapping, string fileName) @@ -359,23 +370,26 @@ private PairMapping GetMappedPair() && x.LanguagePair.TargetCultureName.Equals(TargetLanguage.Name)); } - private SearchResult CreateSearchResult(Segment searchSegment, Segment translation) + private TranslationUnit CreateTuSearchResult(Segment searchSegment, Segment translation) { var translationUnit = new TranslationUnit { ConfirmationLevel = ConfirmationLevel.Draft, Origin = TranslationUnitOrigin.Nmt, SourceSegment = searchSegment.Duplicate(), - TargetSegment = translation + TargetSegment = translation }; - translationUnit.ResourceId = new PersistentObjectToken(translationUnit.GetHashCode(), Guid.Empty); - return new SearchResult(translationUnit) - { - ScoringResult = new ScoringResult { BaseScore = 0 }, - TranslationProposal = new TranslationUnit(translationUnit) - }; - } + var itemFactory = DefaultDocumentItemFactory.CreateInstance(); + //var propertyFactory = DefaultPropertiesFactory.CreateInstance(); + + translationUnit.DocumentSegmentPair = _currentTranslationUnit.DocumentSegmentPair; + translationUnit.DocumentSegmentPair.Properties.TranslationOrigin ??= itemFactory.CreateTranslationOrigin(); + translationUnit.ResourceId = new PersistentObjectToken(translationUnit.GetHashCode(), Guid.Empty); + + return translationUnit; + + } #region To finish private List ExtractTranslatableSegments(TranslationUnit[] translationUnits, bool[] mask, SearchResults[] searchResults, List segments)