Beispiel #1
0
        private static void TestLength(LangFile file, List <LanguageError> fileErrors)
        {
            var test  = $"setlang|-1001234567890|{file.Base ?? ""}|{file.Variant ?? ""}|v";
            var count = Encoding.UTF8.GetByteCount(test);

            if (count > 64)
            {
                fileErrors.Add(new LanguageError(file.FileName, "*Language Node*", "Base and variant are too long.", ErrorLevel.FatalError));
            }
        }
        private void NavigateToFile(LangFile obj)
        {
            var tvi0 = FoldersTree.ItemContainerGenerator.ContainerFromItem(obj.Folder) as TreeViewItem;

            if (tvi0 != null)
            {
                var tvi = tvi0.ItemContainerGenerator.ContainerFromItem(obj) as TreeViewItem;
                if (tvi != null)
                {
                    tvi.IsSelected = true;
                }
            }
        }
Beispiel #3
0
        private static void GetFileErrors(LangFile file, List <LanguageError> fileErrors, XDocument master)
        {
            var masterStrings = master.Descendants("string");

            foreach (var str in masterStrings)
            {
                var key   = str.Attribute("key").Value;
                var isgif = str.Attributes().Any(x => x.Name == "isgif");
                //get the english string
                //get the locale values
                var masterString = GetTranslation(key, master);
                var values       = file.Doc.Descendants("string")
                                   .FirstOrDefault(x => x.Attribute("key").Value == key)?
                                   .Descendants("value");
                if (values == null)
                {
                    fileErrors.Add(new LanguageError(file.FileName, key, $"Values missing"));
                    continue;
                }
                //check master string for {#} values
                int vars = 0;
                for (int i = 0; i < 5; i++)
                {
                    if (masterString.Contains("{" + i + "}"))
                    {
                        vars = i + 1;
                    }
                }

                foreach (var value in values)
                {
                    for (int i = 0; i <= 5 - 1; i++)
                    {
                        if (!value.Value.Contains("{" + i + "}") && vars - 1 >= i)
                        {
                            //missing a value....
                            fileErrors.Add(new LanguageError(file.FileName, key, "Missing {" + i + "}", ErrorLevel.Error));
                        }
                        else if (value.Value.Contains("{" + i + "}") && vars - 1 < i)
                        {
                            fileErrors.Add(new LanguageError(file.FileName, key, "Extra {" + i + "}", ErrorLevel.Error));
                        }
                    }

                    if (isgif && value.Value.Length > 200)
                    {
                        fileErrors.Add(new LanguageError(file.FileName, key, "GIF string length cannot exceed 200 characters", ErrorLevel.FatalError));
                    }
                }
            }
        }
        private static void Main(string[] args)
        {
            if (args.Length != 1)
            {
                ShowUsageInfo();
                return;
            }

            string path = args[0];

            if (File.Exists(path) == false)
            {
                ShowUsageInfo();
                return;
            }
            string extension = Path.GetExtension(path);

            if (String.Equals(extension, ".xml", StringComparison.OrdinalIgnoreCase))
            {
                using (FileStream inputStream = new FileStream(path, FileMode.Open))
                    using (StreamReader xmlReader = new StreamReader(inputStream, Encoding.UTF8))
                        using (FileStream outputStream = new FileStream(path.Substring(0, path.Length - 4), FileMode.Create))
                        {
                            XmlSerializer serializer = new XmlSerializer(typeof(LangFile));
                            LangFile      file       = serializer.Deserialize(xmlReader) as LangFile;
                            if (file == null)
                            {
                                Console.WriteLine("XML was not not a valid LangFile");
                                return;
                            }
                            file.Write(outputStream);
                        }
            }
            else if (String.Equals(extension, ".lng", StringComparison.OrdinalIgnoreCase) ||
                     String.Equals(extension, ".lng2", StringComparison.OrdinalIgnoreCase))
            {
                var dictionary = GetDictionary(DefaultDictionaryPath);
                using (FileStream inputStream = new FileStream(path, FileMode.Open))
                    using (FileStream outputStream = new FileStream(path + ".xml", FileMode.Create))
                        using (StreamWriter xmlWriter = new StreamWriter(outputStream, Encoding.UTF8))
                        {
                            LangFile      file       = LangFile.ReadLangFile(inputStream, dictionary);
                            XmlSerializer serializer = new XmlSerializer(typeof(LangFile));
                            serializer.Serialize(xmlWriter, file);
                        }
            }
            else
            {
                ShowUsageInfo();
            }
        }
