コード例 #1
0
        public SearchResults[] SearchTranslationUnitsMasked(SearchSettings settings, TranslationUnit[] translationUnits,
                                                            bool[] mask)
        {
            var sdlMtFileAndSegmentIds = new FileAndSegmentIds
            {
                FilePath = GetSdlXliffFilePath(translationUnits[0].FileProperties) ??
                           Path.GetFileName(translationUnits[0]?.FileProperties.FileConversionProperties.OriginalFilePath),
                Segments = translationUnits.ToDictionary(tu => tu.DocumentSegmentPair.Properties.Id, tu => tu.SourceSegment.ToString())
            };

            if (translationUnits == null)
            {
                throw new ArgumentNullException(nameof(translationUnits), @"TranslationUnits in SearchSegmentsMasked");
            }

            if (mask == null || mask.Length != translationUnits.Length)
            {
                throw new ArgumentException("Mask in SearchSegmentsMasked");
            }

            _translationUnits.Clear();
            _translationUnits.AddRange(translationUnits);

            return(SearchSegments(translationUnits.Select(tu => tu?.SourceSegment).ToArray(), mask, sdlMtFileAndSegmentIds));
        }
コード例 #2
0
        private static void RemoveSegmentsThatMustNotBeTranslated(FileAndSegmentIds fileAndSegmentIds, List <MTCloudSegment> mtCloudSegments)
        {
            var segmentEntries = new List <(SegmentId, string)>();

            foreach (var index in mtCloudSegments.Select(seg => seg.Index))
            {
                var segmentId = fileAndSegmentIds.Segments.Keys.ElementAt((int)index);
                segmentEntries.Add((segmentId, fileAndSegmentIds.Segments[segmentId]));
            }

            fileAndSegmentIds.Segments = segmentEntries.ToDictionary(se => se.Item1, se => se.Item2);
        }
コード例 #3
0
        public Segment[] TranslateSegments(Segment[] sourceSegments, FileAndSegmentIds fileAndSegmentIds)
        {
            var xliffDocument = CreateXliffFile(sourceSegments);

            var model = _translationProvider.Options.LanguageMappings?.FirstOrDefault(l =>
                                                                                      l.SourceTradosCode.Equals(_languageDirection?.SourceCulture?.Name, StringComparison.InvariantCultureIgnoreCase) &&
                                                                                      l.TargetTradosCode.Equals(_languageDirection?.TargetCulture?.Name, StringComparison.InvariantCultureIgnoreCase));

            var targetSegments = Task.Run(async() => await _translationProvider.TranslationService.TranslateText(
                                              xliffDocument.ToString(), model, fileAndSegmentIds)).Result;

            return(targetSegments ?? new Segment[0]);
        }
コード例 #4
0
        private bool GetTranslations(IReadOnlyList <MTCloudSegment> mtCloudSegments, FileAndSegmentIds fileAndSegmentIds)
        {
            var translations = TranslateSegments(mtCloudSegments.Select(segment => segment.Segment).ToArray(), fileAndSegmentIds);

            if (translations.Any() && translations[0] != null)
            {
                for (var i = 0; i < mtCloudSegments.Count; i++)
                {
                    mtCloudSegments[i].Translation  = translations[i];
                    mtCloudSegments[i].SearchResult = CreateSearchResult(mtCloudSegments[i].Segment, translations[i]);
                }

                return(true);
            }

            return(false);
        }
