Browse Source

[common, hle] add new updates Polish+Thai languages

Signed-off-by: lizzie <lizzie@eden-emu.dev>
pull/3587/head
lizzie 2 weeks ago
committed by crueter
parent
commit
20a00eb74d
  1. 2
      src/common/settings_enums.h
  2. 45
      src/core/file_sys/control_metadata.cpp
  3. 170
      src/core/file_sys/control_metadata.h
  4. 86
      src/core/hle/service/ns/language.cpp
  5. 2
      src/core/hle/service/ns/language.h
  6. 4
      src/core/hle/service/set/settings_types.h
  7. 2
      src/qt_common/config/shared_translation.cpp

2
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,

45
src/core/file_sys/control_metadata.cpp

@ -12,6 +12,7 @@
#include <zlib.h>
#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<const char*, 16> LANGUAGE_NAMES{{
const std::array<const char*, size_t(Language::Count)> LANGUAGE_NAMES{{
"AmericanEnglish",
"BritishEnglish",
"Japanese",
@ -36,6 +37,8 @@ const std::array<const char*, 16> 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, 18> language_to_codes = {{
constexpr std::array<Language, 20> language_to_codes = {{
Language::Japanese,
Language::AmericanEnglish,
Language::French,
@ -134,6 +135,8 @@ constexpr std::array<Language, 18> 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<s32>(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<u8>(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<u8>(Language::AmericanEnglish));
}

170
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<u8, 0x10> key;
};
static_assert(sizeof(ApplicationNeighborDetectionGroupConfiguration) == 0x18);
// NeighborDetectionClientConfiguration
struct NeighborDetectionClientConfiguration {
ApplicationNeighborDetectionGroupConfiguration send_group_configuration; ///< SendGroupConfiguration
std::array<ApplicationNeighborDetectionGroupConfiguration, 0x10> 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<u64, 8> 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<ApplicationControlDataConditionData, 0x8> 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<u8, 0x89> 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<const char*, 16> LANGUAGE_NAMES;
extern const std::array<const char*, size_t(Language::Count)> 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.

86
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<ApplicationLanguage> 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<Set::LanguageCode> 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;
}

2
src/core/hle/service/ns/language.h

@ -26,6 +26,8 @@ enum class ApplicationLanguage : u8 {
TraditionalChinese,
SimplifiedChinese,
BrazilianPortuguese,
Polish,
Thai,
Count
};
using ApplicationLanguagePriorityList =

4
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

2
src/qt_common/config/shared_translation.cpp

@ -652,6 +652,8 @@ std::unique_ptr<ComboboxTranslationMap> 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<Settings::Region>::Index(),
{

Loading…
Cancel
Save