Beispiel #5
0
        private static void Main(string[] args)
        {
            if (args.Length != 1)
            {
                ShowUsageInfo();
                return;
            }

            string path = args[0];

            if (File.Exists(path) == false)
            {
                ShowUsageInfo();
                return;
            }
            string extension = Path.GetExtension(path);

            if (extension == ".xml")
            {
                using (FileStream inputStream = new FileStream(path, FileMode.Open))
                    using (StreamReader xmlReader = new StreamReader(inputStream, Encoding.UTF8))
                        using (FileStream outputStream = new FileStream(path.Substring(0, path.Length - 4), FileMode.Create))
                        {
                            XmlSerializer serializer = new XmlSerializer(typeof(LangFile));
                            LangFile      file       = serializer.Deserialize(xmlReader) as LangFile;
                            if (file == null)
                            {
                                Console.WriteLine("XML was not not a valid LangFile");
                                return;
                            }
                            file.Write(outputStream);
                        }
            }
            else if (Regex.Match(extension, @"^\.lng#\w{3}$", RegexOptions.IgnoreCase).Success)
            {
                using (FileStream inputStream = new FileStream(path, FileMode.Open))
                    using (FileStream outputStream = new FileStream(path + ".xml", FileMode.Create))
                        using (StreamWriter xmlWriter = new StreamWriter(outputStream, Encoding.UTF8))
                        {
                            LangFile      file       = LangFile.ReadLangFile(inputStream);
                            XmlSerializer serializer = new XmlSerializer(typeof(LangFile));
                            serializer.Serialize(xmlWriter, file);
                        }
            }
            else
            {
                ShowUsageInfo();
            }
        }
Beispiel #6
0
 private static void CheckLanguageNode(LangFile langfile, List <LanguageError> errors)
 {
     if (String.IsNullOrWhiteSpace(langfile.Name))
     {
         errors.Add(new LanguageError(langfile.FileName, "*Language Node*", "Language name is missing", ErrorLevel.FatalError));
     }
     if (String.IsNullOrWhiteSpace(langfile.Base))
     {
         errors.Add(new LanguageError(langfile.FileName, "*Language Node*", "Base is missing", ErrorLevel.FatalError));
     }
     if (String.IsNullOrWhiteSpace(langfile.Variant))
     {
         errors.Add(new LanguageError(langfile.FileName, "*Language Node*", "Variant is missing", ErrorLevel.FatalError));
     }
 }
Beispiel #7
0
        public static void WriteQuestLangs(string dir, params CoreDetails[] coreDetails)
        {
            List <LangEntry> langList            = new List <LangEntry>();
            List <string>    notificationLangIds = new List <string>();

            foreach (CoreDetails core in coreDetails)
            {
                string notifId = core.progressLangID;

                if (!notificationLangIds.Contains(notifId) && UpdateNotifsManager.isCustomNotification(notifId))
                {
                    notificationLangIds.Add(notifId);
                }

                langList.Add(new LangEntry("name_q" + core.QuestNum, core.QuestTitle, 5));
                langList.Add(new LangEntry("info_q" + core.QuestNum, core.QuestDesc, 5));
            }

            foreach (string langId in notificationLangIds)
            {
                langList.Add(new LangEntry(langId, UpdateNotifsManager.GetDisplayNotification(langId) + " [%d/%d]", 5));
            }

            LangFile questLng = new LangFile(langList);

            string fileName = "";

            if (coreDetails.Length > 1)
            {
                fileName = $"ih_q{coreDetails[0].QuestNum}_q{coreDetails[coreDetails.Length - 1].QuestNum}";
            }
            else if (coreDetails.Length > 0)
            {
                fileName = $"ih_quest_q{coreDetails[0].QuestNum}";
            }

            foreach (string language in lngLanguages)
            {
                string lngPath = $@"{dir}/Assets/tpp/pack/ui/lang/lang_default_data_{language}_fpk/Assets/tpp/lang/ui";
                string lngFile = Path.Combine(lngPath, $"{fileName}.{language}.lng2");
                Directory.CreateDirectory(lngPath);

                using (FileStream outputStream = new FileStream(lngFile, FileMode.Create))
                {
                    questLng.Write(outputStream);
                }
            }
        }
Beispiel #8
0
 private static void LoadLanguages()
 {
     foreach (var file in Directory.GetFiles(LanguageDirectory, "*.xml"))
     {
         var langFile = new LangFile(file);
         var key      = Path.GetFileNameWithoutExtension(file);
         if (Languages.ContainsKey(key))
         {
             Languages[key] = langFile;
         }
         else
         {
             Languages.Add(key, langFile);
         }
     }
 }
