protected IEnumerable <ITranslationDumper> GetScenarioTextMergers() { if (!TextDump.IsReadyForFinalDump()) { yield break; } var needle = CombinePaths("", "abdata", "adv", "scenario", ""); var paths = BaseTextDumpPlugin.GetTranslationPaths().Where(k => k.Contains(needle)).ToList(); paths.Sort(); paths.Reverse(); var personalityCheckChars = "01234567890-".ToCharArray(); var mappings = new Dictionary <string, Dictionary <string, string> >(); var fileMaps = new Dictionary <string, List <string> >(); foreach (var path in paths) { var parts = path.Split(PathSplitter).ToList(); var personalityIndex = parts.IndexOf("scenario") + 1; if (personalityIndex == 0) { continue; } var personality = parts[personalityIndex]; var isPersonalityFile = personality.Length > 1 && personality.StartsWith("c") && personalityCheckChars.Contains(personality[1]); if (!isPersonalityFile) { continue; } var personalityMap = mappings.GetOrInit(personality, () => new Dictionary <string, string>(new TrimmedStringComparer())); var personalityFiles = fileMaps.GetOrInit(personality); personalityFiles.Add(path); foreach (var entry in BaseTextDumpPlugin.GetTranslationsForPath(path) .Where(entry => !entry.Value.IsNullOrEmpty())) { AddLocalizationToResults(personalityMap, entry); } } foreach (var translationDumper in BuildTranslationMergers(fileMaps, mappings)) { yield return(translationDumper); } }
protected IEnumerable <ITranslationDumper> GetCommunicationTextMergers() { if (!TextDump.IsReadyForFinalDump()) { yield break; } var needle = CombinePaths("", "abdata", "communication", ""); var paths = BaseTextDumpPlugin.GetTranslationPaths().Where(k => k.Contains(needle)).ToList(); paths.Sort(); paths.Reverse(); var splitter = new HashSet <char> { Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar }.ToArray(); var mappings = new Dictionary <string, Dictionary <string, string> >(); var fileMaps = new Dictionary <string, List <string> >(); foreach (var path in paths) { var parent = Path.GetFileName(Path.GetDirectoryName(path)); if (parent is null) { continue; } var personalityMap = mappings.GetOrInit(parent, () => new Dictionary <string, string>(new TrimmedStringComparer())); var personalityFiles = fileMaps.GetOrInit(parent); personalityFiles.Add(path); foreach (var entry in BaseTextDumpPlugin.GetTranslationsForPath(path) .Where(entry => !entry.Value.IsNullOrEmpty())) { AddLocalizationToResults(personalityMap, entry); } } foreach (var translationDumper in BuildTranslationMergers(fileMaps, mappings)) { yield return(translationDumper); } }
protected IEnumerable <ITranslationDumper> BuildTranslationMergers(Dictionary <string, List <string> > fileMaps, Dictionary <string, Dictionary <string, string> > mappings) { foreach (var personalityFileMap in fileMaps) { var personality = personalityFileMap.Key; var personalityMap = mappings[personality]; var personalityFiles = personalityFileMap.Value; foreach (var path in personalityFiles) { var mapPath = path.Substring(TextDump.AssetsRoot.Length).TrimStart(PathSplitter); mapPath = CombinePaths(Path.GetDirectoryName(mapPath), Path.GetFileNameWithoutExtension(mapPath)); var toUpdate = new HashSet <string>(BaseTextDumpPlugin.GetTranslationsForPath(path) .Where(e => e.Value.IsNullOrWhiteSpace()).Select(e => e.Key)); if (toUpdate.Count == 0) { continue; } IDictionary <string, string> Dumper() { var result = new OrderedDictionary <string, string>(); foreach (var key in toUpdate) { if (personalityMap.TryGetValue(key, out var match)) { AddLocalizationToResults(result, key, match); } } return(result); } yield return(new StringTranslationDumper(mapPath, Dumper)); } } }