/// <summary> /// Performs the actual search by looping through the /// delimited segment pairs contained in the text file. /// Depening on the search mode, a segment lookup (with exact machting) or a source / target /// concordance search is done. /// </summary> /// <param name="settings"></param> /// <param name="segment"></param> /// <returns></returns> #region "SearchSegment" public SearchResults SearchSegment(SearchSettings settings, Segment segment) { // Loop through segment elements to 'filter out' e.g. tags in order to // make certain that only plain text information is retrieved for // this simplified implementation. #region "SegmentElements" _visitor.Reset(); foreach (var element in segment.Elements) { element.AcceptSegmentElementVisitor(_visitor); } #endregion #region "SearchResultsObject" var results = new SearchResults(); results.SourceSegment = segment.Duplicate(); #endregion #region | Taus.TM.Provider | var tausTmProvider = new Processor(); var searchSettings = new Sdl.Community.Taus.TM.Provider.Settings.SearchSettings { Timeout = Convert.ToInt32(_options.SearchTimeout), AppKey = _options.ConnectionAppKey, UserName = _options.ConnectionUserName, Password = _options.ConnectionUserPassword, AuthKey = _options.ConnectionAuthKey, Limit = settings.MaxResults }; searchSettings.SearchSections.Add(new SegmentSection(true, _visitor.PlainText)); if (settings.Mode == SearchMode.TargetConcordanceSearch) { searchSettings.SourceLanguageId = _languageDirection.TargetCultureName; searchSettings.TargetLanguageId = _languageDirection.SourceCultureName; } else { searchSettings.SourceLanguageId = _languageDirection.SourceCultureName; searchSettings.TargetLanguageId = _languageDirection.TargetCultureName; } searchSettings.IndustryId = Convert.ToInt64(_options.SearchCriteriaIndustryId) > 0 ? _options.SearchCriteriaIndustryId : string.Empty; searchSettings.ContentTypeId = Convert.ToInt64(_options.SearchCriteriaContentTypeId) > 0 ? _options.SearchCriteriaContentTypeId : string.Empty; searchSettings.ProviderId = Convert.ToInt64(_options.SearchCriteriaProviderId) > 0 ? _options.SearchCriteriaProviderId : string.Empty; searchSettings.OwnerId = Convert.ToInt64(_options.SearchCriteriaOwnerId) > 0 ? _options.SearchCriteriaOwnerId : string.Empty; searchSettings.ProductId = Convert.ToInt64(_options.SearchCriteriaProductId) > 0 ? _options.SearchCriteriaProductId : string.Empty; searchSettings.PenaltySettings.MissingFormattingPenalty = 1; searchSettings.PenaltySettings.DifferentFormattingPenalty = 1; var scoreType = Processor.ScoreType.Concordance; if (settings.Mode == SearchMode.NormalSearch) { scoreType = Processor.ScoreType.Lookup; } var searchResult = tausTmProvider.SearchSegment(searchSettings, scoreType); #endregion switch (searchResult.Status) { case "timed out": //ignore break; case "200": foreach (var searchResultSegment in searchResult.Segments) { #region "TargetConcordanceSearch" switch (settings.Mode) { case SearchMode.TargetConcordanceSearch: { var resultSegment = new Sdl.Community.Taus.TM.Provider.Segment.Segment(); resultSegment.ContentType = searchResultSegment.ContentType; resultSegment.Id = searchResultSegment.Id; resultSegment.Industry = searchResultSegment.Industry; resultSegment.MatchPercentage = searchResultSegment.MatchPercentage; resultSegment.Owner = searchResultSegment.Owner; resultSegment.Product = searchResultSegment.Product; resultSegment.Provider = searchResultSegment.Provider; resultSegment.SourceLanguage = searchResultSegment.TargetLanguage; resultSegment.TargetLanguage = searchResultSegment.SourceLanguage; resultSegment.SourceSections = searchResultSegment.TargetSections; resultSegment.TargetSections = searchResultSegment.SourceSections; resultSegment.SourceText = searchResultSegment.TargetText; resultSegment.TargetText = searchResultSegment.SourceText; var result = CreateSearchResult(settings, segment, resultSegment, _visitor.PlainText, false); if (result != null) { results.Add(result); } } break; case SearchMode.ConcordanceSearch: { var result = CreateSearchResult(settings, segment, searchResultSegment, _visitor.PlainText, false); if (result != null) { results.Add(result); } } break; case SearchMode.NormalSearch: { var result = CreateSearchResult(settings, segment, searchResultSegment, _visitor.PlainText, segment.HasTags); if (result != null) { results.Add(result); } } break; } #endregion } break; default: throw new Exception(string.Format("Query Exception: Status={0}, Reason={1}", searchResult.Status, searchResult.Reason)); } return(results); }
/// <summary> /// Creates the translation unit as it is later shown in the Translation Results /// window of SDL Trados Studio. This member also determines the match score /// (in our implementation always 100%, as only exact matches are supported) /// as well as the confirmation lelvel, i.e. Translated. /// </summary> /// <param name="settings"></param> /// <param name="searchSegment"></param> /// <param name="searchResultSegment"></param> /// <param name="sourceSegment"></param> /// <param name="formattingPenalty"></param> /// <returns></returns> #region "CreateSearchResult" private SearchResult CreateSearchResult(SearchSettings settings, Segment searchSegment, Sdl.Community.Taus.TM.Provider.Segment.Segment searchResultSegment, string sourceSegment, bool formattingPenalty) { #region "TranslationUnit" var tu = new TranslationUnit(); var searchSegmentSource = new Segment(); var searchSegmentTarget = new Segment(); searchSegmentSource.Add(searchResultSegment.SourceText); searchSegmentTarget.Add(searchResultSegment.TargetText); tu.SourceSegment = searchSegmentSource; tu.TargetSegment = searchSegmentTarget; tu.ResourceId = new PersistentObjectToken(tu.GetHashCode(), Guid.Empty); #endregion #region "TuProperties" var score = Convert.ToInt32(searchResultSegment.MatchPercentage); tu.Origin = TranslationUnitOrigin.TM; #region | properties | if (searchResultSegment.Industry.Name.Trim() != string.Empty) { var fieldValue = new MultiplePicklistFieldValue("industry"); fieldValue.Add(searchResultSegment.Industry.Name + " [" + searchResultSegment.Industry.Id + "]"); tu.FieldValues.Add(fieldValue); } if (searchResultSegment.ContentType.Name.Trim() != string.Empty) { var fieldValue = new MultiplePicklistFieldValue("contentType"); fieldValue.Add(searchResultSegment.ContentType.Name + " [" + searchResultSegment.ContentType.Id + "]"); tu.FieldValues.Add(fieldValue); } if (searchResultSegment.Owner.Name.Trim() != string.Empty) { var fieldValue = new MultiplePicklistFieldValue("owner"); fieldValue.Add(searchResultSegment.Owner.Name + " [" + searchResultSegment.Owner.Id + "]"); tu.FieldValues.Add(fieldValue); } if (searchResultSegment.Product.Name.Trim() != string.Empty) { var fieldValue = new MultiplePicklistFieldValue("product"); fieldValue.Add(searchResultSegment.Product.Name + " [" + searchResultSegment.Product.Id + "]"); tu.FieldValues.Add(fieldValue); } if (searchResultSegment.Provider.Name.Trim() != string.Empty) { var fieldValue = new MultiplePicklistFieldValue("provider"); fieldValue.Add(searchResultSegment.Provider.Name + " [" + searchResultSegment.Provider.Id + "]"); tu.FieldValues.Add(fieldValue); } #endregion var searchResult = new SearchResult(tu) { ScoringResult = new ScoringResult { BaseScore = score } }; if (settings.Mode == SearchMode.ConcordanceSearch) { searchSegmentSource.Tokens = Tokenize(searchSegmentSource); searchResult.ScoringResult.MatchingConcordanceRanges = CollectConcordanceMatchRanges(searchSegmentSource, _visitor.PlainText); } else if (settings.Mode == SearchMode.TargetConcordanceSearch) { searchSegmentTarget.Tokens = Tokenize(searchSegmentTarget); searchResult.ScoringResult.MatchingConcordanceRanges = CollectConcordanceMatchRanges(searchSegmentTarget, _visitor.PlainText); } var providerPenalty = settings.FindPenalty(PenaltyType.ProviderPenalty); if (providerPenalty != null && providerPenalty.Malus > 0) { var penalty = new Penalty(PenaltyType.ProviderPenalty, settings.FindPenalty(PenaltyType.ProviderPenalty).Malus); searchResult.ScoringResult.ApplyPenalty(penalty); } if (searchResult.ScoringResult.BaseScore >= settings.MinScore) { searchResult.TranslationProposal = searchResult.MemoryTranslationUnit; if (searchSegment.HasTags) { #region "Draft" tu.ConfirmationLevel = ConfirmationLevel.Draft; #endregion #region "FormattingPenalty" var penalty = new Penalty(PenaltyType.MemoryTagsDeleted, settings.FindPenalty(PenaltyType.MemoryTagsDeleted).Malus); searchResult.ScoringResult.ApplyPenalty(penalty); #endregion } else { tu.ConfirmationLevel = ConfirmationLevel.Translated; } } else { searchResult = null; } #endregion return(searchResult); }