コード例 #1
0
        /// <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);
        }
コード例 #2
0
        /// <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);
        }