private void CheckLocalizationsME3(DeploymentChecklistItem obj) { var customDLCJob = ModBeingDeployed.GetJob(ModJob.JobHeader.CUSTOMDLC); var customDLCFolders = customDLCJob.CustomDLCFolderMapping.Keys.ToList(); customDLCFolders.AddRange(customDLCJob.AlternateDLCs.Where(x => x.Operation == AlternateDLC.AltDLCOperation.OP_ADD_CUSTOMDLC).Select(x => x.AlternateDLCFolder)); var languages = StarterKitGeneratorWindow.me3languages; List <string> errors = new List <string>(); obj.ItemText = M3L.GetString(M3L.string_languageCheckInProgress); foreach (var customDLC in customDLCFolders) { if (_closed) { return; } var tlkBasePath = Path.Combine(ModBeingDeployed.ModPath, customDLC, @"CookedPCConsole", customDLC); Dictionary <string, List <TalkFileME1.TLKStringRef> > tlkMappings = new Dictionary <string, List <TalkFileME1.TLKStringRef> >(); foreach (var language in languages) { if (_closed) { return; } var tlkLangPath = tlkBasePath + @"_" + language.filecode + @".tlk"; if (File.Exists(tlkLangPath)) { //inspect TalkFileME2ME3 tf = new TalkFileME2ME3(); tf.LoadTlkData(tlkLangPath); tlkMappings[language.filecode] = tf.StringRefs; } else { errors.Add(M3L.GetString(M3L.string_interp_customDLCMissingLocalizedTLK, customDLC, language.filecode));; } } if (tlkMappings.Count > 1) { //find TLK with most entries //var tlkCounts = tlkMappings.Select(x => (x.Key, x.Value.Count)); double numLoops = Math.Pow(tlkMappings.Count - 1, tlkMappings.Count - 1); int numDone = 0; foreach (var mapping1 in tlkMappings) { foreach (var mapping2 in tlkMappings) { if (mapping1.Equals(mapping2)) { continue; } var differences = mapping1.Value.Select(x => x.StringID).Except(mapping2.Value.Select(x => x.StringID)); foreach (var difference in differences) { var str = mapping1.Value.FirstOrDefault(x => x.StringID == difference)?.Data ?? M3L.GetString(M3L.string_errorFindingString); errors.Add(M3L.GetString(M3L.string_interp_tlkDifference, difference.ToString(), mapping1.Key, mapping2.Key, str)); } numDone++; double percent = (numDone * 100.0) / numLoops; obj.ItemText = $@"{M3L.GetString(M3L.string_languageCheckInProgress)} {percent:0.00}%"; } } //use INT as master. Not sure if any mods are not-english based //TODO } } if (errors.Count > 0) { obj.HasError = true; obj.Icon = FontAwesomeIcon.Warning; obj.Foreground = Brushes.Orange; obj.Errors = errors; obj.ItemText = M3L.GetString(M3L.string_languageCheckDetectedIssues); obj.ToolTip = M3L.GetString(M3L.string_validationFailed); } else { obj.Icon = FontAwesomeIcon.CheckCircle; obj.Foreground = Brushes.Green; obj.ItemText = M3L.GetString(M3L.string_noLanguageIssuesDetected); obj.ToolTip = M3L.GetString(M3L.string_validationOK); } }
private void CheckLocalizationsME3(DeploymentChecklistItem obj) { var customDLCJob = ModBeingDeployed.GetJob(ModJob.JobHeader.CUSTOMDLC); var customDLCFolders = customDLCJob.CustomDLCFolderMapping.Keys.ToList(); customDLCFolders.AddRange(customDLCJob.AlternateDLCs.Where(x => x.Operation == AlternateDLC.AltDLCOperation.OP_ADD_CUSTOMDLC).Select(x => x.AlternateDLCFolder)); var languages = StarterKitGeneratorWindow.me3languages; List <string> errors = new List <string>(); obj.ItemText = "Language check in progress"; foreach (var customDLC in customDLCFolders) { if (_closed) { return; } var tlkBasePath = Path.Combine(ModBeingDeployed.ModPath, customDLC, "CookedPCConsole", customDLC); Dictionary <string, List <TalkFileME1.TLKStringRef> > tlkMappings = new Dictionary <string, List <TalkFileME1.TLKStringRef> >(); foreach (var language in languages) { if (_closed) { return; } var tlkLangPath = tlkBasePath + "_" + language.filecode + ".tlk"; if (File.Exists(tlkLangPath)) { //inspect TalkFileME2ME3 tf = new TalkFileME2ME3(); tf.LoadTlkData(tlkLangPath); tlkMappings[language.filecode] = tf.StringRefs; } else { errors.Add(customDLC + " is missing a localized TLK for language " + language.filecode + ". This DLC will not load if the user's game language is set to this. Some versions of the game cannot have their language changed, so this will effectively lock the user out from using this mod."); } } if (tlkMappings.Count > 1) { //find TLK with most entries //var tlkCounts = tlkMappings.Select(x => (x.Key, x.Value.Count)); double numLoops = Math.Pow(tlkMappings.Count - 1, tlkMappings.Count - 1); int numDone = 0; foreach (var mapping1 in tlkMappings) { foreach (var mapping2 in tlkMappings) { if (mapping1.Equals(mapping2)) { continue; } var differences = mapping1.Value.Select(x => x.StringID).Except(mapping2.Value.Select(x => x.StringID)); foreach (var difference in differences) { var str = mapping1.Value.FirstOrDefault(x => x.StringID == difference)?.Data ?? "<error finding string>"; errors.Add($"TLKStringID {difference} is present in {mapping1.Key} but is not present in {mapping2.Key}. Even if this mod is not truly localized to another language, the strings should be copied into other language TLK files to ensure users of that language will see strings instead of string references.\n{str}"); } numDone++; double percent = (numDone * 100.0) / numLoops; obj.ItemText = $"Language check in progress {percent:0.00}%"; } } //use INT as master. Not sure if any mods are not-english based //TODO } } if (errors.Count > 0) { obj.HasError = true; obj.Icon = FontAwesomeIcon.Warning; obj.Foreground = Brushes.Orange; obj.Errors = errors; obj.ItemText = "Language check detected issues"; obj.ToolTip = "Validation failed"; } else { obj.Icon = FontAwesomeIcon.CheckCircle; obj.Foreground = Brushes.Green; obj.ItemText = "No language issues detected"; obj.ToolTip = "Validation OK"; } }