コード例 #5
0
        public async Task <Segment[]> TranslateText(string text, LanguageMappingModel model, FileAndSegmentIds fileAndSegments)
        {
            if (string.IsNullOrEmpty(model?.SelectedModel?.Model))
            {
                throw new Exception(PluginResources.Message_No_model_selected);
            }

            CheckConnection();

            var uri     = new Uri($"{Constants.MTCloudTranslateAPIUri}/v4/mt/translations/async");
            var request = GetRequestMessage(HttpMethod.Post, uri);

            var engineModel             = model.SelectedModel.Model;
            var translationRequestModel = new TranslationRequest
            {
                Input             = new[] { text },
                SourceLanguageId  = model.SelectedSource.CodeName,
                TargetLanguageId  = model.SelectedTarget.CodeName,
                Model             = engineModel,
                InputFormat       = "xliff",
                QualityEstimation = engineModel.ToLower().Contains("qe") ? 1 : 0
            };

            if (!model.SelectedDictionary.Name.Equals(PluginResources.Message_No_dictionary_available) &&
                !model.SelectedDictionary.Name.Equals(PluginResources.Message_No_dictionary))
            {
                translationRequestModel.Dictionaries = new[] { model.SelectedDictionary?.DictionaryId };
            }

            var content = JsonConvert.SerializeObject(translationRequestModel);

            request.Content = new StringContent(content, new UTF8Encoding(), "application/json");

            var response = await _httpClient.SendRequest(request);

            var translationResponse = await _httpClient.GetResult <TranslationResponse>(response);

            if (response is null)
            {
                return(null);
            }

            var responseMessage = await CheckTranslationStatus(translationResponse?.RequestId);

            var translations = await _httpClient.GetResult <TranslationResponse>(responseMessage);

            var translation = translations?.Translation?.FirstOrDefault();

            if (translation == null)
            {
                return(null);
            }

            var translatedXliff = Converter.ParseXliffString(translation);

            if (translatedXliff == null)
            {
                return(null);
            }

            var targetSegments = translatedXliff.GetTargetSegments();
            var segmentIds     = fileAndSegments.Segments.Keys.ToList();

            OnTranslationReceived(new TranslationData
            {
                TargetSegments =
                    segmentIds.Select((segmentId, index) => (segmentId, target: targetSegments[index].Segment.ToString())).ToDictionary(
                        x => x.segmentId,
                        x => x.target),
                TranslationOriginData = new TranslationOriginData
                {
                    Model = translations.Model,
                    QualityEstimations = segmentIds.Select((segmentId, index) => (segmentId, targetSegments[index].QualityEstimation))
コード例 #6
0
        /// <summary>
        /// Translate an array of segments.
        /// </summary>
        /// <param name="segments">Array of segments to be translated (depending on the value of the
        ///     corresponding mask)</param>
        /// <param name="mask">Whether to translate a segment or not</param>
        /// <param name="fileAndSegmentIds"></param>
        /// <param name="settings"></param>
        /// <returns></returns>
        public SearchResults[] SearchSegments(Segment[] segments, bool[] mask, FileAndSegmentIds fileAndSegmentIds = null)
        {
            var results                   = new SearchResults[segments.Length];
            var mtCloudSegments           = new List <MTCloudSegment>();
            var alreadyTranslatedSegments = new List <MTCloudSegment>();

            if (!_translationProvider.Options.ResendDraft)
            {
                // Re-send draft segment logic
                for (var segmentIndex = 0; segmentIndex < segments.Length; segmentIndex++)
                {
                    if (mask != null && !mask[segmentIndex])
                    {
                        results[segmentIndex] = null;
                        fileAndSegmentIds?.Segments.Remove(fileAndSegmentIds.Segments.Keys.ElementAt(segmentIndex));
                        continue;
                    }
                    var existsMergedSegments = CheckMergedSegments(results, CurrentSegmentPair, segmentIndex);
                    if (existsMergedSegments)
                    {
                        continue;
                    }

                    // Set translation unit based on segment index: when the first 10 segments are translated for the first time,
                    // then the TU index is the same as segment index
                    var correspondingTu = _translationUnits[segmentIndex];
                    var currentSegment  = correspondingTu.TargetSegment == null
                                                ? CurrentSegmentPair
                                                : correspondingTu.DocumentSegmentPair;

                    if (IsDraftOrTranslated(currentSegment) && !IsTargetEqualToSource(currentSegment))
                    {
                        alreadyTranslatedSegments.Add(CreateTranslatedSegment(segments, segmentIndex));
                    }
                    else
                    {
                        mtCloudSegments.Add(CreateMTCloudSegments(segments, segmentIndex));
                    }
                }

                if (mtCloudSegments.Count > 0)
                {
                    var hasTranslations = GetTranslations(mtCloudSegments, fileAndSegmentIds);
                    if (hasTranslations)
                    {
                        SetSearchResults(results, mtCloudSegments);
                    }
                }

                if (alreadyTranslatedSegments.Count > 0)
                {
                    SetSearchResults(results, alreadyTranslatedSegments);
                }
            }
            else
            {
                var translations = TranslateSegments(segments.ToArray(), fileAndSegmentIds);

                if (translations.Any(translation => translation != null))
                {
                    var translationIndex = 0;
                    for (var i = 0; i < segments.Length; i++)
                    {
                        results[i] = new SearchResults();
                        if (segments[i] != null)
                        {
                            results[i].SourceSegment = segments[i].Duplicate();
                            results[i].Add(CreateSearchResult(segments[i], translations[translationIndex]));
                            translationIndex++;
                        }
                        else
                        {
                            results[i].SourceSegment = new Segment();
                            results[i].Add(CreateSearchResult(new Segment(), new Segment()));
                        }
                    }
                }
            }

            return(results);
        }
コード例 #7
0
        /// <summary>
        /// Translate an array of segments.
        /// </summary>
        /// <param name="segments">Array of segments to be translated (depending on the value of the
        ///     corresponding mask)</param>
        /// <param name="mask">Whether to translate a segment or not</param>
        /// <param name="fileAndSegmentIds"></param>
        /// <param name="settings"></param>
        /// <returns></returns>
        public SearchResults[] SearchSegments(Segment[] segments, bool[] mask, FileAndSegmentIds fileAndSegmentIds = null)
        {
            var results                   = new SearchResults[segments.Length];
            var mtCloudSegments           = new List <MTCloudSegment>();
            var alreadyTranslatedSegments = new List <MTCloudSegment>();

            if (!_translationProvider.Options.ResendDraft)
            {
                // Re-send draft segment logic
                for (var segmentIndex = 0; segmentIndex < segments.Length; segmentIndex++)
                {
                    if (mask != null && !mask[segmentIndex])
                    {
                        results[segmentIndex] = null;
                        continue;
                    }

                    var activeSegmentPair    = _editorController?.ActiveDocument?.ActiveSegmentPair;
                    var existsMergedSegments = CheckMergedSegments(results, activeSegmentPair, segmentIndex);
                    if (existsMergedSegments)
                    {
                        continue;
                    }

                    // Set translation unit based on segment index: when the first 10 segments are translated for the first time,
                    // then the TU index is the same as segment index
                    var correspondingTu = _translationUnits[segmentIndex];

                    // If activeSegmentPair is not null, it means the user translates segments through Editor
                    // If activeSegmentPair is null, it means the user executes Pre-Translate Batch task, so he does not navigate through segments in editor
                    var documentLastOpenPath = _translationUnits[0]?.DocumentProperties?.LastOpenedAsPath;
                    if (documentLastOpenPath == null || documentLastOpenPath.Equals(_editorController?.ActiveDocument?.ActiveFile?.LocalFilePath))
                    {
                        if (activeSegmentPair != null && (activeSegmentPair.Target.Count > 0 || activeSegmentPair.Properties.IsLocked))
                        {
                            alreadyTranslatedSegments.Add(CreateTranslatedSegment(segments, segmentIndex));
                        }
                        // In case user copies the source to target and run the pre-translation, do nothing and continue the flow.
                        else if (correspondingTu != null && IsSameSourceTarget(correspondingTu))
                        {
                            // do nothing
                        }
                        // If is already translated or is locked, then the request to server should not be done and it should not be translated
                        else if (activeSegmentPair == null && correspondingTu != null && (correspondingTu.DocumentSegmentPair.Target.Count > 0 || correspondingTu.DocumentSegmentPair.Properties.IsLocked))
                        {
                            alreadyTranslatedSegments.Add(CreateTranslatedSegment(segments, segmentIndex));
                        }
                        else
                        {
                            mtCloudSegments.Add(CreateMTCloudSegments(segments, segmentIndex));
                        }
                    }
                    else
                    {
                        mtCloudSegments.Add(CreateMTCloudSegments(segments, segmentIndex));
                    }
                }

                if (mtCloudSegments.Count > 0)
                {
                    var hasTranslations = GetTranslations(mtCloudSegments, fileAndSegmentIds);
                    if (hasTranslations)
                    {
                        SetSearchResults(results, mtCloudSegments);
                    }
                }

                if (alreadyTranslatedSegments.Count > 0)
                {
                    SetSearchResults(results, alreadyTranslatedSegments);
                }
            }
            else
            {
                var translations = TranslateSegments(segments.ToArray(), fileAndSegmentIds);

                if (translations.Any(translation => translation != null))
                {
                    var translationIndex = 0;
                    for (var i = 0; i < segments.Length; i++)
                    {
                        results[i] = new SearchResults();
                        if (segments[i] != null)
                        {
                            results[i].SourceSegment = segments[i].Duplicate();
                            results[i].Add(CreateSearchResult(segments[i], translations[translationIndex]));
                            translationIndex++;
                        }
                        else
                        {
                            results[i].SourceSegment = new Segment();
                            results[i].Add(CreateSearchResult(new Segment(), new Segment()));
                        }
                    }
                }
            }

            return(results);
        }