diff --git a/src/common/settings_enums.h b/src/common/settings_enums.h index d4935d9b6d..de54696497 100644 --- a/src/common/settings_enums.h +++ b/src/common/settings_enums.h @@ -120,7 +120,7 @@ ENUM(AudioMode, Mono, Stereo, Surround); ENUM(Language, Japanese, EnglishAmerican, French, German, Italian, Spanish, Chinese, Korean, Dutch, Portuguese, Russian, Taiwanese, EnglishBritish, FrenchCanadian, SpanishLatin, - ChineseSimplified, ChineseTraditional, PortugueseBrazilian, Serbian); + ChineseSimplified, ChineseTraditional, PortugueseBrazilian, Serbian, Polish, Thai); ENUM(Region, Japan, Usa, Europe, Australia, China, Korea, Taiwan); ENUM(TimeZone, Auto, Default, Cet, Cst6Cdt, Cuba, Eet, Egypt, Eire, Est, Est5Edt, Gb, GbEire, Gmt, GmtPlusZero, GmtMinusZero, GmtZero, Greenwich, Hongkong, Hst, Iceland, Iran, Israel, Jamaica, diff --git a/src/core/file_sys/control_metadata.cpp b/src/core/file_sys/control_metadata.cpp index 7ca7703afa..6c8f7fa433 100644 --- a/src/core/file_sys/control_metadata.cpp +++ b/src/core/file_sys/control_metadata.cpp @@ -12,6 +12,7 @@ #include #include "common/settings.h" +#include "common/settings_enums.h" #include "common/string_util.h" #include "common/swap.h" #include "core/file_sys/control_metadata.h" @@ -19,7 +20,7 @@ namespace FileSys { -const std::array LANGUAGE_NAMES{{ +const std::array LANGUAGE_NAMES{{ "AmericanEnglish", "BritishEnglish", "Japanese", @@ -36,6 +37,8 @@ const std::array LANGUAGE_NAMES{{ "TraditionalChinese", "SimplifiedChinese", "BrazilianPortuguese", + "Polish", + "Thai", }}; namespace { @@ -106,16 +109,14 @@ void DecodePackedLanguageEntries(RawNACP& raw) { } // namespace std::string LanguageEntry::GetApplicationName() const { - return Common::StringFromFixedZeroTerminatedBuffer(application_name.data(), - application_name.size()); + return Common::StringFromFixedZeroTerminatedBuffer(application_name.data(), application_name.size()); } std::string LanguageEntry::GetDeveloperName() const { - return Common::StringFromFixedZeroTerminatedBuffer(developer_name.data(), - developer_name.size()); + return Common::StringFromFixedZeroTerminatedBuffer(developer_name.data(), developer_name.size()); } -constexpr std::array language_to_codes = {{ +constexpr std::array language_to_codes = {{ Language::Japanese, Language::AmericanEnglish, Language::French, @@ -134,6 +135,8 @@ constexpr std::array language_to_codes = {{ Language::SimplifiedChinese, Language::TraditionalChinese, Language::BrazilianPortuguese, + Language::Polish, + Language::Thai, }}; NACP::NACP() = default; @@ -146,20 +149,40 @@ NACP::NACP(VirtualFile file) { NACP::~NACP() = default; const LanguageEntry& NACP::GetLanguageEntry() const { - Language language = - language_to_codes[static_cast(Settings::values.language_index.GetValue())]; - + auto const language = []{ + switch (Settings::values.language_index.GetValue()) { + case Settings::Language::Chinese: return Language::SimplifiedChinese; + case Settings::Language::ChineseSimplified: return Language::SimplifiedChinese; + case Settings::Language::ChineseTraditional: return Language::TraditionalChinese; + case Settings::Language::Dutch: return Language::Dutch; + case Settings::Language::EnglishAmerican: return Language::AmericanEnglish; + case Settings::Language::EnglishBritish: return Language::BritishEnglish; + case Settings::Language::French: return Language::French; + case Settings::Language::FrenchCanadian: return Language::CanadianFrench; + case Settings::Language::German: return Language::German; + case Settings::Language::Italian: return Language::Italian; + case Settings::Language::Korean: return Language::Korean; + case Settings::Language::Japanese: return Language::Japanese; + case Settings::Language::Portuguese: return Language::Portuguese; + case Settings::Language::PortugueseBrazilian: return Language::BrazilianPortuguese; + case Settings::Language::Russian: return Language::Russian; + case Settings::Language::Serbian: return Language::Russian; + case Settings::Language::Spanish: return Language::Spanish; + case Settings::Language::SpanishLatin: return Language::LatinAmericanSpanish; + case Settings::Language::Taiwanese: return Language::SimplifiedChinese; + case Settings::Language::Thai: return Language::Thai; + case Settings::Language::Polish: return Language::Polish; + } + }(); { const auto& language_entry = raw.language_entries.at(static_cast(language)); if (!language_entry.GetApplicationName().empty()) return language_entry; } - for (const auto& language_entry : raw.language_entries) { if (!language_entry.GetApplicationName().empty()) return language_entry; } - return raw.language_entries.at(static_cast(Language::AmericanEnglish)); } diff --git a/src/core/file_sys/control_metadata.h b/src/core/file_sys/control_metadata.h index bd109f783f..478fd6e5e7 100644 --- a/src/core/file_sys/control_metadata.h +++ b/src/core/file_sys/control_metadata.h @@ -25,7 +25,132 @@ struct LanguageEntry { std::string GetApplicationName() const; std::string GetDeveloperName() const; }; -static_assert(sizeof(LanguageEntry) == 0x300, "LanguageEntry has incorrect size."); +static_assert(sizeof(LanguageEntry) == 0x300); + +struct ApplicationNeighborDetectionGroupConfiguration { + u64 group_id; ///< GroupId + std::array key; +}; +static_assert(sizeof(ApplicationNeighborDetectionGroupConfiguration) == 0x18); + +// NeighborDetectionClientConfiguration +struct NeighborDetectionClientConfiguration { + ApplicationNeighborDetectionGroupConfiguration send_group_configuration; ///< SendGroupConfiguration + std::array receivable_group_configurations; ///< ReceivableGroupConfigurations +}; +static_assert(sizeof(NeighborDetectionClientConfiguration) == 0x198); + +enum class ApparentPlatform : u8 { + NX = 0, + Ounce = 1, + Count = 2 +}; + +enum class JitConfigurationFlag : u64 { + None = 0, + IsEnabled = 1, +}; + +struct JitConfiguration { + JitConfigurationFlag jit_configuration_flag; + u64 memory_size; +}; +static_assert(sizeof(JitConfiguration) == 0x10); + +enum RequiredAddOnContentsSetDescriptorFlag : u16 { + None = 0, + Continue = 1 +}; +struct RequiredAddOnContentsSetDescriptor { + u16 index : 15; + RequiredAddOnContentsSetDescriptorFlag flag : 1; +}; +static_assert(sizeof(RequiredAddOnContentsSetDescriptor) == 0x2); + +struct RequiredAddOnContentsSetBinaryDescriptor { + RequiredAddOnContentsSetDescriptor descriptors[0x20]; +}; +static_assert(sizeof(RequiredAddOnContentsSetBinaryDescriptor) == 0x40); + +enum class PlayReportPermission : u8 { + None = 0, + TargetMarketing = 1, +}; + +enum class CrashScreenshotForProd : u8 { + Deny = 0, + Allow = 1, +}; + +enum class CrashScreenshotForDev : u8 { + Deny = 0, + Allow = 1, +}; + +enum class ContentsAvailabilityTransitionPolicy : u8 { + NoPolicy = 0, + Stable = 1, + Changeable = 2, +}; + +struct AccessibleLaunchRequiredVersion { + std::array application_id; +}; +static_assert(sizeof(AccessibleLaunchRequiredVersion) == 0x40); + +struct ApplicationControlDataConditionData { + u8 priority; + INSERT_PADDING_BYTES(7); + u16 aoc_index; + INSERT_PADDING_BYTES(6); +}; +static_assert(sizeof(ApplicationControlDataConditionData) == 0x10); + +#pragma pack(push, 1) +struct ApplicationControlDataCondition { + u64 type; + std::array data; + u8 count; +}; +#pragma pack(pop) +static_assert(sizeof(ApplicationControlDataCondition) == 0x89); + +// A language on the NX. These are for names and icons. +#define NACP_LANGUAGE_LIST \ + NACP_LANGUAGE_ELEM(AmericanEnglish, 0) \ + NACP_LANGUAGE_ELEM(BritishEnglish, 1) \ + NACP_LANGUAGE_ELEM(Japanese, 2) \ + NACP_LANGUAGE_ELEM(French, 3) \ + NACP_LANGUAGE_ELEM(German, 4) \ + NACP_LANGUAGE_ELEM(LatinAmericanSpanish, 5) \ + NACP_LANGUAGE_ELEM(Spanish, 6) \ + NACP_LANGUAGE_ELEM(Italian, 7) \ + NACP_LANGUAGE_ELEM(Dutch, 8) \ + NACP_LANGUAGE_ELEM(CanadianFrench, 9) \ + NACP_LANGUAGE_ELEM(Portuguese, 10) \ + NACP_LANGUAGE_ELEM(Russian, 11) \ + NACP_LANGUAGE_ELEM(Korean, 12) \ + NACP_LANGUAGE_ELEM(TraditionalChinese, 13) \ + NACP_LANGUAGE_ELEM(SimplifiedChinese, 14) \ + NACP_LANGUAGE_ELEM(BrazilianPortuguese, 15) \ + NACP_LANGUAGE_ELEM(Polish, 16) \ + NACP_LANGUAGE_ELEM(Thai, 17) \ + +enum class Language : u8 { +#define NACP_LANGUAGE_ELEM(X, N) X = N, + NACP_LANGUAGE_LIST +#undef NACP_LANGUAGE_ELEM + Count = 18, + Default = 255, +}; + +// Yes it's duplicated, why? Bits i guess +enum class SupportedLanguage : u32 { +#define NACP_LANGUAGE_ELEM(X, N) X = 1ULL << N, + NACP_LANGUAGE_LIST +#undef NACP_LANGUAGE_ELEM +}; +#undef NACP_LANGUAGE_LIST // The raw file format of a NACP file. struct RawNACP { @@ -35,7 +160,7 @@ struct RawNACP { u8 user_account_switch_lock; u8 addon_content_registration_type; u32_le application_attribute; - u32_le supported_languages; + SupportedLanguage supported_languages; u32_le parental_control; bool screenshot_enabled; u8 video_capture_mode; @@ -71,11 +196,20 @@ struct RawNACP { u16_le cache_storage_max_index; INSERT_PADDING_BYTES(0x8B); u8 app_error_code_prefix; - INSERT_PADDING_BYTES(1); + u8 title_compression; u8 acd_index; - u8 apparent_platform; - INSERT_PADDING_BYTES(0x22F); - std::array app_control_data_condition; + ApparentPlatform apparent_platform; + // NeighborDetectionClientConfiguration neighbor_detection_client_configuration; + // JitConfiguration jit_configuration; + // RequiredAddOnContentsSetBinaryDescriptor required_add_on_contents_set_binary_descriptor; + // PlayReportPermission play_report_permission; + // CrashScreenshotForProd crash_screenshot_for_prod; + // CrashScreenshotForDev crash_screenshot_for_dev; + // ContentsAvailabilityTransitionPolicy contents_availability_transition_policy; + // SupportedLanguage supported_language_copy; ///< TODO: add to XML generation. + INSERT_PADDING_BYTES(0x1EF); + AccessibleLaunchRequiredVersion accessible_launch_required_version; + ApplicationControlDataCondition application_control_data_condition; ///< Used for Switch 2 upgrade packs, which are distributed as AddOnContent titles u8 initial_program_index; INSERT_PADDING_BYTES(2); u32_le accessible_program_index_flags; @@ -90,29 +224,7 @@ struct RawNACP { }; static_assert(sizeof(RawNACP) == 0x4000, "RawNACP has incorrect size."); -// A language on the NX. These are for names and icons. -enum class Language : u8 { - AmericanEnglish = 0, - BritishEnglish = 1, - Japanese = 2, - French = 3, - German = 4, - LatinAmericanSpanish = 5, - Spanish = 6, - Italian = 7, - Dutch = 8, - CanadianFrench = 9, - Portuguese = 10, - Russian = 11, - Korean = 12, - TraditionalChinese = 13, - SimplifiedChinese = 14, - BrazilianPortuguese = 15, - - Default = 255, -}; - -extern const std::array LANGUAGE_NAMES; +extern const std::array LANGUAGE_NAMES; // A class representing the format used by NX metadata files, typically named Control.nacp. // These store application name, dev name, title id, and other miscellaneous data. diff --git a/src/core/hle/service/ns/language.cpp b/src/core/hle/service/ns/language.cpp index d187be935a..997e293a80 100644 --- a/src/core/hle/service/ns/language.cpp +++ b/src/core/hle/service/ns/language.cpp @@ -22,6 +22,8 @@ constexpr ApplicationLanguagePriorityList priority_list_american_english = {{ ApplicationLanguage::SimplifiedChinese, ApplicationLanguage::TraditionalChinese, ApplicationLanguage::Korean, + ApplicationLanguage::Polish, + ApplicationLanguage::Thai, }}; constexpr ApplicationLanguagePriorityList priority_list_british_english = {{ @@ -40,6 +42,8 @@ constexpr ApplicationLanguagePriorityList priority_list_british_english = {{ ApplicationLanguage::SimplifiedChinese, ApplicationLanguage::TraditionalChinese, ApplicationLanguage::Korean, + ApplicationLanguage::Polish, + ApplicationLanguage::Thai, }}; constexpr ApplicationLanguagePriorityList priority_list_japanese = {{ @@ -58,6 +62,8 @@ constexpr ApplicationLanguagePriorityList priority_list_japanese = {{ ApplicationLanguage::SimplifiedChinese, ApplicationLanguage::TraditionalChinese, ApplicationLanguage::Korean, + ApplicationLanguage::Polish, + ApplicationLanguage::Thai, }}; constexpr ApplicationLanguagePriorityList priority_list_french = {{ @@ -76,6 +82,8 @@ constexpr ApplicationLanguagePriorityList priority_list_french = {{ ApplicationLanguage::SimplifiedChinese, ApplicationLanguage::TraditionalChinese, ApplicationLanguage::Korean, + ApplicationLanguage::Polish, + ApplicationLanguage::Thai, }}; constexpr ApplicationLanguagePriorityList priority_list_german = {{ @@ -94,6 +102,8 @@ constexpr ApplicationLanguagePriorityList priority_list_german = {{ ApplicationLanguage::SimplifiedChinese, ApplicationLanguage::TraditionalChinese, ApplicationLanguage::Korean, + ApplicationLanguage::Polish, + ApplicationLanguage::Thai, }}; constexpr ApplicationLanguagePriorityList priority_list_latin_american_spanish = {{ @@ -112,6 +122,8 @@ constexpr ApplicationLanguagePriorityList priority_list_latin_american_spanish = ApplicationLanguage::SimplifiedChinese, ApplicationLanguage::TraditionalChinese, ApplicationLanguage::Korean, + ApplicationLanguage::Polish, + ApplicationLanguage::Thai, }}; constexpr ApplicationLanguagePriorityList priority_list_spanish = {{ @@ -130,6 +142,8 @@ constexpr ApplicationLanguagePriorityList priority_list_spanish = {{ ApplicationLanguage::SimplifiedChinese, ApplicationLanguage::TraditionalChinese, ApplicationLanguage::Korean, + ApplicationLanguage::Polish, + ApplicationLanguage::Thai, }}; constexpr ApplicationLanguagePriorityList priority_list_italian = {{ @@ -148,6 +162,8 @@ constexpr ApplicationLanguagePriorityList priority_list_italian = {{ ApplicationLanguage::SimplifiedChinese, ApplicationLanguage::TraditionalChinese, ApplicationLanguage::Korean, + ApplicationLanguage::Polish, + ApplicationLanguage::Thai, }}; constexpr ApplicationLanguagePriorityList priority_list_dutch = {{ @@ -166,6 +182,8 @@ constexpr ApplicationLanguagePriorityList priority_list_dutch = {{ ApplicationLanguage::SimplifiedChinese, ApplicationLanguage::TraditionalChinese, ApplicationLanguage::Korean, + ApplicationLanguage::Polish, + ApplicationLanguage::Thai, }}; constexpr ApplicationLanguagePriorityList priority_list_canadian_french = {{ @@ -184,6 +202,8 @@ constexpr ApplicationLanguagePriorityList priority_list_canadian_french = {{ ApplicationLanguage::SimplifiedChinese, ApplicationLanguage::TraditionalChinese, ApplicationLanguage::Korean, + ApplicationLanguage::Polish, + ApplicationLanguage::Thai, }}; constexpr ApplicationLanguagePriorityList priority_list_portuguese = {{ @@ -202,6 +222,8 @@ constexpr ApplicationLanguagePriorityList priority_list_portuguese = {{ ApplicationLanguage::SimplifiedChinese, ApplicationLanguage::TraditionalChinese, ApplicationLanguage::Korean, + ApplicationLanguage::Polish, + ApplicationLanguage::Thai, }}; constexpr ApplicationLanguagePriorityList priority_list_russian = {{ @@ -220,6 +242,8 @@ constexpr ApplicationLanguagePriorityList priority_list_russian = {{ ApplicationLanguage::SimplifiedChinese, ApplicationLanguage::TraditionalChinese, ApplicationLanguage::Korean, + ApplicationLanguage::Polish, + ApplicationLanguage::Thai, }}; constexpr ApplicationLanguagePriorityList priority_list_korean = {{ @@ -238,6 +262,8 @@ constexpr ApplicationLanguagePriorityList priority_list_korean = {{ ApplicationLanguage::Japanese, ApplicationLanguage::SimplifiedChinese, ApplicationLanguage::TraditionalChinese, + ApplicationLanguage::Polish, + ApplicationLanguage::Thai, }}; constexpr ApplicationLanguagePriorityList priority_list_traditional_chinese = {{ @@ -256,6 +282,8 @@ constexpr ApplicationLanguagePriorityList priority_list_traditional_chinese = {{ ApplicationLanguage::Portuguese, ApplicationLanguage::Russian, ApplicationLanguage::Korean, + ApplicationLanguage::Polish, + ApplicationLanguage::Thai, }}; constexpr ApplicationLanguagePriorityList priority_list_simplified_chinese = {{ @@ -274,6 +302,8 @@ constexpr ApplicationLanguagePriorityList priority_list_simplified_chinese = {{ ApplicationLanguage::Portuguese, ApplicationLanguage::Russian, ApplicationLanguage::Korean, + ApplicationLanguage::Polish, + ApplicationLanguage::Thai, }}; constexpr ApplicationLanguagePriorityList priority_list_brazilian_portuguese = {{ @@ -293,6 +323,50 @@ constexpr ApplicationLanguagePriorityList priority_list_brazilian_portuguese = { ApplicationLanguage::Korean, ApplicationLanguage::SimplifiedChinese, ApplicationLanguage::TraditionalChinese, + ApplicationLanguage::Polish, + ApplicationLanguage::Thai, +}}; + +constexpr ApplicationLanguagePriorityList priority_list_thai = {{ + ApplicationLanguage::Thai, + ApplicationLanguage::BrazilianPortuguese, + ApplicationLanguage::Portuguese, + ApplicationLanguage::LatinAmericanSpanish, + ApplicationLanguage::AmericanEnglish, + ApplicationLanguage::BritishEnglish, + ApplicationLanguage::Japanese, + ApplicationLanguage::French, + ApplicationLanguage::German, + ApplicationLanguage::Spanish, + ApplicationLanguage::Italian, + ApplicationLanguage::Dutch, + ApplicationLanguage::CanadianFrench, + ApplicationLanguage::Russian, + ApplicationLanguage::Korean, + ApplicationLanguage::SimplifiedChinese, + ApplicationLanguage::TraditionalChinese, + ApplicationLanguage::Polish, +}}; + +constexpr ApplicationLanguagePriorityList priority_list_polish = {{ + ApplicationLanguage::Polish, + ApplicationLanguage::Thai, + ApplicationLanguage::BrazilianPortuguese, + ApplicationLanguage::Portuguese, + ApplicationLanguage::LatinAmericanSpanish, + ApplicationLanguage::AmericanEnglish, + ApplicationLanguage::BritishEnglish, + ApplicationLanguage::Japanese, + ApplicationLanguage::French, + ApplicationLanguage::German, + ApplicationLanguage::Spanish, + ApplicationLanguage::Italian, + ApplicationLanguage::Dutch, + ApplicationLanguage::CanadianFrench, + ApplicationLanguage::Russian, + ApplicationLanguage::Korean, + ApplicationLanguage::SimplifiedChinese, + ApplicationLanguage::TraditionalChinese, }}; const ApplicationLanguagePriorityList* GetApplicationLanguagePriorityList( @@ -330,6 +404,10 @@ const ApplicationLanguagePriorityList* GetApplicationLanguagePriorityList( return &priority_list_simplified_chinese; case ApplicationLanguage::BrazilianPortuguese: return &priority_list_brazilian_portuguese; + case ApplicationLanguage::Polish: + return &priority_list_polish; + case ApplicationLanguage::Thai: + return &priority_list_thai; default: return nullptr; } @@ -372,6 +450,10 @@ std::optional ConvertToApplicationLanguage( return ApplicationLanguage::SimplifiedChinese; case Set::LanguageCode::PT_BR: return ApplicationLanguage::BrazilianPortuguese; + case Set::LanguageCode::TH: + return ApplicationLanguage::Thai; + case Set::LanguageCode::PL: + return ApplicationLanguage::Polish; default: return std::nullopt; } @@ -411,6 +493,10 @@ std::optional ConvertToLanguageCode(const ApplicationLanguage return Set::LanguageCode::ZH_HANS; case ApplicationLanguage::BrazilianPortuguese: return Set::LanguageCode::PT_BR; + case ApplicationLanguage::Thai: + return Set::LanguageCode::TH; + case ApplicationLanguage::Polish: + return Set::LanguageCode::PL; default: return std::nullopt; } diff --git a/src/core/hle/service/ns/language.h b/src/core/hle/service/ns/language.h index dad9934f2e..3502c5c093 100644 --- a/src/core/hle/service/ns/language.h +++ b/src/core/hle/service/ns/language.h @@ -26,6 +26,8 @@ enum class ApplicationLanguage : u8 { TraditionalChinese, SimplifiedChinese, BrazilianPortuguese, + Polish, + Thai, Count }; using ApplicationLanguagePriorityList = diff --git a/src/core/hle/service/set/settings_types.h b/src/core/hle/service/set/settings_types.h index 7f152cb523..12f1c42185 100644 --- a/src/core/hle/service/set/settings_types.h +++ b/src/core/hle/service/set/settings_types.h @@ -169,6 +169,8 @@ enum class Language : u32 { SimplifiedCHhinese, TraditionalChinese, BrazilianPortuguese, + Polish, + Thai }; /// This is "nn::settings::LanguageCode", which is a NUL-terminated string stored in a u64. @@ -191,6 +193,8 @@ enum class LanguageCode : u64 { ZH_HANS = 0x00736E61482D687A, ZH_HANT = 0x00746E61482D687A, PT_BR = 0x00000052422D7470, + TH = 0x0000000000006874, + PL = 0x000000000000706C, }; /// This is nn::settings::system::NotificationVolume diff --git a/src/qt_common/config/shared_translation.cpp b/src/qt_common/config/shared_translation.cpp index f4355197b0..78fbce2347 100644 --- a/src/qt_common/config/shared_translation.cpp +++ b/src/qt_common/config/shared_translation.cpp @@ -652,6 +652,8 @@ std::unique_ptr ComboboxEnumeration(QObject* parent) PAIR(Language, ChineseTraditional, tr("Traditional Chinese (正體中文)")), PAIR(Language, PortugueseBrazilian, tr("Brazilian Portuguese (português do Brasil)")), PAIR(Language, Serbian, tr("Serbian (српски)")), + PAIR(Language, Polish, tr("Polish (polska)")), + PAIR(Language, Thai, tr("Thai (แบบไทย)")), }}); translations->insert({Settings::EnumMetadata::Index(), {