summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/hle/service/cfg/cfg.cpp74
1 files changed, 38 insertions, 36 deletions
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
322 return MakeResult<void*>(pointer); 322 return MakeResult<void*>(pointer);
323} 323}
324 324
325/// Checks if the language is available in the chosen region, and returns a proper one
326static u8 AdjustLanguageInfoBlock(u32 region, u8 language) {
327 static const std::array<std::vector<u8>, 7> region_languages{{
328 // JPN
329 {LANGUAGE_JP},
330 // USA
331 {LANGUAGE_EN, LANGUAGE_FR, LANGUAGE_ES, LANGUAGE_PT},
332 // EUR
333 {LANGUAGE_EN, LANGUAGE_FR, LANGUAGE_DE, LANGUAGE_IT, LANGUAGE_ES, LANGUAGE_NL, LANGUAGE_PT,
334 LANGUAGE_RU},
335 // AUS
336 {LANGUAGE_EN, LANGUAGE_FR, LANGUAGE_DE, LANGUAGE_IT, LANGUAGE_ES, LANGUAGE_NL, LANGUAGE_PT,
337 LANGUAGE_RU},
338 // CHN
339 {LANGUAGE_ZH},
340 // KOR
341 {LANGUAGE_KO},
342 // TWN
343 {LANGUAGE_TW},
344 }};
345 const auto& available = region_languages[region];
346 if (std::find(available.begin(), available.end(), language) == available.end()) {
347 return available[0];
348 }
349 return language;
350}
351
352ResultCode GetConfigInfoBlock(u32 block_id, u32 size, u32 flag, void* output) { 325ResultCode GetConfigInfoBlock(u32 block_id, u32 size, u32 flag, void* output) {
353 void* pointer; 326 void* pointer;
354 CASCADE_RESULT(pointer, GetConfigInfoBlockPointer(block_id, size, flag)); 327 CASCADE_RESULT(pointer, GetConfigInfoBlockPointer(block_id, size, flag));
355 memcpy(output, pointer, size); 328 memcpy(output, pointer, size);
356 329
357 // override the language setting if the region setting is auto
358 if (block_id == LanguageBlockID &&
359 Settings::values.region_value == Settings::REGION_VALUE_AUTO_SELECT) {
360 u8 language;
361 memcpy(&language, output, sizeof(u8));
362 language = AdjustLanguageInfoBlock(preferred_region_code, language);
363 memcpy(output, &language, sizeof(u8));
364 }
365
366 return RESULT_SUCCESS; 330 return RESULT_SUCCESS;
367} 331}
368 332
@@ -586,9 +550,47 @@ void Init() {
586 550
587void Shutdown() {} 551void Shutdown() {}
588 552
553/// Checks if the language is available in the chosen region, and returns a proper one
554static SystemLanguage AdjustLanguageInfoBlock(u32 region, SystemLanguage language) {
555 static const std::array<std::vector<SystemLanguage>, 7> region_languages{{
556 // JPN
557 {LANGUAGE_JP},
558 // USA
559 {LANGUAGE_EN, LANGUAGE_FR, LANGUAGE_ES, LANGUAGE_PT},
560 // EUR
561 {LANGUAGE_EN, LANGUAGE_FR, LANGUAGE_DE, LANGUAGE_IT, LANGUAGE_ES, LANGUAGE_NL, LANGUAGE_PT,
562 LANGUAGE_RU},
563 // AUS
564 {LANGUAGE_EN, LANGUAGE_FR, LANGUAGE_DE, LANGUAGE_IT, LANGUAGE_ES, LANGUAGE_NL, LANGUAGE_PT,
565 LANGUAGE_RU},
566 // CHN
567 {LANGUAGE_ZH},
568 // KOR
569 {LANGUAGE_KO},
570 // TWN
571 {LANGUAGE_TW},
572 }};
573 const auto& available = region_languages[region];
574 if (std::find(available.begin(), available.end(), language) == available.end()) {
575 return available[0];
576 }
577 return language;
578}
579
589void SetPreferredRegionCode(u32 region_code) { 580void SetPreferredRegionCode(u32 region_code) {
590 preferred_region_code = region_code; 581 preferred_region_code = region_code;
591 LOG_INFO(Service_CFG, "Preferred region code set to %u", preferred_region_code); 582 LOG_INFO(Service_CFG, "Preferred region code set to %u", preferred_region_code);
583
584 if (Settings::values.region_value == Settings::REGION_VALUE_AUTO_SELECT) {
585 const SystemLanguage current_language = GetSystemLanguage();
586 const SystemLanguage adjusted_language =
587 AdjustLanguageInfoBlock(region_code, current_language);
588 if (current_language != adjusted_language) {
589 LOG_WARNING(Service_CFG, "System language %d does not fit the region. Adjusted to %d",
590 static_cast<int>(current_language), static_cast<int>(adjusted_language));
591 SetSystemLanguage(adjusted_language);
592 }
593 }
592} 594}
593 595
594void SetUsername(const std::u16string& name) { 596void SetUsername(const std::u16string& name) {