diff --git a/rpcs3/rpcs3qt/game_compatibility.cpp b/rpcs3/rpcs3qt/game_compatibility.cpp index 2575fd7ca9..d9414e527f 100644 --- a/rpcs3/rpcs3qt/game_compatibility.cpp +++ b/rpcs3/rpcs3qt/game_compatibility.cpp @@ -1,6 +1,7 @@ #include "game_compatibility.h" #include "gui_settings.h" #include "downloader.h" +#include "localized.h" #include "Crypto/unpkg.h" #include "Loader/PSF.h" @@ -256,9 +257,30 @@ compat::package_info game_compatibility::GetPkgInfo(const QString& pkg_path, gam compat::package_info info; info.path = pkg_path; info.title = qstr(std::string(psf::get_string(psf, title_key))); // Let's read this from the psf first - info.title_id = qstr(std::string(psf::get_string(psf, "TITLE_ID", "Unknown"))); + info.title_id = qstr(std::string(psf::get_string(psf, "TITLE_ID"))); + info.category = qstr(std::string(psf::get_string(psf, "CATEGORY"))); info.version = qstr(std::string(psf::get_string(psf, "APP_VER"))); + if (!info.category.isEmpty()) + { + const Localized localized; + + if (const auto boot_cat = localized.category.cat_boot.find(info.category); boot_cat != localized.category.cat_boot.end()) + { + info.local_cat = boot_cat->second; + } + else if (const auto data_cat = localized.category.cat_data.find(info.category); data_cat != localized.category.cat_data.end()) + { + info.local_cat = data_cat->second; + } + + // Update packages always seem to have an APP_VER, so let's assume it's a DLC otherwise. + if (info.category == "GD" && info.version.isEmpty()) + { + info.is_dlc = true; + } + } + if (info.version.isEmpty()) { // Fallback to VERSION diff --git a/rpcs3/rpcs3qt/game_compatibility.h b/rpcs3/rpcs3qt/game_compatibility.h index d9f2d3e91c..f594d17f47 100644 --- a/rpcs3/rpcs3qt/game_compatibility.h +++ b/rpcs3/rpcs3qt/game_compatibility.h @@ -92,11 +92,14 @@ namespace compat /** Concicely represents a specific pkg's localized information for use in the GUI */ struct package_info { - QString path; // File path - QString title_id; // TEST12345 - QString title; // Localized - QString changelog; // Localized, may be empty - QString version; // May be empty + QString path; // File path + QString title_id; // TEST12345 + QString title; // Localized + QString changelog; // Localized, may be empty + QString version; // May be empty + QString category; // HG, DG, GD etc. + QString local_cat; // Localized category + bool is_dlc = false; // Distinguish between update and DLC if category is GD }; } diff --git a/rpcs3/rpcs3qt/main_window.cpp b/rpcs3/rpcs3qt/main_window.cpp index 9415229039..80930618a0 100644 --- a/rpcs3/rpcs3qt/main_window.cpp +++ b/rpcs3/rpcs3qt/main_window.cpp @@ -515,23 +515,39 @@ void main_window::InstallPackages(QStringList file_paths) compat::package_info info = game_compatibility::GetPkgInfo(file_path, m_game_list_frame ? m_game_list_frame->GetGameCompatibility() : nullptr); - if (!info.title_id.isEmpty()) + if (info.category == "GD") { - info.title_id = tr("\n%0").arg(info.title_id); + if (info.is_dlc) + { + info.local_cat = tr("\nDLC", "Block for package type (DLC)"); + } + else + { + info.local_cat = tr("\nUpdate", "Block for package type (Update)"); + } + } + else if (!info.local_cat.isEmpty()) + { + info.local_cat = tr("\n%0", "Block for package type").arg(info.local_cat); } - if (!info.changelog.isEmpty()) + if (!info.title_id.isEmpty()) { - info.changelog = tr("\n\nChangelog:\n%0").arg(info.changelog); + info.title_id = tr("\n%0", "Block for Title ID").arg(info.title_id); } if (!info.version.isEmpty()) { - info.version = tr("\nVersion %0").arg(info.version); + info.version = tr("\nVersion %0", "Block for Version").arg(info.version); } - if (QMessageBox::question(this, tr("PKG Decrypter / Installer"), tr("Do you want to install this package?\n\n%0%1%2%3") - .arg(info.title).arg(info.title_id).arg(info.version).arg(info.changelog), + if (!info.changelog.isEmpty()) + { + info.changelog = tr("\n\nChangelog:\n%0", "Block for Changelog").arg(info.changelog); + } + + if (QMessageBox::question(this, tr("PKG Decrypter / Installer"), tr("Do you want to install this package?\n\n%0%1%2%3%4") + .arg(info.title).arg(info.local_cat).arg(info.title_id).arg(info.version).arg(info.changelog), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) != QMessageBox::Yes) { gui_log.notice("PKG: Cancelled installation from drop. File: %s", sstr(file_paths.front())); diff --git a/rpcs3/rpcs3qt/pkg_install_dialog.cpp b/rpcs3/rpcs3qt/pkg_install_dialog.cpp index 375b3192de..4afb5c9bd7 100644 --- a/rpcs3/rpcs3qt/pkg_install_dialog.cpp +++ b/rpcs3/rpcs3qt/pkg_install_dialog.cpp @@ -59,24 +59,65 @@ pkg_install_dialog::pkg_install_dialog(const QStringList& paths, game_compatibil { const compat::package_info info = game_compatibility::GetPkgInfo(path, compat); + // We have to build our complicated localized string in some annoying manner + QString accumulated_info; + QString additional_info; QString tooltip; - QString version = info.version; + + if (!info.title_id.isEmpty()) + { + accumulated_info = info.title_id; + } + + if (info.category == "GD") + { + if (!accumulated_info.isEmpty()) + { + accumulated_info += ", "; + } + + if (info.is_dlc) + { + accumulated_info += tr("DLC", "Package type info (DLC)"); + } + else + { + accumulated_info += tr("Update", "Package type info (Update)"); + } + } + else if (!info.local_cat.isEmpty()) + { + if (!accumulated_info.isEmpty()) + { + accumulated_info += ", "; + } + accumulated_info += tr("%0", "Package type info").arg(info.local_cat); + } + + if (!info.version.isEmpty()) + { + if (!accumulated_info.isEmpty()) + { + accumulated_info += ", "; + } + accumulated_info += tr("v.%0", "Version info").arg(info.version); + } if (info.changelog.isEmpty()) { - tooltip = tr("No info"); + tooltip = tr("No info", "Changelog info placeholder"); } else { - tooltip = tr("Changelog:\n\n%0").arg(info.changelog); + tooltip = tr("Changelog:\n\n%0", "Changelog info").arg(info.changelog); } - if (!version.isEmpty()) + if (!accumulated_info.isEmpty()) { - version = tr("v.%0").arg(info.version); + additional_info = tr(" (%0)", "Additional info").arg(accumulated_info); } - const QString text = tr("%0 (%1 %2)").arg(info.title).arg(info.title_id).arg(version); + const QString text = tr("%0%1", "Package text").arg(info.title).arg(additional_info); QListWidgetItem* item = new numbered_widget_item(text, m_dir_list); item->setData(Roles::FullPathRole, info.path);