Browse Source

Pick game icon based on the configured system language

Keve1227 3 years ago
parent
commit
d0aa63069f
1 changed files with 32 additions and 1 deletions
  1. 32 1
      src/core/file_sys/patch_manager.cpp

+ 32 - 1
src/core/file_sys/patch_manager.cpp

@@ -24,6 +24,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"
@@ -623,8 +625,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 catastrophy, 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;