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; } } }
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(); } }
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(); } }
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)); } }
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); } } }
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); } } }
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); }
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(); } }
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); } }
private static void ReloadLang(string langName) { Languages[langName] = new LangFile(Path.Combine(LanguageDirectory, langName + ".xml")); }