void UnifiedCacheThread::exerciseByLocale(const Locale &locale) { UErrorCode status = U_ZERO_ERROR; const UCTMultiThreadItem *origItem = NULL; fCache->get( LocaleCacheKey<UCTMultiThreadItem>(locale), fCache, origItem, status); U_ASSERT(U_SUCCESS(status)); if (uprv_strcmp(locale.getLanguage(), origItem->value)) { IntlTest::gTest->errln( "%s:%d Expected %s, got %s", __FILE__, __LINE__, locale.getLanguage(), origItem->value); } // Fetch the same item again many times. We should always get the same // pointer since this client is already holding onto it for (int32_t i = 0; i < 1000; ++i) { const UCTMultiThreadItem *item = NULL; fCache->get( LocaleCacheKey<UCTMultiThreadItem>(locale), fCache, item, status); if (item != origItem) { IntlTest::gTest->errln( "%s:%d Expected to get the same pointer", __FILE__, __LINE__); } if (item != NULL) { item->removeRef(); } } origItem->removeRef(); }
std::wstring L10n::GetFallbackToAvailableDictLocale(const Locale& locale) const { std::wstringstream stream; std::function<bool(const Locale* const&)> checkLangAndCountry = [&locale](const Locale* const& l) { return strcmp(locale.getLanguage(), l->getLanguage()) == 0 && strcmp(locale.getCountry(), l->getCountry()) == 0; }; if (strcmp(locale.getCountry(), "") != 0 && std::find_if(availableLocales.begin(), availableLocales.end(), checkLangAndCountry) != availableLocales.end()) { stream << locale.getLanguage() << L"_" << locale.getCountry(); return stream.str(); } std::function<bool(const Locale* const&)> checkLang = [&locale](const Locale* const& l) { return strcmp(locale.getLanguage(), l->getLanguage()) == 0; }; if (std::find_if(availableLocales.begin(), availableLocales.end(), checkLang) != availableLocales.end()) { stream << locale.getLanguage(); return stream.str(); } return L""; }
AlphabeticIndex::ELangType AlphabeticIndex::langTypeFromLocale(const Locale &loc) { const char *lang = loc.getLanguage(); if (uprv_strcmp(lang, "zh") != 0) { return kNormal; } const char *script = loc.getScript(); if (uprv_strcmp(script, "Hant") == 0) { return kTraditional; } const char *country = loc.getCountry(); if (uprv_strcmp(country, "TW") == 0) { return kTraditional; } return kSimplified; }
void QuasarConfig::slotLocaleChange() { Locale locale; if (_locale->currentItem() == 0) locale = systemLocale; else locale = _locales[_locale->currentItem() - 1]; QString localesDir = QuasarClient::localesDir(); QString language(locale.getLanguage()); QString country(locale.getCountry()); bool found = false; QTranslator translator(0); if (!country.isEmpty()) { QString dir = localesDir + "/" + language + "_" + country; if (translator.load("messages.qm", dir)) found = true; } if (!found) { QString dir = localesDir + "/" + language; if (translator.load("messages.qm", dir)) found = true; } if (!found) { QString message = tr("Quasar has not been localized for this\n" "locale so the text of the program will\n" "not change but the date, time, number,\n" "currency, and percent should be properly\n" "localized."); QMessageBox::warning(this, tr("Warning"), message); } // Set default locale for ICU UErrorCode status = U_ZERO_ERROR; Locale::setDefault(locale, status); if (U_FAILURE(status)) { QString msg = tr("Failed setting locale to %1").arg(locale.getName()); QMessageBox::critical(this, tr("Error"), msg); } loadLocales(); setSamples(); }
std::string GlobalizationNDK::getPreferredLanguage() { Locale loc = Locale::getDefault(); std::string ppslang = readLanguageFromPPS(); if (!ppslang.empty()) loc = Locale::createFromName(ppslang.c_str()); const char* lang = loc.getLanguage(); if (!lang || !strlen(lang)) { slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::getPreferredLanguage: no language for current locale! Use \"en\" instead."); lang = "en"; } const char* country = loc.getCountry(); if (!country || !strlen(country)) { slog2f(0, ID_G11N, SLOG2_ERROR, "GlobalizationNDK::getPreferredLanguage: no country for current locale! Use \"US\" instead."); country = "US"; } return resultInJson(std::string(lang) + "-" + country); }
std::string L10n::GetLocaleLanguage(const std::string& locale) const { Locale loc = Locale::createCanonical(locale.c_str()); return loc.getLanguage(); }
UnicodeString& LocaleDisplayNamesImpl::localeDisplayName(const Locale& locale, UnicodeString& result) const { if (locale.isBogus()) { result.setToBogus(); return result; } UnicodeString resultName; const char* lang = locale.getLanguage(); if (uprv_strlen(lang) == 0) { lang = "root"; } const char* script = locale.getScript(); const char* country = locale.getCountry(); const char* variant = locale.getVariant(); UBool hasScript = uprv_strlen(script) > 0; UBool hasCountry = uprv_strlen(country) > 0; UBool hasVariant = uprv_strlen(variant) > 0; if (dialectHandling == ULDN_DIALECT_NAMES) { char buffer[ULOC_FULLNAME_CAPACITY]; do { // loop construct is so we can break early out of search if (hasScript && hasCountry) { ncat(buffer, ULOC_FULLNAME_CAPACITY, lang, "_", script, "_", country, (char *)0); localeIdName(buffer, resultName); if (!resultName.isBogus()) { hasScript = FALSE; hasCountry = FALSE; break; } } if (hasScript) { ncat(buffer, ULOC_FULLNAME_CAPACITY, lang, "_", script, (char *)0); localeIdName(buffer, resultName); if (!resultName.isBogus()) { hasScript = FALSE; break; } } if (hasCountry) { ncat(buffer, ULOC_FULLNAME_CAPACITY, lang, "_", country, (char*)0); localeIdName(buffer, resultName); if (!resultName.isBogus()) { hasCountry = FALSE; break; } } } while (FALSE); } if (resultName.isBogus() || resultName.isEmpty()) { localeIdName(lang, resultName); } UnicodeString resultRemainder; UnicodeString temp; UErrorCode status = U_ZERO_ERROR; if (hasScript) { resultRemainder.append(scriptDisplayName(script, temp, TRUE)); } if (hasCountry) { appendWithSep(resultRemainder, regionDisplayName(country, temp, TRUE)); } if (hasVariant) { appendWithSep(resultRemainder, variantDisplayName(variant, temp, TRUE)); } resultRemainder.findAndReplace(formatOpenParen, formatReplaceOpenParen); resultRemainder.findAndReplace(formatCloseParen, formatReplaceCloseParen); LocalPointer<StringEnumeration> e(locale.createKeywords(status)); if (e.isValid() && U_SUCCESS(status)) { UnicodeString temp2; char value[ULOC_KEYWORD_AND_VALUES_CAPACITY]; // sigh, no ULOC_VALUE_CAPACITY const char* key; while ((key = e->next((int32_t *)0, status)) != NULL) { locale.getKeywordValue(key, value, ULOC_KEYWORD_AND_VALUES_CAPACITY, status); if (U_FAILURE(status)) { return result; } keyDisplayName(key, temp, TRUE); temp.findAndReplace(formatOpenParen, formatReplaceOpenParen); temp.findAndReplace(formatCloseParen, formatReplaceCloseParen); keyValueDisplayName(key, value, temp2, TRUE); temp2.findAndReplace(formatOpenParen, formatReplaceOpenParen); temp2.findAndReplace(formatCloseParen, formatReplaceCloseParen); if (temp2 != UnicodeString(value, -1, US_INV)) { appendWithSep(resultRemainder, temp2); } else if (temp != UnicodeString(key, -1, US_INV)) { UnicodeString temp3; keyTypeFormat.format(temp, temp2, temp3, status); appendWithSep(resultRemainder, temp3); } else { appendWithSep(resultRemainder, temp) .append((UChar)0x3d /* = */) .append(temp2); } } } if (!resultRemainder.isEmpty()) { format.format(resultName, resultRemainder, result.remove(), status); return adjustForUsageAndContext(kCapContextUsageLanguage, result); } result = resultName; return adjustForUsageAndContext(kCapContextUsageLanguage, result); }
extern "C" JNIEXPORT jstring JNICALL Java_java_lang_System_getProperty(JNIEnv* e, jclass, jstring name, jbooleanArray found) { jstring r = 0; const char* chars = e->GetStringUTFChars(name, 0); if (chars) { #ifdef PLATFORM_WINDOWS if (strcmp(chars, "line.separator") == 0) { r = e->NewStringUTF("\r\n"); } else if (strcmp(chars, "file.separator") == 0) { r = e->NewStringUTF("\\"); } else if (strcmp(chars, "os.name") == 0) { r = e->NewStringUTF("Windows"); } else if (strcmp(chars, "os.version") == 0) { unsigned size = 32; RUNTIME_ARRAY(char, buffer, size); OSVERSIONINFO OSversion; OSversion.dwOSVersionInfoSize=sizeof(OSVERSIONINFO); ::GetVersionEx(&OSversion); snprintf(RUNTIME_ARRAY_BODY(buffer), size, "%i.%i", (int)OSversion.dwMajorVersion, (int)OSversion.dwMinorVersion); r = e->NewStringUTF(RUNTIME_ARRAY_BODY(buffer)); } else if (strcmp(chars, "os.arch") == 0) { #ifdef ARCH_x86_32 r = e->NewStringUTF("x86"); #elif defined ARCH_x86_64 r = e->NewStringUTF("x86_64"); #elif defined ARCH_powerpc r = e->NewStringUTF("ppc"); #elif defined ARCH_arm r = e->NewStringUTF("arm"); #endif } else if (strcmp(chars, "java.io.tmpdir") == 0) { TCHAR buffer[MAX_PATH]; GetTempPath(MAX_PATH, buffer); r = e->NewStringUTF(buffer); } else if (strcmp(chars, "user.dir") == 0) { TCHAR buffer[MAX_PATH]; GetCurrentDirectory(MAX_PATH, buffer); r = e->NewStringUTF(buffer); } else if (strcmp(chars, "user.home") == 0) { # ifdef _MSC_VER WCHAR buffer[MAX_PATH]; size_t needed; if (_wgetenv_s(&needed, buffer, MAX_PATH, L"USERPROFILE") == 0) { r = e->NewString(reinterpret_cast<jchar*>(buffer), lstrlenW(buffer)); } else { r = 0; } # else LPWSTR home = _wgetenv(L"USERPROFILE"); r = e->NewString(reinterpret_cast<jchar*>(home), lstrlenW(home)); # endif } #else if (strcmp(chars, "line.separator") == 0) { r = e->NewStringUTF("\n"); } else if (strcmp(chars, "file.separator") == 0) { r = e->NewStringUTF("/"); } else if (strcmp(chars, "os.name") == 0) { #ifdef __APPLE__ r = e->NewStringUTF("Mac OS X"); #elif defined __FreeBSD__ r = e->NewStringUTF("FreeBSD"); #else r = e->NewStringUTF("Linux"); #endif } else if (strcmp(chars, "os.version") == 0) { #if (defined __APPLE__) && (! defined AVIAN_IOS) unsigned size = 32; char buffer[size]; #ifdef ARCH_x86_64 int32_t minorVersion, majorVersion; #else long minorVersion, majorVersion; #endif Gestalt(gestaltSystemVersionMajor, &majorVersion); Gestalt(gestaltSystemVersionMinor, &minorVersion); snprintf(buffer, size, "%d.%d", static_cast<int32_t>(majorVersion), static_cast<int32_t>(minorVersion)); r = e->NewStringUTF(buffer); #else struct utsname system_id; uname(&system_id); r = e->NewStringUTF(system_id.release); #endif } else if (strcmp(chars, "os.arch") == 0) { #ifdef ARCH_x86_32 r = e->NewStringUTF("x86"); #elif defined ARCH_x86_64 r = e->NewStringUTF("x86_64"); #elif defined ARCH_powerpc r = e->NewStringUTF("ppc"); #elif defined ARCH_arm r = e->NewStringUTF("arm"); #endif } else if (strcmp(chars, "java.io.tmpdir") == 0) { r = e->NewStringUTF("/tmp"); } else if (strcmp(chars, "user.dir") == 0) { char buffer[PATH_MAX]; r = e->NewStringUTF(getcwd(buffer, PATH_MAX)); } else if (strcmp(chars, "user.home") == 0) { r = e->NewStringUTF(getenv("HOME")); } #endif else if (strcmp(chars, "user.language") == 0) { Locale locale = getLocale(); if (strlen(locale.getLanguage())) r = e->NewStringUTF(locale.getLanguage()); } else if (strcmp(chars, "user.region") == 0) { Locale locale = getLocale(); if (strlen(locale.getRegion())) r = e->NewStringUTF(locale.getRegion()); } e->ReleaseStringUTFChars(name, chars); } if (r) { jboolean v = true; e->SetBooleanArrayRegion(found, 0, 1, &v); } return r; }
void AlphabeticIndex::addIndexExemplars(const Locale &locale, UErrorCode &status) { if (U_FAILURE(status)) { return; } // Chinese index characters, which are specific to each of the several Chinese tailorings, // take precedence over the single locale data exemplar set per language. const char *language = locale.getLanguage(); if (uprv_strcmp(language, "zh") == 0 || uprv_strcmp(language, "ja") == 0 || uprv_strcmp(language, "ko") == 0) { // TODO: This should be done regardless of the language, but it's expensive. // We should add a Collator function (can be @internal) // to enumerate just the contractions that start with a given code point or string. if (addChineseIndexCharacters(status) || U_FAILURE(status)) { return; } } LocalULocaleDataPointer uld(ulocdata_open(locale.getName(), &status)); if (U_FAILURE(status)) { return; } UnicodeSet exemplars; ulocdata_getExemplarSet(uld.getAlias(), exemplars.toUSet(), 0, ULOCDATA_ES_INDEX, &status); if (U_SUCCESS(status)) { initialLabels_->addAll(exemplars); return; } status = U_ZERO_ERROR; // Clear out U_MISSING_RESOURCE_ERROR // The locale data did not include explicit Index characters. // Synthesize a set of them from the locale's standard exemplar characters. ulocdata_getExemplarSet(uld.getAlias(), exemplars.toUSet(), 0, ULOCDATA_ES_STANDARD, &status); if (U_FAILURE(status)) { return; } // question: should we add auxiliary exemplars? if (exemplars.containsSome(0x61, 0x7A) /* a-z */ || exemplars.size() == 0) { exemplars.add(0x61, 0x7A); } if (exemplars.containsSome(0xAC00, 0xD7A3)) { // Hangul syllables // cut down to small list exemplars.remove(0xAC00, 0xD7A3). add(0xAC00).add(0xB098).add(0xB2E4).add(0xB77C). add(0xB9C8).add(0xBC14).add(0xC0AC).add(0xC544). add(0xC790).add(0xCC28).add(0xCE74).add(0xD0C0). add(0xD30C).add(0xD558); } if (exemplars.containsSome(0x1200, 0x137F)) { // Ethiopic block // cut down to small list // make use of the fact that Ethiopic is allocated in 8's, where // the base is 0 mod 8. UnicodeSet ethiopic( UNICODE_STRING_SIMPLE("[[:Block=Ethiopic:]&[:Script=Ethiopic:]]"), status); UnicodeSetIterator it(ethiopic); while (it.next() && !it.isString()) { if ((it.getCodepoint() & 0x7) != 0) { exemplars.remove(it.getCodepoint()); } } } // Upper-case any that aren't already so. // (We only do this for synthesized index characters.) UnicodeSetIterator it(exemplars); UnicodeString upperC; while (it.next()) { const UnicodeString &exemplarC = it.getString(); upperC = exemplarC; upperC.toUpper(locale); initialLabels_->add(upperC); } }
ResourceBundlePtr ResourceBundle::getBundle(const String& baseName, const Locale& locale) { String bundleName; istream * bundleStream; PropertyResourceBundlePtr resourceBundle, previous; std::vector<String> bundlesNames; if (!locale.getVariant().empty()) { bundlesNames.push_back(baseName + _T("_") + locale.getLanguage() + _T("_") + locale.getCountry() + _T("_") + locale.getVariant()); } if (!locale.getCountry().empty()) { bundlesNames.push_back(baseName + _T("_") + locale.getLanguage() + _T("_") + locale.getCountry()); } if (!locale.getLanguage().empty()) { bundlesNames.push_back(baseName + _T("_") + locale.getLanguage()); } bundlesNames.push_back(baseName); for (std::vector<String>::iterator it = bundlesNames.begin(); it != bundlesNames.end(); it++) { bundleName = *it; PropertyResourceBundlePtr current; try { const Class& classObj = Loader::loadClass(bundleName); current = classObj.newInstance(); } catch(ClassNotFoundException&) { current = 0; } if (current == 0) { bundleStream = Loader::getResourceAsStream(bundleName + _T(".properties")); if (bundleStream == 0) { continue; } } try { current = new PropertyResourceBundle(*bundleStream); } catch(Exception&) { delete bundleStream; bundleStream = 0; throw; } delete bundleStream; bundleStream = 0; if (resourceBundle == 0) { resourceBundle = current; previous = current; } else { previous->setParent(current); previous = current; } } if (resourceBundle == 0) { throw MissingResourceException(); } return resourceBundle; }
UnicodeString& LocaleDisplayNamesImpl::localeDisplayName(const Locale& locale, UnicodeString& result) const { UnicodeString resultName; const char* lang = locale.getLanguage(); if (uprv_strlen(lang) == 0) { lang = "root"; } const char* script = locale.getScript(); const char* country = locale.getCountry(); const char* variant = locale.getVariant(); UBool hasScript = uprv_strlen(script) > 0; UBool hasCountry = uprv_strlen(country) > 0; UBool hasVariant = uprv_strlen(variant) > 0; if (dialectHandling == ULDN_DIALECT_NAMES) { char buffer[ULOC_FULLNAME_CAPACITY]; do { // loop construct is so we can break early out of search if (hasScript && hasCountry) { ncat(buffer, ULOC_FULLNAME_CAPACITY, lang, "_", script, "_", country, (char *)0); localeIdName(buffer, resultName); if (!resultName.isBogus()) { hasScript = FALSE; hasCountry = FALSE; break; } } if (hasScript) { ncat(buffer, ULOC_FULLNAME_CAPACITY, lang, "_", script, (char *)0); localeIdName(buffer, resultName); if (!resultName.isBogus()) { hasScript = FALSE; break; } } if (hasCountry) { ncat(buffer, ULOC_FULLNAME_CAPACITY, lang, "_", country, (char*)0); localeIdName(buffer, resultName); if (!resultName.isBogus()) { hasCountry = FALSE; break; } } } while (FALSE); } if (resultName.isBogus() || resultName.isEmpty()) { localeIdName(lang, resultName); } UnicodeString resultRemainder; UnicodeString temp; StringEnumeration *e = NULL; UErrorCode status = U_ZERO_ERROR; if (hasScript) { resultRemainder.append(scriptDisplayName(script, temp)); } if (hasCountry) { appendWithSep(resultRemainder, regionDisplayName(country, temp)); } if (hasVariant) { appendWithSep(resultRemainder, variantDisplayName(variant, temp)); } e = locale.createKeywords(status); if (e && U_SUCCESS(status)) { UnicodeString temp2; char value[ULOC_KEYWORD_AND_VALUES_CAPACITY]; // sigh, no ULOC_VALUE_CAPACITY const char* key; while ((key = e->next((int32_t *)0, status)) != NULL) { locale.getKeywordValue(key, value, ULOC_KEYWORD_AND_VALUES_CAPACITY, status); keyDisplayName(key, temp); keyValueDisplayName(key, value, temp2); if (temp2 != UnicodeString(value, -1, US_INV)) { appendWithSep(resultRemainder, temp2); } else if (temp != UnicodeString(key, -1, US_INV)) { UnicodeString temp3; Formattable data[] = { temp, temp2 }; FieldPosition fpos; status = U_ZERO_ERROR; keyTypeFormat->format(data, 2, temp3, fpos, status); appendWithSep(resultRemainder, temp3); } else { appendWithSep(resultRemainder, temp) .append((UChar)0x3d /* = */) .append(temp2); } } delete e; } if (!resultRemainder.isEmpty()) { Formattable data[] = { resultName, resultRemainder }; FieldPosition fpos; status = U_ZERO_ERROR; format->format(data, 2, result, fpos, status); return result; } return result = resultName; }
RuleBasedNumberFormat::RuleBasedNumberFormat(URBNFRuleSetTag tag, const Locale& alocale, UErrorCode& status) : ruleSets(NULL) , defaultRuleSet(NULL) , locale(alocale) , collator(NULL) , decimalFormatSymbols(NULL) , lenient(FALSE) , lenientParseRules(NULL) , localizations(NULL) { if (U_FAILURE(status)) { return; } const char* rules_tag = "RBNFRules"; const char* fmt_tag = ""; switch (tag) { case URBNF_SPELLOUT: fmt_tag = "SpelloutRules"; break; case URBNF_ORDINAL: fmt_tag = "OrdinalRules"; break; case URBNF_DURATION: fmt_tag = "DurationRules"; break; case URBNF_NUMBERING_SYSTEM: fmt_tag = "NumberingSystemRules"; break; default: status = U_ILLEGAL_ARGUMENT_ERROR; return; } // TODO: read localization info from resource LocalizationInfo* locinfo = NULL; UResourceBundle* nfrb = ures_open(U_ICUDATA_RBNF, locale.getName(), &status); if (U_SUCCESS(status)) { setLocaleIDs(ures_getLocaleByType(nfrb, ULOC_VALID_LOCALE, &status), ures_getLocaleByType(nfrb, ULOC_ACTUAL_LOCALE, &status)); UResourceBundle* rbnfRules = ures_getByKeyWithFallback(nfrb, rules_tag, NULL, &status); if (U_FAILURE(status)) { ures_close(nfrb); } UResourceBundle* ruleSets = ures_getByKeyWithFallback(rbnfRules, fmt_tag, NULL, &status); if (U_FAILURE(status)) { ures_close(rbnfRules); ures_close(nfrb); return; } UnicodeString desc; while (ures_hasNext(ruleSets)) { desc.append(ures_getNextUnicodeString(ruleSets,NULL,&status)); } UParseError perror; init (desc, locinfo, perror, status); //TODO: we need a real fix - see #6895 / #6896 noParse = FALSE; if (tag == URBNF_SPELLOUT) { const char *lang = alocale.getLanguage(); for (int32_t i = 0; NO_SPELLOUT_PARSE_LANGUAGES[i] != NULL; i++) { if (uprv_strcmp(lang, NO_SPELLOUT_PARSE_LANGUAGES[i]) == 0) { noParse = TRUE; break; } } } //TODO: end ures_close(ruleSets); ures_close(rbnfRules); } ures_close(nfrb); }