Make language configurable (requires restart)

Make language configurable (requires restart)
This commit is contained in:
Andy Vandijck 2025-07-27 13:27:09 +02:00
parent ae09ab7189
commit 27acf80b80
10 changed files with 738 additions and 5 deletions

BIN
resource.xrs Normal file

Binary file not shown.

View File

@ -2643,6 +2643,510 @@ EVT_HANDLER(LinkConfigure, "Link options...")
#endif #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 // Dummy for disabling system key bindings
EVT_HANDLER_MASK(NOOP, "Do nothing", CMDEN_NEVER) EVT_HANDLER_MASK(NOOP, "Do nothing", CMDEN_NEVER)
{ {

View File

@ -252,6 +252,7 @@ std::array<Option, kNbOptions>& Option::All() {
int32_t volume = 100; int32_t volume = 100;
uint32_t bitdepth = 3; uint32_t bitdepth = 3;
wxString sdlrenderer = wxString("default"); wxString sdlrenderer = wxString("default");
int locale = wxLANGUAGE_DEFAULT;
}; };
static OwnedOptions g_owned_opts; static OwnedOptions g_owned_opts;
@ -393,6 +394,7 @@ std::array<Option, kNbOptions>& Option::All() {
Option(OptionID::kSoundDSoundHWAccel, &g_owned_opts.dsound_hw_accel), Option(OptionID::kSoundDSoundHWAccel, &g_owned_opts.dsound_hw_accel),
Option(OptionID::kSoundUpmix, &g_owned_opts.upmix), Option(OptionID::kSoundUpmix, &g_owned_opts.upmix),
Option(OptionID::kSoundVolume, &g_owned_opts.volume, 0, 200), Option(OptionID::kSoundVolume, &g_owned_opts.volume, 0, 200),
Option(OptionID::kLocale, &g_owned_opts.locale, 0, 911),
}; };
// clang-format on // clang-format on
return g_all_opts; return g_all_opts;
@ -602,6 +604,7 @@ const std::array<OptionData, kNbOptions + 1> kAllOptionsData = {
OptionData{"Sound/DSoundHWAccel", "DSoundHWAccel", _("Use DirectSound hardware acceleration")}, OptionData{"Sound/DSoundHWAccel", "DSoundHWAccel", _("Use DirectSound hardware acceleration")},
OptionData{"Sound/Upmix", "Upmix", _("Upmix stereo to surround")}, OptionData{"Sound/Upmix", "Upmix", _("Upmix stereo to surround")},
OptionData{"Sound/Volume", "", _("Sound volume (%)")}, OptionData{"Sound/Volume", "", _("Sound volume (%)")},
OptionData{"Language/Locale", _("Language")},
// Last. This should never be used, it actually maps to OptionID::kLast. // Last. This should never be used, it actually maps to OptionID::kLast.
// This is to prevent a memory access violation error in case something // This is to prevent a memory access violation error in case something

View File

@ -137,6 +137,7 @@ enum class OptionID {
kSoundDSoundHWAccel, kSoundDSoundHWAccel,
kSoundUpmix, kSoundUpmix,
kSoundVolume, kSoundVolume,
kLocale,
// Do not add anything under here. // Do not add anything under here.
Last, Last,

View File

@ -141,6 +141,7 @@ static constexpr std::array<Option::Type, kNbOptions> kOptionsTypes = {
/*kSoundDSoundHWAccel*/ Option::Type::kBool, /*kSoundDSoundHWAccel*/ Option::Type::kBool,
/*kSoundUpmix*/ Option::Type::kBool, /*kSoundUpmix*/ Option::Type::kBool,
/*kSoundVolume*/ Option::Type::kInt, /*kSoundVolume*/ Option::Type::kInt,
/*kLocale*/ Option::Type::kInt,
}; };
// Less verbose accessor for a specific OptionID with compile-time type checks. // Less verbose accessor for a specific OptionID with compile-time type checks.

View File

@ -1922,6 +1922,42 @@ bool MainFrame::BindControls()
MenuOptionIntRadioValue("LinkType2Wireless", gopts.gba_link_type, 2); MenuOptionIntRadioValue("LinkType2Wireless", gopts.gba_link_type, 2);
MenuOptionIntRadioValue("LinkType3GameCube", gopts.gba_link_type, 3); MenuOptionIntRadioValue("LinkType3GameCube", gopts.gba_link_type, 3);
MenuOptionIntRadioValue("LinkType4Gameboy", gopts.gba_link_type, 4); 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++) { for (size_t i = 0; i < checkable_mi.size(); i++) {

View File

@ -45,6 +45,8 @@ extern struct opts_t {
bool hide_menu_bar = true; bool hide_menu_bar = true;
bool suspend_screensaver = false; bool suspend_screensaver = false;
int locale = 0;
/// wxWindows /// wxWindows
// wxWidgets-generated options (opaque) // wxWidgets-generated options (opaque)
} gopts; } gopts;

View File

@ -223,7 +223,7 @@ static void get_config_path(wxPathList& path, bool exists = true)
if (!debug_dumped) { if (!debug_dumped) {
wxLogDebug(wxT("GetUserLocalDataDir(): %s"), stdp.GetUserLocalDataDir().c_str()); wxLogDebug(wxT("GetUserLocalDataDir(): %s"), stdp.GetUserLocalDataDir().c_str());
wxLogDebug(wxT("GetUserDataDir(): %s"), stdp.GetUserDataDir().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("GetResourcesDir(): %s"), stdp.GetResourcesDir().c_str());
wxLogDebug(wxT("GetDataDir(): %s"), stdp.GetDataDir().c_str()); wxLogDebug(wxT("GetDataDir(): %s"), stdp.GetDataDir().c_str());
wxLogDebug(wxT("GetLocalDataDir(): %s"), stdp.GetLocalDataDir().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 // NOTE: this does not support XDG (freedesktop.org) paths
add_path(GetUserLocalDataDir()); add_path(GetUserLocalDataDir());
add_path(GetUserDataDir()); add_path(GetUserDataDir());
add_path(GetLocalizedResourcesDir(wxGetApp().locale.GetCanonicalName())); add_path(GetLocalizedResourcesDir(wxvbam_locale->GetCanonicalName()));
add_path(GetResourcesDir()); add_path(GetResourcesDir());
add_path(GetDataDir()); add_path(GetDataDir());
add_path(GetLocalDataDir()); add_path(GetLocalDataDir());
@ -352,6 +352,9 @@ wxString wxvbamApp::GetAbsolutePath(wxString path)
return path; return path;
} }
int language = wxLANGUAGE_DEFAULT;
wxLocale *wxvbam_locale = NULL;
bool wxvbamApp::OnInit() { bool wxvbamApp::OnInit() {
using_wayland = IsWayland(); using_wayland = IsWayland();
@ -364,14 +367,25 @@ bool wxvbamApp::OnInit() {
#if (wxMAJOR_VERSION >= 3) #if (wxMAJOR_VERSION >= 3)
SetAppDisplayName("VisualBoyAdvance-M"); SetAppDisplayName("VisualBoyAdvance-M");
#endif #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 #ifdef _WIN32
wxTranslations::Get()->SetLoader(new wxResourceTranslationsLoader); wxTranslations::Get()->SetLoader(new wxResourceTranslationsLoader);
#endif #endif
locale.AddCatalog("wxvbam"); wxvbam_locale->AddCatalog("wxvbam");
// make built-in xrc file available // make built-in xrc file available
// this has to be done before parent OnInit() so xrc dump works // this has to be done before parent OnInit() so xrc dump works
wxFileSystem::AddHandler(new wxMemoryFSHandler); wxFileSystem::AddHandler(new wxMemoryFSHandler);
@ -473,6 +487,29 @@ bool wxvbamApp::OnInit() {
// Load the default options. // Load the default options.
load_opts(!config_file_.Exists()); 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 // wxGLCanvas segfaults under wayland before wx 3.2
#if defined(HAVE_WAYLAND_SUPPORT) && !defined(HAVE_WAYLAND_EGL) #if defined(HAVE_WAYLAND_SUPPORT) && !defined(HAVE_WAYLAND_EGL)
if (UsingWayland()) { if (UsingWayland()) {

View File

@ -38,6 +38,8 @@
#include "wx/wxlogdebug.h" #include "wx/wxlogdebug.h"
#include "wx/compat_generic_file_dialog.h" #include "wx/compat_generic_file_dialog.h"
extern wxLocale *wxvbam_locale;
template <typename T> template <typename T>
void CheckPointer(T pointer) void CheckPointer(T pointer)
{ {

View File

@ -578,6 +578,153 @@
<checkable>1</checkable> <checkable>1</checkable>
</object> </object>
</object> </object>
<object class="wxMenu">
<label translate="0">_Languages</label>
<object class="wxMenuItem" name="Language0">
<label>Default Language</label>
<radio>1</radio>
</object>
<object class="wxMenuItem" name="Language1">
<label>Bulgarian</label>
<radio>1</radio>
</object>
<object class="wxMenuItem" name="Language2">
<label>Breton</label>
<radio>1</radio>
</object>
<object class="wxMenuItem" name="Language3">
<label>Czech</label>
<radio>1</radio>
</object>
<object class="wxMenuItem" name="Language4">
<label>German</label>
<radio>1</radio>
</object>
<object class="wxMenuItem" name="Language5">
<label>Greek</label>
<radio>1</radio>
</object>
<object class="wxMenuItem" name="Language6">
<label>English (US)</label>
<radio>1</radio>
</object>
<object class="wxMenuItem" name="Language7">
<label>Spanish (Latin American)</label>
<radio>1</radio>
</object>
<object class="wxMenuItem" name="Language8">
<label>Spanish (Colombia)</label>
<radio>1</radio>
</object>
<object class="wxMenuItem" name="Language9">
<label>Spanish (Peru)</label>
<radio>1</radio>
</object>
<object class="wxMenuItem" name="Language10">
<label>Spanish (United States)</label>
<radio>1</radio>
</object>
<object class="wxMenuItem" name="Language11">
<label>Spanish</label>
<radio>1</radio>
</object>
<object class="wxMenuItem" name="Language12">
<label>French (France)</label>
<radio>1</radio>
</object>
<object class="wxMenuItem" name="Language13">
<label>French</label>
<radio>1</radio>
</object>
<object class="wxMenuItem" name="Language14">
<label>Galician</label>
<radio>1</radio>
</object>
<object class="wxMenuItem" name="Language15">
<label>Hebrew (Israel)</label>
<radio>1</radio>
</object>
<object class="wxMenuItem" name="Language16">
<label>Hungarian (Hungary)</label>
<radio>1</radio>
</object>
<object class="wxMenuItem" name="Language17">
<label>Hungarian</label>
<radio>1</radio>
</object>
<object class="wxMenuItem" name="Language18">
<label>Indonesian</label>
<radio>1</radio>
</object>
<object class="wxMenuItem" name="Language19">
<label>Italian</label>
<radio>1</radio>
</object>
<object class="wxMenuItem" name="Language20">
<label>Japanese</label>
<radio>1</radio>
</object>
<object class="wxMenuItem" name="Language21">
<label>Korean (Korea)</label>
<radio>1</radio>
</object>
<object class="wxMenuItem" name="Language22">
<label>Korean</label>
<radio>1</radio>
</object>
<object class="wxMenuItem" name="Language23">
<label>Malay (Malaysia)</label>
<radio>1</radio>
</object>
<object class="wxMenuItem" name="Language24">
<label>Norwegian</label>
<radio>1</radio>
</object>
<object class="wxMenuItem" name="Language25">
<label>Dutch</label>
<radio>1</radio>
</object>
<object class="wxMenuItem" name="Language26">
<label>Polish (Poland)</label>
<radio>1</radio>
</object>
<object class="wxMenuItem" name="Language27">
<label>Polish</label>
<radio>1</radio>
</object>
<object class="wxMenuItem" name="Language28">
<label>Portuguese (Brazil)</label>
<radio>1</radio>
</object>
<object class="wxMenuItem" name="Language29">
<label>Portuguese (Portugal)</label>
<radio>1</radio>
</object>
<object class="wxMenuItem" name="Language30">
<label>Russian (Russia)</label>
<radio>1</radio>
</object>
<object class="wxMenuItem" name="Language31">
<label>Swedish</label>
<radio>1</radio>
</object>
<object class="wxMenuItem" name="Language32">
<label>Turkish</label>
<radio>1</radio>
</object>
<object class="wxMenuItem" name="Language33">
<label>Ukrainian</label>
<radio>1</radio>
</object>
<object class="wxMenuItem" name="Language34">
<label>Urdu (Pakistan)</label>
<radio>1</radio>
</object>
<object class="wxMenuItem" name="Language35">
<label>Chinese (China)</label>
<radio>1</radio>
</object>
</object>
</object> </object>
<object class="wxMenu"> <object class="wxMenu">
<label>_Tools</label> <label>_Tools</label>