From 27acf80b80e394231246bd243f580199a555ebbe Mon Sep 17 00:00:00 2001 From: Andy Vandijck Date: Sun, 27 Jul 2025 13:27:09 +0200 Subject: [PATCH] Make language configurable (requires restart) Make language configurable (requires restart) --- resource.xrs | Bin 0 -> 3898 bytes src/wx/cmdevents.cpp | 504 +++++++++++++++++++++ src/wx/config/internal/option-internal.cpp | 3 + src/wx/config/option-id.h | 1 + src/wx/config/option-proxy.h | 1 + src/wx/guiinit.cpp | 36 ++ src/wx/opts.h | 2 + src/wx/wxvbam.cpp | 47 +- src/wx/wxvbam.h | 2 + src/wx/xrc/MainMenu.xrc | 147 ++++++ 10 files changed, 738 insertions(+), 5 deletions(-) create mode 100644 resource.xrs diff --git a/resource.xrs b/resource.xrs new file mode 100644 index 0000000000000000000000000000000000000000..94a53b8cc543a1a74328389cea69b57d221a45bb GIT binary patch literal 3898 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 literal 0 HcmV?d00001 diff --git a/src/wx/cmdevents.cpp b/src/wx/cmdevents.cpp index 8546b805..420589a0 100644 --- a/src/wx/cmdevents.cpp +++ b/src/wx/cmdevents.cpp @@ -2643,6 +2643,510 @@ EVT_HANDLER(LinkConfigure, "Link options...") #endif } +EVT_HANDLER(Language0, "Default Language") +{ + OPTION(kLocale) = wxLANGUAGE_DEFAULT; + + if (wxvbam_locale != NULL) + wxDELETE(wxvbam_locale); + + wxvbam_locale = new wxLocale; + wxvbam_locale->Init(OPTION(kLocale), wxLOCALE_LOAD_DEFAULT); + wxvbam_locale->AddCatalog("wxvbam", wxLANGUAGE_DEFAULT); + + update_opts(); +} + +EVT_HANDLER(Language1, "Bulgarian") +{ + OPTION(kLocale) = wxLANGUAGE_BULGARIAN; + + if (wxvbam_locale != NULL) + wxDELETE(wxvbam_locale); + + wxvbam_locale = new wxLocale; + wxvbam_locale->Init(OPTION(kLocale), wxLOCALE_LOAD_DEFAULT); + wxvbam_locale->AddCatalog("wxvbam", wxLANGUAGE_BULGARIAN); + + update_opts(); +} + +EVT_HANDLER(Language2, "Breton") +{ + OPTION(kLocale) = wxLANGUAGE_BRETON; + + if (wxvbam_locale != NULL) + wxDELETE(wxvbam_locale); + + wxvbam_locale = new wxLocale; + wxvbam_locale->Init(OPTION(kLocale), wxLOCALE_LOAD_DEFAULT); + wxvbam_locale->AddCatalog("wxvbam", wxLANGUAGE_BRETON); + + update_opts(); +} + +EVT_HANDLER(Language3, "Czech") +{ + OPTION(kLocale) = wxLANGUAGE_CZECH; + + if (wxvbam_locale != NULL) + wxDELETE(wxvbam_locale); + + wxvbam_locale = new wxLocale; + wxvbam_locale->Init(OPTION(kLocale), wxLOCALE_LOAD_DEFAULT); + wxvbam_locale->AddCatalog("wxvbam", wxLANGUAGE_CZECH); + + update_opts(); +} + +EVT_HANDLER(Language4, "German") +{ + OPTION(kLocale) = wxLANGUAGE_GERMAN; + + if (wxvbam_locale != NULL) + wxDELETE(wxvbam_locale); + + wxvbam_locale = new wxLocale; + wxvbam_locale->Init(OPTION(kLocale), wxLOCALE_LOAD_DEFAULT); + wxvbam_locale->AddCatalog("wxvbam", wxLANGUAGE_GERMAN); + + update_opts(); +} + +EVT_HANDLER(Language5, "Greek") +{ + OPTION(kLocale) = wxLANGUAGE_GREEK; + + if (wxvbam_locale != NULL) + wxDELETE(wxvbam_locale); + + wxvbam_locale = new wxLocale; + wxvbam_locale->Init(OPTION(kLocale), wxLOCALE_LOAD_DEFAULT); + wxvbam_locale->AddCatalog("wxvbam", wxLANGUAGE_GREEK); + + update_opts(); +} + +EVT_HANDLER(Language6, "English (US)") +{ + OPTION(kLocale) = wxLANGUAGE_ENGLISH_US; + + if (wxvbam_locale != NULL) + wxDELETE(wxvbam_locale); + + wxvbam_locale = new wxLocale; + wxvbam_locale->Init(OPTION(kLocale), wxLOCALE_LOAD_DEFAULT); + wxvbam_locale->AddCatalog("wxvbam", wxLANGUAGE_ENGLISH_US); + + update_opts(); +} + +EVT_HANDLER(Language7, "Spanish (Latin American)") +{ + OPTION(kLocale) = wxLANGUAGE_SPANISH_LATIN_AMERICA; + + if (wxvbam_locale != NULL) + wxDELETE(wxvbam_locale); + + wxvbam_locale = new wxLocale; + wxvbam_locale->Init(OPTION(kLocale), wxLOCALE_LOAD_DEFAULT); + wxvbam_locale->AddCatalog("wxvbam", wxLANGUAGE_SPANISH_LATIN_AMERICA); + + update_opts(); +} + +EVT_HANDLER(Language8, "Spanish (Colombia)") +{ + OPTION(kLocale) = wxLANGUAGE_SPANISH_COLOMBIA; + + if (wxvbam_locale != NULL) + wxDELETE(wxvbam_locale); + + wxvbam_locale = new wxLocale; + wxvbam_locale->Init(OPTION(kLocale), wxLOCALE_LOAD_DEFAULT); + wxvbam_locale->AddCatalog("wxvbam", wxLANGUAGE_SPANISH_COLOMBIA); + + update_opts(); +} + +EVT_HANDLER(Language9, "Spanish (Peru)") +{ + OPTION(kLocale) = wxLANGUAGE_SPANISH_PERU; + + if (wxvbam_locale != NULL) + wxDELETE(wxvbam_locale); + + wxvbam_locale = new wxLocale; + wxvbam_locale->Init(OPTION(kLocale), wxLOCALE_LOAD_DEFAULT); + wxvbam_locale->AddCatalog("wxvbam", wxLANGUAGE_SPANISH_PERU); + + update_opts(); +} + +EVT_HANDLER(Language10, "Spanish (US)") +{ + OPTION(kLocale) = wxLANGUAGE_SPANISH_US; + + if (wxvbam_locale != NULL) + wxDELETE(wxvbam_locale); + + wxvbam_locale = new wxLocale; + wxvbam_locale->Init(OPTION(kLocale), wxLOCALE_LOAD_DEFAULT); + wxvbam_locale->AddCatalog("wxvbam", wxLANGUAGE_SPANISH_US); + + update_opts(); +} + +EVT_HANDLER(Language11, "Spanish") +{ + OPTION(kLocale) = wxLANGUAGE_SPANISH; + + if (wxvbam_locale != NULL) + wxDELETE(wxvbam_locale); + + wxvbam_locale = new wxLocale; + wxvbam_locale->Init(OPTION(kLocale), wxLOCALE_LOAD_DEFAULT); + wxvbam_locale->AddCatalog("wxvbam", wxLANGUAGE_SPANISH); + + update_opts(); +} + +EVT_HANDLER(Language12, "French (France)") +{ + OPTION(kLocale) = wxLANGUAGE_FRENCH_FRANCE; + + if (wxvbam_locale != NULL) + wxDELETE(wxvbam_locale); + + wxvbam_locale = new wxLocale; + wxvbam_locale->Init(OPTION(kLocale), wxLOCALE_LOAD_DEFAULT); + wxvbam_locale->AddCatalog("wxvbam", wxLANGUAGE_FRENCH_FRANCE); + + update_opts(); +} + +EVT_HANDLER(Language13, "French") +{ + OPTION(kLocale) = wxLANGUAGE_FRENCH; + + if (wxvbam_locale != NULL) + wxDELETE(wxvbam_locale); + + wxvbam_locale = new wxLocale; + wxvbam_locale->Init(OPTION(kLocale), wxLOCALE_LOAD_DEFAULT); + wxvbam_locale->AddCatalog("wxvbam", wxLANGUAGE_FRENCH); + + update_opts(); +} + +EVT_HANDLER(Language14, "Galician") +{ + OPTION(kLocale) = wxLANGUAGE_GALICIAN; + + if (wxvbam_locale != NULL) + wxDELETE(wxvbam_locale); + + wxvbam_locale = new wxLocale; + wxvbam_locale->Init(OPTION(kLocale), wxLOCALE_LOAD_DEFAULT); + wxvbam_locale->AddCatalog("wxvbam", wxLANGUAGE_GALICIAN); + + update_opts(); +} + +EVT_HANDLER(Language15, "Hebrew (Israel)") +{ + OPTION(kLocale) = wxLANGUAGE_HEBREW_ISRAEL; + + if (wxvbam_locale != NULL) + wxDELETE(wxvbam_locale); + + wxvbam_locale = new wxLocale; + wxvbam_locale->Init(OPTION(kLocale), wxLOCALE_LOAD_DEFAULT); + wxvbam_locale->AddCatalog("wxvbam", wxLANGUAGE_HEBREW_ISRAEL); + + update_opts(); +} + +EVT_HANDLER(Language16, "Hungarian (Hungary)") +{ + OPTION(kLocale) = wxLANGUAGE_HUNGARIAN_HUNGARY; + + if (wxvbam_locale != NULL) + wxDELETE(wxvbam_locale); + + wxvbam_locale = new wxLocale; + wxvbam_locale->Init(OPTION(kLocale), wxLOCALE_LOAD_DEFAULT); + wxvbam_locale->AddCatalog("wxvbam", wxLANGUAGE_HUNGARIAN_HUNGARY); + + update_opts(); +} + +EVT_HANDLER(Language17, "Hungarian") +{ + OPTION(kLocale) = wxLANGUAGE_HUNGARIAN; + + if (wxvbam_locale != NULL) + wxDELETE(wxvbam_locale); + + wxvbam_locale = new wxLocale; + wxvbam_locale->Init(OPTION(kLocale), wxLOCALE_LOAD_DEFAULT); + wxvbam_locale->AddCatalog("wxvbam", wxLANGUAGE_HUNGARIAN); + + update_opts(); +} + +EVT_HANDLER(Language18, "Indonesian") +{ + OPTION(kLocale) = wxLANGUAGE_INDONESIAN; + + if (wxvbam_locale != NULL) + wxDELETE(wxvbam_locale); + + wxvbam_locale = new wxLocale; + wxvbam_locale->Init(OPTION(kLocale), wxLOCALE_LOAD_DEFAULT); + wxvbam_locale->AddCatalog("wxvbam", wxLANGUAGE_INDONESIAN); + + update_opts(); +} + +EVT_HANDLER(Language19, "Italian") +{ + OPTION(kLocale) = wxLANGUAGE_ITALIAN_ITALY; + + if (wxvbam_locale != NULL) + wxDELETE(wxvbam_locale); + + wxvbam_locale = new wxLocale; + wxvbam_locale->Init(OPTION(kLocale), wxLOCALE_LOAD_DEFAULT); + wxvbam_locale->AddCatalog("wxvbam", wxLANGUAGE_ITALIAN_ITALY); + + update_opts(); +} + +EVT_HANDLER(Language20, "Japanese") +{ + OPTION(kLocale) = wxLANGUAGE_JAPANESE; + + if (wxvbam_locale != NULL) + wxDELETE(wxvbam_locale); + + wxvbam_locale = new wxLocale; + wxvbam_locale->Init(OPTION(kLocale), wxLOCALE_LOAD_DEFAULT); + wxvbam_locale->AddCatalog("wxvbam", wxLANGUAGE_JAPANESE); + + update_opts(); +} + +EVT_HANDLER(Language21, "Korean (Korea)") +{ + OPTION(kLocale) = wxLANGUAGE_KOREAN_KOREA; + + if (wxvbam_locale != NULL) + wxDELETE(wxvbam_locale); + + wxvbam_locale = new wxLocale; + wxvbam_locale->Init(OPTION(kLocale), wxLOCALE_LOAD_DEFAULT); + wxvbam_locale->AddCatalog("wxvbam", wxLANGUAGE_KOREAN_KOREA); + + update_opts(); +} + +EVT_HANDLER(Language22, "Korean") +{ + OPTION(kLocale) = wxLANGUAGE_KOREAN; + + if (wxvbam_locale != NULL) + wxDELETE(wxvbam_locale); + + wxvbam_locale = new wxLocale; + wxvbam_locale->Init(OPTION(kLocale), wxLOCALE_LOAD_DEFAULT); + wxvbam_locale->AddCatalog("wxvbam", wxLANGUAGE_KOREAN); + + update_opts(); +} + +EVT_HANDLER(Language23, "Malay (Malaysia)") +{ + OPTION(kLocale) = wxLANGUAGE_MALAY_MALAYSIA; + + if (wxvbam_locale != NULL) + wxDELETE(wxvbam_locale); + + wxvbam_locale = new wxLocale; + wxvbam_locale->Init(OPTION(kLocale), wxLOCALE_LOAD_DEFAULT); + wxvbam_locale->AddCatalog("wxvbam", wxLANGUAGE_MALAY_MALAYSIA); + + update_opts(); +} + +EVT_HANDLER(Language24, "Norwegian") +{ + OPTION(kLocale) = wxLANGUAGE_NORWEGIAN; + + if (wxvbam_locale != NULL) + wxDELETE(wxvbam_locale); + + wxvbam_locale = new wxLocale; + wxvbam_locale->Init(OPTION(kLocale), wxLOCALE_LOAD_DEFAULT); + wxvbam_locale->AddCatalog("wxvbam", wxLANGUAGE_NORWEGIAN); + + update_opts(); +} + +EVT_HANDLER(Language25, "Dutch") +{ + OPTION(kLocale) = wxLANGUAGE_DUTCH; + + if (wxvbam_locale != NULL) + wxDELETE(wxvbam_locale); + + wxvbam_locale = new wxLocale; + wxvbam_locale->Init(OPTION(kLocale), wxLOCALE_LOAD_DEFAULT); + wxvbam_locale->AddCatalog("wxvbam", wxLANGUAGE_DUTCH); + + update_opts(); +} + +EVT_HANDLER(Language26, "Polish (Poland)") +{ + OPTION(kLocale) = wxLANGUAGE_POLISH_POLAND; + + if (wxvbam_locale != NULL) + wxDELETE(wxvbam_locale); + + wxvbam_locale = new wxLocale; + wxvbam_locale->Init(OPTION(kLocale), wxLOCALE_LOAD_DEFAULT); + wxvbam_locale->AddCatalog("wxvbam", wxLANGUAGE_POLISH_POLAND); + + update_opts(); +} + +EVT_HANDLER(Language27, "Polish") +{ + OPTION(kLocale) = wxLANGUAGE_POLISH; + + if (wxvbam_locale != NULL) + wxDELETE(wxvbam_locale); + + wxvbam_locale = new wxLocale; + wxvbam_locale->Init(OPTION(kLocale), wxLOCALE_LOAD_DEFAULT); + wxvbam_locale->AddCatalog("wxvbam", wxLANGUAGE_POLISH); + + update_opts(); +} + +EVT_HANDLER(Language28, "Portuguese (Brazil)") +{ + OPTION(kLocale) = wxLANGUAGE_PORTUGUESE_BRAZILIAN; + + if (wxvbam_locale != NULL) + wxDELETE(wxvbam_locale); + + wxvbam_locale = new wxLocale; + wxvbam_locale->Init(OPTION(kLocale), wxLOCALE_LOAD_DEFAULT); + wxvbam_locale->AddCatalog("wxvbam", wxLANGUAGE_PORTUGUESE_BRAZILIAN); + + update_opts(); +} + +EVT_HANDLER(Language29, "Portuguese (Portugal)") +{ + OPTION(kLocale) = wxLANGUAGE_PORTUGUESE_PORTUGAL; + + if (wxvbam_locale != NULL) + wxDELETE(wxvbam_locale); + + wxvbam_locale = new wxLocale; + wxvbam_locale->Init(OPTION(kLocale), wxLOCALE_LOAD_DEFAULT); + wxvbam_locale->AddCatalog("wxvbam", wxLANGUAGE_PORTUGUESE_PORTUGAL); + + update_opts(); +} + +EVT_HANDLER(Language30, "Russian (Russia)") +{ + OPTION(kLocale) = wxLANGUAGE_RUSSIAN_RUSSIA; + + if (wxvbam_locale != NULL) + wxDELETE(wxvbam_locale); + + wxvbam_locale = new wxLocale; + wxvbam_locale->Init(OPTION(kLocale), wxLOCALE_LOAD_DEFAULT); + wxvbam_locale->AddCatalog("wxvbam", wxLANGUAGE_RUSSIAN_RUSSIA); + + update_opts(); +} + +EVT_HANDLER(Language31, "Swedish") +{ + OPTION(kLocale) = wxLANGUAGE_SWEDISH; + + if (wxvbam_locale != NULL) + wxDELETE(wxvbam_locale); + + wxvbam_locale = new wxLocale; + wxvbam_locale->Init(OPTION(kLocale), wxLOCALE_LOAD_DEFAULT); + wxvbam_locale->AddCatalog("wxvbam", wxLANGUAGE_SWEDISH); + + update_opts(); +} + +EVT_HANDLER(Language32, "Turkish") +{ + OPTION(kLocale) = wxLANGUAGE_TURKISH; + + if (wxvbam_locale != NULL) + wxDELETE(wxvbam_locale); + + wxvbam_locale = new wxLocale; + wxvbam_locale->Init(OPTION(kLocale), wxLOCALE_LOAD_DEFAULT); + wxvbam_locale->AddCatalog("wxvbam", wxLANGUAGE_TURKISH); + + update_opts(); +} + +EVT_HANDLER(Language33, "Ukrainian") +{ + OPTION(kLocale) = wxLANGUAGE_UKRAINIAN; + + if (wxvbam_locale != NULL) + wxDELETE(wxvbam_locale); + + wxvbam_locale = new wxLocale; + wxvbam_locale->Init(OPTION(kLocale), wxLOCALE_LOAD_DEFAULT); + wxvbam_locale->AddCatalog("wxvbam", wxLANGUAGE_UKRAINIAN); + + update_opts(); +} + +EVT_HANDLER(Language34, "Urdu (Pakistan)") +{ + OPTION(kLocale) = wxLANGUAGE_URDU_PAKISTAN; + + if (wxvbam_locale != NULL) + wxDELETE(wxvbam_locale); + + wxvbam_locale = new wxLocale; + wxvbam_locale->Init(OPTION(kLocale), wxLOCALE_LOAD_DEFAULT); + wxvbam_locale->AddCatalog("wxvbam", wxLANGUAGE_URDU_PAKISTAN); + + update_opts(); +} + +EVT_HANDLER(Language35, "Chinese (China)") +{ + OPTION(kLocale) = wxLANGUAGE_CHINESE_CHINA; + + if (wxvbam_locale != NULL) + wxDELETE(wxvbam_locale); + + wxvbam_locale = new wxLocale; + wxvbam_locale->Init(OPTION(kLocale), wxLOCALE_LOAD_DEFAULT); + wxvbam_locale->AddCatalog("wxvbam", wxLANGUAGE_CHINESE_CHINA); + + update_opts(); +} + // Dummy for disabling system key bindings EVT_HANDLER_MASK(NOOP, "Do nothing", CMDEN_NEVER) { diff --git a/src/wx/config/internal/option-internal.cpp b/src/wx/config/internal/option-internal.cpp index 1ab15218..c640b83a 100644 --- a/src/wx/config/internal/option-internal.cpp +++ b/src/wx/config/internal/option-internal.cpp @@ -252,6 +252,7 @@ std::array& Option::All() { int32_t volume = 100; uint32_t bitdepth = 3; wxString sdlrenderer = wxString("default"); + int locale = wxLANGUAGE_DEFAULT; }; static OwnedOptions g_owned_opts; @@ -393,6 +394,7 @@ std::array& Option::All() { Option(OptionID::kSoundDSoundHWAccel, &g_owned_opts.dsound_hw_accel), Option(OptionID::kSoundUpmix, &g_owned_opts.upmix), Option(OptionID::kSoundVolume, &g_owned_opts.volume, 0, 200), + Option(OptionID::kLocale, &g_owned_opts.locale, 0, 911), }; // clang-format on return g_all_opts; @@ -602,6 +604,7 @@ const std::array kAllOptionsData = { OptionData{"Sound/DSoundHWAccel", "DSoundHWAccel", _("Use DirectSound hardware acceleration")}, OptionData{"Sound/Upmix", "Upmix", _("Upmix stereo to surround")}, OptionData{"Sound/Volume", "", _("Sound volume (%)")}, + OptionData{"Language/Locale", _("Language")}, // Last. This should never be used, it actually maps to OptionID::kLast. // This is to prevent a memory access violation error in case something diff --git a/src/wx/config/option-id.h b/src/wx/config/option-id.h index 95360627..5f030811 100644 --- a/src/wx/config/option-id.h +++ b/src/wx/config/option-id.h @@ -137,6 +137,7 @@ enum class OptionID { kSoundDSoundHWAccel, kSoundUpmix, kSoundVolume, + kLocale, // Do not add anything under here. Last, diff --git a/src/wx/config/option-proxy.h b/src/wx/config/option-proxy.h index 74e3b706..e1a0fea9 100644 --- a/src/wx/config/option-proxy.h +++ b/src/wx/config/option-proxy.h @@ -141,6 +141,7 @@ static constexpr std::array kOptionsTypes = { /*kSoundDSoundHWAccel*/ Option::Type::kBool, /*kSoundUpmix*/ Option::Type::kBool, /*kSoundVolume*/ Option::Type::kInt, + /*kLocale*/ Option::Type::kInt, }; // Less verbose accessor for a specific OptionID with compile-time type checks. diff --git a/src/wx/guiinit.cpp b/src/wx/guiinit.cpp index 0d40b008..20db0f1f 100644 --- a/src/wx/guiinit.cpp +++ b/src/wx/guiinit.cpp @@ -1922,6 +1922,42 @@ bool MainFrame::BindControls() MenuOptionIntRadioValue("LinkType2Wireless", gopts.gba_link_type, 2); MenuOptionIntRadioValue("LinkType3GameCube", gopts.gba_link_type, 3); MenuOptionIntRadioValue("LinkType4Gameboy", gopts.gba_link_type, 4); + MenuOptionIntRadioValue("Language0", gopts.locale, wxLANGUAGE_DEFAULT); + MenuOptionIntRadioValue("Language1", gopts.locale, wxLANGUAGE_BULGARIAN); + MenuOptionIntRadioValue("Language2", gopts.locale, wxLANGUAGE_BRETON); + MenuOptionIntRadioValue("Language3", gopts.locale, wxLANGUAGE_CZECH); + MenuOptionIntRadioValue("Language4", gopts.locale, wxLANGUAGE_GERMAN); + MenuOptionIntRadioValue("Language5", gopts.locale, wxLANGUAGE_GREEK); + MenuOptionIntRadioValue("Language6", gopts.locale, wxLANGUAGE_ENGLISH_US); + MenuOptionIntRadioValue("Language7", gopts.locale, wxLANGUAGE_SPANISH_LATIN_AMERICA); + MenuOptionIntRadioValue("Language8", gopts.locale, wxLANGUAGE_SPANISH_COLOMBIA); + MenuOptionIntRadioValue("Language9", gopts.locale, wxLANGUAGE_SPANISH_PERU); + MenuOptionIntRadioValue("Language10", gopts.locale, wxLANGUAGE_SPANISH_US); + MenuOptionIntRadioValue("Language11", gopts.locale, wxLANGUAGE_SPANISH); + MenuOptionIntRadioValue("Language12", gopts.locale, wxLANGUAGE_FRENCH_FRANCE); + MenuOptionIntRadioValue("Language13", gopts.locale, wxLANGUAGE_FRENCH); + MenuOptionIntRadioValue("Language14", gopts.locale, wxLANGUAGE_GALICIAN); + MenuOptionIntRadioValue("Language15", gopts.locale, wxLANGUAGE_HEBREW_ISRAEL); + MenuOptionIntRadioValue("Language16", gopts.locale, wxLANGUAGE_HUNGARIAN_HUNGARY); + MenuOptionIntRadioValue("Language17", gopts.locale, wxLANGUAGE_HUNGARIAN); + MenuOptionIntRadioValue("Language18", gopts.locale, wxLANGUAGE_INDONESIAN); + MenuOptionIntRadioValue("Language19", gopts.locale, wxLANGUAGE_ITALIAN_ITALY); + MenuOptionIntRadioValue("Language20", gopts.locale, wxLANGUAGE_JAPANESE); + MenuOptionIntRadioValue("Language21", gopts.locale, wxLANGUAGE_KOREAN_KOREA); + MenuOptionIntRadioValue("Language22", gopts.locale, wxLANGUAGE_KOREAN); + MenuOptionIntRadioValue("Language23", gopts.locale, wxLANGUAGE_MALAY_MALAYSIA); + MenuOptionIntRadioValue("Language24", gopts.locale, wxLANGUAGE_NORWEGIAN); + MenuOptionIntRadioValue("Language25", gopts.locale, wxLANGUAGE_DUTCH); + MenuOptionIntRadioValue("Language26", gopts.locale, wxLANGUAGE_POLISH_POLAND); + MenuOptionIntRadioValue("Language27", gopts.locale, wxLANGUAGE_POLISH); + MenuOptionIntRadioValue("Language28", gopts.locale, wxLANGUAGE_PORTUGUESE_BRAZILIAN); + MenuOptionIntRadioValue("Language29", gopts.locale, wxLANGUAGE_PORTUGUESE_PORTUGAL); + MenuOptionIntRadioValue("Language30", gopts.locale, wxLANGUAGE_RUSSIAN_RUSSIA); + MenuOptionIntRadioValue("Language31", gopts.locale, wxLANGUAGE_SWEDISH); + MenuOptionIntRadioValue("Language32", gopts.locale, wxLANGUAGE_TURKISH); + MenuOptionIntRadioValue("Language33", gopts.locale, wxLANGUAGE_UKRAINIAN); + MenuOptionIntRadioValue("Language34", gopts.locale, wxLANGUAGE_URDU_PAKISTAN); + MenuOptionIntRadioValue("Language35", gopts.locale, wxLANGUAGE_CHINESE_CHINA); } for (size_t i = 0; i < checkable_mi.size(); i++) { diff --git a/src/wx/opts.h b/src/wx/opts.h index cdbebec5..0a480c3d 100644 --- a/src/wx/opts.h +++ b/src/wx/opts.h @@ -45,6 +45,8 @@ extern struct opts_t { bool hide_menu_bar = true; bool suspend_screensaver = false; + int locale = 0; + /// wxWindows // wxWidgets-generated options (opaque) } gopts; diff --git a/src/wx/wxvbam.cpp b/src/wx/wxvbam.cpp index 7eafa65b..e625ddd3 100644 --- a/src/wx/wxvbam.cpp +++ b/src/wx/wxvbam.cpp @@ -223,7 +223,7 @@ static void get_config_path(wxPathList& path, bool exists = true) if (!debug_dumped) { wxLogDebug(wxT("GetUserLocalDataDir(): %s"), stdp.GetUserLocalDataDir().c_str()); wxLogDebug(wxT("GetUserDataDir(): %s"), stdp.GetUserDataDir().c_str()); - wxLogDebug(wxT("GetLocalizedResourcesDir(wxGetApp().locale.GetCanonicalName()): %s"), stdp.GetLocalizedResourcesDir(wxGetApp().locale.GetCanonicalName()).c_str()); + wxLogDebug(wxT("GetLocalizedResourcesDir(wxvbam_locale->GetCanonicalName()): %s"), stdp.GetLocalizedResourcesDir(wxvbam_locale->GetCanonicalName()).c_str()); wxLogDebug(wxT("GetResourcesDir(): %s"), stdp.GetResourcesDir().c_str()); wxLogDebug(wxT("GetDataDir(): %s"), stdp.GetDataDir().c_str()); wxLogDebug(wxT("GetLocalDataDir(): %s"), stdp.GetLocalDataDir().c_str()); @@ -257,7 +257,7 @@ static void get_config_path(wxPathList& path, bool exists = true) // NOTE: this does not support XDG (freedesktop.org) paths add_path(GetUserLocalDataDir()); add_path(GetUserDataDir()); - add_path(GetLocalizedResourcesDir(wxGetApp().locale.GetCanonicalName())); + add_path(GetLocalizedResourcesDir(wxvbam_locale->GetCanonicalName())); add_path(GetResourcesDir()); add_path(GetDataDir()); add_path(GetLocalDataDir()); @@ -352,6 +352,9 @@ wxString wxvbamApp::GetAbsolutePath(wxString path) return path; } +int language = wxLANGUAGE_DEFAULT; +wxLocale *wxvbam_locale = NULL; + bool wxvbamApp::OnInit() { using_wayland = IsWayland(); @@ -364,14 +367,25 @@ bool wxvbamApp::OnInit() { #if (wxMAJOR_VERSION >= 3) SetAppDisplayName("VisualBoyAdvance-M"); #endif - // load system default locale, if available - locale.Init(); + + wxvbam_locale = new wxLocale; + + language = OPTION(kLocale); + + if (language != wxLANGUAGE_DEFAULT) { + wxvbam_locale->Init(language, wxLOCALE_LOAD_DEFAULT); + } else { + wxvbam_locale->Init(); + } + + // load selected language #ifdef _WIN32 wxTranslations::Get()->SetLoader(new wxResourceTranslationsLoader); #endif - locale.AddCatalog("wxvbam"); + wxvbam_locale->AddCatalog("wxvbam"); + // make built-in xrc file available // this has to be done before parent OnInit() so xrc dump works wxFileSystem::AddHandler(new wxMemoryFSHandler); @@ -473,6 +487,29 @@ bool wxvbamApp::OnInit() { // Load the default options. load_opts(!config_file_.Exists()); + if (wxvbam_locale) + wxDELETE(wxvbam_locale); + + wxvbam_locale = new wxLocale; + + language = OPTION(kLocale); + + if (language != wxLANGUAGE_DEFAULT) { + wxvbam_locale->Init(language, wxLOCALE_LOAD_DEFAULT); + } else { + wxvbam_locale->Init(); + } + + fprintf(stderr, "Language: %d\n", language); + + // load selected language + +#ifdef _WIN32 + wxTranslations::Get()->SetLoader(new wxResourceTranslationsLoader); +#endif + + wxvbam_locale->AddCatalog("wxvbam"); + // wxGLCanvas segfaults under wayland before wx 3.2 #if defined(HAVE_WAYLAND_SUPPORT) && !defined(HAVE_WAYLAND_EGL) if (UsingWayland()) { diff --git a/src/wx/wxvbam.h b/src/wx/wxvbam.h index e2e1c559..d499a55e 100644 --- a/src/wx/wxvbam.h +++ b/src/wx/wxvbam.h @@ -38,6 +38,8 @@ #include "wx/wxlogdebug.h" #include "wx/compat_generic_file_dialog.h" +extern wxLocale *wxvbam_locale; + template void CheckPointer(T pointer) { diff --git a/src/wx/xrc/MainMenu.xrc b/src/wx/xrc/MainMenu.xrc index 994a8c45..ed6f9e63 100644 --- a/src/wx/xrc/MainMenu.xrc +++ b/src/wx/xrc/MainMenu.xrc @@ -578,6 +578,153 @@ 1 + + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + + + + 1 + +