public KeyLinkRow(StringKeyGroup strings, StringKey pair, int optionIndex, int range)
 {
     _strings     = strings;
     _pair        = pair;
     _index       = strings.IndexOf(pair);
     _optionIndex = optionIndex;
     _start       = Math.Max(0, _index - range);
     _end         = Math.Min(strings.List.Count, _index + range + 1);
 }
        static void GetKeyLink(List <KeyLink> links, string name, int surroundRange, StringKeyGroup strings)
        {
            var pairs  = strings.KeysFromEnglishName(name);
            int chosen = 0;

            if (pairs.Length > 1)
            {
                bool allEqual = true;
                for (int i = 1; i < pairs.Length && allEqual; i++)
                {
                    for (int c = 0; c < pairs[i].Translations.Count && allEqual; c++)
                    {
                        foreach (var pair in pairs)
                        {
                            if (pair.Translations[c].Text != pairs[0].Translations[c].Text)
                            {
                                allEqual = false;
                            }
                        }
                    }
                }
                if (!allEqual)
                {
                    List <KeyLinkRow> rows = new List <KeyLinkRow>();

                    for (int i = 0; i < pairs.Length; i++)
                    {
                        KeyLinkRow row = new KeyLinkRow(strings, pairs[i], i, 5);
                        rows.Add(row);
                    }

                    foreach (var row in rows)
                    {
                        row.Write();
                    }

                    while (!int.TryParse(Console.ReadLine(), out chosen) || chosen >= pairs.Length)
                    {
                        ;
                    }
                }
            }
            else if (pairs.Length == 0)
            {
                Console.WriteLine($"Error: no pairs found for '{name}'.");
                Console.ReadLine();
                return;
            }
            links.Add(new KeyLink(name, pairs[chosen].Key));
        }
예제 #3
0
        public void DumpStrings(StringKeyGroup group, string language, bool addNewKeys, Log log)
        {
            if (group == null)
            {
                throw new ArgumentNullException(nameof(group));
            }
            if (language == null)
            {
                throw new ArgumentNullException(nameof(language));
            }
            if (!Languages.Contains(language))
            {
                throw new ArgumentException(language + " is not a valid language.", nameof(language));
            }

            if (log != null)
            {
                log.Write(LogLevel.Normal, $"Getting {language} keys...");
            }

            string commandResult = RunCommand("dump-strings --language=" + language);

            string[] lines = commandResult.Split(
                new[] { "\r\n", "\r", "\n" },
                StringSplitOptions.None
                );

            for (int i = 0; i < lines.Length; i++)
            {
                string[] lineSplit = lines[i].Split(':', 2);
                if (lineSplit.Length == 2 && lineSplit[1].Length > 0)
                {
                    string key = lineSplit[0];
                    string str = lineSplit[1].Substring(1);
                    group.Add(key, language, str, addNewKeys);
                }
            }

            if (log != null)
            {
                log.Write(LogLevel.Normal, $"Got {language} keys.");
            }
        }
        public static void Generate(string[] args)
        {
            string datatoolPath  = args.ElementAtOrDefault(1);
            string keyLinkFile   = args.ElementAtOrDefault(2);
            string outputFile    = args.ElementAtOrDefault(3);
            string overwatchPath = args.ElementAtOrDefault(4);

            // Return if one of the required arguments is missing.
            if (datatoolPath == null || outputFile == null)
            {
                Log.Write(LogLevel.Normal, syntax);
                return;
            }
            // Get the overwatch path.
            if (overwatchPath == null)
            {
                overwatchPath = "C:/Program Files (x86)/Overwatch";

                if (!Directory.Exists(overwatchPath))
                {
                    Log.Write(LogLevel.Normal, "Could not find a folder at the default Overwatch install location.");
                    Log.Write(LogLevel.Normal, syntax);
                    return;
                }
            }
            else if (!Directory.Exists(overwatchPath))
            {
                Log.Write(LogLevel.Normal, "Could not find a folder at " + overwatchPath + ".");
                Log.Write(LogLevel.Normal, syntax);
                return;
            }

            var datatool = new Dump.DataTool(datatoolPath, overwatchPath);

            XmlSerializer linkSerializer = new XmlSerializer(typeof(KeyLinkList));

            KeyLink[] keyLinks;
            using (var fileStream = File.OpenRead(keyLinkFile))
                keyLinks = ((KeyLinkList)linkSerializer.Deserialize(fileStream)).Methods;

            XmlSerializer serializer = new XmlSerializer(typeof(I18nLanguage));

            foreach (string lang in ProcLanguages)
            {
                // Dump the strings for the language.
                StringKeyGroup strings = new StringKeyGroup();
                strings.DumpStrings(datatool, lang, true, Log);

                I18nLanguage xml = new I18nLanguage();

                // Translate
                foreach (var keyword in Keywords())
                {
                    xml.Methods.Add(new I18nMethod(
                                        keyword,
                                        strings.ValueFromKeyAndLang(keyLinks.First(m => m.MethodName.ToLower() == keyword.ToLower()).Key, lang)
                                        ));
                }

                // Get the file
                string file = Path.Combine(outputFile, "i18n-" + lang + ".xml");

                if (File.Exists(file))
                {
                    File.Delete(file);
                }

                // Serialize
                using (var fileStream = File.Create(file))
                    using (StreamWriter writer = new StreamWriter(fileStream))
                        serializer.Serialize(writer, xml);

                Log.Write(LogLevel.Normal, "Finished " + lang + ".");
            }
        }
        public static void GenerateKeyLink()
        {
            string datatoolPath  = "C:/Users/Deltin/Downloads/toolchain-release/DataTool.exe";
            string overwatchPath = "C:/Program Files (x86)/Overwatch";
            string previous      = "C:/Users/Deltin/Documents/GitHub/Overwatch-Script-To-Workshop/Deltinteger/Deltinteger/bin/Debug/netcoreapp3.0/Languages/key_links.xml";
            string saveAt        = previous;

            Console.OutputEncoding = System.Text.Encoding.Unicode;

            Dump.DataTool  datatool = new Dump.DataTool(datatoolPath, overwatchPath);
            StringKeyGroup strings  = new StringKeyGroup();

            strings.DumpStrings(datatool, "enUS", true, Log);
            strings.DumpStrings(datatool, "esES", false, Log);
            strings.DumpStrings(datatool, "itIT", false, Log);

            List <KeyLink> links      = new List <KeyLink>();
            var            serializer = new XmlSerializer(typeof(KeyLinkList));

            if (previous != null)
            {
                using (var lastStream = File.OpenRead(previous))
                {
                    var last = ((KeyLinkList)serializer.Deserialize(lastStream)).Methods;
                    links.AddRange(last);
                }
            }

            foreach (var keyword in Keywords())
            {
                if (!links.Any(link => link.MethodName.ToLower() == keyword.ToLower()))
                {
                    GetKeyLink(links, keyword, 5, strings);
                }
            }

            while (true)
            {
                Console.WriteLine("Write name of link to redo.");
                string input = Console.ReadLine();
                if (input == "")
                {
                    break;
                }

                KeyLink link = links.FirstOrDefault(l => l.MethodName == input);
                if (link == null)
                {
                    Console.WriteLine($"No keywords by that name exists.");
                }
                else
                {
                    links.Remove(link);
                    GetKeyLink(links, input, 5, strings);
                }
            }

            using (var fileStream = File.Create(saveAt))
                using (StreamWriter writer = new StreamWriter(fileStream))
                    serializer.Serialize(writer, new KeyLinkList(links.ToArray()));
        }