From 6058ddf20bfe1ff50e6a01a1d846fdda052a92a2 Mon Sep 17 00:00:00 2001
From: Tim Young <Tim.Young@LightSys.org>
Date: Sat, 1 Aug 2015 15:03:23 -0600
Subject: [PATCH] Allow puzzles to have alternate languages for description and
 title.

---
 EduNetworkBuilder/EduNetworkBuilder.csproj   |   1 +
 EduNetworkBuilder/LanguageString.cs          | 131 +++++++++++++++++++
 EduNetworkBuilder/Network.cs                 |  34 +++--
 EduNetworkBuilder/NetworkBuilder.cs          |   8 +-
 EduNetworkBuilder/OptionsWindow.cs           |   8 +-
 EduNetworkBuilder/Resources/ReleaseNotes.rtf | Bin 6791 -> 7125 bytes
 6 files changed, 161 insertions(+), 21 deletions(-)
 create mode 100644 EduNetworkBuilder/LanguageString.cs

diff --git a/EduNetworkBuilder/EduNetworkBuilder.csproj b/EduNetworkBuilder/EduNetworkBuilder.csproj
index af7b6d9..fc246cc 100644
--- a/EduNetworkBuilder/EduNetworkBuilder.csproj
+++ b/EduNetworkBuilder/EduNetworkBuilder.csproj
@@ -91,6 +91,7 @@
     <Compile Include="IPAddressEntry.Designer.cs">
       <DependentUpon>IPAddressEntry.cs</DependentUpon>
     </Compile>
+    <Compile Include="LanguageString.cs" />
     <Compile Include="LinkEditor.cs">
       <SubType>Form</SubType>
     </Compile>
diff --git a/EduNetworkBuilder/LanguageString.cs b/EduNetworkBuilder/LanguageString.cs
new file mode 100644
index 0000000..5a45332
--- /dev/null
+++ b/EduNetworkBuilder/LanguageString.cs
@@ -0,0 +1,131 @@
+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
+{
+    public class LanguageString
+    {
+
+        public string text="";
+        public string language="en";
+        public string tag_type;
+
+        public LanguageString(string lang, string msg, string tag)
+        {
+            text = msg;
+            language = lang;
+            tag_type = tag;
+        }
+
+        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 void Save(XmlWriter writer)
+        {
+            writer.WriteElementString(language+"_" + tag_type, text);
+        }
+    }
+
+    public class LanguageStrings
+    {
+        List<LanguageString> TheStrings = new List<LanguageString>();
+        string tag = "";
+
+        /// <summary>
+        /// Make a language string list of type: "message", "title"
+        /// </summary>
+        /// <param name="type">Should be of type "message" or "title"</param>
+        public LanguageStrings(string type)
+        {
+            tag = type;
+        }
+
+        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)
+        {
+            LanguageString oneString = new LanguageString(Properties.Settings.Default.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 string GetText()
+        {
+            return GetText(Properties.Settings.Default.ChosenLanguage);
+        }
+    }
+}
\ No newline at end of file
diff --git a/EduNetworkBuilder/Network.cs b/EduNetworkBuilder/Network.cs
index 22a4100..46eb8cc 100644
--- a/EduNetworkBuilder/Network.cs
+++ b/EduNetworkBuilder/Network.cs
@@ -7,7 +7,7 @@ using System.Drawing;
 using System.Windows.Forms;
 using System.Xml;
 using System.IO;
-
+using System.Text.RegularExpressions;
 
 
 namespace EduNetworkBuilder
@@ -23,8 +23,8 @@ namespace EduNetworkBuilder
         public int Level = 0;
         public double SortOrder = 0;
         public bool ShowLabels = false;
-        public string NetMessage = "";
-        public string NetTitle = "";
+        public LanguageStrings NetMessage;
+        public LanguageStrings NetTitle;
         List<NetworkComponent> NetComponents = new List<NetworkComponent>();
         //should have background image
         Image TheNetImage = new Bitmap(1024, 1024);
@@ -51,6 +51,8 @@ namespace EduNetworkBuilder
         {
             TheNetImage = new Bitmap(myWidth, myHeight);
             PuzzleName = Name;
+            NetMessage = new LanguageStrings("message");
+            NetTitle = new LanguageStrings("title");
         }
 
         private bool isDirty()
@@ -115,12 +117,6 @@ namespace EduNetworkBuilder
                         case "network":
                             Load(Individual,PuzzleName);
                             break;
-                        case "message":
-                            NetMessage = Individual.InnerText;
-                            break;
-                        case "title":
-                            NetTitle = Individual.InnerText;
-                            break;
                         case "showlabels":
                             bool.TryParse(Individual.InnerText, out ShowLabels);
                             break;
@@ -162,11 +158,23 @@ namespace EduNetworkBuilder
                         case "startinghelplevel":
                            StartingHelpLevel = NB.ParseEnum<NetTestVerbosity>(Individual.InnerText);
                            HintsToDisplay = StartingHelpLevel;
+                            break;
+                        default:
+                            if(Regex.IsMatch(Individual.Name.ToLower(),"message"))
+                            {
+                                NetMessage.Add(Individual);
+                            }
+                            else
+                                if (Regex.IsMatch(Individual.Name.ToLower(), "title"))
+                                {
+                                    NetTitle.Add(Individual);
+                                }
+
                             break;
                     }
                 }
             }