Beispiel #9
0
        private static string OutputResult(LangFile newFile, List <LanguageError> newFileErrors, LangFile curFile, List <LanguageError> curFileErrors)
        {
            var result = $"NEW FILE\n*{newFile.FileName}.xml - ({newFile.Name ?? ""})*" + Environment.NewLine;

            if (newFileErrors.Any(x => x.Level == ErrorLevel.Error))
            {
                result += "_Errors:_\n";
                result  = newFileErrors.Where(x => x.Level == ErrorLevel.Error).Aggregate(result, (current, fileError) => current + $"{fileError.Key}\n{fileError.Message}\n\n");
            }
            if (newFileErrors.Any(x => x.Level == ErrorLevel.MissingString))
            {
                result += "_Missing Values:_\n";
                result  = newFileErrors.Where(x => x.Level == ErrorLevel.MissingString).Aggregate(result, (current, fileError) => current + $"{fileError.Key}\n");
            }
            if (newFileErrors.Any(x => x.Level == ErrorLevel.FatalError))
            {
                result += "\n*Fatal errors:*\n";
                result  = newFileErrors.Where(x => x.Level == ErrorLevel.FatalError).Aggregate(result, (current, fileError) => current + $"{fileError.Key}\n{fileError.Message}\n\n");
            }
            if (newFileErrors.Count == 0)
            {
                result += "_No errors_\n";
            }

            if (curFile != null)
            {
                result += "\n\n";
                result += $"OLD FILE (Last updated: {curFile.LatestUpdate.ToString("MMM dd")})\n*{curFile.FileName}.xml - ({curFile.Name})*\n";
                result +=
                    $"Errors: {curFileErrors.Count(x => x.Level == ErrorLevel.Error)}\nMissing strings: {curFileErrors.Count(x => x.Level == ErrorLevel.MissingString)}";
            }
            else
            {
                result += "\n\n*No old file, this is a new language*";
                result += "\nPlease double check the filename, and the language name, base and variant, as you won't be able to change them.";
                result += $"\n_Name:_ {newFile.Name ?? ""}";
                result += $"\n_Base:_ {newFile.Base ?? ""}";
                if (!Directory.GetFiles(Constants.GetLangDirectory(), "*.xml").Select(x => new LangFile(x)).Any(x => x.Base == newFile.Base))
                {
                    result += " *(NEW)*";
                }
                result += $"\n_Variant:_ {newFile.Variant ?? ""}";
            }

            return(result);
        }
Beispiel #10
0
        private static void Main(string[] args)
        {
            if (args.Length == 0 || args.Length > 3)
            {
                ShowUsageInfo();
                return;
            }

            string path           = args[0];
            bool   outputHashes   = false;
            string dictionaryPath = DefaultDictionaryPath;

            if (args.Length > 1)
            {
                for (int i = 1; i < args.Length; i++)
                {
                    string arg  = args[i];
                    string argL = args[i].ToLower();
                    if (argL == "-outputhashes" || argL == "-o")
                    {
                        outputHashes = true;
                    }
                    else
                    {
                        if (argL == "-dictionary" || argL == "-d")
                        {
                            if (i + 1 < args.Length)
                            {
                                dictionaryPath = args[i + 1];
                            }
                        }
                    }
                }
            }

            if (File.Exists(path) == false)
            {
                ShowUsageInfo();
                return;
            }

            string extension = Path.GetExtension(path);

            if (String.Equals(extension, ".xml", StringComparison.OrdinalIgnoreCase))
            {
                using (FileStream inputStream = new FileStream(path, FileMode.Open))
                    using (StreamReader xmlReader = new StreamReader(inputStream, Encoding.UTF8))
                        using (FileStream outputStream = new FileStream(path.Substring(0, path.Length - 4), FileMode.Create))
                        {
                            XmlSerializer serializer = new XmlSerializer(typeof(LangFile));
                            LangFile      file       = serializer.Deserialize(xmlReader) as LangFile;
                            if (file == null)
                            {
                                Console.WriteLine("XML was not not a valid LangFile");
                                return;
                            }
                            file.Write(outputStream);
                        }
            }
            else if (String.Equals(extension, ".lng", StringComparison.OrdinalIgnoreCase) ||
                     String.Equals(extension, ".lng2", StringComparison.OrdinalIgnoreCase))
            {
                var dictionary = GetDictionary(dictionaryPath);
                using (FileStream inputStream = new FileStream(path, FileMode.Open))
                    using (FileStream outputStream = new FileStream(path + ".xml", FileMode.Create))
                        using (StreamWriter xmlWriter = new StreamWriter(outputStream, Encoding.UTF8))
                        {
                            LangFile      file       = LangFile.ReadLangFile(inputStream, dictionary);
                            XmlSerializer serializer = new XmlSerializer(typeof(LangFile));
                            serializer.Serialize(xmlWriter, file);
                            if (outputHashes)
                            {
                                HashSet <string> uniqueHashes = new HashSet <string>();
                                foreach (LangEntry entry in file.Entries)
                                {
                                    ulong langIdHash = entry.Key;
                                    uniqueHashes.Add(langIdHash.ToString("x"));
                                }
                                List <string> hashes = uniqueHashes.ToList <string>();
                                hashes.Sort();
                                string fileDirectory    = Path.GetDirectoryName(path);
                                string hashesOutputPath = Path.Combine(fileDirectory, string.Format("{0}_langIdHashes.txt", Path.GetFileName(path)));
                                File.WriteAllLines(hashesOutputPath, hashes.ToArray <string>());
                            }
                        }
            }
            else
            {
                ShowUsageInfo();
            }
        }
