CFG: override language setting on boot
This commit is contained in:
		
							parent
							
								
									1d088c637c
								
							
						
					
					
						commit
						0045ea662f
					
				@ -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) {
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user