using System; using System.Text; using System.Data; using System.Web.UI.WebControls; using CMS.DocumentEngine; using CMS.GlobalHelper; using CMS.SiteProvider; using CMS.UIControls; using CMS.TranslationServices; using CMS.SettingsProvider; using CMS.CMSHelper; using TreeNode = CMS.DocumentEngine.TreeNode; public partial class CMSModules_Translations_Controls_TranslationServiceSelector : CMSUserControl { #region "Variables" private string defaultCulture = CultureHelper.GetDefaultCulture(CMSContext.CurrentSiteName); private bool mAnyServiceAvailable = false; private bool mDisplayMachineServices = true; private string mMachineServiceSuffix = null; #endregion #region "Properties" /// /// Gets or sets TreeProvider to use. /// public TreeProvider TreeProvider { get; set; } /// /// Gets number of services displayed. /// public int DisplayedServicesCount { get; private set; } /// /// If true, the name of the service is displayed when only one is available. /// public bool DisplayOnlyServiceName { get; set; } /// /// Gets name of the service displayed (if only one is displayed, if more services are displayed, null is returned) /// public string DisplayedServiceName { get; private set; } /// /// Gets or sets NodeID which to translates /// public int NodeID { get; set; } /// /// Gets or sets TranslationSettings object which will be used to process/submit translation. /// public TranslationSettings TranslationSettings { get; set; } /// /// Returns if the translation should process binary fields. /// public bool ProcessBinary { get { return chkProcessBinary.Checked; } set { chkProcessBinary.Checked = value; } } /// /// Returns the instructions of the submission. /// public string Instructions { get { return txtInstruction.Text; } set { txtInstruction.Text = value; } } /// /// Gets or sets source language of translation. /// public string FromLanguage { get { return selectCultureElem.Value.ToString(); } set { selectCultureElem.Value = value; } } /// /// Gets or sets target language of translation. /// public string TargetLanguage { get { return selectTargetCultureElem.Value.ToString(); } set { selectTargetCultureElem.Value = value; } } /// /// Returns the instructions of the submission. /// public int Priority { get { return ValidationHelper.GetInteger(drpPriority.Value, 1); } set { drpPriority.Value = value; } } /// /// Returns the instructions of the submission. /// public DateTime Deadline { get { return dtDeadline.SelectedDateTime; } set { dtDeadline.SelectedDateTime = value; } } /// /// Gets or sets the selected service name. /// public string SelectedService { get { return hdnSelectedName.Value; } set { hdnSelectedName.Value = value; } } /// /// Determines whether to display machine translation services. /// public bool DisplayMachineServices { get { return mDisplayMachineServices; } set { mDisplayMachineServices = value; } } /// /// Determines whether to display machine translation services. /// public bool DisplayTargetlanguage { get { return plcTargetLang.Visible; } set { plcTargetLang.Visible = value; } } /// /// String which will be addad as a suffix of each machine translation service. /// public string MachineServiceSuffix { get { if (mMachineServiceSuffix == null) { return GetString("translationservice.machineservicesuffix"); } return mMachineServiceSuffix; } set { mMachineServiceSuffix = value; } } /// /// Indicates if there is any enabled service available in the selector. /// public bool AnyServiceAvailable { get { return mAnyServiceAvailable; } } /// /// Returns true if there is at least one source culture which can be used for translation. /// public bool SourceCultureAvailable { get { return selectCultureElem.UniSelector.HasData; } } #endregion #region "Page Events" protected void Page_Load(object sender, EventArgs e) { if (!StopProcessing && !RequestHelper.IsCallback()) { StringBuilder sb = new StringBuilder(); sb.Append( "function SelectService(serviceName, supportsInstructions, supportsPriority, supportsAttachments, supportsDeadline, generateTarget) { \n", " var nameElem = document.getElementById('", hdnSelectedName.ClientID, "'); \n", " var generateTargetElem = document.getElementById('", hdnGenerateTarget.ClientID, "'); \n", " if (nameElem != null) { \n", " nameElem.value = serviceName; \n", " } \n", " if (generateTargetElem != null) \n", " { \n", " generateTargetElem.value = generateTarget; \n", " document.getElementById('pnlInstructions').style.display = (supportsInstructions ? '' : 'none'); \n", " document.getElementById('pnlPriority').style.display = (supportsPriority ? '' : 'none'); \n", " document.getElementById('pnlDeadline').style.display = (supportsDeadline ? '' : 'none'); \n", " document.getElementById('pnlProcessBinary').style.display = (supportsAttachments ? '' : 'none'); \n", " var selectButton = document.getElementById('rad' + serviceName); \n", " if (selectButton != null) { \n", " selectButton.checked = 'checked'; \n", " } \n", " } \n", "} \n" ); ScriptHelper.RegisterClientScriptBlock(this.Page, typeof(string), "TranslationServiceSelector", sb.ToString(), true); string format = "{% CultureName %}{% if (CultureCode == \"" + defaultCulture + "\") { \" \" +\"" + GetString("general.defaultchoice") + "\" } %}"; ; selectCultureElem.UniSelector.DisplayNameFormat = format; selectTargetCultureElem.UniSelector.DisplayNameFormat = format; if (!CurrentUser.IsGlobalAdministrator && CurrentUser.UserHasAllowedCultures) { selectTargetCultureElem.AdditionalWhereCondition = "CultureID IN (SELECT CultureID FROM CMS_UserCulture WHERE UserID = " + CurrentUser.UserID + " AND SiteID = " + CurrentSite.SiteID + ")"; } if (TranslationSettings != null) { string where = "NOT CultureCode = '" + SqlHelperClass.GetSafeQueryString(TranslationSettings.TargetLanguage) + "'"; if (NodeID > 0) { where = SqlHelperClass.AddWhereCondition(where, "CultureCode IN (SELECT DocumentCulture FROM CMS_Document WHERE DocumentNodeID = " + NodeID + ")", "AND"); } selectCultureElem.AdditionalWhereCondition = where; } ReloadData(); } } protected override void OnPreRender(EventArgs e) { base.OnPreRender(e); if (!StopProcessing) { if (!RequestHelper.IsPostBack()) { dtDeadline.SelectedDateTime = DateTime.Now.AddDays(7); selectCultureElem.Value = defaultCulture; } } } /// /// Selects correct value. /// private void ReloadData() { string where = "TranslationServiceEnabled = 1"; if (!DisplayMachineServices) { where += " AND TranslationServiceIsMachine = 0"; } bool allowBinary = SettingsKeyProvider.GetBoolValue(CMSContext.CurrentSiteName + ".CMSAllowAttachmentTranslation"); DataSet ds = TranslationServiceInfoProvider.GetTranslationServices(where, "TranslationServiceIsMachine DESC, TranslationServiceDisplayName ASC", 0, "TranslationServiceDisplayName, TranslationServiceName, TranslationServiceIsMachine, TranslationServiceSupportsPriority, TranslationServiceSupportsInstructions, TranslationServiceSupportsDeadline, TranslationServiceGenerateTargetTag"); if (!DataHelper.DataSourceIsEmpty(ds)) { string selected = hdnSelectedName.Value; string lastDisplayName = null; int i = 0; int count = ds.Tables[0].Rows.Count; string machSelectScript = null; foreach (DataRow dr in ds.Tables[0].Rows) { string codeName = ValidationHelper.GetString(dr["TranslationServiceName"], ""); // Check availability if (TranslationServiceHelper.IsServiceAvailable(codeName, CMSContext.CurrentSiteName)) { if (string.IsNullOrEmpty(selected) && (i == 0)) { selected = codeName; } bool isMachine = ValidationHelper.GetBoolean(dr["TranslationServiceIsMachine"], false); string displayName = ValidationHelper.GetString(dr["TranslationServiceDisplayName"], ""); bool supportsInstructions = ValidationHelper.GetBoolean(dr["TranslationServiceSupportsInstructions"], false); bool supportsPriority = ValidationHelper.GetBoolean(dr["TranslationServiceSupportsPriority"], false); bool supportsDeadline = ValidationHelper.GetBoolean(dr["TranslationServiceSupportsDeadline"], false); bool generateTargetTag = ValidationHelper.GetBoolean(dr["TranslationServiceGenerateTargetTag"], false); if (isMachine && !string.IsNullOrEmpty(MachineServiceSuffix)) { displayName += MachineServiceSuffix; } string selectScript = "SelectService(" + ScriptHelper.GetString(codeName) + ", " + (supportsInstructions ? "true" : "false") + ", " + (supportsPriority ? "true" : "false") + ", " + (!isMachine && allowBinary ? "true" : "false") + ", " + (supportsDeadline ? "true" : "false") + ", " + (generateTargetTag ? "true" : "false") + ")"; bool isSelected = selected.Equals(codeName, StringComparison.CurrentCultureIgnoreCase); if (isSelected) { hdnSelectedName.Value = selected; if (string.IsNullOrEmpty(machSelectScript)) { machSelectScript = selectScript; } } string radioBtn = ""; radioBtn += ""; lastDisplayName = displayName; mAnyServiceAvailable = true; ltlServices.Text += radioBtn + (i < count - 1 ? "
" : ""); i++; } } // If only one service is available, display it in a different way if (i == 1) { DisplayedServiceName = lastDisplayName; ltlServices.Text = DisplayOnlyServiceName ? "" + HTMLHelper.HTMLEncode(lastDisplayName) + "" : String.Empty; } if (!String.IsNullOrEmpty(machSelectScript)) { // Register selection script for first service ScriptHelper.RegisterStartupScript(this.Page, typeof(string), "TranslationServiceSelectorSelection", machSelectScript, true); } DisplayedServicesCount = i; } } #endregion #region "Methods" /// /// Validates the data. Returns error msg if something is not ok. /// private string ValidateData() { if (dtDeadline.SelectedDateTime != DataHelper.DATETIME_NOT_SELECTED) { if (dtDeadline.SelectedDateTime < DateTime.Now) { return GetString("translationservice.invaliddeadline"); } } return null; } /// /// Submits the node for translation. Does not check the permissions, you need to chek it before calling this method. /// public string SubmitToTranslation() { string err = ValidateData(); if (!string.IsNullOrEmpty(err)) { return err; } TranslationSettings settings = TranslationSettings ?? new TranslationSettings(); if (string.IsNullOrEmpty(settings.TargetLanguage)) { settings.TargetLanguage = CMSContext.PreferredCultureCode; } settings.TranslateWebpartProperties = SettingsKeyProvider.GetBoolValue(CMSContext.CurrentSiteName + ".CMSTranslateWebpartProperties"); settings.SourceLanguage = FromLanguage; settings.Instructions = Instructions; settings.Priority = Priority; settings.ProcessBinary = ProcessBinary; settings.TranslateAttachments = ProcessBinary; settings.TranslationDeadline = Deadline; settings.TranslationServiceName = hdnSelectedName.Value; settings.GenerateTargetTag = ValidationHelper.GetBoolean(hdnGenerateTarget.Value, false); TreeProvider tree = TreeProvider; if (tree == null) { tree = new TreeProvider(); } TreeNode node = DocumentHelper.GetDocument(NodeID, settings.SourceLanguage, true, tree); //tree.SelectSingleNode(NodeID, settings.SourceLanguage, true, settings.TranslateDocCoupledData); TranslationSubmissionInfo submissionInfo = null; return TranslationServiceHelper.SubmitToTranslation(settings, node, out submissionInfo); } #endregion }