-            if (NetMessage != "" && !AlreadyDisplayedMessage)
+            if (NetMessage.GetText() != "" && !AlreadyDisplayedMessage)
             {
                 //We have a message loaded on this network.  Display it
                 BuilderWindow myWin = (BuilderWindow)Application.OpenForms["BuilderWindow"];
@@ -176,7 +184,7 @@ namespace EduNetworkBuilder
                 }
                 else
                 {
-                    MessageBox.Show(NetMessage, NetTitle, MessageBoxButtons.OK);
+                    MessageBox.Show(NetMessage.GetText(), NetTitle.GetText(), MessageBoxButtons.OK);
                 }
                 AlreadyDisplayedMessage = true;
             }
@@ -219,8 +227,8 @@ namespace EduNetworkBuilder
             //save the number of items
             //Save all the items
             writer.WriteStartElement("Network");
-            writer.WriteElementString("message", NetMessage);
-            writer.WriteElementString("title", NetTitle);
+            NetMessage.Save(writer);
+            NetTitle.Save(writer);
             writer.WriteElementString("height", myHeight.ToString());
             writer.WriteElementString("width", myWidth.ToString());
             writer.WriteElementString("itemsize", itemsize.ToString());
diff --git a/EduNetworkBuilder/NetworkBuilder.cs b/EduNetworkBuilder/NetworkBuilder.cs
index f050bf3..5fb6001 100644
--- a/EduNetworkBuilder/NetworkBuilder.cs
+++ b/EduNetworkBuilder/NetworkBuilder.cs
@@ -270,9 +270,9 @@ namespace EduNetworkBuilder
             UpdateMessages();
             processing = true;
             Text = "EduNetworkBuilder";
-            if (myNetwork.NetTitle != "")
-                Text += ": " + myNetwork.NetTitle;
-            if (myNetwork.NetMessage != "")
+            if (myNetwork.NetTitle.GetText() != "")
+                Text += ": " + myNetwork.NetTitle.GetText();
+            if (myNetwork.NetMessage.GetText() != "")
             {
                 btnHelp.Visible = true;
             }
@@ -1047,7 +1047,7 @@ namespace EduNetworkBuilder
             RTFWindow rtwin = (RTFWindow)Application.OpenForms["RTFWindow"];
             if (rtwin == null)
             {
-                rtwin = new RTFWindow("Help: " + myNetwork.NetTitle, myNetwork.NetMessage, myNetwork.NetTests);
+                rtwin = new RTFWindow("Help: " + myNetwork.NetTitle.GetText(), myNetwork.NetMessage.GetText(), myNetwork.NetTests);
                 rtwin.Show();
                 Activate();
             }
diff --git a/EduNetworkBuilder/OptionsWindow.cs b/EduNetworkBuilder/OptionsWindow.cs
index bace3ca..8fb967d 100644
--- a/EduNetworkBuilder/OptionsWindow.cs
+++ b/EduNetworkBuilder/OptionsWindow.cs
@@ -69,8 +69,8 @@ namespace EduNetworkBuilder
         private void LoadValuesFromNetwork()
         {
             tbItemSize.Text = myNet.itemsize.ToString();
-            tbMessage.Text = myNet.NetMessage;
-            tbNetworkTitle.Text = myNet.NetTitle;
+            tbMessage.Text = myNet.NetMessage.GetText();
+            tbNetworkTitle.Text = myNet.NetTitle.GetText();
             cbDisplayTitles.Checked = myNet.ShowLabels;
             tbNetworkX.Text = myNet.myWidth.ToString();
             tbNetworkY.Text = myNet.myHeight.ToString();
@@ -105,8 +105,8 @@ namespace EduNetworkBuilder
         private void SaveValuesToNetwork()
         {
             int.TryParse(tbItemSize.Text, out myNet.itemsize);
-            myNet.NetMessage = tbMessage.Text;
-            myNet.NetTitle = tbNetworkTitle.Text;
+            myNet.NetMessage.Add( tbMessage.Text);
+            myNet.NetTitle.Add(tbNetworkTitle.Text);
             myNet.ShowLabels = cbDisplayTitles.Checked;
             int.TryParse(tbNetworkX.Text, out myNet.myWidth);
             int.TryParse(tbNetworkY.Text, out myNet.myHeight);
diff --git a/EduNetworkBuilder/Resources/ReleaseNotes.rtf b/EduNetworkBuilder/Resources/ReleaseNotes.rtf
index d3be033eede9e1fc3c8bb11c705b24d31ef4ebfb..fda40aee69bcba4131a0e355e478360765909682 100644
GIT binary patch
delta 338
zcmX|-u}TC%5JXut63jIaDiQTK%tTW$GLempO!{{Eb_Un!WqS4oF1gU$%l!ty&oK5=
z%<VmKlMcG6s#pDb^?m(uTHR3BNx@PQ>S4X^_)Otgn-uySBq9qIj1WOlvgd@3VmnaF
z+mq^RGsB%1Q3g$WP=;nodFT<AkjU_)h`ciKf;pn`rigQMbaq-XWQuCMx%1?8`P5T7
zJec9uId&65zXP2^H(pAJEsD2LPkql(ac)(dutm!M@?s<@BZ#HtB1U5~JuC949ISwK
sgVGD*z6Lp$Se5mU(S(I!-o0W7opIo?ey}cizgVB```+>APxW^63!im(-2eap

delta 16
Xcmca=-fp@<m2q+^<KfL_%=0AxH!lVL