From 44faf142f9d1d487d08e2267350ca3e620e4a009 Mon Sep 17 00:00:00 2001 From: Eyal Levin Date: Mon, 30 Mar 2026 14:26:00 +0300 Subject: [PATCH] =?UTF-8?q?Fix:=20generic=20locale=20fallback=20on=20all?= =?UTF-8?q?=20platforms=20when=20language=20is=20unavai=E2=80=A6=20(#12948?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix: generic locale fallback on all platforms when language is unavailable Move the locale fallback chain out of the #ifdef __linux__ block so it applies on macOS and Windows too. Add a base-language fallback step that strips the region code (e.g. en_IL -> en) before trying the full fallback chain (current locale, system, best, en_US, en_UK). Previously, if wxLocale::IsAvailable() failed on non-Linux, the app would show an error and exit. Now it gracefully falls back to a working locale. Co-authored-by: SoftFever --- src/slic3r/GUI/GUI_App.cpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index b0c0bef473..a7f188efc4 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -6424,7 +6424,22 @@ bool GUI_App::load_language(wxString language, bool initial) % original_lang % locale_language_info->CanonicalName.ToUTF8().data(); } } +#endif + // Try base language without region (e.g., "en" from "en_IL") on all platforms + if (locale_language_info == nullptr || !wxLocale::IsAvailable(locale_language_info->Language)) { + wxString base_lang = requested_language_code.BeforeFirst('_'); + if (base_lang != requested_language_code) { + const wxLanguageInfo *base_info = wxLocale::FindLanguageInfo(base_lang); + if (base_info && wxLocale::IsAvailable(base_info->Language)) { + BOOST_LOG_TRIVIAL(info) << boost::format("Locale %1% not available. Falling back to base language %2%.") + % requested_language_code.ToUTF8().data() % base_info->CanonicalName.ToUTF8().data(); + locale_language_info = base_info; + } + } + } + + // Generic fallback chain for all platforms if (locale_language_info == nullptr || !wxLocale::IsAvailable(locale_language_info->Language)) { auto try_locale = [](const wxLanguageInfo* candidate) -> const wxLanguageInfo* { return (candidate && wxLocale::IsAvailable(candidate->Language)) ? candidate : nullptr; @@ -6441,7 +6456,6 @@ bool GUI_App::load_language(wxString language, bool initial) locale_language_info = fallback_locale_info; } } -#endif if (initial) { // bbs supported languages