Example #1
0
    /// <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);
    }
Example #2
0
    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;
        }
    }
Example #3
0
    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");
            }
        }
    }
Example #4
0
    /// <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);
    }