/// <summary> /// Get translation of an original text. /// </summary> /// <param name="serviceName">Name of translation service to use</param> /// <param name="textToTranslate">Text to be translated</param> /// <returns>Translation of an original text</returns> private string GetTranslatedText(string serviceName, string textToTranslate) { TranslationServiceInfo info = TranslationServiceInfoProvider.GetTranslationServiceInfo(serviceName); if (info != null) { if (info.TranslationServiceIsMachine) { AbstractMachineTranslationService service = AbstractMachineTranslationService.GetTranslationService(info, SiteContext.CurrentSiteName); if (service != null) { if (string.IsNullOrEmpty(textToTranslate)) { textToTranslate = TranslationSourceText ?? String.Empty; } string sourceLang = TranslationSourceLanguage ?? CultureHelper.DefaultUICultureCode; string targetLang = TranslationTargetLanguage ?? CultureHelper.PreferredUICultureCode; string translation = service.Translate(textToTranslate, sourceLang, targetLang) ?? String.Empty; // Translators may add a dot to the translation - remove it if it was not a part of the original text if (!textToTranslate.EndsWithCSafe(".")) { translation = translation.TrimEnd('.'); } return(translation); } } } return(null); }
private void SetupUnsupportedFeaturesVisibility() { var submission = UIFormControl.EditedObject as TranslationSubmissionInfo; if (submission == null) { return; } var service = TranslationServiceInfoProvider.GetTranslationServiceInfo(submission.SubmissionServiceID); if (service == null) { return; } if (!service.TranslationServiceSupportsPriority) { UIFormControl.FieldsToHide.Add("SubmissionPriority"); } if (!service.TranslationServiceSupportsDeadline) { UIFormControl.FieldsToHide.Add("SubmissionDeadline"); } if (!service.TranslationServiceSupportsInstructions) { UIFormControl.FieldsToHide.Add("SubmissionInstructions"); } if (!SettingsKeyInfoProvider.GetBoolValue(SiteContext.CurrentSiteName + ".CMSAllowAttachmentTranslation")) { UIFormControl.FieldsToHide.Add("SubmissionTranslateAttachments"); } UIFormControl.FieldControls["SubmissionStatus"].Enabled = service.TranslationServiceSupportsStatusUpdate; }
/// <summary> /// Translates document(s). /// </summary> private void Translate(object parameter) { var parameters = parameter as AsyncParameters; if ((parameters == null) || nodeIds.Count < 1) { return; } AbstractMachineTranslationService machineService = null; AbstractHumanTranslationService humanService = null; TranslationSubmissionInfo submission = null; string submissionFileName = ""; int charCount = 0; int wordCount = 0; int refreshId = 0; int itemCount = 0; int pageCount = 0; bool oneSubmission = translationElem.CreateSeparateSubmission; bool success = false; bool separateSubmissionCreated = false; TreeProvider tree = new TreeProvider(); tree.AllowAsyncActions = false; try { // Begin log AddLog(ResHelper.GetString("contentrequest.starttranslate", parameters.UICulture)); // Prepare translation settings var settings = PrepareTranslationSettings(); // Check selected service var service = TranslationServiceInfoProvider.GetTranslationServiceInfo(translationElem.SelectedService); if (service == null) { return; } // Set if we need target tag (Translations.com workaround) settings.GenerateTargetTag = service.TranslationServiceGenerateTargetTag; if (service.TranslationServiceIsMachine) { machineService = AbstractMachineTranslationService.GetTranslationService(service, CurrentSiteName); } else { humanService = AbstractHumanTranslationService.GetTranslationService(service, CurrentSiteName); } bool langSupported = (humanService == null) || CheckLanguageSupport(humanService, settings); if (!langSupported) { return; } if ((machineService != null) || (humanService != null)) { var data = tree.SelectNodes() .CombineWithDefaultCulture(false) .Published(false) .Culture(settings.SourceLanguage) .WhereIn("NodeID", nodeIds) .OnSite(CurrentSiteName) .OrderBy("NodeLevel, NodeAliasPath") .Column("NodeID"); if (!DataHelper.DataSourceIsEmpty(data)) { var processedNodes = new List <int>(); // Translate the documents foreach (DataRow dr in data.Tables[0].Rows) { int nodeId = ValidationHelper.GetInteger(dr["NodeID"], 0); // Get document in source language var node = DocumentHelper.GetDocument(nodeId, settings.SourceLanguage, false, tree); if (node == null) { // Document doesn't exist in source culture, skip it continue; } var targetLanguages = GetTargetLanguages(settings.TargetLanguages, node).ToList(); if (!targetLanguages.Any()) { continue; } if ((submission == null) && (humanService != null)) { // Create new submission if not exists for human translation service submission = TranslationServiceHelper.CreateSubmissionInfo(settings, service, MembershipContext.AuthenticatedUser.UserID, SiteInfoProvider.GetSiteID(CurrentSiteName), node.GetDocumentName()); } // Handle duplicities if (processedNodes.Contains(nodeId)) { continue; } processedNodes.Add(nodeId); bool targetLanguageVersionCreated = false; bool logged = false; string encodedPath = HTMLHelper.HTMLEncode(node.NodeAliasPath); foreach (var targetLanguage in targetLanguages) { // Log only once per document if (!logged) { AddLog(String.Format(ResHelper.GetString("content.translating"), encodedPath, settings.SourceLanguage)); logged = true; } itemCount++; targetLanguageVersionCreated = true; if (humanService != null) { if (String.IsNullOrEmpty(submissionFileName)) { submissionFileName = node.NodeAlias; } var targetNode = TranslationServiceHelper.CreateTargetCultureNode(node, targetLanguage, true, false, !settings.TranslateAttachments); TranslationSubmissionItemInfo submissionItem; using (new CMSActionContext { TouchParent = false }) { // Do not touch parent because all updated information are saved after last item submissionItem = TranslationServiceHelper.CreateSubmissionItemInfo(settings, submission, node, targetNode.DocumentID, targetLanguage); } charCount += submissionItem.SubmissionItemCharCount; wordCount += submissionItem.SubmissionItemWordCount; } else { // Prepare local settings to translate per one target language var localSettings = settings.Clone(); localSettings.TargetLanguages.Clear(); localSettings.TargetLanguages.Add(targetLanguage); // Translate page via machine translator TranslationServiceHelper.Translate(machineService, localSettings, node); } } // Each page has own submission if human service is used if (!oneSubmission && (humanService != null)) { if (itemCount > 0) { SubmitSubmissionToService(itemCount, submission, charCount, wordCount, submissionFileName, humanService, true); // Reset counters itemCount = 0; charCount = 0; wordCount = 0; // Reset submission file name submissionFileName = null; // At least one submission was created separateSubmissionCreated = true; } else { // No documents were submitted to translation delete empty submission TranslationSubmissionInfoProvider.DeleteTranslationSubmissionInfo(submission); } // Reset submission to create new for next page submission = null; } if (targetLanguageVersionCreated) { // Check if at least one target language version was created pageCount++; } // Store parent ID to refresh UI refreshId = node.NodeParentID; } success = true; } else { AddError(ResHelper.GetString("TranslateDocument.NoSourceDocuments", parameters.UICulture)); } } else { AddError(ResHelper.GetString("TranslateDocument.TranslationServiceNotFound", parameters.UICulture)); } } catch (ThreadAbortException ex) { if (CMSThread.Stopped(ex)) { // When canceled AddError(ResHelper.GetString("TranslateDocument.TranslationCanceled", parameters.UICulture)); } else { // Log error LogExceptionToEventLog(ex, parameters.UICulture); } } catch (Exception ex) { // Log error LogExceptionToEventLog(ex, parameters.UICulture); } finally { var showAllAlreadyTranslatedError = false; if (itemCount > 0) { // All pages are submitted via only one submission or using machine service if ((humanService != null) && (submission != null)) { // Set submission name if more pages are translated if (pageCount > 1) { submission.SubmissionName += " " + string.Format(GetString("translationservices.submissionnamesuffix"), pageCount - 1); // Do not localize the file name submissionFileName += string.Format(" (and {0} more)", pageCount - 1); } SubmitSubmissionToService(itemCount, submission, charCount, wordCount, submissionFileName, humanService, success); } } else if (oneSubmission) { TranslationSubmissionInfoProvider.DeleteTranslationSubmissionInfo(submission); // Log error only if the translation was successfully processed if (success) { showAllAlreadyTranslatedError = true; } } else if (!separateSubmissionCreated) { // Separate submissions were used and no one was created showAllAlreadyTranslatedError = true; } if (showAllAlreadyTranslatedError) { AddError(ResHelper.GetString("TranslateDocument.DocumentsAlreadyTranslated", parameters.UICulture)); } if (parameters.IsDialog) { ctlAsyncLog.Parameter = "wopener.location.replace(wopener.location); CloseDialog(); if (wopener.RefreshTree) { wopener.RefreshTree(null, null);}"; } else { if (string.IsNullOrEmpty(CurrentError)) { // Overwrite refreshId variable if sub-levels are visible if (parameters.AllLevels && Parameters.ContainsKey("refreshnodeid")) { refreshId = ValidationHelper.GetInteger(Parameters["refreshnodeid"], 0); } // Refresh tree ctlAsyncLog.Parameter = "RefreshTree(" + refreshId + ", " + refreshId + "); \n" + "SelectNode(" + refreshId + ");"; } else { ctlAsyncLog.Parameter = "RefreshTree(null, null);"; } } } }
protected object gridElem_OnExternalDataBound(object sender, string sourceName, object parameter) { // For all actions if (sourceName.EndsWith("action", StringComparison.OrdinalIgnoreCase)) { var img = sender as CMSGridActionButton; if (img != null) { img.Enabled = !IsRunningThread(); } } switch (sourceName.ToLowerInvariant()) { case "resubmitaction": case "processaction": case "cancelaction": var img = sender as CMSGridActionButton; if (img != null) { img.Enabled &= modifyAllowed; var gvr = parameter as GridViewRow; if (gvr == null) { return(img); } var drv = gvr.DataItem as DataRowView; if (drv == null) { return(img); } var status = (TranslationStatusEnum)ValidationHelper.GetInteger(drv["SubmissionStatus"], 0); switch (sourceName.ToLowerInvariant()) { case "resubmitaction": img.Enabled &= modifyAllowed && ((status == TranslationStatusEnum.WaitingForTranslation) || (status == TranslationStatusEnum.SubmissionError)); break; case "processaction": img.Enabled &= modifyAllowed && ((status == TranslationStatusEnum.TranslationReady) || (status == TranslationStatusEnum.TranslationCompleted) || (status == TranslationStatusEnum.ProcessingError)); break; case "cancelaction": var service = TranslationServiceInfoProvider.GetTranslationServiceInfo(ValidationHelper.GetInteger(drv["SubmissionServiceID"], 0)); if (service != null) { bool serviceSupportsCancel = service.TranslationServiceSupportsCancel; img.Enabled &= modifyAllowed && (status == TranslationStatusEnum.WaitingForTranslation) && serviceSupportsCancel; if (!serviceSupportsCancel) { // Display tooltip for disabled cancel img.ToolTip = String.Format(GetString("translationservice.cancelnotsupported"), service.TranslationServiceDisplayName); } } break; } } return(img); case "submissionstatus": TranslationStatusEnum submissionstatus = (TranslationStatusEnum)ValidationHelper.GetInteger(parameter, 0); return(TranslationServiceHelper.GetFormattedStatusString(submissionstatus)); case "submissionprice": string price = GetString("general.notavailable"); double priceVal = ValidationHelper.GetDouble(parameter, -1); if (priceVal >= 0) { price = priceVal.ToString(); } return(price); case "submissiontargetculture": { string[] cultureCodes = ValidationHelper.GetString(parameter, "").Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries); StringBuilder sb = new StringBuilder(); int count = cultureCodes.Length; int counter = 0; foreach (var cultureCode in cultureCodes) { // Limit cultures list if (counter == 5) { sb.Append(" "); sb.AppendFormat(ResHelper.GetString("translationservices.submissionnamesuffix"), count - 5); break; } // Separate cultures by comma if (counter > 0) { sb.Append(", "); } var culture = CultureInfoProvider.GetCultureInfo(cultureCode); if (culture == null) { continue; } sb.AppendFormat("<span title=\"{0}\"><img class=\"cms-icon-80\" src=\"{1}\" alt=\"{2}\" /> {3}</span>", HTMLHelper.EncodeForHtmlAttribute(culture.CultureName), UIHelper.GetFlagIconUrl(null, culture.CultureCode, "16x16"), HTMLHelper.EncodeForHtmlAttribute(culture.CultureName), HTMLHelper.HTMLEncode(culture.CultureShortName)); ++counter; } return(sb.ToString()); } } return(parameter); }
protected void gridElem_OnAction(string actionName, object actionArgument) { // There is already a running thread if (IsRunningThread()) { return; } string err = null; string info = null; // Check modify permission for all actions except for download ZIP if (!string.Equals(actionName, "downloadzip", StringComparison.OrdinalIgnoreCase)) { if (!modifyAllowed) { RedirectToAccessDenied("CMS.TranslationServices", "Modify"); } } // Get submission var submissionInfo = TranslationSubmissionInfoProvider.GetTranslationSubmissionInfo(ValidationHelper.GetInteger(actionArgument, 0)); if (submissionInfo == null) { return; } switch (actionName.ToLowerInvariant()) { case "downloadzip": TranslationServiceHelper.DownloadXLIFFinZIP(submissionInfo, Page.Response); break; case RESUBMIT_ACTION: ProcessActionAsync(actionName, submissionInfo); break; case PROCESS_ACTION: ProcessActionAsync(actionName, submissionInfo); break; case "cancel": err = TranslationServiceHelper.CancelSubmission(submissionInfo); info = GetString("translationservice.submissioncanceled"); break; case "delete": var serviceInfo = TranslationServiceInfoProvider.GetTranslationServiceInfo(submissionInfo.SubmissionServiceID); if (serviceInfo.TranslationServiceSupportsCancel) { err = TranslationServiceHelper.CancelSubmission(submissionInfo); } if (String.IsNullOrEmpty(err)) { submissionInfo.Delete(); } info = GetString("translationservice.submissiondeleted"); break; } if (!string.IsNullOrEmpty(err)) { ShowError(err); } else if (!string.IsNullOrEmpty(info)) { ShowConfirmation(info); } }
protected object gridElem_OnExternalDataBound(object sender, string sourceName, object parameter) { switch (sourceName.ToLowerCSafe()) { case "resubmitaction": case "processaction": case "cancelaction": CMSGridActionButton img = sender as CMSGridActionButton; if (img != null) { img.Enabled = modifyAllowed; GridViewRow gvr = parameter as GridViewRow; if (gvr == null) { return(img); } DataRowView drv = gvr.DataItem as DataRowView; if (drv == null) { return(img); } TranslationStatusEnum status = (TranslationStatusEnum)ValidationHelper.GetInteger(drv["SubmissionStatus"], 0); switch (sourceName.ToLowerCSafe()) { case "resubmitaction": img.Enabled = modifyAllowed && ((status == TranslationStatusEnum.WaitingForTranslation) || (status == TranslationStatusEnum.SubmissionError)); break; case "processaction": img.Enabled = modifyAllowed && ((status == TranslationStatusEnum.TranslationReady) || (status == TranslationStatusEnum.TranslationCompleted) || (status == TranslationStatusEnum.ProcessingError)); break; case "cancelaction": TranslationServiceInfo service = TranslationServiceInfoProvider.GetTranslationServiceInfo(ValidationHelper.GetInteger(drv["SubmissionServiceID"], 0)); if (service != null) { bool serviceSupportsCancel = service.TranslationServiceSupportsCancel; img.Enabled = modifyAllowed && (status == TranslationStatusEnum.WaitingForTranslation) && serviceSupportsCancel; if (!serviceSupportsCancel) { // Display tooltip for disabled cancel img.ToolTip = String.Format(GetString("translationservice.cancelnotsupported"), service.TranslationServiceDisplayName); } } break; } } return(img); case "submissionstatus": TranslationStatusEnum submissionstatus = (TranslationStatusEnum)ValidationHelper.GetInteger(parameter, 0); return(TranslationServiceHelper.GetFormattedStatusString(submissionstatus)); case "submissionprice": string price = GetString("general.notavailable"); double priceVal = ValidationHelper.GetDouble(parameter, -1); if (priceVal >= 0) { price = priceVal.ToString(); } return(price); } return(parameter); }
protected override void OnPreRender(EventArgs e) { base.OnPreRender(e); if (SubmissionInfo == null) { return; } bool allowed = CheckModifyPermissions(false); HeaderAction processAction = new HeaderAction { OnClientClick = "if (confirm(" + ScriptHelper.GetString(GetString("translationservice.confirmprocesstranslations")) + ")) { " + ControlsHelper.GetPostBackEventReference(btnImportTranslations) + " }", Tooltip = GetString("translationservice.importtranslationstooltip"), Text = GetString("translationservice.importtranslations"), Enabled = allowed && ((SubmissionInfo.SubmissionStatus == TranslationStatusEnum.TranslationReady) || (SubmissionInfo.SubmissionStatus == TranslationStatusEnum.TranslationCompleted) || (SubmissionInfo.SubmissionStatus == TranslationStatusEnum.ProcessingError)) }; HeaderAction resubmitAction = new HeaderAction { CommandName = "resubmit", Tooltip = GetString("translationservice.resubmittooltip"), Text = GetString("translationservice.resubmit"), Enabled = allowed && ((SubmissionInfo.SubmissionStatus == TranslationStatusEnum.WaitingForTranslation) || (SubmissionInfo.SubmissionStatus == TranslationStatusEnum.SubmissionError)) }; HeaderAction updateAction = new HeaderAction { CommandName = "update", Tooltip = GetString("translationservice.updateandresubmittooltip"), Text = GetString("translationservice.updateandresubmit"), Enabled = allowed && ((SubmissionInfo.SubmissionStatus == TranslationStatusEnum.WaitingForTranslation) || (SubmissionInfo.SubmissionStatus == TranslationStatusEnum.SubmissionError)) }; HeaderAction saveAction = new SaveAction(Page); saveAction.Enabled = allowed; List <HeaderAction> actions = CurrentMaster.HeaderActions.ActionsList; actions.Add(saveAction); actions.Add(updateAction); actions.Add(resubmitAction); actions.Add(processAction); // Check if current service supports canceling TranslationServiceInfo service = TranslationServiceInfoProvider.GetTranslationServiceInfo(SubmissionInfo.SubmissionServiceID); if (service != null) { bool serviceSupportsCancel = service.TranslationServiceSupportsCancel; HeaderAction cancelAction = new HeaderAction { CommandName = "cancel", Tooltip = serviceSupportsCancel ? GetString("translationservice.cancelsubmissiontooltip") : String.Format(GetString("translationservice.cancelnotsupported"), service.TranslationServiceDisplayName), Text = GetString("translationservice.cancelsubmission"), Enabled = allowed && (SubmissionInfo.SubmissionStatus == TranslationStatusEnum.WaitingForTranslation) && serviceSupportsCancel }; actions.Add(cancelAction); } CurrentMaster.HeaderActions.ReloadData(); ScriptHelper.RegisterClientScriptBlock(Page, typeof(string), "ShowUploadSuccess", "function ShowUploadSuccess() { " + ControlsHelper.GetPostBackEventReference(btnShowMessage) + " }", true); }
/// <summary> /// Creates buttons in header actions /// </summary> private void CreateButtons() { bool allowed = CheckModifyPermissions(false); var processAction = new HeaderAction { ButtonStyle = ButtonStyle.Default, CommandName = PROCESS_ACTION, OnClientClick = "if (!confirm(" + ScriptHelper.GetString(GetString("translationservice.confirmprocesstranslations")) + ")) { return false; }", Tooltip = GetString("translationservice.importtranslationstooltip"), Text = GetString("translationservice.importtranslations"), Enabled = allowed && ((SubmissionInfo.SubmissionStatus == TranslationStatusEnum.TranslationReady) || (SubmissionInfo.SubmissionStatus == TranslationStatusEnum.TranslationCompleted) || (SubmissionInfo.SubmissionStatus == TranslationStatusEnum.ProcessingError)) }; var resubmitAction = new HeaderAction { ButtonStyle = ButtonStyle.Default, CommandName = RESUBMIT_ACTION, Tooltip = GetString("translationservice.resubmittooltip"), Text = GetString("translationservice.resubmit"), Enabled = allowed && ((SubmissionInfo.SubmissionStatus == TranslationStatusEnum.WaitingForTranslation) || (SubmissionInfo.SubmissionStatus == TranslationStatusEnum.SubmissionError)) }; var updateAction = new HeaderAction { ButtonStyle = ButtonStyle.Default, CommandName = "updateandresubmit", Tooltip = GetString("translationservice.updateandresubmittooltip"), Text = GetString("translationservice.updateandresubmit"), Enabled = allowed && ((SubmissionInfo.SubmissionStatus == TranslationStatusEnum.WaitingForTranslation) || (SubmissionInfo.SubmissionStatus == TranslationStatusEnum.SubmissionError)) }; var saveAction = new SaveAction(); saveAction.Enabled = allowed; var actions = HeaderActions.ActionsList; actions.AddRange(new[] { saveAction, updateAction, resubmitAction, processAction }); // Check if current service supports canceling var service = TranslationServiceInfoProvider.GetTranslationServiceInfo(SubmissionInfo.SubmissionServiceID); if (service != null) { bool serviceSupportsCancel = service.TranslationServiceSupportsCancel; var cancelAction = new HeaderAction { ButtonStyle = ButtonStyle.Default, CommandName = "cancel", Tooltip = serviceSupportsCancel ? GetString("translationservice.cancelsubmissiontooltip") : String.Format(GetString("translationservice.cancelnotsupported"), service.TranslationServiceDisplayName), Text = GetString("translationservice.cancelsubmission"), Enabled = allowed && (SubmissionInfo.SubmissionStatus == TranslationStatusEnum.WaitingForTranslation) && serviceSupportsCancel }; actions.Add(cancelAction); } HeaderActions.ReloadData(); }
/// <summary> /// Translates document(s). /// </summary> private void Translate(object parameter) { if (parameter == null || nodeIds.Count < 1) { return; } int refreshId = 0; TreeProvider tree = new TreeProvider(currentUser); tree.AllowAsyncActions = false; try { // Begin log AddLog(ResHelper.GetString("contentrequest.starttranslate", currentCulture)); bool oneSubmission = chkSeparateSubmissions.Checked; // Prepare translation settings TranslationSettings settings = new TranslationSettings(); settings.TargetLanguage = targetCulture; settings.TranslateWebpartProperties = SettingsKeyProvider.GetBoolValue(CMSContext.CurrentSiteName + ".CMSTranslateWebpartProperties"); settings.SourceLanguage = translationElem.FromLanguage; settings.Instructions = translationElem.Instructions; settings.Priority = translationElem.Priority; settings.TranslateAttachments = translationElem.ProcessBinary; settings.ProcessBinary = translationElem.ProcessBinary; settings.TranslationDeadline = translationElem.Deadline; settings.TranslationServiceName = translationElem.SelectedService; using (CMSTransactionScope tr = new CMSTransactionScope()) { // Get the translation provider AbstractMachineTranslationService machineService = null; AbstractHumanTranslationService humanService = null; TranslationSubmissionInfo submission = null; TranslationServiceInfo ti = TranslationServiceInfoProvider.GetTranslationServiceInfo(translationElem.SelectedService); if (ti != null) { if (oneSubmission) { if (ti.TranslationServiceIsMachine) { machineService = AbstractMachineTranslationService.GetTranslationService(ti, CurrentSiteName); } else { humanService = AbstractHumanTranslationService.GetTranslationService(ti, CurrentSiteName); if (oneSubmission) { submission = TranslationServiceHelper.CreateSubmissionInfo(settings, ti, CMSContext.CurrentUser.UserID, CMSContext.CurrentSiteID, "Document submission " + DateTime.Now); } } } bool langSupported = true; if (humanService != null) { if (!humanService.IsLanguageSupported(settings.TargetLanguage)) { AddError(ResHelper.GetString("translationservice.targetlanguagenotsupported")); langSupported = false; } } if (langSupported) { if (!oneSubmission || (machineService != null) || (humanService != null)) { // Prepare the where condition string where = SqlHelperClass.GetWhereCondition("NodeID", (int[])nodeIds.ToArray(typeof(int))); string columns = "NodeID, NodeAliasPath, DocumentCulture, NodeParentID"; string submissionFileName = ""; string submissionName = ""; int charCount = 0; int wordCount = 0; int docCount = 0; // Get the documents in target culture to be able to check if "Skip already translated" option is on // Combine both, source and target culture (at least one hit has to be found - to find the source of translation) where = SqlHelperClass.AddWhereCondition(where, "DocumentCulture = N'" + settings.SourceLanguage + "' OR DocumentCulture = N'" + settings.TargetLanguage + "'"); DataSet ds = tree.SelectNodes(CMSContext.CurrentSiteName, "/%", TreeProvider.ALL_CULTURES, true, null, where, "NodeAliasPath DESC", TreeProvider.ALL_LEVELS, false, 0, columns); if (!DataHelper.DataSourceIsEmpty(ds)) { List <int> processedNodes = new List <int>(); // Translate the documents foreach (DataRow dr in ds.Tables[0].Rows) { refreshId = ValidationHelper.GetInteger(dr["NodeParentID"], 0); int nodeId = ValidationHelper.GetInteger(dr["NodeID"], 0); if (!processedNodes.Contains(nodeId)) { processedNodes.Add(nodeId); string aliasPath = ValidationHelper.GetString(dr["NodeAliasPath"], ""); string culture = ValidationHelper.GetString(dr["DocumentCulture"], ""); if (chkSkipTranslated.Checked) { if (culture == settings.TargetLanguage) { // Document already exists in requested culture, skip it AddLog(string.Format(ResHelper.GetString("content.translatedalready"), HTMLHelper.HTMLEncode(aliasPath + " (" + culture + ")"))); continue; } } AddLog(string.Format(ResHelper.GetString("content.translating"), HTMLHelper.HTMLEncode(aliasPath + " (" + culture + ")"))); TreeNode node = DocumentHelper.GetDocument(nodeId, settings.SourceLanguage, true, null); // Save the first document as a base for submission name if (string.IsNullOrEmpty(submissionName)) { submissionName = node.GetDocumentName(); } if (string.IsNullOrEmpty(submissionFileName)) { submissionFileName = node.NodeAlias; } docCount++; // Submit the document if (machineService != null) { TranslationServiceHelper.Translate(machineService, settings, node); } else { if (oneSubmission && (humanService != null)) { TreeNode targetNode = TranslationServiceHelper.CreateTargetCultureNode(node, settings.TargetLanguage, true, false); TranslationSubmissionItemInfo submissionItem = TranslationServiceHelper.CreateSubmissionItemInfo(settings, submission, node, targetNode.DocumentID); charCount += submissionItem.SubmissionItemCharCount; wordCount += submissionItem.SubmissionItemWordCount; } else { TranslationServiceHelper.SubmitToTranslation(settings, node, out submission); } } } } if (docCount > 0) { if (oneSubmission && (humanService != null)) { AddLog(ResHelper.GetString("content.submitingtranslation")); // Set submission name int itemCount = processedNodes.Count; if (itemCount > 1) { submissionName += " " + string.Format(GetString("translationservices.submissionnamesuffix"), itemCount - 1); } submission.SubmissionName = submissionName; submission.SubmissionCharCount = charCount; submission.SubmissionWordCount = wordCount; submission.SubmissionItemCount = itemCount; submission.SubmissionParameter = submissionFileName; string err = humanService.CreateSubmission(submission); if (!string.IsNullOrEmpty(err)) { AddError(err); } // Save submission with ticket TranslationSubmissionInfoProvider.SetTranslationSubmissionInfo(submission); } } else { TranslationSubmissionInfoProvider.DeleteTranslationSubmissionInfo(submission); AddError(ResHelper.GetString("TranslateDocument.DocumentsAlreadyTranslated", currentCulture)); } } } else { AddError(ResHelper.GetString("TranslateDocument.TranslationServiceNotFound", currentCulture)); } } } tr.Commit(); } } catch (ThreadAbortException ex) { string state = ValidationHelper.GetString(ex.ExceptionState, string.Empty); if (state == CMSThread.ABORT_REASON_STOP) { // When canceled AddError(ResHelper.GetString("TranslateDocument.TranslationCanceled", currentCulture)); } else { // Log error LogExceptionToEventLog(ex); } } catch (Exception ex) { // Log error LogExceptionToEventLog(ex); } finally { if (isModal) { ctlAsync.Parameter = "wopener.location.replace(wopener.location); CloseDialog();"; } else { if (string.IsNullOrEmpty(CurrentError)) { // Refresh tree ctlAsync.Parameter = "RefreshTree(" + refreshId + ", " + refreshId + "); \n" + "SelectNode(" + refreshId + ");"; } else { ctlAsync.Parameter = "RefreshTree(null, null);"; } } } }