private bool CreateWizardContext(AbstractController controller, out string message)
        {
            _wizardContext = new WizardContext(_action, _settings);

            message = string.Empty;

            if (controller is ProjectsController || controller is FilesController)
            {
                var selectedProject = _controllers.ProjectsController.SelectedProjects.FirstOrDefault()
                                      ?? _controllers.ProjectsController.CurrentProject;

                _wizardContext.Owner = controller is ProjectsController
                                        ? Enumerators.Controller.Projects
                                        : Enumerators.Controller.Files;

                // activate the selected project if diffrent to the current project
                if (_controllers.ProjectsController.CurrentProject?.GetProjectInfo().Id != selectedProject.GetProjectInfo().Id)
                {
                    _controllers.ProjectsController.Open(selectedProject);
                }

                _wizardContext.AnalysisBands = _projectAutomationService.GetAnalysisBands(selectedProject);

                var projectInfo     = selectedProject.GetProjectInfo();
                var selectedFileIds = new List <string>();


                if (controller is FilesController)
                {
                    selectedFileIds = _controllers.FilesController.SelectedFiles.Select(a => a.Id.ToString()).ToList();
                }
                else
                {
                    foreach (var targetLanguage in projectInfo.TargetLanguages)
                    {
                        var allFiles = selectedProject.GetTargetLanguageFiles(targetLanguage);
                        selectedFileIds.AddRange(
                            from projectFile in allFiles
                            where projectFile.Role == FileRole.Translatable
                            select projectFile.Id.ToString());
                    }
                }

                _wizardContext.LocalProjectFolder = projectInfo.LocalProjectFolder;
                _wizardContext.TransactionFolder  = _wizardContext.GetDefaultTransactionPath();

                var project = _projectAutomationService.GetProject(selectedProject, selectedFileIds);

                _wizardContext.Project      = project;
                _wizardContext.ProjectFiles = project.ProjectFiles;
            }
            else if (controller is TranscreateViewController)
            {
                _wizardContext.Owner = Enumerators.Controller.Manager;

                var selectedProjectFiles = _controllers.TranscreateController.GetSelectedProjectFiles();
                var selectedProjects     = _controllers.TranscreateController.GetSelectedProjects();
                var selectedFileIds      = selectedProjectFiles?.Select(a => a.FileId.ToString()).ToList();

                if (selectedProjects.Count == 0)
                {
                    message = PluginResources.WizardMessage_NoProjectSelected;
                    return(false);
                }

                if (selectedProjects.Count > 1)
                {
                    message = PluginResources.WizardMessage_MultipleProjectsSelected;
                    return(false);
                }

                var selectedProject = _controllers.ProjectsController.GetProjects()
                                      .FirstOrDefault(a => a.GetProjectInfo().Id.ToString() == selectedProjects[0].Id);
                if (selectedProject == null)
                {
                    message = PluginResources.WizardMessage_UnableToLocateSelectedProject;
                    return(false);
                }

                _wizardContext.AnalysisBands = _projectAutomationService.GetAnalysisBands(selectedProject);

                var projectInfo = selectedProject.GetProjectInfo();
                _wizardContext.LocalProjectFolder = projectInfo.LocalProjectFolder;
                _wizardContext.TransactionFolder  = _wizardContext.GetDefaultTransactionPath();

                var project = _projectAutomationService.GetProject(selectedProject, selectedFileIds);
                _wizardContext.Project      = project;
                _wizardContext.ProjectFiles = project.ProjectFiles;
            }

            return(true);
        }
