using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml; using System.Text.RegularExpressions; namespace EduNetworkBuilder { [Serializable] public class LanguageString { public string text=""; public string language="en"; public string tag_type; private LanguageString() { } public LanguageString(string lang, string msg, string tag) { text = msg; language = lang; tag_type = tag; } public LanguageString Clone() { LanguageString newitem = new LanguageString(); newitem.text = text; newitem.language = language; newitem.tag_type = tag_type; return newitem; } public LanguageString(XmlNode theNode, string tag) { XmlNodeType myNodetype = theNode.NodeType; if (myNodetype == XmlNodeType.Element) { if(Regex.IsMatch(theNode.Name.ToLower(),"^[a-z][a-z]_" + tag)) { //We have a language, and then a message text = theNode.InnerText; language = Regex.Replace(theNode.Name.ToLower(), "_" + tag, ""); } else { //It is just a message. Use the default language. language = "en"; text = theNode.InnerText; } } tag_type = tag; } public bool Equals(LanguageString compareWith) { if (text != compareWith.text) return false; if (tag_type != compareWith.tag_type) return false; if (language != compareWith.language) return false; return true; } public void Save(XmlWriter writer) { writer.WriteElementString(language+"_" + tag_type, text); } } [Serializable] public class LanguageStrings { List TheStrings = new List(); string tag = ""; /// /// Make a language string list of type: "message", "title" /// /// Should be of type "message" or "title" public LanguageStrings(string type) { tag = type; } private LanguageStrings() { } public LanguageStrings(LanguageStrings ToCopy) { LanguageStrings.Clone(ToCopy, this); } public static void Clone(LanguageStrings source, LanguageStrings dest) { dest.tag = source.tag; dest.TheStrings.Clear(); foreach(LanguageString ls in source.TheStrings) { dest.TheStrings.Add(ls.Clone()); } } public LanguageStrings Clone() { LanguageStrings newitem = new LanguageStrings(); LanguageStrings.Clone(this, newitem); return newitem; } public void Add(XmlNode theNode) { LanguageString oneString = new LanguageString(theNode, tag); //remove duplicates for (int i = TheStrings.Count - 1; i >= 0; i--) { if (TheStrings[i].language == oneString.language) { TheStrings.RemoveAt(i); } } TheStrings.Add(oneString); } public void Add(string Text) { NBSettings oursettings = NB.GetSettings(); LanguageString oneString = new LanguageString(oursettings.ChosenLanguage,Text,tag); //remove duplicates for (int i = TheStrings.Count - 1; i >= 0; i--) { if (TheStrings[i].language == oneString.language) { TheStrings.RemoveAt(i); } } TheStrings.Add(oneString); } public void Save(XmlWriter writer) { foreach(LanguageString LS in TheStrings) { LS.Save(writer); } } public string GetText(string language) { //Find the matching language foreach(LanguageString LS in TheStrings) { if(LS.language == language) { return LS.text; } } //Return the english version if one exists if(language != "en") { return GetText("en"); } //return the first language (if the puzzle is only in french, use that.) if (TheStrings.Count > 0) return TheStrings[0].text; //If there is no language, return a blank message return ""; } public void ChangeText(string language, string NewText) { bool done = false; //Find the matching language foreach (LanguageString LS in TheStrings) { if (LS.language == language) { LS.text = NewText; done = true; } } if(!done) { LanguageString oneString = new LanguageString(language, NewText, tag); TheStrings.Add(oneString); } } public string GetText() { NBSettings oursettings = NB.GetSettings(); return GetText(oursettings.ChosenLanguage); } } }