private static void LoadUIMessages(List <MapDescriptor> mapDescriptors, DataFileSet fileSet, IProgress <ProgressInfo> progress, CancellationToken ct) { // Key = locale, Value = file contents var ui_messages = new Dictionary <string, UI_Message>(); foreach (string locale in Locale.ALL) { ui_messages[locale] = new UI_Message(fileSet.ui_message_csv[locale], locale); } // using the MSG ID in each map descriptor, load its actual string from the ui_message_XX.csv file foreach (MapDescriptor mapDescriptor in mapDescriptors) { foreach (string locale in Locale.ALL) { var msgId = mapDescriptor.Name_MSG_ID; if (msgId > 0) { mapDescriptor.Name[locale] = ui_messages[locale].get(mapDescriptor.Name_MSG_ID); } else { mapDescriptor.Name[locale] = ""; } msgId = mapDescriptor.Desc_MSG_ID; if (msgId > 0) { mapDescriptor.Desc[locale] = ui_messages[locale].get(mapDescriptor.Desc_MSG_ID); } else { mapDescriptor.Desc[locale] = ""; } } mapDescriptor.readFrbFileInfo(fileSet.param_folder, progress, ct); } }
private static void WriteLocalizationFiles(List <MapDescriptor> mapDescriptors, DataFileSet fileSet, DataFileSet riivFileSet, bool patchWiimmfi) { // Key = locale, Value = file contents var ui_messages = new Dictionary <string, UI_Message>(); foreach (string locale in Locale.ALL) { ui_messages[locale] = new UI_Message(fileSet.ui_message_csv[locale], locale); } // free up the used MSG IDs foreach (MapDescriptor mapDescriptor in mapDescriptors) { foreach (string locale in Locale.ALL) { if (mapDescriptor.Name_MSG_ID > 0) { ui_messages[locale].removeKey(mapDescriptor.Name_MSG_ID); } if (mapDescriptor.Desc_MSG_ID > 0) { ui_messages[locale].removeKey(mapDescriptor.Desc_MSG_ID); } } } // make new msg ids uint msgId = 25000; foreach (var mapDescriptor in mapDescriptors) { mapDescriptor.Name_MSG_ID = msgId++; foreach (var entry in ui_messages) { var locale = entry.Key; var ui_message = entry.Value; // write EN messages to the UK file as well (we are not differentiating here) if (locale == Locale.UK) { locale = Locale.EN; } // if there is no localization for this locale, use the english variant as default if (!mapDescriptor.Name.ContainsKey(locale) || string.IsNullOrWhiteSpace(mapDescriptor.Name[locale])) { ui_message.set(mapDescriptor.Name_MSG_ID, mapDescriptor.Name[Locale.EN]); } else { ui_message.set(mapDescriptor.Name_MSG_ID, mapDescriptor.Name[locale]); } } mapDescriptor.Desc_MSG_ID = msgId++; foreach (var entry in ui_messages) { var locale = entry.Key; var ui_message = entry.Value; // write EN messages to the UK file as well (we are not differentiating here) if (locale == Locale.UK) { locale = Locale.EN; } // if there is no localization for this locale, use the english variant as default if (!mapDescriptor.Desc.ContainsKey(locale) || string.IsNullOrWhiteSpace(mapDescriptor.Desc[locale])) { ui_message.set(mapDescriptor.Desc_MSG_ID, mapDescriptor.Desc[Locale.EN]); } else { ui_message.set(mapDescriptor.Desc_MSG_ID, mapDescriptor.Desc[locale]); } } } // text replace Nintendo WFC -> Wiimmfi if (patchWiimmfi) { foreach (var entry in ui_messages) { var locale = entry.Key; var ui_message = entry.Value; var keys = ui_message.getMap().Keys.ToList(); foreach (var id in keys) { var text = ui_message.get(id); // need to use Regex, because there are different types of whitespaces in the messages (some are U+0020 while others are U+00A0) if (locale == Locale.DE) { text = Regex.Replace(text, @"die\sNintendo\sWi-Fi\sConnection", "Wiimmfi", RegexOptions.IgnoreCase); text = Regex.Replace(text, @"der\sNintendo\sWi-Fi\sConnection", "Wiimmfi", RegexOptions.IgnoreCase); text = Regex.Replace(text, @"zur\sNintendo\sWi-Fi\sConnection", "Wiimmfi", RegexOptions.IgnoreCase); } if (locale == Locale.FR) { text = Regex.Replace(text, @"Wi-Fi\sNintendo", "Wiimmfi", RegexOptions.IgnoreCase); text = Regex.Replace(text, @"CWF\sNintendo", "Wiimmfi", RegexOptions.IgnoreCase); text = Regex.Replace(text, @"Connexion\sWi-Fi\sNintendo", "Wiimmfi", RegexOptions.IgnoreCase); } if (locale == Locale.ES) { text = Regex.Replace(text, @"Conexión\sWi-Fi\sde\sNintendo", "Wiimmfi", RegexOptions.IgnoreCase); text = Regex.Replace(text, @"CWF\sde\sNintendo", "Wiimmfi", RegexOptions.IgnoreCase); text = Regex.Replace(text, @"Conexión\sWi-Fi\sde<n>Nintendo", "Wiimmfi<n>", RegexOptions.IgnoreCase); text = Regex.Replace(text, @"Conexión<n>Wi-Fi\sde\sNintendo", "Wiimmfi<n>", RegexOptions.IgnoreCase); } if (locale == Locale.JP) { text = text.Replace("Wi-Fi", "Wiimmfi", StringComparison.OrdinalIgnoreCase); } text = Regex.Replace(text, @"Nintendo\sWi-Fi\sConnection", "Wiimmfi", RegexOptions.IgnoreCase); text = Regex.Replace(text, @"Nintendo\sWFC", "Wiimmfi", RegexOptions.IgnoreCase); text = text.Replace("support.nintendo.com", "https://wiimmfi.de/error", StringComparison.OrdinalIgnoreCase); ui_message.set(id, text); } } } // write to files foreach (var entry in ui_messages) { string locale = entry.Key; UI_Message ui_message = entry.Value; Directory.CreateDirectory(Path.GetDirectoryName(riivFileSet.ui_message_csv[locale])); ui_message.writeToFile(riivFileSet.ui_message_csv[locale]); } }