Example #2
0
        public List <Report> CreateFinalReport(Interfaces.IProject project, FileBasedProject studioProject, out string workingPathOut)
        {
            var reports  = new List <Report>();
            var settings = new XmlWriterSettings
            {
                OmitXmlDeclaration = true,
                Indent             = false
            };
            var reportName = "SDL Transcreate Report";

            var studioProjectInfo     = studioProject.GetProjectInfo();
            var dateTimeStamp         = DateTime.UtcNow;
            var dataTimeStampToString = DateTimeStampToString(dateTimeStamp);
            var workflowPath          = GetPath(studioProjectInfo.LocalProjectFolder, "Workflow");
            var actionPath            = GetPath(workflowPath, "Report");
            var workingPath           = GetPath(actionPath, dataTimeStampToString);

            var exportOptions = new ExportOptions();

            exportOptions.IncludeBackTranslations = true;
            exportOptions.IncludeTranslations     = true;
            exportOptions.CopySourceToTarget      = false;

            var analysisBands = _projectAutomationService.GetAnalysisBands(studioProject);

            var progressSettings = new ProgressDialogSettings(ApplicationInstance.GetActiveForm(), true, true, false);
            var result           = ProgressDialog.ProgressDialog.Execute("Create Transcreate Reports", () =>
            {
                var sdlxliffReader = new SdlxliffReader(_segmentBuilder, exportOptions, analysisBands);
                decimal maximum    = project.ProjectFiles.Count;
                decimal current    = 0;
                foreach (var targetLanguage in project.TargetLanguages)
                {
                    var projectFiles = project.ProjectFiles.Where(a => string.Compare(a.TargetLanguage, targetLanguage.CultureInfo.Name,
                                                                                      StringComparison.CurrentCultureIgnoreCase) == 0).ToList();

                    var workingLanguageFolder = GetPath(workingPath, targetLanguage.CultureInfo.Name);
                    foreach (var projectFile in projectFiles)
                    {
                        if (ProgressDialog.ProgressDialog.Current.CheckCancellationPending())
                        {
                            ProgressDialog.ProgressDialog.Current.ThrowIfCancellationPending();
                        }

                        current++;
                        var progress = current / maximum * 100;
                        ProgressDialog.ProgressDialog.Current.Report((int)progress, "File: " + projectFile.Name);


                        var projectFilePath = Path.Combine(project.Path, projectFile.Location);
                        var xliffData       = sdlxliffReader.ReadFile(project.Id, projectFile.FileId, projectFilePath,
                                                                      targetLanguage.CultureInfo.Name);

                        var backTranslationProject   = GetBackTranslationProject(project, targetLanguage.CultureInfo.Name);
                        var backTranslationFile      = GetBackTranslationProjectFile(backTranslationProject, projectFile);
                        var xliffDataBackTranslation = GetBackTranslationXliffData(backTranslationProject, backTranslationFile, sdlxliffReader);

                        var fileName   = projectFile.Name.Substring(0, projectFile.Name.LastIndexOf(".", StringComparison.Ordinal));
                        var reportFile = Path.Combine(workingLanguageFolder, fileName + ".xml");

                        using (var writer = XmlWriter.Create(reportFile, settings))
                        {
                            writer.WriteStartElement("task");
                            writer.WriteAttributeString("name", reportName);
                            writer.WriteAttributeString("created", dataTimeStampToString);

                            writer.WriteStartElement("taskInfo");
                            writer.WriteAttributeString("action", "SDL Transcreate Report");
                            writer.WriteAttributeString("file", projectFile.Path + projectFile.Name);
                            writer.WriteAttributeString("taskId", Guid.NewGuid().ToString());
                            writer.WriteAttributeString("runAt", GetDisplayDateTime(dateTimeStamp));


                            WriteReportProject(writer, "project", project);
                            WriteReportProject(writer, "backProject", backTranslationProject);

                            WriteReportLanguage(writer, "source", project.SourceLanguage.CultureInfo.Name);
                            WriteReportLanguage(writer, "target", targetLanguage.CultureInfo.Name);

                            WriteReportCustomer(writer, project);

                            WriteReportTranslationProviders(writer, studioProject);

                            writer.WriteEndElement();                             //taskInfo


                            writer.WriteStartElement("translations");
                            foreach (var dataFile in xliffData.Files)
                            {
                                writer.WriteStartElement("version");
                                writer.WriteAttributeString("type", dataFile.Original);

                                var backTranslationDataFile =
                                    xliffDataBackTranslation?.Files.FirstOrDefault(a => a.Original == dataFile.Original);

                                writer.WriteStartElement("segments");
                                foreach (var transUnit in dataFile.Body.TransUnits)
                                {
                                    var textFunction = transUnit.Contexts.FirstOrDefault(
                                        a => string.Compare(a.DisplayName, "Text Function", StringComparison.CurrentCultureIgnoreCase) == 0);

                                    foreach (var segmentPair in transUnit.SegmentPairs)
                                    {
                                        writer.WriteStartElement("segment");

                                        var backTranslationSegmentPair = GetBackTranslationSegmentPair(backTranslationDataFile, segmentPair);

                                        writer.WriteAttributeString("id", segmentPair.Id);
                                        writer.WriteAttributeString("textFunction", textFunction?.Description ?? string.Empty);

                                        writer.WriteStartElement("source");
                                        writer.WriteString(segmentPair.Source.ToString());
                                        writer.WriteEndElement();                                         //source

                                        writer.WriteStartElement("target");
                                        writer.WriteString(segmentPair.Target.ToString());
                                        writer.WriteEndElement();                                         //source

                                        writer.WriteStartElement("back");
                                        writer.WriteString(backTranslationSegmentPair?.Target?.ToString() ?? string.Empty);
                                        writer.WriteEndElement();                                         //backTranslation

                                        writer.WriteStartElement("comments");
                                        var comments = GetSegmentComments(segmentPair.Target, xliffData.DocInfo);
                                        if (comments != null)
                                        {
                                            foreach (var comment in comments)
                                            {
                                                writer.WriteStartElement("comment");
                                                writer.WriteAttributeString("version", comment.Version);
                                                writer.WriteAttributeString("author", comment.Author);
                                                writer.WriteAttributeString("severity", comment.Severity.ToString());
                                                writer.WriteAttributeString("date", GetDisplayDateTime(comment.Date));
                                                writer.WriteString(comment.Text ?? string.Empty);
                                                writer.WriteEndElement();                                                 //comment
                                            }
                                        }

                                        writer.WriteEndElement();                                         //comments

                                        writer.WriteEndElement();                                         //segment
                                    }
                                }
                                writer.WriteEndElement();                         //segments

                                writer.WriteEndElement();                         //version
                            }
                            writer.WriteEndElement();                             //translations
                        }

                        // transform the file against an xslt
                        var templatePath   = GetReportTemplatePath("TranscreateFinalReport.xsl");
                        var reportFilePath = CreateHtmlReportFile(reportFile, templatePath);


                        var report = new Report
                        {
                            Name        = fileName,
                            Date        = dateTimeStamp,
                            Description = "Transcreate Report",
                            Group       = "Transcreate Report",
                            Language    = targetLanguage.CultureInfo.Name,
                            Path        = reportFilePath
                        };
                        reports.Add(report);
                    }
                }
            }, progressSettings);

            workingPathOut = workingPath;

            if (result.Cancelled)
            {
                System.Windows.Forms.MessageBox.Show("Process cancelled by user.", PluginResources.Plugin_Name);
                return(new List <Report>());
            }

            return(reports);
        }