protected virtual Dictionary <string, string> FallbackPersonalityLinesLocalizer() { var results = new Dictionary <string, string>(); var subdirs = new[] { "2", "2_0" }; foreach (var voiceInfo in Singleton <Voice> .Instance.voiceInfoList) { for (var i = 0; i < 3; i++) { foreach (var subdir1 in subdirs) { var fileKey = CombinePaths(TextDump.AssetsRoot, "adv", "scenario", $"c{voiceInfo.No:00}", "00", $"{i:00}", subdir1, "translation.txt"); if (TextDump.GetTranslationPaths().Contains(fileKey)) { var dict = TextDump.GetTranslationsForPath(fileKey); foreach (var entry in dict.Where(e => e.Key.Contains("{0}") && !string.IsNullOrEmpty(e.Value))) { if (entry.Key.Contains("{0}が")) { var key = new StringBuilder(entry.Key.Length * 3); var hit = false; foreach (var c in entry.Key) { if (c == 'が') { hit = true; } key.Append(c); if (hit) { key.Append(@"\n?"); } } //sr: "^\[(?<stat>[\w]+)(?<num_i>[\+\-]{1}[0-9]+)?\](?<after>[\s\S]+)?$" = "[${stat}${num_i}]${after}" key = key.Replace("{0}", @"^(?<color_open_i><color[^>]+>)(?<item_name>[\S\s]+)x(?<item_count_i>[1-9][0-9]*)(?<color_close_i><\/color>)$"); key.Insert(0, "sr:\""); key.Append("\""); var value = entry.Value.Replace("{0}", "${color_open_i}${item_name} x${item_count_i}${color_close_i}"); AddLocalizationToResults(results, key.ToString(), value); } else { AddLocalizationToResults(results, entry.Key, entry.Value); } } } } } } return(results); }
protected IEnumerable <ITranslationDumper> GetScenarioTextMergers() { if (!TextDump.IsReadyForFinalDump()) { yield break; } var needle = CombinePaths("", "abdata", "adv", "scenario", ""); var paths = TextDump.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; } if (!mappings.TryGetValue(personality, out var personalityMap)) { mappings[personality] = personalityMap = new Dictionary <string, string>(new TrimmedStringComparer()); } if (!fileMaps.TryGetValue(personality, out var personalityFiles)) { fileMaps[personality] = personalityFiles = new List <string>(); } personalityFiles.Add(path); foreach (var entry in TextDump.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 = TextDump.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; } if (!mappings.TryGetValue(parent, out var personalityMap)) { mappings[parent] = personalityMap = new Dictionary <string, string>(new TrimmedStringComparer()); } if (!fileMaps.TryGetValue(parent, out var personalityFiles)) { fileMaps[parent] = personalityFiles = new List <string>(); } personalityFiles.Add(path); foreach (var entry in TextDump.GetTranslationsForPath(path) .Where(entry => !entry.Value.IsNullOrEmpty())) { AddLocalizationToResults(personalityMap, entry); } } foreach (var translationDumper in BuildTranslationMergers(fileMaps, mappings)) { yield return(translationDumper); } }