diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index f4d94c0d6..cb80faa95 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -4830,30 +4830,18 @@ bool GUI_App::load_language(wxString language, bool initial) const wxLanguage lang_system = wxLanguage(wxLocale::GetSystemLanguage()); if (lang_system != wxLANGUAGE_UNKNOWN) { m_language_info_system = wxLocale::GetLanguageInfo(lang_system); +#ifdef __WXMSW__ + WCHAR wszLanguagesBuffer[LOCALE_NAME_MAX_LENGTH]; + ::LCIDToLocaleName(LOCALE_USER_DEFAULT, wszLanguagesBuffer, LOCALE_NAME_MAX_LENGTH, 0); + wxString lang(wszLanguagesBuffer); + lang.Replace('-', '_'); + if (auto info = wxLocale::FindLanguageInfo(lang)) + m_language_info_system = info; +#endif BOOST_LOG_TRIVIAL(trace) << boost::format("System language detected (user locales and such): %1%") % m_language_info_system->CanonicalName.ToUTF8().data(); // BBS set language to app config app_config->set("language", m_language_info_system->CanonicalName.ToUTF8().data()); } else { - { - std::map language_descptions = { - {"zh_CN", wxString::FromUTF8("\xE4\xB8\xAD\xE6\x96\x87\x28\xE7\xAE\x80\xE4\xBD\x93\x29")}, - {"zh_TW", wxString::FromUTF8("\xE4\xB8\xAD\xE6\x96\x87\x28\xE7\xB9\x81\xE9\xAB\x94\x29")}, - {"de", wxString::FromUTF8("Deutsch")}, - {"nl", wxString::FromUTF8("Nederlands")}, - {"sv", wxString::FromUTF8("\x53\x76\x65\x6e\x73\x6b\x61")}, //Svenska - {"en", wxString::FromUTF8("English")}, - {"es", wxString::FromUTF8("\x45\x73\x70\x61\xC3\xB1\x6F\x6C")}, - {"fr", wxString::FromUTF8("\x46\x72\x61\x6E\xC3\xA7\x61\x69\x73")}, - {"it", wxString::FromUTF8("\x49\x74\x61\x6C\x69\x61\x6E\x6F")}, - {"ru", wxString::FromUTF8("\xD1\x80\xD1\x83\xD1\x81\xD1\x81\xD0\xBA\xD0\xB8\xD0\xB9")}, - {"hu", wxString::FromUTF8("Magyar")}, - {"ja", wxString::FromUTF8("\xE6\x97\xA5\xE6\x9C\xAC\xE8\xAA\x9E")} - }; - for (auto l : language_descptions) { - const wxLanguageInfo *langinfo = wxLocale::FindLanguageInfo(l.first); - if (langinfo) const_cast(langinfo)->Description = l.second; - } - } { // Allocating a temporary locale will switch the default wxTranslations to its internal wxTranslations instance. wxLocale temp_locale; @@ -4945,35 +4933,35 @@ bool GUI_App::load_language(wxString language, bool initial) else if (initial) { // bbs supported languages //TODO: use a global one with Preference - wxLanguage supported_languages[]{ - wxLANGUAGE_ENGLISH, - wxLANGUAGE_CHINESE_SIMPLIFIED, - wxLANGUAGE_GERMAN, - wxLANGUAGE_FRENCH, - wxLANGUAGE_SPANISH, - wxLANGUAGE_SWEDISH, - wxLANGUAGE_DUTCH, - wxLANGUAGE_HUNGARIAN, - wxLANGUAGE_JAPANESE, - wxLANGUAGE_ITALIAN - }; - std::string cur_language = app_config->get("language"); - if (cur_language != "") { - //cleanup the language wrongly set before - const wxLanguageInfo *langinfo = nullptr; - bool embedded_language = false; - int language_num = sizeof(supported_languages) / sizeof(supported_languages[0]); - for (auto index = 0; index < language_num; index++) { - langinfo = wxLocale::GetLanguageInfo(supported_languages[index]); - std::string temp_lan = langinfo->CanonicalName.ToUTF8().data(); - if (cur_language == temp_lan) { - embedded_language = true; - break; - } - } - if (!embedded_language) - app_config->erase("app", "language"); - } + //wxLanguage supported_languages[]{ + // wxLANGUAGE_ENGLISH, + // wxLANGUAGE_CHINESE_SIMPLIFIED, + // wxLANGUAGE_GERMAN, + // wxLANGUAGE_FRENCH, + // wxLANGUAGE_SPANISH, + // wxLANGUAGE_SWEDISH, + // wxLANGUAGE_DUTCH, + // wxLANGUAGE_HUNGARIAN, + // wxLANGUAGE_JAPANESE, + // wxLANGUAGE_ITALIAN + //}; + //std::string cur_language = app_config->get("language"); + //if (cur_language != "") { + // //cleanup the language wrongly set before + // const wxLanguageInfo *langinfo = nullptr; + // bool embedded_language = false; + // int language_num = sizeof(supported_languages) / sizeof(supported_languages[0]); + // for (auto index = 0; index < language_num; index++) { + // langinfo = wxLocale::GetLanguageInfo(supported_languages[index]); + // std::string temp_lan = langinfo->CanonicalName.ToUTF8().data(); + // if (cur_language == temp_lan) { + // embedded_language = true; + // break; + // } + // } + // if (!embedded_language) + // app_config->erase("app", "language"); + //} } if (! wxLocale::IsAvailable(language_info->Language)) { diff --git a/src/slic3r/GUI/Preferences.cpp b/src/slic3r/GUI/Preferences.cpp index 1c16ebe72..dc533e6cc 100644 --- a/src/slic3r/GUI/Preferences.cpp +++ b/src/slic3r/GUI/Preferences.cpp @@ -104,7 +104,8 @@ wxBoxSizer *PreferencesDialog::create_item_language_combobox( auto combobox = new ::ComboBox(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, DESIGN_LARGE_COMBOBOX_SIZE, 0, nullptr, wxCB_READONLY); combobox->SetFont(::Label::Body_13); combobox->GetDropDown().SetFont(::Label::Body_13); - + auto language = app_config->get(param); + m_current_language_selected = -1; std::vector::iterator iter; for (size_t i = 0; i < vlist.size(); ++i) { auto language_name = vlist[i]->Description; @@ -137,11 +138,20 @@ wxBoxSizer *PreferencesDialog::create_item_language_combobox( language_name = wxString::FromUTF8("\x69\x74\x61\x6c\x69\x61\x6e\x6f"); } - if (app_config->get(param) == vlist[i]->CanonicalName) { + if (language == vlist[i]->CanonicalName) { m_current_language_selected = i; } combobox->Append(language_name); } + if (m_current_language_selected == -1 && language.size() >= 5) { + language = language.substr(0, 2); + for (size_t i = 0; i < vlist.size(); ++i) { + if (vlist[i]->CanonicalName.StartsWith(language)) { + m_current_language_selected = i; + break; + } + } + } combobox->SetSelection(m_current_language_selected); m_sizer_combox->Add(combobox, 0, wxALIGN_CENTER, 0);