AtomicString InbandTextTrackPrivateAVCF::label() const { if (!m_mediaSelectionOption) return emptyAtom; RetainPtr<CFStringRef> title; RetainPtr<CFArrayRef> commonMetaData = adoptCF(AVCFMediaSelectionOptionCopyCommonMetadata(mediaSelectionOption())); RetainPtr<CFArrayRef> titles = adoptCF(AVCFMetadataItemCopyItemsWithKeyAndKeySpace(commonMetaData.get(), AVCFMetadataCommonKeyTitle, AVCFMetadataKeySpaceCommon)); CFIndex titlesCount = CFArrayGetCount(titles.get()); if (!titlesCount) return emptyAtom; // If possible, return a title in one of the user's preferred languages. RetainPtr<CFArrayRef> preferredLanguages = CFLocaleCopyPreferredLanguages(); RetainPtr<CFArrayRef> titlesForPreferredLanguages = AVCFMediaSelectionCopyOptionsFromArrayFilteredAndSortedAccordingToPreferredLanguages(titles.get(), preferredLanguages.get()); CFIndex preferredTitlesCount = CFArrayGetCount(titlesForPreferredLanguages.get()); if (preferredTitlesCount) { AVCFMetadataItemRef titleMetadata = static_cast<AVCFMetadataItemRef>(CFArrayGetValueAtIndex(titlesForPreferredLanguages.get(), 0)); title = adoptCF(AVCFMetadataItemCopyStringValue(titleMetadata)); } if (!title) { AVCFMetadataItemRef titleMetadata = static_cast<AVCFMetadataItemRef>(CFArrayGetValueAtIndex(titles.get(), 0)); title = adoptCF(AVCFMetadataItemCopyStringValue(titleMetadata)); } return title ? AtomicString(title.get()) : emptyAtom; }
std::string getOSXSystemLang() { // Get the user's language list (in order of preference) CFArrayRef langs = CFLocaleCopyPreferredLanguages(); if( CFArrayGetCount( langs ) == 0 ) { return "en_US"; } const char *lang_code_raw = CFStringGetCStringPtr( ( CFStringRef )CFArrayGetValueAtIndex( langs, 0 ), kCFStringEncodingUTF8 ); if( !lang_code_raw ) { return "en_US"; } // Convert to the underscore format expected by gettext std::string lang_code( lang_code_raw ); std::replace( lang_code.begin(), lang_code.end(), '-', '_' ); /** * Handle special case for simplified/traditional Chinese. Simplified/Traditional * is actually denoted by the region code in older iterations of the * language codes, whereas now (at least on OS X) region is distinct. * That is, CDDA expects 'zh_CN' but OS X might give 'zh-Hans-CN'. */ if( string_starts_with( lang_code, "zh_Hans" ) ) { return "zh_CN"; } else if( string_starts_with( lang_code, "zh_Hant" ) ) { return "zh_TW"; } return isValidLanguage( lang_code ) ? lang_code : "en_US"; }
std::string System::get_language() { #ifdef WIN32 char* lang_c = getenv("LC_MESSAGES"); #else char* lang_c = setlocale(LC_MESSAGES, NULL); #endif std::string lang; if (lang_c) { lang = lang_c; } if (lang.empty() || lang == "C") { lang_c = getenv("LANG"); if (lang_c) { lang = lang_c; } } if (lang.empty() || lang == "C") { #ifndef __APPLE__ return globals::default_language; #else /* on Mac OS X we get "C" if launched using Finder, so we ask the OS for the language */ /* Note: this is used as last resort to allow the use of LANG when starting via Terminal */ CFArrayRef preferred_languages = CFLocaleCopyPreferredLanguages(); //CFShow(preferred_languages); CFStringRef language = (CFStringRef)CFArrayGetValueAtIndex(preferred_languages, 0 /* most important language */); //CFShow(language); CFRelease(preferred_languages); CFStringRef substring = CFStringCreateWithSubstring(NULL, language, CFRangeMake(0, 2)); CFRelease(language); char buff[3]; CFStringGetCString(substring, buff, 3, kCFStringEncodingUTF8); CFRelease(substring); lang = buff; return lang; #endif } else { return lang.substr(0, 2); } }
void locales(std::vector<std::unique_ptr<char[]>>& locales) { char tmp[16]; CFArrayRef localesArray = CFLocaleCopyPreferredLanguages(); const long count = CFArrayGetCount(localesArray); locales.reserve(count); for (long i = 0; i < count; ++i) { CFStringRef lang = static_cast<CFStringRef>( CFArrayGetValueAtIndex(localesArray, i)); CFStringGetCString( lang, tmp, sizeof(tmp), kCFStringEncodingUTF8); locales.emplace_back(new char[sizeof(tmp)]); strcpy(locales[i].get(), tmp); } CFRelease(localesArray); }
const char * GetBestMatchedLanguageString() { CFArrayRef langid_arr = CFLocaleCopyPreferredLanguages(); if (langid_arr) { CFStringRef firstPreferred = (CFStringRef)CFArrayGetValueAtIndex(langid_arr, 0); char stringbuf[100]; if (CFStringGetCString(firstPreferred, stringbuf, 100, kCFStringEncodingASCII)) { if (strncmp(stringbuf, "zh-", strlen("zh-"))==0) { return "cn"; } } CFRelease(langid_arr); } return "en"; }
std::string Platform::GetUserLanguage() { char lang[100]; CFArrayRef langs = CFLocaleCopyPreferredLanguages(); if( langs && CFArrayGetCount( langs ) < 1 ) { CFRelease(langs); return "en"; } CFStringRef langCode = (CFStringRef)CFArrayGetValueAtIndex(langs, 0); if( !langCode ) { CFRelease(langs); return "en"; } CFStringGetCString(langCode, lang, 100, kCFStringEncodingUTF8); CFRelease(langs); return lang; }
/***************************************************************************** * * ccid_open_hack_post * ****************************************************************************/ int ccid_open_hack_post(unsigned int reader_index) { _ccid_descriptor *ccid_descriptor = get_ccid_descriptor(reader_index); RESPONSECODE return_value = IFD_SUCCESS; switch (ccid_descriptor->readerID) { case GEMPCKEY: case GEMPCTWIN: /* Reader announces TPDU but can do APDU (EMV in fact) */ if (DriverOptions & DRIVER_OPTION_GEMPC_TWIN_KEY_APDU) { unsigned char cmd[] = { 0x1F, 0x02 }; unsigned char res[10]; unsigned int length_res = sizeof(res); if (CmdEscape(reader_index, cmd, sizeof(cmd), res, &length_res, 0) == IFD_SUCCESS) { ccid_descriptor->dwFeatures &= ~CCID_CLASS_EXCHANGE_MASK; ccid_descriptor->dwFeatures |= CCID_CLASS_SHORT_APDU; } } break; case VEGAALPHA: case GEMPCPINPAD: /* load the l10n strings in the pinpad memory */ { #define L10N_HEADER_SIZE 5 #define L10N_STRING_MAX_SIZE 16 #define L10N_NB_STRING 10 unsigned char cmd[L10N_HEADER_SIZE + L10N_NB_STRING * L10N_STRING_MAX_SIZE]; unsigned char res[20]; unsigned int length_res = sizeof(res); int offset, i, j; const char *fr[] = { "Entrer PIN", "Nouveau PIN", "Confirmer PIN", "PIN correct", "PIN Incorrect !", "Delai depasse", "* essai restant", "Inserer carte", "Erreur carte", "PIN bloque" }; const char *de[] = { "PIN eingeben", "Neue PIN", "PIN bestatigen", "PIN korrect", "Falsche PIN !", "Zeit abgelaufen", "* Versuche ubrig", "Karte einstecken", "Fehler Karte", "PIN blockiert" }; const char *es[] = { "Introducir PIN", "Nuevo PIN", "Confirmar PIN", "PIN OK", "PIN Incorrecto !", "Tiempo Agotado", "* ensayos quedan", "Introducir Tarj.", "Error en Tarjeta", "PIN bloqueado" }; const char *it[] = { "Inserire PIN", "Nuovo PIN", "Confermare PIN", "PIN Corretto", "PIN Errato !", "Tempo scaduto", "* prove rimaste", "Inserire Carta", "Errore Carta", "PIN ostruito"}; const char *pt[] = { "Insira PIN", "Novo PIN", "Conf. novo PIN", "PIN OK", "PIN falhou!", "Tempo expirou", "* tentiv. restam", "Introduza cartao", "Erro cartao", "PIN bloqueado" }; const char *nl[] = { "Inbrengen code", "Nieuwe code", "Bevestig code", "Code aanvaard", "Foute code", "Time out", "* Nog Pogingen", "Kaart inbrengen", "Kaart fout", "Kaart blok" }; const char *tr[] = { "PIN Giriniz", "Yeni PIN", "PIN Onayala", "PIN OK", "Yanlis PIN", "Zaman Asimi", "* deneme kaldi", "Karti Takiniz", "Kart Hatasi", "Kart Kilitli" }; const char *en[] = { "Enter PIN", "New PIN", "Confirm PIN", "PIN OK", "Incorrect PIN!", "Time Out", "* retries left", "Insert Card", "Card Error", "PIN blocked" }; const char *lang; const char **l10n; #ifdef __APPLE__ CFArrayRef cfa; CFStringRef slang; /* Get the complete ordered list */ cfa = CFLocaleCopyPreferredLanguages(); /* Use the first/preferred language * As the driver is run as root we get the language * selected during install */ slang = CFArrayGetValueAtIndex(cfa, 0); /* CFString -> C string */ lang = CFStringGetCStringPtr(slang, kCFStringEncodingMacRoman); #else /* The other Unixes just use the LANG env variable */ lang = getenv("LANG"); #endif DEBUG_COMM2("Using lang: %s", lang); if (NULL == lang) l10n = en; else { if (0 == strncmp(lang, "fr", 2)) l10n = fr; else if (0 == strncmp(lang, "de", 2)) l10n = de; else if (0 == strncmp(lang, "es", 2)) l10n = es; else if (0 == strncmp(lang, "it", 2)) l10n = it; else if (0 == strncmp(lang, "pt", 2)) l10n = pt; else if (0 == strncmp(lang, "nl", 2)) l10n = nl; else if (0 == strncmp(lang, "tr", 2)) l10n = tr; else l10n = en; } #ifdef __APPLE__ /* Release the allocated array */ CFRelease(cfa); #endif offset = 0; cmd[offset++] = 0xB2; /* load strings */ cmd[offset++] = 0xA0; /* address of the memory */ cmd[offset++] = 0x00; /* address of the first byte */ cmd[offset++] = 0x4D; /* magic value */ cmd[offset++] = 0x4C; /* magic value */ /* for each string */ for (i=0; i<L10N_NB_STRING; i++) { /* copy the string */ for (j=0; l10n[i][j]; j++) cmd[offset++] = l10n[i][j]; /* pad with " " */ for (; j<L10N_STRING_MAX_SIZE; j++) cmd[offset++] = ' '; } (void)sleep(1); if (IFD_SUCCESS == CmdEscape(reader_index, cmd, sizeof(cmd), res, &length_res, DEFAULT_COM_READ_TIMEOUT)) { DEBUG_COMM("l10n string loaded successfully"); } else { DEBUG_COMM("Failed to load l10n strings"); return_value = IFD_COMMUNICATION_ERROR; } if (DriverOptions & DRIVER_OPTION_DISABLE_PIN_RETRIES) { /* disable VERIFY from reader */ const unsigned char cmd2[] = {0xb5, 0x00}; length_res = sizeof(res); if (IFD_SUCCESS == CmdEscape(reader_index, cmd2, sizeof(cmd2), res, &length_res, DEFAULT_COM_READ_TIMEOUT)) { DEBUG_COMM("Disable SPE retry counter successful"); } else { DEBUG_CRITICAL("Failed to disable SPE retry counter"); } } } break; case HPSMARTCARDKEYBOARD: case HP_CCIDSMARTCARDKEYBOARD: case FUJITSUSMARTKEYB: /* the Secure Pin Entry is bogus so disable it * https://web.archive.org/web/20120320001756/http://martinpaljak.net/2011/03/19/insecure-hp-usb-smart-card-keyboard/ * * The problem is that the PIN code entered using the Secure * Pin Entry function is also sent to the host. */ ccid_descriptor->bPINSupport = 0; break; case HID_AVIATOR: /* The chip advertises pinpad but actually doesn't have one */ ccid_descriptor->bPINSupport = 0; /* Firmware uses chaining */ ccid_descriptor->dwFeatures &= ~CCID_CLASS_EXCHANGE_MASK; ccid_descriptor->dwFeatures |= CCID_CLASS_EXTENDED_APDU; break; #if 0 /* SCM SCR331-DI contactless */ case SCR331DI: /* SCM SCR331-DI-NTTCOM contactless */ case SCR331DINTTCOM: /* SCM SDI010 contactless */ case SDI010: /* the contactless reader is in the second slot */ if (ccid_descriptor->bCurrentSlotIndex > 0) { unsigned char cmd1[] = { 0x00 }; /* command: 00 ?? * response: 06 10 03 03 00 00 00 01 FE FF FF FE 01 ?? */ unsigned char cmd2[] = { 0x02 }; /* command: 02 ?? * response: 00 ?? */ unsigned char res[20]; unsigned int length_res = sizeof(res); if ((IFD_SUCCESS == CmdEscape(reader_index, cmd1, sizeof(cmd1), res, &length_res, 0)) && (IFD_SUCCESS == CmdEscape(reader_index, cmd2, sizeof(cmd2), res, &length_res, 0))) { DEBUG_COMM("SCM SCR331-DI contactless detected"); } else { DEBUG_COMM("SCM SCR331-DI contactless init failed"); } /* hack since the contactless reader do not share dwFeatures */ ccid_descriptor->dwFeatures &= ~CCID_CLASS_EXCHANGE_MASK; ccid_descriptor->dwFeatures |= CCID_CLASS_SHORT_APDU; ccid_descriptor->dwFeatures |= CCID_CLASS_AUTO_IFSD; } break; #endif case CHERRY_KC1000SC: if ((0x0100 == ccid_descriptor->IFD_bcdDevice) && (ccid_descriptor->dwFeatures & CCID_CLASS_EXCHANGE_MASK) == CCID_CLASS_SHORT_APDU) { /* firmware 1.00 is bogus * With a T=1 card and case 2 APDU (data from card to * host) the maximum size returned by the reader is 128 * byes. The reader is then using chaining as with * extended APDU. */ ccid_descriptor->dwFeatures &= ~CCID_CLASS_EXCHANGE_MASK; ccid_descriptor->dwFeatures |= CCID_CLASS_EXTENDED_APDU; } break; case ElatecTWN4: case SCM_SCL011: /* restore default timeout (modified in ccid_open_hack_pre()) */ ccid_descriptor->readTimeout = DEFAULT_COM_READ_TIMEOUT; break; } /* Gemalto readers may report additional information */ if (GET_VENDOR(ccid_descriptor->readerID) == VENDOR_GEMALTO) set_gemalto_firmware_features(reader_index); return return_value; } /* ccid_open_hack_post */
void init() { #ifdef _WIN32 { char c[1024]; GetLocaleInfoA(LOCALE_USER_DEFAULT,LOCALE_SISO639LANGNAME,c,1024); if(c[0]!='\0'){ locale=c; GetLocaleInfoA(LOCALE_USER_DEFAULT,LOCALE_SISO3166CTRYNAME,c,1024); if(c[0]!='\0') locale+=std::string("_")+c; } } #endif #ifdef __APPLE__ CFArrayRef localeIDs = CFLocaleCopyPreferredLanguages(); if (localeIDs) { CFStringRef localeID = (CFStringRef)CFArrayGetValueAtIndex(localeIDs, 0); char tmp[16]; if (CFStringGetCString(localeID, tmp, 16, kCFStringEncodingUTF8)) locale = std::string(tmp); CFRelease(localeIDs); } #endif #if defined(TARGET_OS_HARMATTAN) std::cerr << "Get GConf default client\n"; GConfClient *gconf = gconf_client_get_default(); locale = std::string(gconf_client_get_string(gconf, "/meegotouch/i18n/region", NULL)); #elif defined(TARGET_BLACKBERRY) char *language = 0; char *country = 0; if (BPS_SUCCESS == locale_get(&language, &country) && language!= NULL && country != NULL) { std::stringstream ss; ss << language << "_" << country; locale = ss.str(); bps_free(language); bps_free(country); } #else char *cstr = getenv("LANG"); if (cstr != NULL) locale = cstr; if (locale.size() < 2) { cstr = getenv("LC_ALL"); if (cstr != NULL) locale = cstr; } if (locale == "zh-Hans") locale = "zh_CN"; //hack to make it work on iOS if (locale == "zh-Hant") locale = "zh_TW"; #endif //strip the charset part of the country and language code, //e.g. "pt_BR.UTF8" --> "pt_BR" size_t found = locale.find("."); if (found != std::string::npos) { locale = locale.substr(0, found); } if (locale.size() < 2) return; std::string filename = "./locale/" + locale + "/LC_MESSAGES/frogatto.mo"; found = locale.find("@"); if (!sys::file_exists(filename) && found != std::string::npos) { locale = locale.substr(0, found); filename = "./locale/" + locale + "/LC_MESSAGES/frogatto.mo"; } //strip the country code, e.g. "de_DE" --> "de" found = locale.find("_"); if (!sys::file_exists(filename) && found != std::string::npos) { locale = locale.substr(0, found); filename = "./locale/" + locale + "/LC_MESSAGES/frogatto.mo"; } if (!sys::file_exists(filename)) return; const std::string content = sys::read_file(module::map_file(filename)); size_t size = content.size(); if (size < sizeof(mo_header)) return; mo_header* header = (mo_header*) content.c_str(); if (header->magic != 0x950412de || header->version != 0 || header->o_offset + 8*header->number > size || header->t_offset + 8*header->number > size) return; mo_entry* original = (mo_entry*) (content.c_str() + header->o_offset); mo_entry* translated = (mo_entry*) (content.c_str() + header->t_offset); for (int i = 0; i < header->number; ++i) { if (original[i].offset + original[i].length > size || translated[i].offset + translated[i].length > size) return; const std::string msgid = content.substr(original[i].offset, original[i].length); const std::string msgstr = content.substr(translated[i].offset, translated[i].length); hashmap[msgid] = msgstr; } }