diff --git a/src/core/hle/service/cfg/cfg.cpp b/src/core/hle/service/cfg/cfg.cpp
index 59dd6d1cd..6f13cde27 100644
--- a/src/core/hle/service/cfg/cfg.cpp
+++ b/src/core/hle/service/cfg/cfg.cpp
@@ -322,47 +322,11 @@ static ResultVal<void*> GetConfigInfoBlockPointer(u32 block_id, u32 size, u32 fl
     return MakeResult<void*>(pointer);
 }
 
-/// Checks if the language is available in the chosen region, and returns a proper one
-static u8 AdjustLanguageInfoBlock(u32 region, u8 language) {
-    static const std::array<std::vector<u8>, 7> region_languages{{
-        // JPN
-        {LANGUAGE_JP},
-        // USA
-        {LANGUAGE_EN, LANGUAGE_FR, LANGUAGE_ES, LANGUAGE_PT},
-        // EUR
-        {LANGUAGE_EN, LANGUAGE_FR, LANGUAGE_DE, LANGUAGE_IT, LANGUAGE_ES, LANGUAGE_NL, LANGUAGE_PT,
-         LANGUAGE_RU},
-        // AUS
-        {LANGUAGE_EN, LANGUAGE_FR, LANGUAGE_DE, LANGUAGE_IT, LANGUAGE_ES, LANGUAGE_NL, LANGUAGE_PT,
-         LANGUAGE_RU},
-        // CHN
-        {LANGUAGE_ZH},
-        // KOR
-        {LANGUAGE_KO},
-        // TWN
-        {LANGUAGE_TW},
-    }};
-    const auto& available = region_languages[region];
-    if (std::find(available.begin(), available.end(), language) == available.end()) {
-        return available[0];
-    }
-    return language;
-}
-
 ResultCode GetConfigInfoBlock(u32 block_id, u32 size, u32 flag, void* output) {
     void* pointer;
     CASCADE_RESULT(pointer, GetConfigInfoBlockPointer(block_id, size, flag));
     memcpy(output, pointer, size);
 
-    // override the language setting if the region setting is auto
-    if (block_id == LanguageBlockID &&
-        Settings::values.region_value == Settings::REGION_VALUE_AUTO_SELECT) {
-        u8 language;
-        memcpy(&language, output, sizeof(u8));
-        language = AdjustLanguageInfoBlock(preferred_region_code, language);
-        memcpy(output, &language, sizeof(u8));
-    }
-
     return RESULT_SUCCESS;
 }
 
@@ -586,9 +550,47 @@ void Init() {
 
 void Shutdown() {}
 
+/// Checks if the language is available in the chosen region, and returns a proper one
+static SystemLanguage AdjustLanguageInfoBlock(u32 region, SystemLanguage language) {
+    static const std::array<std::vector<SystemLanguage>, 7> region_languages{{
+        // JPN
+        {LANGUAGE_JP},
+        // USA
+        {LANGUAGE_EN, LANGUAGE_FR, LANGUAGE_ES, LANGUAGE_PT},
+        // EUR
+        {LANGUAGE_EN, LANGUAGE_FR, LANGUAGE_DE, LANGUAGE_IT, LANGUAGE_ES, LANGUAGE_NL, LANGUAGE_PT,
+         LANGUAGE_RU},
+        // AUS
+        {LANGUAGE_EN, LANGUAGE_FR, LANGUAGE_DE, LANGUAGE_IT, LANGUAGE_ES, LANGUAGE_NL, LANGUAGE_PT,
+         LANGUAGE_RU},
+        // CHN
+        {LANGUAGE_ZH},
+        // KOR
+        {LANGUAGE_KO},
+        // TWN
+        {LANGUAGE_TW},
+    }};
+    const auto& available = region_languages[region];
+    if (std::find(available.begin(), available.end(), language) == available.end()) {
+        return available[0];
+    }
+    return language;
+}
+
 void SetPreferredRegionCode(u32 region_code) {
     preferred_region_code = region_code;
     LOG_INFO(Service_CFG, "Preferred region code set to %u", preferred_region_code);
+
+    if (Settings::values.region_value == Settings::REGION_VALUE_AUTO_SELECT) {
+        const SystemLanguage current_language = GetSystemLanguage();
+        const SystemLanguage adjusted_language =
+            AdjustLanguageInfoBlock(region_code, current_language);
+        if (current_language != adjusted_language) {
+            LOG_WARNING(Service_CFG, "System language %d does not fit the region. Adjusted to %d",
+                        static_cast<int>(current_language), static_cast<int>(adjusted_language));
+            SetSystemLanguage(adjusted_language);
+        }
+    }
 }
 
 void SetUsername(const std::u16string& name) {