/// <summary> /// Compute a summary for given project containing languages and percentages /// </summary> /// <param name="project">ProjectInfo of the project to be checked</param> /// <param name="maxPerc">only returns the objects in the list where the completed percentage is below gived value</param> /// <param name="minPerc">only returns the objects in the list where the completed percentage is above gived value</param> /// <returns>A List of translated Languages as ProjectFileShortSummary object</returns> public static List <ProjectHelper.ProjectFileShortSummary> ComputeSummary(ProjectHelper.ProjectInfo project, double minPerc = 0, double maxPerc = 99.999) { List <ProjectHelper.ProjectFileShortSummary> functionReturnValue = new List <ProjectHelper.ProjectFileShortSummary>(); string ProjDirectory = ConfigurationManager.AppSettings["ProjectDirectory"] + project.Folder; if (Directory.Exists(ProjDirectory)) { // Logger.Write("Directory '" + Directory + "' exists.", Category, 10, 0, Diagnostics.TraceEventType.Verbose, LogTitle, LogProperties); string[] AllLanguageFiles = Directory.GetFiles(ProjDirectory, "*.xml", SearchOption.TopDirectoryOnly); foreach (string LanguageFilename in AllLanguageFiles) { XmlDocument LanguageXML = XMLFile.GetXMLDocument(LanguageFilename); ProjectHelper.ProjectFileShortSummary pss = new ProjectHelper.ProjectFileShortSummary(); // if there is something wrong with the xml file, it will raise an exception here for the first time try { pss.LangCode = LanguageXML.SelectSingleNode("files").Attributes["language"].Value; } catch (Exception e) { throw new Exception("Your language file " + LanguageFilename + " is damaged!", e); } double Percentage = 0.0; DateTime LastUpdate = DateTime.MinValue; foreach (XmlNode FileNode in LanguageXML.SelectNodes("/files/file")) { Percentage += Convert.ToDouble(FileNode["percentcompleted"].InnerText, CultureInfo.InvariantCulture); try { DateTime LastChange = DateTime.Parse(FileNode["lastchange"].InnerText); if (LastChange > LastUpdate) { LastUpdate = LastChange; } } catch (FormatException) { } } Percentage = Math.Round(Percentage / LanguageXML.SelectNodes("/files/file").Count, 4); pss.Percentage = Percentage; pss.LastUpdate = LastUpdate; pss.LangFile = LanguageFilename; if (Percentage >= minPerc && Percentage <= maxPerc) { functionReturnValue.Add(pss); } } } return(functionReturnValue); }
protected void initTranslationTable() { // if none was chosen, on site.master.cs the first one will be selected as default ProjectHelper.ProjectInfo Project = (ProjectHelper.ProjectInfo)Session["CurrentlyChosenProject"]; string ProjDirectory = ConfigurationManager.AppSettings["ProjectDirectory"].ToString() + Project.Folder + "\\"; string Language = User.Identity.getUserLanguage(Session); string SourceLang = User.Identity.GetSourceLanguage(); SelectedProject.Text = Project.Name + " files"; // Getting Directory + Language + ".xml" - if it doesn't exist, it will automatically be created on percentage calculation if (!File.Exists(ProjDirectory + Language + ".xml")) { XMLFile.ComputePercentage(Project, Language, null, SourceLang); } if (!File.Exists(ProjDirectory + Language + ".xml")) { showError("Language file for '" + Language + "' could not be created!"); return; } else { XmlDocument LanguageXML = XMLFile.GetXMLDocument(ProjDirectory + Language + ".xml"); XmlNodeList AllFiles = LanguageXML.SelectNodes("/files[@language=\"" + Language + "\"]/file"); DataSet oDs = new DataSet(); oDs.ReadXml(ProjDirectory + Language + ".xml"); if (oDs.Tables.Count >= 2) { FileList.DataSource = oDs.Tables[1]; } FileList.DataBind(); } //Check if a file is selected if (Session["SelectedFilename"] != null) { CurrentFile.Text = "Selected file: " + Convert.ToString(Session["SelectedFilename"]); Save.Visible = true; XmlDocument SourceFile; if (Directory.Exists(Path.Combine(ProjDirectory, SourceLang))) { SourceFile = XMLFile.GetXMLDocument(Path.Combine(ProjDirectory, SourceLang, Convert.ToString(Session["SelectedFilename"]) + "." + SourceLang + ".resx")); } else { SourceFile = XMLFile.GetXMLDocument(ProjDirectory + Convert.ToString(Session["SelectedFilename"]) + ".resx"); } if (SourceFile == null) { Session["SelectedFilename"] = null; Response.Redirect("/Account/Default.aspx"); // redirect to homepage, as this selected file does not longer seem to exist return; } XmlDocument TranslatedFile = XMLFile.GetXMLDocument(ProjDirectory + Language + "\\" + Convert.ToString(Session["SelectedFilename"]) + "." + Language + ".resx"); DataTable Table = new DataTable(); Table.Columns.Add("TextName"); Table.Columns.Add("English"); Table.Columns.Add("Translation"); Table.Columns.Add("Comment"); foreach (XmlNode Text in SourceFile.SelectNodes("/root/data")) { DataRow Row = Table.NewRow(); Row["TextName"] = Text.Attributes["name"].InnerText; Row["English"] = Server.HtmlEncode(Text.SelectSingleNode("value")?.InnerText); Row["Comment"] = TranslatedFile?.SelectSingleNode("/root/data[@name=\"" + Row["Textname"].ToString() + "\"]/comment")?.InnerText ?? ""; XmlNode Translated = TranslatedFile?.SelectSingleNode("/root/data[@name=\"" + Row["Textname"].ToString() + "\"]/value"); if (Translated == null) { Row["Translation"] = string.Empty; } else { Row["Translation"] = Server.HtmlEncode(Translated.InnerText); } bool CanBeAdded = true; foreach (String notToCheck in XMLFile.NotArgs) { if (Row["TextName"].ToString().Contains("." + notToCheck) || String.IsNullOrEmpty(Row["English"].ToString())) { CanBeAdded = false; } } if (CanBeAdded && (!cb_showOnlyUntr.Checked || String.IsNullOrEmpty(Row["Translation"].ToString()))) { Table.Rows.Add(Row); } } TextElements.DataSource = Table; TextElements.DataBind(); Save.Visible = true; } else { Save.Visible = false; } }
protected void Save_Click(object sender, System.EventArgs e) { if (!User.Identity.IsAuthenticated) { showError("You are not logged in. Please login!", "/Account/Login", "/translate"); } else { ProjectHelper.ProjectInfo Project = (ProjectHelper.ProjectInfo)Session["CurrentlyChosenProject"]; string Language = User.Identity.getUserLanguage(Session); string ProjectDirectory = ConfigurationManager.AppSettings["ProjectDirectory"].ToString() + Project.Folder + "\\"; string SourceLang = User.Identity.GetSourceLanguage(); if (Project == null || Language == null) { showError("Session expired. Could not read Project or Language. Please login!", "/Account/Login", "/translate"); // TODO: Save Values here for relog (like HttpCookie myCookie = new HttpCookie("savedValues");) } int Updates = 0; XmlDocument SourceFile; if (Directory.Exists(Path.Combine(ProjectDirectory, SourceLang))) { SourceFile = XMLFile.GetXMLDocument(Path.Combine(ProjectDirectory, SourceLang, Convert.ToString(Session["SelectedFilename"]) + "." + SourceLang + ".resx")); } else { SourceFile = XMLFile.GetXMLDocument(ProjectDirectory + Convert.ToString(Session["SelectedFilename"]) + ".resx"); } string TargetFilename = ProjectDirectory + Language + "\\" + Convert.ToString(Session["SelectedFilename"]) + "." + Language + ".resx"; string TargetFileNameForGen = ProjectDirectory + Language + "\\Download" + "\\" + Convert.ToString(Session["SelectedFilename"]) + "." + Language + ".resx"; // if download directory does not exist, create it if (!Directory.Exists(ProjectDirectory + Language + "\\Download")) { Directory.CreateDirectory(ProjectDirectory + Language + "\\Download"); } XmlDocument TranslatedFile = XMLFile.GetXMLDocument(TargetFilename); string Filename = Convert.ToString(Session["SelectedFilename"]); foreach (RepeaterItem Item in TextElements.Items) { Label LB = Item.FindControl("Element") as Label; TextBox TB = Item.FindControl("TranslatedText") as TextBox; string TComment = (Item.FindControl("TranslateComment") as TextBox).Text; string ElementName = Utils.HTMLDecode(LB.Text); XmlNode Node = TranslatedFile.SelectSingleNode("/root/data[@name=\"" + ElementName + "\"]/value"); // Node does not exist in translation file, so add it if (Node == null) { Node = SourceFile.SelectSingleNode("/root/data[@name=\"" + ElementName + "\"]"); XmlNode rootnode = TranslatedFile.SelectSingleNode("/root"); XmlNode CopiedNode = TranslatedFile.ImportNode(Node, true); CopiedNode.SelectSingleNode("value").InnerText = TB.Text; rootnode.AppendChild(CopiedNode); Updates += 1; } else { string CurrentValue = Node.InnerText; string NewValue = TB.Text; // if value changed.. if (CurrentValue != NewValue) { Node.InnerText = NewValue; Updates += 1; } } XmlNode CommentNode = TranslatedFile.SelectSingleNode("/root/data[@name=\"" + ElementName + "\"]/comment"); // Node does not exist in translation file, so add it if (CommentNode == null) { CommentNode = TranslatedFile.SelectSingleNode("/root/data[@name=\"" + ElementName + "\"]"); XmlNode rootnode = TranslatedFile.SelectSingleNode("/root"); //Create a new comment node. XmlElement elem = TranslatedFile.CreateElement("comment"); elem.InnerText = TComment; CommentNode.AppendChild(elem); rootnode.AppendChild(CommentNode); Updates += 1; } else { string CurrentValue = CommentNode.InnerText; // if value changed.. if (CurrentValue != TComment) { Updates += 1; CommentNode.InnerText = TComment; } } } int alreadyTranslated = Convert.ToInt32(User.Identity.GetTranslatedStrings()); int updateCount = Updates; User.Identity.SetTranslatedStrings(alreadyTranslated + updateCount); // No updates made. No need to save file, but recalculate the percentage in case the file changed externally if (Updates == 0) { XMLFile.ComputePercentage(Project, Language, Convert.ToString(Session["SelectedFilename"]), SourceLang); } else { TranslatedFile.Save(TargetFilename); Utils.CreateBackup(TranslatedFile, TargetFilename); XMLFile.ComputePercentage(Project, Language, Convert.ToString(Session["SelectedFilename"]), SourceLang); //Session["GlobalMessage"] = "File '" + TargetFilename.Split("\\".ToCharArray())[TargetFilename.Split("\\".ToCharArray()).GetUpperBound(0)] + "' saved sucessfully!"; TranslatedFile.Save(TargetFileNameForGen); if (ProjectHelper.FTPUploadEnabled(Project)) { try { ProjectHelper.FTPUpload(Project, TargetFilename, Language); } catch (Exception ex) { showError("Error: " + ex.Message); } } Response.Redirect("Translate.aspx"); Session.Remove("SelectedFilename"); } } }
/// <summary> /// Refresh completed percentage /// </summary> /// <param name="project">ProjectInfo of the current project</param> /// <param name="language">shortcut of language, e.g. de</param> /// <param name="filename">File which was updated, e.g. beta.aspx. Or null to check all files</param> /// <param name="sourceLang">Source language the file is compared to</param> /// <returns>Percentage as integer</returns> /// <remarks>Creates info file if not existing</remarks> public static double ComputePercentage(ProjectHelper.ProjectInfo project, string language, string filename, string sourceLang) { double Percentage = 0; string ProjectDirectory = ConfigurationManager.AppSettings["ProjectDirectory"] + project.Folder + "\\"; if (!Directory.Exists(ProjectDirectory)) { Directory.CreateDirectory(ProjectDirectory); } string[] allMainProjectFiles = Directory.GetFiles(ProjectDirectory, "*.resx", SearchOption.TopDirectoryOnly); if (allMainProjectFiles.Length == 0) { throw new Exception("No Resource files in the project directory " + ProjectDirectory); } // Language file does not exist, so create new language file in a potential new folder if (!File.Exists(ProjectDirectory + language + ".xml")) { // Now write the main chart xml for Form Update XmlTextWriter writer = new XmlTextWriter(ProjectDirectory + language + ".xml", System.Text.Encoding.UTF8) { Formatting = Formatting.Indented, Indentation = 3 }; writer.WriteStartDocument(); writer.WriteComment("Created on " + DateTime.Now.ToString()); // <files> writer.WriteStartElement("files"); writer.WriteAttributeString("language", language); string ResXFile = null; string ShortName = null; foreach (string ResXFile_loopVariable in allMainProjectFiles) { // <file> ResXFile = ResXFile_loopVariable; writer.WriteStartElement("file"); ShortName = ResXFile.Substring(ProjectDirectory.Length).Replace(".resx", ""); writer.WriteElementString("name", ShortName); writer.WriteElementString("percentcompleted", "0"); writer.WriteElementString("caption", ""); writer.WriteElementString("lastchange", DateTime.Now.ToShortDateString()); writer.WriteEndElement(); // </file> } writer.WriteEndElement(); // </files> writer.WriteEndDocument(); writer.Close(); } XmlDocument LanguageXML = XMLFile.GetXMLDocument(ProjectDirectory + language + ".xml"); // get all files that are registered in that language file XmlNodeList AllFiles = LanguageXML.SelectNodes("/files/file"); bool SummaryUpdated = false; if (!Directory.Exists(ProjectDirectory + language)) { Directory.CreateDirectory(ProjectDirectory + language); } foreach (XmlNode SingleFile in AllFiles) { string CurrentFile = SingleFile.SelectSingleNode("name").InnerText; // if the current file in the directoy is not invalid and either no file was specified to test (== all files) or the file matches the given one if (CurrentFile != null && (filename == null || CurrentFile == filename)) { XmlDocument SourceFile; if (Directory.Exists(Path.Combine(ProjectDirectory, sourceLang))) { SourceFile = XMLFile.GetXMLDocument(Path.Combine(ProjectDirectory, sourceLang, CurrentFile + "." + sourceLang + ".resx")); } else { SourceFile = XMLFile.GetXMLDocument(ProjectDirectory + CurrentFile + ".resx"); } // if not null, english source file was found if (SourceFile != null) { XmlDocument TranslatedDoc = XMLFile.GetXMLDocument(Path.Combine(ProjectDirectory, language, (CurrentFile + "." + language + ".resx"))); // Is translated language file not there? if (TranslatedDoc == null) { // Create empty translation file foreach (XmlNode Node in SourceFile.SelectNodes("/root/data/value")) { Node.InnerText = string.Empty; } // save the "emptied" english source file to the translated file name SourceFile.Save(Path.Combine(ProjectDirectory, language, (CurrentFile + "." + language + ".resx"))); SingleFile.SelectSingleNode("percentcompleted").InnerText = "0"; } else // if the translation file { double FileElements = 0; double TranslatedFileElements = 0; // get through each node in the english doc .. foreach (XmlNode SourceNode in SourceFile.SelectNodes("root/data")) { string NodeName = SourceNode.Attributes["name"].InnerText; Array NodePoints = default(Array); NodePoints = NodeName.Split('.'); bool CanBeAdded = true; for (int i = 0; i <= NotArgs.Length - 1; i++) { if (NodeName.Contains("." + NotArgs[i]) || String.IsNullOrEmpty(SourceNode.SelectSingleNode("value")?.InnerText)) { CanBeAdded = false; } } if (CanBeAdded) { FileElements += 1; XmlNode TranslatedNode = TranslatedDoc.SelectSingleNode("root/data[@name='" + NodeName + "']"); // if translated node was null, it wasn't there if (TranslatedNode != null) { TranslatedNode = TranslatedNode.SelectSingleNode("value"); // if value was null or text empty, the node was empty and therefore not translated if (TranslatedNode != null && (TranslatedNode.InnerText).Trim().Length > 0) { TranslatedFileElements += 1; } } } } if (FileElements == 0) { Percentage = 100; } else { Percentage = (TranslatedFileElements / FileElements) * 100; } } } SingleFile.SelectSingleNode("caption").InnerText = ""; // Check whether percentage is changed - if this condition was true, the percentage was already stored correct if (Convert.ToDouble(SingleFile.SelectSingleNode("percentcompleted").InnerText.Replace(",", "."), CultureInfo.InvariantCulture) != Percentage) { SingleFile.SelectSingleNode("percentcompleted").InnerText = Percentage.ToString("0.00", System.Globalization.CultureInfo.InvariantCulture); SingleFile.SelectSingleNode("lastchange").InnerText = DateTime.Now.ToString(); if (!SummaryUpdated) { SummaryUpdated = true; } } } } // Save configuration file if it was changed if (SummaryUpdated) { LanguageXML.Save(ProjectDirectory + language + ".xml"); } return(Percentage); }