From 57c06eeba311c8a12be9424b06f578518d3f9d11 Mon Sep 17 00:00:00 2001 From: fgenesis Date: Sat, 2 Jun 2012 21:02:01 +0100 Subject: [PATCH] Corrected locale detection on OSX. (For me, it's de_en, which is kinda weird. But it seems to work.) --- Aquaria/UserSettings.cpp | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/Aquaria/UserSettings.cpp b/Aquaria/UserSettings.cpp index 9d41677..abe3ebb 100644 --- a/Aquaria/UserSettings.cpp +++ b/Aquaria/UserSettings.cpp @@ -40,7 +40,18 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #endif #ifdef BBGE_BUILD_MACOSX - #include + #include + #include + #include + +// veeery clunky. +static std::string _CFToStdString(CFStringRef cs) +{ + char buf[1024]; + CFStringGetCString(cs, &buf[0], 2048, kCFStringEncodingUTF8); + return &buf[0]; +} + #endif void UserSettings::save() @@ -647,30 +658,24 @@ void UserSettings::getSystemLocale() } #elif BBGE_BUILD_MACOSX CFLocaleRef locale = CFLocaleCopyCurrent(); - CFTypeRef type; + CFArrayRef langs = CFLocaleCopyPreferredLanguages(); CFStringRef buf; - type = CFLocaleGetValue(locale, kCFLocaleLanguageCode); - - if ((buf = CFLocaleCopyDisplayNameForPropertyValue(locale, kCFLocaleLanguageCode, type)) != NULL) + if ((buf = (CFStringRef)CFLocaleGetValue(locale, kCFLocaleLanguageCode)) != NULL) { - system.locale = buf; + system.locale = _CFToStdString(buf); CFRelease(buf); - CFRelease(type); - type = CFLocaleGetValue(locale, kCFLocaleCountryCode); - - if ((buf = CFLocaleCopyDisplayNameForPropertyValue(locale, kCFLocaleCountryCode, type)) != NULL) + if ((buf = (CFStringRef)CFArrayGetValueAtIndex(langs, 0)) != NULL) { system.locale += "_"; - system.locale += buf; + system.locale += _CFToStdString(buf); CFRelease(buf); } - - CFRelease(type); } CFRelease(locale); + CFRelease(langs); #else const char *lang = (const char *)getenv("LANG");