diff --git a/UnleashedRecomp/CMakeLists.txt b/UnleashedRecomp/CMakeLists.txt index b45e186..147b325 100644 --- a/UnleashedRecomp/CMakeLists.txt +++ b/UnleashedRecomp/CMakeLists.txt @@ -66,6 +66,11 @@ set(SWA_KERNEL_CXX_SOURCES "kernel/io/file_system.cpp" ) +set(SWA_LOCALE_CXX_SOURCES + "locale/config_locale.cpp" + "locale/locale.cpp" +) + set(SWA_OS_CXX_SOURCES "os/logger.cpp" "os/media.cpp" @@ -182,6 +187,7 @@ set(SWA_CXX_SOURCES "stdafx.cpp" ${SWA_KERNEL_CXX_SOURCES} + ${SWA_LOCALE_CXX_SOURCES} ${SWA_OS_CXX_SOURCES} ${SWA_CPU_CXX_SOURCES} ${SWA_GPU_CXX_SOURCES} diff --git a/UnleashedRecomp/gpu/imgui/imgui_snapshot.cpp b/UnleashedRecomp/gpu/imgui/imgui_snapshot.cpp index dbf87ee..cdb1c71 100644 --- a/UnleashedRecomp/gpu/imgui/imgui_snapshot.cpp +++ b/UnleashedRecomp/gpu/imgui/imgui_snapshot.cpp @@ -211,15 +211,6 @@ void ImFontAtlasSnapshot::GenerateGlyphRanges() { for (auto& [language, value] : locale) GetGlyphs(glyphs, value); - } - - for (auto& [language, locale] : g_bool_locale) - { - for (auto& [value, nameAndDesc] : locale) - { - GetGlyphs(glyphs, std::get<0>(nameAndDesc)); - GetGlyphs(glyphs, std::get<1>(nameAndDesc)); - } } for (size_t i = XDBF_LANGUAGE_ENGLISH; i <= XDBF_LANGUAGE_ITALIAN; i++) diff --git a/UnleashedRecomp/locale/config_locale.h b/UnleashedRecomp/locale/config_locale.cpp similarity index 88% rename from UnleashedRecomp/locale/config_locale.h rename to UnleashedRecomp/locale/config_locale.cpp index 6a9d0d7..c55676c 100644 --- a/UnleashedRecomp/locale/config_locale.h +++ b/UnleashedRecomp/locale/config_locale.cpp @@ -1,58 +1,11 @@ -#pragma once - +#include #include #define CONFIG_DEFINE_LOCALE(name) \ - inline std::unordered_map> g_##name##_locale = + CONFIG_LOCALE Config::g_##name##_locale = #define CONFIG_DEFINE_ENUM_LOCALE(type) \ - inline std::unordered_map>> g_##type##_locale = - -CONFIG_DEFINE_ENUM_LOCALE(bool) -{ - { - ELanguage::English, - { - { true, { "ON", "" } }, - { false, { "OFF", "" } } - } - }, - { - ELanguage::Japanese, - { - { true, { "オン", "" } }, - { false, { "オフ", "" } } - } - }, - { - ELanguage::German, - { - { true, { "EIN", "" } }, - { false, { "AUS", "" } } - } - }, - { - ELanguage::French, - { - { true, { "OUI", "" } }, - { false, { "NON", "" } } - } - }, - { - ELanguage::Spanish, - { - { true, { "SÍ", "" } }, - { false, { "NO", "" } } - } - }, - { - ELanguage::Italian, - { - { true, { "SÌ", "" } }, - { false, { "NO", "" } } - } - } -}; + CONFIG_ENUM_LOCALE(type) Config::g_##type##_locale = CONFIG_DEFINE_LOCALE(Language) { diff --git a/UnleashedRecomp/locale/locale.cpp b/UnleashedRecomp/locale/locale.cpp new file mode 100644 index 0000000..3104804 --- /dev/null +++ b/UnleashedRecomp/locale/locale.cpp @@ -0,0 +1,333 @@ +#include + +std::unordered_map> g_locale = +{ + { + "Options_Category_System", + { + { ELanguage::English, "SYSTEM" } + } + }, + { + "Options_Category_Input", + { + { ELanguage::English, "INPUT" } + } + }, + { + "Options_Category_Audio", + { + { ELanguage::English, "AUDIO" } + } + }, + { + "Options_Category_Video", + { + { ELanguage::English, "VIDEO" } + } + }, + { + "Options_Value_Max", + { + { ELanguage::English, "MAX" } + } + }, + { + "Options_Name_WindowSize", + { + { ELanguage::English, "Window Size" } + } + }, + { + "Options_Desc_WindowSize", + { + { ELanguage::English, "Adjust the size of the game window in windowed mode." } + } + }, + { + "Options_Desc_NotAvailable", + { + { ELanguage::English, "This option is not available at this location." } + } + }, + { + "Options_Desc_NotAvailableMSAA", + { + { ELanguage::English, "This option is not available without MSAA." } + } + }, + { + "Options_Desc_OSNotSupported", + { + { ELanguage::English, "This option is not supported by your operating system." } + } + }, + { + "Options_Message_Restart", + { + { ELanguage::English, "The game will now restart." } + } + }, + { + "Achievements_Name", + { + { ELanguage::English, "Achievements" } + } + }, + { + "Achievements_Name_Uppercase", + { + { ELanguage::English, "ACHIEVEMENTS" } + } + }, + { + "Achievements_Unlock", + { + { ELanguage::English, "Achievement Unlocked!" } + } + }, + { + "Installer_Header_Installer", + { + { ELanguage::English, "INSTALLER" }, + { ELanguage::Spanish, "INSTALADOR" }, + }, + }, + { + "Installer_Header_Installing", + { + { ELanguage::English, "INSTALLING" }, + { ELanguage::Spanish, "INSTALANDO" }, + } + }, + { + "Installer_Page_SelectLanguage", + { + { ELanguage::English, "Please select a language." } + } + }, + { + "Installer_Page_Introduction", + { + { ELanguage::English, "Welcome to Unleashed Recompiled!\n\nYou'll need an Xbox 360 copy\nof Sonic Unleashed in order to proceed with the installation." } + } + }, + { + "Installer_Page_SelectGameAndUpdate", + { + { ELanguage::English, "Add the files for the game and its title update. You can use digital dumps or pre-extracted folders containing the necessary files." } + } + }, + { + "Installer_Page_SelectDLC", + { + { ELanguage::English, "Add the files for the DLC. You can use digital dumps or pre-extracted folders containing the necessary files." } + } + }, + { + "Installer_Page_CheckSpace", + { + { ELanguage::English, "The content will be installed to the program's folder. Please confirm you have enough free space.\n\n" } + } + }, + { + "Installer_Page_Installing", + { + { ELanguage::English, "Please wait while the content is being installed..." } + } + }, + { + "Installer_Page_InstallSucceeded", + { + { ELanguage::English, "Installation complete.\n\nThis project is brought to you by:\n\n" } + } + }, + { + "Installer_Page_InstallFailed", + { + { ELanguage::English, "Installation failed.\n\nError:\n\n" } + } + }, + { + "Installer_Step_Game", + { + { ELanguage::English, "GAME" } + } + }, + { + "Installer_Step_Update", + { + { ELanguage::English, "UPDATE" } + } + }, + { + "Installer_Step_RequiredSpace", + { + { ELanguage::English, "Required space: %2.2f GiB" } + } + }, + { + "Installer_Step_AvailableSpace", + { + { ELanguage::English, "Available space: %2.2f GiB" } + } + }, + { + "Installer_Button_Next", + { + { ELanguage::English, "NEXT" }, + { ELanguage::Spanish, "SIGUIENTE" }, + { ELanguage::German, "WEITER" }, + } + }, + { + "Installer_Button_Skip", + { + { ELanguage::English, "SKIP" }, + { ELanguage::Spanish, "SALTAR" }, + { ELanguage::German, "ÜBERSPRINGEN" }, + } + }, + { + "Installer_Button_AddFiles", + { + { ELanguage::English, "ADD FILES" }, + { ELanguage::Spanish, "AÑADIR ARCHIVOS" }, + { ELanguage::German, "DATEIEN HINZUFÜGEN" }, + } + }, + { + "Installer_Button_AddFolder", + { + { ELanguage::English, "ADD FOLDER" }, + { ELanguage::Spanish, "AÑADIR CARPETA" }, + { ELanguage::German, "ORDNER HINZUFÜGEN" }, + } + }, + { + "Installer_Message_InvalidFilesList", + { + { ELanguage::English, "The following selected files are invalid:" } + } + }, + { + "Installer_Message_InvalidFiles", + { + { ELanguage::English, "Some of the files that have\nbeen provided are not valid.\n\nPlease make sure all the\nspecified files are correct\nand try again." } + } + }, + { + "Installer_Message_IncompatibleGameData", + { + { ELanguage::English, "The specified game and\nupdate file are incompatible.\n\nPlease ensure the files are\nfor the same version and\nregion and try again." } + } + }, + { + "Installer_Message_DLCWarning", + { + { ELanguage::English, "It is highly recommended\nthat you install all of the\nDLC, as it includes high\nquality lighting textures\nfor the base game.\n\nAre you sure you want to\nskip this step?" } + } + }, + { + "Installer_Message_TitleMissingDLC", + { + { ELanguage::English, "This will restart the game to\nallow you to install any DLC\nthat you are missing.\n\nInstalling DLC will improve the\nlighting quality across the game.\n\nWould you like to install missing\ncontent?" } + } + }, + { + "Installer_Message_Title", + { + { ELanguage::English, "This restarts the game to\nallow you to install any DLC\nthat you may be missing.\n\nYou are not currently\nmissing any DLC.\n\nWould you like to proceed\nanyway?" } + } + }, + { + "Title_Message_Quit", + { + { ELanguage::English, "Are you sure you want to quit?" } + } + }, + { + "Common_On", + { + { ELanguage::English, "ON" }, + { ELanguage::Japanese, "オン" }, + { ELanguage::German, "EIN" }, + { ELanguage::French, "OUI" }, + { ELanguage::Spanish, "SÍ" }, + { ELanguage::Italian, "SÌ" } + } + }, + { + "Common_Off", + { + { ELanguage::English, "OFF" }, + { ELanguage::Japanese, "オフ" }, + { ELanguage::German, "AUS" }, + { ELanguage::French, "NON" }, + { ELanguage::Spanish, "NO" }, + { ELanguage::Italian, "NO" } + } + }, + { + "Common_Yes", + { + { ELanguage::English, "Yes" } + } + }, + { + "Common_No", + { + { ELanguage::English, "No" } + } + }, + { + "Common_Next", + { + { ELanguage::English, "Next" } + } + }, + { + "Common_Select", + { + { ELanguage::English, "Select" } + } + }, + { + "Common_Back", + { + { ELanguage::English, "Back" } + } + }, + { + "Common_Reset", + { + { ELanguage::English, "Reset" } + } + }, + { + "Common_Switch", + { + { ELanguage::English, "Switch" } + } + } +}; + +std::string& Localise(const char* key) +{ + if (!g_locale.count(key)) + return g_localeMissing; + + if (!g_locale[key].count(Config::Language)) + { + if (g_locale[key].count(ELanguage::English)) + { + return g_locale[key][ELanguage::English]; + } + else + { + return g_localeMissing; + } + } + + return g_locale[key][Config::Language]; +} diff --git a/UnleashedRecomp/locale/locale.h b/UnleashedRecomp/locale/locale.h index aeceb6f..0c0986a 100644 --- a/UnleashedRecomp/locale/locale.h +++ b/UnleashedRecomp/locale/locale.h @@ -4,312 +4,6 @@ inline std::string g_localeMissing = ""; -inline std::unordered_map> g_locale -{ - { - "Options_Category_System", - { - { ELanguage::English, "SYSTEM" } - } - }, - { - "Options_Category_Input", - { - { ELanguage::English, "INPUT" } - } - }, - { - "Options_Category_Audio", - { - { ELanguage::English, "AUDIO" } - } - }, - { - "Options_Category_Video", - { - { ELanguage::English, "VIDEO" } - } - }, - { - "Options_Value_Max", - { - { ELanguage::English, "MAX" } - } - }, - { - "Options_Name_WindowSize", - { - { ELanguage::English, "Window Size" } - } - }, - { - "Options_Desc_WindowSize", - { - { ELanguage::English, "Adjust the size of the game window in windowed mode." } - } - }, - { - "Options_Desc_NotAvailable", - { - { ELanguage::English, "This option is not available at this location." } - } - }, - { - "Options_Desc_NotAvailableMSAA", - { - { ELanguage::English, "This option is not available without MSAA." } - } - }, - { - "Options_Desc_OSNotSupported", - { - { ELanguage::English, "This option is not supported by your operating system." } - } - }, - { - "Options_Message_Restart", - { - { ELanguage::English, "The game will now restart." } - } - }, - { - "Achievements_Name", - { - { ELanguage::English, "Achievements" } - } - }, - { - "Achievements_Name_Uppercase", - { - { ELanguage::English, "ACHIEVEMENTS" } - } - }, - { - "Achievements_Unlock", - { - { ELanguage::English, "Achievement Unlocked!" } - } - }, - { - "Installer_Header_Installer", - { - { ELanguage::English, "INSTALLER" }, - { ELanguage::Spanish, "INSTALADOR" }, - }, - }, - { - "Installer_Header_Installing", - { - { ELanguage::English, "INSTALLING" }, - { ELanguage::Spanish, "INSTALANDO" }, - } - }, - { - "Installer_Page_SelectLanguage", - { - { ELanguage::English, "Please select a language." } - } - }, - { - "Installer_Page_Introduction", - { - { ELanguage::English, "Welcome to Unleashed Recompiled!\n\nYou'll need an Xbox 360 copy\nof Sonic Unleashed in order to proceed with the installation." } - } - }, - { - "Installer_Page_SelectGameAndUpdate", - { - { ELanguage::English, "Add the files for the game and its title update. You can use digital dumps or pre-extracted folders containing the necessary files." } - } - }, - { - "Installer_Page_SelectDLC", - { - { ELanguage::English, "Add the files for the DLC. You can use digital dumps or pre-extracted folders containing the necessary files." } - } - }, - { - "Installer_Page_CheckSpace", - { - { ELanguage::English, "The content will be installed to the program's folder. Please confirm you have enough free space.\n\n" } - } - }, - { - "Installer_Page_Installing", - { - { ELanguage::English, "Please wait while the content is being installed..." } - } - }, - { - "Installer_Page_InstallSucceeded", - { - { ELanguage::English, "Installation complete.\n\nThis project is brought to you by:\n\n" } - } - }, - { - "Installer_Page_InstallFailed", - { - { ELanguage::English, "Installation failed.\n\nError:\n\n" } - } - }, - { - "Installer_Step_Game", - { - { ELanguage::English, "GAME" } - } - }, - { - "Installer_Step_Update", - { - { ELanguage::English, "UPDATE" } - } - }, - { - "Installer_Step_RequiredSpace", - { - { ELanguage::English, "Required space: %2.2f GiB" } - } - }, - { - "Installer_Step_AvailableSpace", - { - { ELanguage::English, "Available space: %2.2f GiB" } - } - }, - { - "Installer_Button_Next", - { - { ELanguage::English, "NEXT" }, - { ELanguage::Spanish, "SIGUIENTE" }, - { ELanguage::German, "WEITER" }, - } - }, - { - "Installer_Button_Skip", - { - { ELanguage::English, "SKIP" }, - { ELanguage::Spanish, "SALTAR" }, - { ELanguage::German, "ÜBERSPRINGEN" }, - } - }, - { - "Installer_Button_AddFiles", - { - { ELanguage::English, "ADD FILES" }, - { ELanguage::Spanish, "AÑADIR ARCHIVOS" }, - { ELanguage::German, "DATEIEN HINZUFÜGEN" }, - } - }, - { - "Installer_Button_AddFolder", - { - { ELanguage::English, "ADD FOLDER" }, - { ELanguage::Spanish, "AÑADIR CARPETA" }, - { ELanguage::German, "ORDNER HINZUFÜGEN" }, - } - }, - { - "Installer_Message_InvalidFilesList", - { - { ELanguage::English, "The following selected files are invalid:" } - } - }, - { - "Installer_Message_InvalidFiles", - { - { ELanguage::English, "Some of the files that have\nbeen provided are not valid.\n\nPlease make sure all the\nspecified files are correct\nand try again." } - } - }, - { - "Installer_Message_IncompatibleGameData", - { - { ELanguage::English, "The specified game and\nupdate file are incompatible.\n\nPlease ensure the files are\nfor the same version and\nregion and try again." } - } - }, - { - "Installer_Message_DLCWarning", - { - { ELanguage::English, "It is highly recommended\nthat you install all of the\nDLC, as it includes high\nquality lighting textures\nfor the base game.\n\nAre you sure you want to\nskip this step?" } - } - }, - { - "Installer_Message_TitleMissingDLC", - { - { ELanguage::English, "This will restart the game to\nallow you to install any DLC\nthat you are missing.\n\nInstalling DLC will improve the\nlighting quality across the game.\n\nWould you like to install missing\ncontent?" } - } - }, - { - "Installer_Message_Title", - { - { ELanguage::English, "This restarts the game to\nallow you to install any DLC\nthat you may be missing.\n\nYou are not currently\nmissing any DLC.\n\nWould you like to proceed\nanyway?" } - } - }, - { - "Title_Message_Quit", - { - { ELanguage::English, "Are you sure you want to quit?" } - } - }, - { - "Common_Yes", - { - { ELanguage::English, "Yes" } - } - }, - { - "Common_No", - { - { ELanguage::English, "No" } - } - }, - { - "Common_Next", - { - { ELanguage::English, "Next" } - } - }, - { - "Common_Select", - { - { ELanguage::English, "Select" } - } - }, - { - "Common_Back", - { - { ELanguage::English, "Back" } - } - }, - { - "Common_Reset", - { - { ELanguage::English, "Reset" } - } - }, - { - "Common_Switch", - { - { ELanguage::English, "Switch" } - } - } -}; +extern std::unordered_map> g_locale; -inline std::string& Localise(const char* key) -{ - if (!g_locale.count(key)) - return g_localeMissing; - - if (!g_locale[key].count(Config::Language)) - { - if (g_locale[key].count(ELanguage::English)) - { - return g_locale[key][ELanguage::English]; - } - else - { - return g_localeMissing; - } - } - - return g_locale[key][Config::Language]; -} +std::string& Localise(const char* key); diff --git a/UnleashedRecomp/user/config.h b/UnleashedRecomp/user/config.h index 5e14580..c85235e 100644 --- a/UnleashedRecomp/user/config.h +++ b/UnleashedRecomp/user/config.h @@ -1,7 +1,6 @@ #pragma once #include -#include #include #include diff --git a/UnleashedRecomp/user/config_detail.cpp b/UnleashedRecomp/user/config_detail.cpp index 3149225..dc4cfb4 100644 --- a/UnleashedRecomp/user/config_detail.cpp +++ b/UnleashedRecomp/user/config_detail.cpp @@ -1,5 +1,6 @@ #include "config.h" #include "config_detail.h" +#include // CONFIG_DEFINE template @@ -100,7 +101,9 @@ std::string ConfigDef::GetValueLocalised() const } else if constexpr (std::is_same_v) { - locale = &g_bool_locale; + return Value + ? Localise("Common_On") + : Localise("Common_Off"); } if (!locale) @@ -138,7 +141,7 @@ std::string ConfigDef::GetValueDescription() const } else if constexpr (std::is_same_v) { - locale = &g_bool_locale; + return ""; } if (!locale) diff --git a/UnleashedRecomp/user/config_detail.h b/UnleashedRecomp/user/config_detail.h index 5133cca..25ecf15 100644 --- a/UnleashedRecomp/user/config_detail.h +++ b/UnleashedRecomp/user/config_detail.h @@ -1,26 +1,30 @@ #pragma once +#define CONFIG_LOCALE std::unordered_map> +#define CONFIG_ENUM_LOCALE(type) std::unordered_map>> + #define CONFIG_DEFINE(section, type, name, defaultValue) \ static inline ConfigDef name{section, #name, defaultValue}; #define CONFIG_DEFINE_LOCALISED(section, type, name, defaultValue) \ + static CONFIG_LOCALE g_##name##_locale; \ static inline ConfigDef name{section, #name, &g_##name##_locale, defaultValue}; #define CONFIG_DEFINE_ENUM(section, type, name, defaultValue) \ static inline ConfigDef name{section, #name, defaultValue, &g_##type##_template}; #define CONFIG_DEFINE_ENUM_LOCALISED(section, type, name, defaultValue) \ + static CONFIG_LOCALE g_##name##_locale; \ + static CONFIG_ENUM_LOCALE(type) g_##type##_locale; \ static inline ConfigDef name{section, #name, &g_##name##_locale, defaultValue, &g_##type##_template, &g_##type##_locale}; #define CONFIG_DEFINE_CALLBACK(section, type, name, defaultValue, readCallback) \ + static CONFIG_LOCALE g_##name##_locale; \ static inline ConfigDef name{section, #name, defaultValue, [](ConfigDef* def) readCallback}; #define CONFIG_DEFINE_ENUM_TEMPLATE(type) \ inline std::unordered_map g_##type##_template = -#define CONFIG_LOCALE std::unordered_map> -#define CONFIG_ENUM_LOCALE(type) std::unordered_map>> - #define WINDOWPOS_CENTRED 0x2FFF0000 enum class ELanguage : uint32_t