private static void CleanupBackstories()
        {
            string activeLanguageCoreModFolderPath = TranslationFilesCleaner.GetActiveLanguageCoreModFolderPath();
            string text = Path.Combine(activeLanguageCoreModFolderPath, "Backstories");

            Directory.CreateDirectory(text);
            string path = Path.Combine(text, "Backstories.xml");

            File.Delete(path);
            XDocument xDocument = new XDocument();

            try
            {
                XElement xElement = new XElement("BackstoryTranslations");
                xDocument.Add(xElement);
                xElement.Add(new XComment("NEWLINE"));
                foreach (KeyValuePair <string, Backstory> current in from x in BackstoryDatabase.allBackstories
                         orderby x.Key
                         select x)
                {
                    try
                    {
                        XElement xElement2 = new XElement(current.Key);
                        TranslationFilesCleaner.AddBackstoryFieldElement(xElement2, "title", current.Value.title, current.Value.untranslatedTitle, current.Value.titleTranslated);
                        TranslationFilesCleaner.AddBackstoryFieldElement(xElement2, "titleFemale", current.Value.titleFemale, current.Value.untranslatedTitleFemale, current.Value.titleFemaleTranslated);
                        TranslationFilesCleaner.AddBackstoryFieldElement(xElement2, "titleShort", current.Value.titleShort, current.Value.untranslatedTitleShort, current.Value.titleShortTranslated);
                        TranslationFilesCleaner.AddBackstoryFieldElement(xElement2, "titleShortFemale", current.Value.titleShortFemale, current.Value.untranslatedTitleShortFemale, current.Value.titleShortFemaleTranslated);
                        TranslationFilesCleaner.AddBackstoryFieldElement(xElement2, "desc", current.Value.baseDesc, current.Value.untranslatedDesc, current.Value.descTranslated);
                        xElement.Add(xElement2);
                        xElement.Add(new XComment("NEWLINE"));
                    }
                    catch (Exception ex)
                    {
                        Log.Error(string.Concat(new object[]
                        {
                            "Could not process backstory ",
                            current.Key,
                            ": ",
                            ex
                        }), false);
                    }
                }
            }
            finally
            {
                TranslationFilesCleaner.SaveXMLDocumentWithProcessedNewlineTags(xDocument, path);
            }
        }
 private static void DoCleanupTranslationFiles()
 {
     if (LanguageDatabase.activeLanguage == LanguageDatabase.defaultLanguage)
     {
         return;
     }
     try
     {
         try
         {
             TranslationFilesCleaner.CleanupKeyedTranslations();
         }
         catch (Exception arg)
         {
             Log.Error("Could not cleanup keyed translations: " + arg, false);
         }
         try
         {
             TranslationFilesCleaner.CleanupDefInjections();
         }
         catch (Exception arg2)
         {
             Log.Error("Could not cleanup def-injections: " + arg2, false);
         }
         try
         {
             TranslationFilesCleaner.CleanupBackstories();
         }
         catch (Exception arg3)
         {
             Log.Error("Could not cleanup backstories: " + arg3, false);
         }
         Messages.Message("MessageTranslationFilesCleanupDone".Translate(new object[]
         {
             TranslationFilesCleaner.GetActiveLanguageCoreModFolderPath()
         }), MessageTypeDefOf.TaskCompletion, false);
     }
     catch (Exception arg4)
     {
         Log.Error("Could not cleanup translation files: " + arg4, false);
     }
 }
        private static void CleanupDefInjections()
        {
            string        activeLanguageCoreModFolderPath = TranslationFilesCleaner.GetActiveLanguageCoreModFolderPath();
            string        text          = Path.Combine(activeLanguageCoreModFolderPath, "DefLinked");
            string        text2         = Path.Combine(activeLanguageCoreModFolderPath, "DefInjected");
            DirectoryInfo directoryInfo = new DirectoryInfo(text);

            if (directoryInfo.Exists)
            {
                if (!Directory.Exists(text2))
                {
                    Directory.Move(text, text2);
                    Thread.Sleep(1000);
                    directoryInfo = new DirectoryInfo(text2);
                }
            }
            else
            {
                directoryInfo = new DirectoryInfo(text2);
            }
            if (!directoryInfo.Exists)
            {
                Log.Error("Could not find def-injections folder for the active language.", false);
                return;
            }
            FileInfo[] files = directoryInfo.GetFiles("*.xml", SearchOption.AllDirectories);
            for (int i = 0; i < files.Length; i++)
            {
                FileInfo fileInfo = files[i];
                try
                {
                    fileInfo.Delete();
                }
                catch (Exception ex)
                {
                    Log.Error(string.Concat(new object[]
                    {
                        "Could not delete ",
                        fileInfo.Name,
                        ": ",
                        ex
                    }), false);
                }
            }
            foreach (Type current in GenDefDatabase.AllDefTypesWithDatabases())
            {
                try
                {
                    TranslationFilesCleaner.CleanupDefInjectionsForDefType(current, directoryInfo.FullName);
                }
                catch (Exception ex2)
                {
                    Log.Error(string.Concat(new object[]
                    {
                        "Could not process def-injections for type ",
                        current.Name,
                        ": ",
                        ex2
                    }), false);
                }
            }
        }
        private static void CleanupKeyedTranslations()
        {
            LoadedLanguage activeLanguage = LanguageDatabase.activeLanguage;
            LoadedLanguage english        = LanguageDatabase.defaultLanguage;
            string         activeLanguageCoreModFolderPath = TranslationFilesCleaner.GetActiveLanguageCoreModFolderPath();
            string         text          = Path.Combine(activeLanguageCoreModFolderPath, "CodeLinked");
            string         text2         = Path.Combine(activeLanguageCoreModFolderPath, "Keyed");
            DirectoryInfo  directoryInfo = new DirectoryInfo(text);

            if (directoryInfo.Exists)
            {
                if (!Directory.Exists(text2))
                {
                    Directory.Move(text, text2);
                    Thread.Sleep(1000);
                    directoryInfo = new DirectoryInfo(text2);
                }
            }
            else
            {
                directoryInfo = new DirectoryInfo(text2);
            }
            if (!directoryInfo.Exists)
            {
                Log.Error("Could not find keyed translations folder for the active language.", false);
                return;
            }
            DirectoryInfo directoryInfo2 = new DirectoryInfo(Path.Combine(TranslationFilesCleaner.GetEnglishLanguageCoreModFolderPath(), "Keyed"));

            if (!directoryInfo2.Exists)
            {
                Log.Error("English keyed translations folder doesn't exist.", false);
                return;
            }
            FileInfo[] files = directoryInfo.GetFiles("*.xml", SearchOption.AllDirectories);
            for (int i = 0; i < files.Length; i++)
            {
                FileInfo fileInfo = files[i];
                try
                {
                    fileInfo.Delete();
                }
                catch (Exception ex)
                {
                    Log.Error(string.Concat(new object[]
                    {
                        "Could not delete ",
                        fileInfo.Name,
                        ": ",
                        ex
                    }), false);
                }
            }
            FileInfo[] files2 = directoryInfo2.GetFiles("*.xml", SearchOption.AllDirectories);
            for (int j = 0; j < files2.Length; j++)
            {
                FileInfo fileInfo2 = files2[j];
                try
                {
                    string path  = new Uri(directoryInfo2.FullName + Path.DirectorySeparatorChar).MakeRelativeUri(new Uri(fileInfo2.FullName)).ToString();
                    string text3 = Path.Combine(directoryInfo.FullName, path);
                    Directory.CreateDirectory(Path.GetDirectoryName(text3));
                    fileInfo2.CopyTo(text3);
                }
                catch (Exception ex2)
                {
                    Log.Error(string.Concat(new object[]
                    {
                        "Could not copy ",
                        fileInfo2.Name,
                        ": ",
                        ex2
                    }), false);
                }
            }
            List <LoadedLanguage.KeyedReplacement> list = (from x in activeLanguage.keyedReplacements
                                                           where !x.Value.isPlaceholder && !english.HaveTextForKey(x.Key, false)
                                                           select x.Value).ToList <LoadedLanguage.KeyedReplacement>();
            HashSet <LoadedLanguage.KeyedReplacement> writtenUnusedKeyedTranslations = new HashSet <LoadedLanguage.KeyedReplacement>();

            FileInfo[] files3 = directoryInfo.GetFiles("*.xml", SearchOption.AllDirectories);
            for (int k = 0; k < files3.Length; k++)
            {
                FileInfo fileInfo3 = files3[k];
                try
                {
                    XDocument xDocument = XDocument.Load(fileInfo3.FullName, LoadOptions.PreserveWhitespace);
                    XElement  xElement  = xDocument.DescendantNodes().OfType <XElement>().FirstOrDefault <XElement>();
                    if (xElement != null)
                    {
                        try
                        {
                            foreach (XNode current in xElement.DescendantNodes())
                            {
                                XElement xElement2 = current as XElement;
                                if (xElement2 != null)
                                {
                                    foreach (XNode current2 in xElement2.DescendantNodes())
                                    {
                                        try
                                        {
                                            XText xText = current2 as XText;
                                            if (xText != null && !xText.Value.NullOrEmpty())
                                            {
                                                string value = " EN: " + xText.Value + " ";
                                                current.AddBeforeSelf(new XComment(value));
                                                current.AddBeforeSelf(Environment.NewLine);
                                                current.AddBeforeSelf("  ");
                                            }
                                        }
                                        catch (Exception ex3)
                                        {
                                            Log.Error(string.Concat(new object[]
                                            {
                                                "Could not add comment node in ",
                                                fileInfo3.Name,
                                                ": ",
                                                ex3
                                            }), false);
                                        }
                                        current2.Remove();
                                    }
                                    try
                                    {
                                        string text4;
                                        if (activeLanguage.TryGetTextFromKey(xElement2.Name.ToString(), out text4))
                                        {
                                            if (!text4.NullOrEmpty())
                                            {
                                                xElement2.Add(new XText(text4.Replace("\n", "\\n")));
                                            }
                                        }
                                        else
                                        {
                                            xElement2.Add(new XText("TODO"));
                                        }
                                    }
                                    catch (Exception ex4)
                                    {
                                        Log.Error(string.Concat(new object[]
                                        {
                                            "Could not add existing translation or placeholder in ",
                                            fileInfo3.Name,
                                            ": ",
                                            ex4
                                        }), false);
                                    }
                                }
                            }
                            bool flag = false;
                            foreach (LoadedLanguage.KeyedReplacement current3 in list)
                            {
                                if (new Uri(fileInfo3.FullName).Equals(new Uri(current3.fileSourceFullPath)))
                                {
                                    if (!flag)
                                    {
                                        xElement.Add("  ");
                                        xElement.Add(new XComment(" UNUSED "));
                                        xElement.Add(Environment.NewLine);
                                        flag = true;
                                    }
                                    XElement xElement3 = new XElement(current3.key);
                                    if (current3.isPlaceholder)
                                    {
                                        xElement3.Add(new XText("TODO"));
                                    }
                                    else if (!current3.value.NullOrEmpty())
                                    {
                                        xElement3.Add(new XText(current3.value.Replace("\n", "\\n")));
                                    }
                                    xElement.Add("  ");
                                    xElement.Add(xElement3);
                                    xElement.Add(Environment.NewLine);
                                    writtenUnusedKeyedTranslations.Add(current3);
                                }
                            }
                            if (flag)
                            {
                                xElement.Add(Environment.NewLine);
                            }
                        }
                        finally
                        {
                            TranslationFilesCleaner.SaveXMLDocumentWithProcessedNewlineTags(xDocument.Root, fileInfo3.FullName);
                        }
                    }
                }
                catch (Exception ex5)
                {
                    Log.Error(string.Concat(new object[]
                    {
                        "Could not process ",
                        fileInfo3.Name,
                        ": ",
                        ex5
                    }), false);
                }
            }
            foreach (IGrouping <string, LoadedLanguage.KeyedReplacement> current4 in from x in list
                     where !writtenUnusedKeyedTranslations.Contains(x)
                     group x by x.fileSourceFullPath)
            {
                try
                {
                    if (File.Exists(current4.Key))
                    {
                        Log.Error("Could not save unused keyed translations to " + current4.Key + " because this file already exists.", false);
                    }
                    else
                    {
                        object[] expr_676  = new object[1];
                        int      arg_6DB_1 = 0;
                        XName    arg_6D6_0 = "LanguageData";
                        object[] expr_688  = new object[4];
                        expr_688[0] = new XComment("NEWLINE");
                        expr_688[1] = new XComment(" UNUSED ");
                        expr_688[2] = current4.Select(delegate(LoadedLanguage.KeyedReplacement x)
                        {
                            string text5 = (!x.isPlaceholder) ? x.value : "TODO";
                            return(new XElement(x.key, new XText((!text5.NullOrEmpty()) ? text5.Replace("\n", "\\n") : string.Empty)));
                        });
                        expr_688[3]         = new XComment("NEWLINE");
                        expr_676[arg_6DB_1] = new XElement(arg_6D6_0, expr_688);
                        XDocument doc = new XDocument(expr_676);
                        TranslationFilesCleaner.SaveXMLDocumentWithProcessedNewlineTags(doc, current4.Key);
                    }
                }
                catch (Exception ex6)
                {
                    Log.Error(string.Concat(new object[]
                    {
                        "Could not save unused keyed translations to ",
                        current4.Key,
                        ": ",
                        ex6
                    }), false);
                }
            }
        }