diff --git a/resource.xrs b/resource.xrs new file mode 100644 index 00000000..94a53b8c Binary files /dev/null and b/resource.xrs differ 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 + +