Merge pull request #10591 from keve1227/localized-game-icons

Localize game icons
This commit is contained in:
liamwhite 2023-06-07 14:03:28 -04:00 committed by GitHub
commit 219bd90152
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 42 additions and 10 deletions

View file

@ -23,8 +23,8 @@ const std::array<const char*, 16> LANGUAGE_NAMES{{
"Portuguese", "Portuguese",
"Russian", "Russian",
"Korean", "Korean",
"Taiwanese", "TraditionalChinese",
"Chinese", "SimplifiedChinese",
"BrazilianPortuguese", "BrazilianPortuguese",
}}; }};
@ -45,17 +45,17 @@ constexpr std::array<Language, 18> language_to_codes = {{
Language::German, Language::German,
Language::Italian, Language::Italian,
Language::Spanish, Language::Spanish,
Language::Chinese, Language::SimplifiedChinese,
Language::Korean, Language::Korean,
Language::Dutch, Language::Dutch,
Language::Portuguese, Language::Portuguese,
Language::Russian, Language::Russian,
Language::Taiwanese, Language::TraditionalChinese,
Language::BritishEnglish, Language::BritishEnglish,
Language::CanadianFrench, Language::CanadianFrench,
Language::LatinAmericanSpanish, Language::LatinAmericanSpanish,
Language::Chinese, Language::SimplifiedChinese,
Language::Taiwanese, Language::TraditionalChinese,
Language::BrazilianPortuguese, Language::BrazilianPortuguese,
}}; }};

View file

@ -84,8 +84,8 @@ enum class Language : u8 {
Portuguese = 10, Portuguese = 10,
Russian = 11, Russian = 11,
Korean = 12, Korean = 12,
Taiwanese = 13, TraditionalChinese = 13,
Chinese = 14, SimplifiedChinese = 14,
BrazilianPortuguese = 15, BrazilianPortuguese = 15,
Default = 255, Default = 255,

View file

@ -25,6 +25,8 @@
#include "core/file_sys/vfs_layered.h" #include "core/file_sys/vfs_layered.h"
#include "core/file_sys/vfs_vector.h" #include "core/file_sys/vfs_vector.h"
#include "core/hle/service/filesystem/filesystem.h" #include "core/hle/service/filesystem/filesystem.h"
#include "core/hle/service/ns/language.h"
#include "core/hle/service/set/set.h"
#include "core/loader/loader.h" #include "core/loader/loader.h"
#include "core/loader/nso.h" #include "core/loader/nso.h"
#include "core/memory/cheat_engine.h" #include "core/memory/cheat_engine.h"
@ -624,8 +626,37 @@ PatchManager::Metadata PatchManager::ParseControlNCA(const NCA& nca) const {
auto nacp = nacp_file == nullptr ? nullptr : std::make_unique<NACP>(nacp_file); auto nacp = nacp_file == nullptr ? nullptr : std::make_unique<NACP>(nacp_file);
// Get language code from settings
const auto language_code =
Service::Set::GetLanguageCodeFromIndex(Settings::values.language_index.GetValue());
// Convert to application language and get priority list
const auto application_language =
Service::NS::ConvertToApplicationLanguage(language_code)
.value_or(Service::NS::ApplicationLanguage::AmericanEnglish);
const auto language_priority_list =
Service::NS::GetApplicationLanguagePriorityList(application_language);
// Convert to language names
auto priority_language_names = FileSys::LANGUAGE_NAMES; // Copy
if (language_priority_list) {
for (size_t i = 0; i < priority_language_names.size(); ++i) {
// Relies on FileSys::LANGUAGE_NAMES being in the same order as
// Service::NS::ApplicationLanguage
const auto language_index = static_cast<u8>(language_priority_list->at(i));
if (language_index < FileSys::LANGUAGE_NAMES.size()) {
priority_language_names[i] = FileSys::LANGUAGE_NAMES[language_index];
} else {
// Not a catastrophe, unlikely to happen
LOG_WARNING(Loader, "Invalid language index {}", language_index);
}
}
}
// Get first matching icon
VirtualFile icon_file; VirtualFile icon_file;
for (const auto& language : FileSys::LANGUAGE_NAMES) { for (const auto& language : priority_language_names) {
icon_file = extracted->GetFile(std::string("icon_").append(language).append(".dat")); icon_file = extracted->GetFile(std::string("icon_").append(language).append(".dat"));
if (icon_file != nullptr) { if (icon_file != nullptr) {
break; break;

View file

@ -3491,6 +3491,7 @@ void GMainWindow::ResetWindowSize1080() {
void GMainWindow::OnConfigure() { void GMainWindow::OnConfigure() {
const auto old_theme = UISettings::values.theme; const auto old_theme = UISettings::values.theme;
const bool old_discord_presence = UISettings::values.enable_discord_presence.GetValue(); const bool old_discord_presence = UISettings::values.enable_discord_presence.GetValue();
const auto old_language_index = Settings::values.language_index.GetValue();
Settings::SetConfiguringGlobal(true); Settings::SetConfiguringGlobal(true);
ConfigureDialog configure_dialog(this, hotkey_registry, input_subsystem.get(), *system, ConfigureDialog configure_dialog(this, hotkey_registry, input_subsystem.get(), *system,
@ -3559,7 +3560,7 @@ void GMainWindow::OnConfigure() {
emit UpdateThemedIcons(); emit UpdateThemedIcons();
const auto reload = UISettings::values.is_game_list_reload_pending.exchange(false); const auto reload = UISettings::values.is_game_list_reload_pending.exchange(false);
if (reload) { if (reload || Settings::values.language_index.GetValue() != old_language_index) {
game_list->PopulateAsync(UISettings::values.game_dirs); game_list->PopulateAsync(UISettings::values.game_dirs);
} }