diff options
author | Ankit Meel <ankitm> | 2021-10-29 11:11:04 +0300 |
---|---|---|
committer | Bastien Montagne <bastien@blender.org> | 2021-10-29 11:24:08 +0300 |
commit | be0d5da341cf3f33ba2d7cca8c979abf9d94f683 (patch) | |
tree | 86485b471471881892bec6ccc785882fe772747b /intern | |
parent | 2887d872320efc50d377ebe299c7e0beaedb67d8 (diff) |
Fix T88877: 2.93: Crash on recent OSX with a non-English locale.
Looks like OSX changed the default format of its locale, which is not
valid anymore for gettext/boost::locale.
Solution based on investigations and patch by Kieun Mun (@kieuns), with
some further tweaks by Ankit Meel (@ankitm), many thanks.
Also add an exception catcher on `std::runtime_error` in
`bl_locale_set()`, since in OSX catching the ancestor `std::exception`
does not work with `boost::locale::conv::conversion_error` and the like
for some reasons.
Reviewed By: #platform_macos, brecht
Maniphest Tasks: T88877
Differential Revision: https://developer.blender.org/D13019
Diffstat (limited to 'intern')
-rw-r--r-- | intern/locale/boost_locale_wrapper.cpp | 7 | ||||
-rw-r--r-- | intern/locale/osx_user_locale.mm | 12 |
2 files changed, 18 insertions, 1 deletions
diff --git a/intern/locale/boost_locale_wrapper.cpp b/intern/locale/boost_locale_wrapper.cpp index 73433fe7c5e..ede9377b38f 100644 --- a/intern/locale/boost_locale_wrapper.cpp +++ b/intern/locale/boost_locale_wrapper.cpp @@ -117,6 +117,13 @@ void bl_locale_set(const char *locale) #undef LOCALE_INFO } + // Extra catch on `std::runtime_error` is needed for macOS/Clang as it seems that exceptions + // like `boost::locale::conv::conversion_error` (which inherit from `std::runtime_error`) are + // not caught by their ancestor `std::exception`. See + // https://developer.blender.org/T88877#1177108 . + catch (std::runtime_error const &e) { + std::cout << "bl_locale_set(" << locale << "): " << e.what() << " \n"; + } catch (std::exception const &e) { std::cout << "bl_locale_set(" << locale << "): " << e.what() << " \n"; } diff --git a/intern/locale/osx_user_locale.mm b/intern/locale/osx_user_locale.mm index e2f65d39df9..ce694b5fc1e 100644 --- a/intern/locale/osx_user_locale.mm +++ b/intern/locale/osx_user_locale.mm @@ -14,7 +14,17 @@ const char *osx_user_locale() CFLocaleRef myCFLocale = CFLocaleCopyCurrent(); NSLocale *myNSLocale = (NSLocale *)myCFLocale; [myNSLocale autorelease]; - NSString *nsIdentifier = [myNSLocale localeIdentifier]; + + // This produces gettext-invalid locale in recent macOS versions (11.4), + // like `ko-Kore_KR` instead of `ko_KR`. See T88877. + // NSString *nsIdentifier = [myNSLocale localeIdentifier]; + + const NSString *nsIdentifier = [myNSLocale languageCode]; + const NSString *const nsIdentifier_country = [myNSLocale countryCode]; + if ([nsIdentifier length] != 0 && [nsIdentifier_country length] != 0) { + nsIdentifier = [NSString stringWithFormat:@"%@_%@", nsIdentifier, nsIdentifier_country]; + } + user_locale = ::strdup([nsIdentifier UTF8String]); [pool drain]; |