CFStringRef CFLocaleCopyDisplayNameForPropertyValue(CFLocaleRef displayLocale, CFStringRef key, CFStringRef value) { CF_OBJC_FUNCDISPATCH2(CFLocaleGetTypeID(), CFStringRef, displayLocale, "_copyDisplayNameForKey:value:", key, value); CFIndex idx, slot = -1; for (idx = 0; idx < __kCFLocaleKeyTableCount; idx++) { if (__CFLocaleKeyTable[idx].key == key) { slot = idx; break; } } if (-1 == slot && NULL != key) { for (idx = 0; idx < __kCFLocaleKeyTableCount; idx++) { if (CFEqual(__CFLocaleKeyTable[idx].key, key)) { slot = idx; break; } } } if (-1 == slot || !value) { return NULL; } // Get the locale ID as a C string char localeID[ULOC_FULLNAME_CAPACITY+ULOC_KEYWORD_AND_VALUES_CAPACITY]; char cValue[ULOC_FULLNAME_CAPACITY+ULOC_KEYWORD_AND_VALUES_CAPACITY]; if (CFStringGetCString(displayLocale->_identifier, localeID, sizeof(localeID)/sizeof(localeID[0]), kCFStringEncodingASCII) && CFStringGetCString(value, cValue, sizeof(cValue)/sizeof(char), kCFStringEncodingASCII)) { CFStringRef result; if ((NULL == displayLocale->_prefs) && __CFLocaleKeyTable[slot].name(localeID, cValue, &result)) { return result; } // We could not find a result using the requested language. Fall back through all preferred languages. CFArrayRef langPref; if (displayLocale->_prefs) { langPref = (CFArrayRef)CFDictionaryGetValue(displayLocale->_prefs, CFSTR("AppleLanguages")); if (langPref) CFRetain(langPref); } else { langPref = (CFArrayRef)CFPreferencesCopyAppValue(CFSTR("AppleLanguages"), kCFPreferencesCurrentApplication); } if (langPref != NULL) { CFIndex count = CFArrayGetCount(langPref); CFIndex i; bool success = false; for (i = 0; i < count && !success; ++i) { CFStringRef language = (CFStringRef)CFArrayGetValueAtIndex(langPref, i); CFStringRef cleanLanguage = CFLocaleCreateCanonicalLanguageIdentifierFromString(kCFAllocatorSystemDefault, language); if (CFStringGetCString(cleanLanguage, localeID, sizeof(localeID)/sizeof(localeID[0]), kCFStringEncodingASCII)) { success = __CFLocaleKeyTable[slot].name(localeID, cValue, &result); } CFRelease(cleanLanguage); } CFRelease(langPref); if (success) return result; } } return NULL; }
static void ShowErrorVa(const wchar_t *de, const wchar_t *en, va_list args) { // Get current language const wchar_t *stringToUse = en; #ifdef _WIN32 if ((GetUserDefaultLangID() & 0xFF) == LANG_GERMAN) stringToUse = de; #elif defined(__APPLE_CC__) CFStringRef localisations[2] = { CFSTR("en"), CFSTR("de") }; CFArrayRef allLocalisations = CFArrayCreate(kCFAllocatorDefault, (const void **) localisations, 2, &kCFTypeArrayCallBacks); CFArrayRef preferredLocalisations = CFBundleCopyPreferredLocalizationsFromArray(allLocalisations); CFStringRef oldStyleLang = (CFStringRef) CFArrayGetValueAtIndex(preferredLocalisations, 0); CFStringRef newStyleLang = CFLocaleCreateCanonicalLanguageIdentifierFromString(kCFAllocatorDefault, oldStyleLang); if (CFStringHasPrefix(newStyleLang, CFSTR("de"))) stringToUse = de; CFRelease(allLocalisations); CFRelease(preferredLocalisations); CFRelease(newStyleLang); #else // TODO: Implement something here for android. #endif // Create output string wchar_t text[1024]; vswprintf(text, 1024, stringToUse, args); // Show message #ifdef _WIN32 MessageBoxW(NULL, text, L"Mindstorms Simulator", MB_TASKMODAL & MB_ICONWARNING); #elif defined(IPHONE) // Ignore it #elif defined(__APPLE_CC__) CFStringRef messageString = CFStringCreateWithBytes(kCFAllocatorDefault, (const UInt8 *) text, sizeof(wchar_t) * wcslen(text), (CFByteOrderGetCurrent() == CFByteOrderBigEndian) ? kCFStringEncodingUTF32BE : kCFStringEncodingUTF32LE, false); CFUserNotificationDisplayAlert(0.0, kCFUserNotificationStopAlertLevel, NULL, NULL, NULL, messageString, NULL, NULL, NULL, NULL, NULL); CFRelease(messageString); #else // TODO: Implement something here for android. size_t length = wcslen(text)+1; char *englishMangledASCII = new char[length]; for (unsigned i = 0; i < length; i++) englishMangledASCII[i] = (char) en[i]; __android_log_print(ANDROID_LOG_FATAL, "librobosim.so", "Error: %s", englishMangledASCII); delete englishMangledASCII; #endif }
CFArrayRef CFLocaleCopyPreferredLanguages(void) { CFMutableArrayRef newArray = CFArrayCreateMutable(kCFAllocatorSystemDefault, 0, &kCFTypeArrayCallBacks); #if DEPLOYMENT_TARGET_WINDOWS LANGID langId = GetUserDefaultLangID(); CFStringRef lang_name = __CFLocaleWindowsLCIDToISOLocaleName(langId); CFArrayAppendValue(newArray, lang_name); #else CFArrayRef languagesArray = (CFArrayRef)CFPreferencesCopyAppValue(CFSTR("AppleLanguages"), kCFPreferencesCurrentApplication); if (languagesArray && (CFArrayGetTypeID() == CFGetTypeID(languagesArray))) { for (CFIndex idx = 0, cnt = CFArrayGetCount(languagesArray); idx < cnt; idx++) { CFStringRef str = (CFStringRef)CFArrayGetValueAtIndex(languagesArray, idx); if (str && (CFStringGetTypeID() == CFGetTypeID(str))) { CFStringRef ident = CFLocaleCreateCanonicalLanguageIdentifierFromString(kCFAllocatorSystemDefault, str); CFArrayAppendValue(newArray, ident); CFRelease(ident); } } } if (languagesArray) CFRelease(languagesArray); #endif return newArray; }
const char * /* O - Language ID */ _cupsAppleLanguage(const char *locale, /* I - Locale ID */ char *language,/* I - Language ID buffer */ size_t langsize) /* I - Size of language ID buffer */ { int i; /* Looping var */ CFStringRef localeid, /* CF locale identifier */ langid; /* CF language identifier */ /* * Copy the locale name and convert, as needed, to the Apple-specific * locale identifier... */ switch (strlen(locale)) { default : /* * Invalid locale... */ strlcpy(language, "en", langsize); break; case 2 : strlcpy(language, locale, langsize); break; case 5 : strlcpy(language, locale, langsize); if (language[2] == '-') { /* * Convert ll-cc to ll_CC... */ language[2] = '_'; language[3] = (char)toupper(language[3] & 255); language[4] = (char)toupper(language[4] & 255); } break; } for (i = 0; i < (int)(sizeof(apple_language_locale) / sizeof(apple_language_locale[0])); i ++) if (!strcmp(locale, apple_language_locale[i].locale)) { strlcpy(language, apple_language_locale[i].language, sizeof(language)); break; } /* * Attempt to map the locale ID to a language ID... */ if ((localeid = CFStringCreateWithCString(kCFAllocatorDefault, language, kCFStringEncodingASCII)) != NULL) { if ((langid = CFLocaleCreateCanonicalLanguageIdentifierFromString( kCFAllocatorDefault, localeid)) != NULL) { CFStringGetCString(langid, language, (CFIndex)langsize, kCFStringEncodingASCII); CFRelease(langid); } CFRelease(localeid); } /* * Return what we got... */ return (language); }