diff --git a/clientgui/BOINCGUIApp.cpp b/clientgui/BOINCGUIApp.cpp index 408925c3203..df9aa21bade 100644 --- a/clientgui/BOINCGUIApp.cpp +++ b/clientgui/BOINCGUIApp.cpp @@ -205,17 +205,22 @@ bool CBOINCGUIApp::OnInit() { #endif m_pConfig->Read(wxT("DisableAutoStart"), &m_iBOINCMGRDisableAutoStart, 0L); m_pConfig->Read(wxT("LanguageISO"), &m_strISOLanguageCode, wxT("")); -#ifdef __WXMAC__ // wxWidgets System language detection does not work on Mac m_bUseDefaultLocale = false; -#else bool bUseDefaultLocaleDefault = false; +#ifdef __WXMAC__ // wxLocale::GetLanguageInfo(wxLANGUAGE_DEFAULT) does not work on Mac + wxLocale *defaultLocale = new wxLocale; + defaultLocale->Init(wxLANGUAGE_DEFAULT); + wxString defaultLanguageCode = defaultLocale->GetCanonicalName(); + bUseDefaultLocaleDefault = m_strISOLanguageCode == defaultLanguageCode; + delete defaultLocale; +#else const wxLanguageInfo *defaultLanguageInfo = wxLocale::GetLanguageInfo(wxLANGUAGE_DEFAULT); if (defaultLanguageInfo != NULL) { // Migration: assume a selected language code that matches the system default means "auto select" bUseDefaultLocaleDefault = m_strISOLanguageCode == defaultLanguageInfo->CanonicalName;; } - m_pConfig->Read(wxT("UseDefaultLocale"), &m_bUseDefaultLocale, bUseDefaultLocaleDefault); #endif + m_pConfig->Read(wxT("UseDefaultLocale"), &m_bUseDefaultLocale, bUseDefaultLocaleDefault); m_pConfig->Read(wxT("GUISelection"), &m_iGUISelected, BOINC_SIMPLEGUI); m_pConfig->Read(wxT("EventLogOpen"), &bOpenEventLog); m_pConfig->Read(wxT("RunDaemon"), &m_bRunDaemon, 1L); @@ -953,7 +958,6 @@ void CBOINCGUIApp::InitSupportedLanguages() { wxLayoutDirection uiLayoutDirection = pLIui ? pLIui->LayoutDirection : wxLayout_Default; GUI_SUPPORTED_LANG newItem; -#ifndef __WXMAC__ // wxWidgets System language detection does not work on Mac // CDlgOptions depends on "Auto" being the first item in the list // if newItem.Language = wxLANGUAGE_DEFAULT; @@ -973,11 +977,11 @@ void CBOINCGUIApp::InitSupportedLanguages() { newItem.Label += LRM + strAutoEnglish + LRM; } m_astrLanguages.push_back(newItem); -#endif // Add known locales to the list for (int langID = wxLANGUAGE_UNKNOWN+1; langID < wxLANGUAGE_USER_DEFINED; ++langID) { const wxLanguageInfo* pLI = wxLocale::GetLanguageInfo(langID); + if (pLI == NULL) continue; wxString lang_region = pLI->CanonicalName.BeforeFirst('@'); wxString lang = lang_region.BeforeFirst('_'); wxString script = pLI->CanonicalName.AfterFirst('@'); diff --git a/clientgui/DlgOptions.cpp b/clientgui/DlgOptions.cpp index 22bbe9b7d05..9ec4810d052 100644 --- a/clientgui/DlgOptions.cpp +++ b/clientgui/DlgOptions.cpp @@ -623,8 +623,6 @@ bool CDlgOptions::ReadSettings() { wxASSERT(wxDynamicCast(pDoc, CMainDocument)); wxASSERT(wxDynamicCast(pFrame, CBOINCBaseFrame)); -// wxWidgets System language detection does not work on Mac -// so we always set UseDefaultLocale() to false on Mac // General Tab if (wxGetApp().UseDefaultLocale()) { // CBOINCGUIApp::InitSupportedLanguages() ensures "Auto" is the first item in the list @@ -734,7 +732,7 @@ bool CDlgOptions::SaveSettings() { CSkinAdvanced* pSkinAdvanced = wxGetApp().GetSkinManager()->GetAdvanced(); long lBuffer = 0; wxString strBuffer = wxEmptyString; - + const wxLanguageInfo *newLanguageInfo = NULL; wxASSERT(pDoc); wxASSERT(pFrame); @@ -750,14 +748,19 @@ bool CDlgOptions::SaveSettings() { int selLangIdx = m_LanguageSelectionCtrl->GetSelection(); if (selLangIdx == 0) { // CBOINCGUIApp::InitSupportedLanguages() ensures "Auto" is the first item in the list - newLangCode = wxLocale::GetLanguageInfo(wxLANGUAGE_DEFAULT)->CanonicalName; + newLanguageInfo = wxLocale::GetLanguageInfo(wxLANGUAGE_DEFAULT); + // wxLocale::GetLanguageInfo(wxLANGUAGE_DEFAULT) may return NULL on Macintosh + newLangCode = wxEmptyString; } else if (selLangIdx > 0) { const std::vector& langs = wxGetApp().GetSupportedLanguages(); if (selLangIdx < langs.size()) { const GUI_SUPPORTED_LANG& selLang = langs[selLangIdx]; - newLangCode = wxLocale::GetLanguageInfo(selLang.Language)->CanonicalName; + newLanguageInfo = wxLocale::GetLanguageInfo(selLang.Language); } } + if (newLanguageInfo) { + newLangCode = newLanguageInfo->CanonicalName; + } if (newLangCode != oldLangCode) { wxString strDialogTitle; wxString strDialogMessage;