Beispiel #11
0
        public static void UploadFile(string fileid, long id, string newFileCorrectName, int msgID)
        {
            var file = Bot.Api.GetFileAsync(fileid).Result;
            var path = Directory.CreateDirectory(Constants.GetLangDirectory(true));
            //var fileName = file.FilePath.Substring(file.FilePath.LastIndexOf("/") + 1);
            var uri         = $"https://api.telegram.org/file/bot{Constants.GetBotToken("BotToken")}/{file.FilePath}";
            var newFilePath = Path.Combine(path.FullName, newFileCorrectName);

            using (var client = new WebClient())
            {
                client.DownloadFile(new Uri(uri), newFilePath);
            }


            //ok, we have the file.  Now we need to determine the language, scan it and the original file.
            var newFileErrors = new List <LanguageError>();

            //first, reload existing file to program
            Program.English = Helpers.ReadEnglish();
            Program.Langs   = Helpers.ReadLanguageFiles();
            var langs   = Program.Langs.Select(x => new LangFile(x.Key, x.Value.XMLFile));
            var master  = Program.English;
            var newFile = new LangFile(newFilePath);

            //make sure it has a complete langnode
            CheckLanguageNode(newFile, newFileErrors);

            //test the length
            TestLength(newFile, newFileErrors);

            //check uniqueness
            var error = langs.FirstOrDefault(x =>
                                             (x.FileName.ToLower() == newFile.FileName.ToLower() && x.Name != newFile.Name) || //check for matching filename and mismatching name
                                             (x.Name == newFile.Name && (x.Base != newFile.Base || x.Variant != newFile.Variant)) || //check for same name and mismatching base-variant
                                             (x.Base == newFile.Base && x.Variant == newFile.Variant && x.FileName != newFile.FileName) //check for same base-variant and mismatching filename
                                                                                                                                        //if we want to have the possibility to rename the file, change previous line with FileName -> Name
                                             );

            if (error != null)
            {
                //problem....
                newFileErrors.Add(new LanguageError(newFile.FileName, "*Language Node*",
                                                    $"ERROR: The following file partially matches the same language node. Please check the file name, and the language name, base and variant. Aborting.\n\n*{error.FileName}.xml*\n_Name:_{error.Name}\n_Base:_{error.Base}\n_Variant:_{error.Variant}", ErrorLevel.FatalError));
            }

            //get the errors in it
            GetFileErrors(newFile, newFileErrors, master.XMLFile);

            //need to get the current file
            var curFile       = langs.FirstOrDefault(x => x.Name == newFile.Name);
            var curFileErrors = new List <LanguageError>();

            if (curFile != null)
            {
                //test the length
                TestLength(curFile, curFileErrors);

                ////validate current file name / base / variants match
                //if (newFile.Base != lang.Base)
                //{
                //    newFileErrors.Add(new LanguageError(curFileName, "Language Node", $"Mismatched Base! {newFile.Base} - {lang.Base}", ErrorLevel.Error));
                //}
                //if (newFile.Variant != lang.Variant)
                //{
                //    newFileErrors.Add(new LanguageError(curFileName, "Language Node", $"Mismatched Variant! {newFile.Variant} - {lang.Variant}", ErrorLevel.Error));
                //}

                //get the errors in it
                GetFileErrors(curFile, curFileErrors, master.XMLFile);
            }

            //send the validation result
            Bot.Api.SendTextMessageAsync(id, OutputResult(newFile, newFileErrors, curFile, curFileErrors), parseMode: ParseMode.Markdown);
            Thread.Sleep(500);


            if (newFileErrors.All(x => x.Level != ErrorLevel.FatalError))
            {
                //load up each file and get the names
                var buttons = new[]
                {
                    new InlineKeyboardCallbackButton($"New", $"upload|{id}|{newFile.FileName}"),
                    new InlineKeyboardCallbackButton($"Old", $"upload|{id}|current")
                };
                var menu = new InlineKeyboardMarkup(buttons.ToArray());
                Bot.Api.SendTextMessageAsync(id, "Which file do you want to keep?", replyToMessageId: msgID,
                                             replyMarkup: menu);
            }
            else
            {
                Bot.Api.SendTextMessageAsync(id, "Fatal errors present, cannot upload.", replyToMessageId: msgID);
            }
        }
Beispiel #12
0
 private static void ReloadLang(string langName)
 {
     Languages[langName] = new LangFile(Path.Combine(LanguageDirectory, langName + ".xml"));
 }