public List <Report> CreateFinalReport(Interfaces.IProject project, FileBasedProject studioProject, List <ProjectFile> selectedFiles, out string workingPathOut) { var reports = new List <Report>(); var settings = new XmlWriterSettings { OmitXmlDeclaration = true, Indent = false }; var reportName = "Trados 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 hasProjectFiles = HasProjectFiles(selectedFiles, projectFiles); if (!hasProjectFiles) { current += projectFiles.Count; var progress = current / maximum * 100; ProgressDialog.ProgressDialog.Current.Report((int)progress, string.Format("Language: {0}\r\nFile: {1}", targetLanguage.CultureInfo.DisplayName, projectFiles.FirstOrDefault().Name)); continue; } 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, string.Format("Language: {0}\r\nFile: {1}", targetLanguage.CultureInfo.DisplayName, projectFile.Name)); if (selectedFiles != null && !selectedFiles.Exists(a => a.FileId == projectFile.FileId)) { continue; } 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", "Trados 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); }
private bool CreateWizardContext(AbstractController controller, out string message) { _taskContext = new TaskContext(_action, _workFlow, _settings); message = string.Empty; if (controller is ProjectsController || controller is FilesController) { var selectedProject = _controllers.ProjectsController.SelectedProjects.FirstOrDefault() ?? _controllers.ProjectsController.CurrentProject; _taskContext.Owner = controller is ProjectsController ? Enumerators.Controller.Projects : Enumerators.Controller.Files; // activate the selected project if different to the current project if (_controllers.ProjectsController.CurrentProject?.GetProjectInfo().Id != selectedProject.GetProjectInfo().Id) { _projectAutomationService.ActivateProject(selectedProject); } _taskContext.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()); } } _taskContext.LocalProjectFolder = projectInfo.LocalProjectFolder; _taskContext.WorkflowFolder = _taskContext.GetWorkflowPath(); var project = _projectAutomationService.GetProject(selectedProject, selectedFileIds); _taskContext.Project = project; _taskContext.FileBasedProject = selectedProject; _taskContext.ProjectFiles = project.ProjectFiles; } else if (controller is TranscreateViewController) { _taskContext.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); } _taskContext.AnalysisBands = _projectAutomationService.GetAnalysisBands(selectedProject); var projectInfo = selectedProject.GetProjectInfo(); _taskContext.LocalProjectFolder = projectInfo.LocalProjectFolder; _taskContext.WorkflowFolder = _taskContext.GetWorkflowPath(); var project = _projectAutomationService.GetProject(selectedProject, selectedFileIds); project.ProjectFiles.RemoveAll(a => a.TargetLanguage == projectInfo.SourceLanguage.CultureInfo.Name); _taskContext.Project = project; _taskContext.FileBasedProject = selectedProject; _taskContext.ProjectFiles = project.ProjectFiles; } return(true); }