Exemplo n.º 1
0
        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);
            }
        }
        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>(TextDump.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));
                }
            }
        }