void CollationServiceTest::TestRegisterFactory(void) { #if !UCONFIG_NO_SERVICE int32_t n1, n2, n3; Locale fu_FU("fu", "FU", ""); Locale fu_FU_FOO("fu", "FU", "FOO"); UErrorCode status = U_ZERO_ERROR; Hashtable* fuFUNames = new Hashtable(FALSE, status); if (!fuFUNames) { errln("memory allocation error"); return; } fuFUNames->setValueDeleter(uprv_deleteUObject); fuFUNames->put(fu_FU.getName(), new UnicodeString("ze leetle bunny Fu-Fu"), status); fuFUNames->put(fu_FU_FOO.getName(), new UnicodeString("zee leetel bunny Foo-Foo"), status); fuFUNames->put(Locale::getDefault().getName(), new UnicodeString("little bunny Foo Foo"), status); Collator* frcol = Collator::createInstance(Locale::getFrance(), status); Collator* gecol = Collator::createInstance(Locale::getGermany(), status); Collator* jpcol = Collator::createInstance(Locale::getJapan(), status); if(U_FAILURE(status)) { errcheckln(status, "Failed to create collators with %s", u_errorName(status)); delete frcol; delete gecol; delete jpcol; delete fuFUNames; return; } CollatorInfo** info = new CollatorInfo*[4]; if (!info) { errln("memory allocation error"); return; } info[0] = new CollatorInfo(Locale::getUS(), frcol, NULL); info[1] = new CollatorInfo(Locale::getFrance(), gecol, NULL); info[2] = new CollatorInfo(fu_FU, jpcol, fuFUNames); info[3] = NULL; TestFactory* factory = new TestFactory(info); if (!factory) { errln("memory allocation error"); return; } Collator* uscol = Collator::createInstance(Locale::getUS(), status); Collator* fucol = Collator::createInstance(fu_FU, status); { n1 = checkAvailable("before registerFactory"); URegistryKey key = Collator::registerFactory(factory, status); n2 = checkAvailable("after registerFactory"); assertTrue("count after > count before", n2 > n1); Collator* ncol = Collator::createInstance(Locale::getUS(), status); if (*frcol != *ncol) { errln("frcoll for en_US failed"); } delete ncol; ncol = NULL; ncol = Collator::createInstance(fu_FU_FOO, status); if (*jpcol != *ncol) { errln("jpcol for fu_FU_FOO failed"); } // The requested locale may be the same as the valid locale, // or may not be supported at all. See ticket #10477. Locale loc = ncol->getLocale(ULOC_REQUESTED_LOCALE, status); if (U_SUCCESS(status) && loc != fu_FU_FOO && loc != fu_FU) { errln(UnicodeString("requested locale for fu_FU_FOO is not fu_FU_FOO nor fu_FU but ") + loc.getName()); } status = U_ZERO_ERROR; loc = ncol->getLocale(ULOC_VALID_LOCALE, status); if (loc != fu_FU) { errln(UnicodeString("valid locale for fu_FU_FOO is not fu_FU but ") + loc.getName()); } delete ncol; ncol = NULL; UnicodeString locName = fu_FU.getName(); StringEnumeration* localeEnum = Collator::getAvailableLocales(); UBool found = FALSE; const UnicodeString* locStr; for (locStr = localeEnum->snext(status); !found && locStr != NULL; locStr = localeEnum->snext(status)) { if (locName == *locStr) { found = TRUE; } } delete localeEnum; if (!found) { errln("new locale fu_FU not reported as supported locale"); } UnicodeString name; Collator::getDisplayName(fu_FU, name); if (name != "little bunny Foo Foo") { errln(UnicodeString("found ") + name + " for fu_FU"); } Collator::getDisplayName(fu_FU, fu_FU_FOO, name); if (name != "zee leetel bunny Foo-Foo") { errln(UnicodeString("found ") + name + " for fu_FU in fu_FU_FOO"); } if (!Collator::unregister(key, status)) { errln("failed to unregister factory"); } // ja, fr, ge collators no longer valid ncol = Collator::createInstance(fu_FU, status); if (*fucol != *ncol) { errln("collator after unregister does not match original fu_FU"); } delete ncol; n3 = checkAvailable("after unregister"); assertTrue("count after unregister == count before register", n3 == n1); } delete fucol; delete uscol; #endif }
QVariant ChartItemModel::data( const QModelIndex &index, int role ) const { QVariant result; if ( role == Qt::DisplayRole ) { if ( ! m_localizeValues ) { return data( index, Qt::EditRole ); } else { QLocale locale; // TODO: temporary workaround while KLocale/money logic still used Locale *planLocale; Locale *tmpPlanLocale = 0; if (project()) { planLocale = project()->locale(); } else { tmpPlanLocale = new Locale(); planLocale = tmpPlanLocale; } switch ( index.column() ) { case BCWSCost: result = planLocale->formatMoney( bcwsCost( index.row() ), QString(), 0 ); break; case BCWPCost: result = planLocale->formatMoney( bcwpCost( index.row() ), QString(), 0 ); break; case ACWPCost: result = planLocale->formatMoney( acwpCost( index.row() ), QString(), 0 ); break; case BCWSEffort: result = locale.toString( bcwsEffort( index.row() ), 'f', 0 ); break; case BCWPEffort: result = locale.toString( bcwpEffort( index.row() ), 'f', 0 ); break; case ACWPEffort: result = locale.toString( acwpEffort( index.row() ), 'f', 0 ); break; case SPICost: result = locale.toString( spiCost( index.row() ), 'f', 2 ); break; case CPICost: result = locale.toString( cpiCost( index.row() ), 'f', 2 ); break; case SPIEffort: result = locale.toString( spiEffort( index.row() ), 'f', 2 ); break; case CPIEffort: result = locale.toString( cpiEffort( index.row() ), 'f', 2 ); break; default: break; } delete tmpPlanLocale; } //debugPlan<<index<<role<<result; return result; } else if ( role == Qt::EditRole ) { switch ( index.column() ) { case BCWSCost: result = bcwsCost( index.row() ); break; case BCWPCost: result = bcwpCost( index.row() ); break; case ACWPCost: result = acwpCost( index.row() ); break; case BCWSEffort: result = bcwsEffort( index.row() ); break; case BCWPEffort: result = bcwpEffort( index.row() ); break; case ACWPEffort: result = acwpEffort( index.row() ); break; case SPICost: result = spiCost( index.row() ); break; case CPICost: result = cpiCost( index.row() ); break; case SPIEffort: result = spiEffort( index.row() ); break; case CPIEffort: result = cpiEffort( index.row() ); break; default: break; } //debugPlan<<index<<role<<result; return result; } else if ( role == Qt::ForegroundRole ) { double v = 0.0; switch ( index.column() ) { case SPICost: v = spiCost( index.row() ); break; case CPICost: v = cpiCost( index.row() ); break; case SPIEffort: v = spiEffort( index.row() ); break; case CPIEffort: v = cpiEffort( index.row() ); break; default: break; } if ( v > 0.0 && v < 1.0 ) { result = QBrush( Qt::red ); } return result; } else if ( role == KChart::DatasetBrushRole ) { return headerData( index.column(), Qt::Horizontal, role ); } else if ( role == KChart::DatasetPenRole ) { return headerData( index.column(), Qt::Horizontal, role ); } //debugPlan<<index<<role<<result; return result; }
CalendarData::CalendarData(const Locale& loc, const char *type, UErrorCode& status) : fFillin(NULL), fOtherFillin(NULL), fBundle(NULL), fFallback(NULL) { initData(loc.getBaseName(), type, status); }
void DecimalFormatSymbols::initialize(const Locale& loc, UErrorCode& status, UBool useLastResortData) { static const char *gNumberElementKeys[kFormatSymbolCount] = { "decimal", "group", "list", "percentSign", NULL, /* Native zero digit is deprecated from CLDR - get it from the numbering system */ NULL, /* Pattern digit character is deprecated from CLDR - use # by default always */ "minusSign", "plusSign", NULL, /* currency symbol - We don't really try to load this directly from CLDR until we know the currency */ NULL, /* intl currency symbol - We don't really try to load this directly from CLDR until we know the currency */ "currencyDecimal", "exponential", "perMille", NULL, /* Escape padding character - not in CLDR */ "infinity", "nan", NULL, /* Significant digit symbol - not in CLDR */ "currencyGroup", NULL, /* one digit - get it from the numbering system */ NULL, /* two digit - get it from the numbering system */ NULL, /* three digit - get it from the numbering system */ NULL, /* four digit - get it from the numbering system */ NULL, /* five digit - get it from the numbering system */ NULL, /* six digit - get it from the numbering system */ NULL, /* seven digit - get it from the numbering system */ NULL, /* eight digit - get it from the numbering system */ NULL, /* nine digit - get it from the numbering system */ }; static const char *gLatn = "latn"; static const char *gSymbols = "symbols"; const char *nsName; const UChar *sym = NULL; int32_t len = 0; *validLocale = *actualLocale = 0; currPattern = NULL; if (U_FAILURE(status)) return; const char* locStr = loc.getName(); UResourceBundle *resource = ures_open((char *)0, locStr, &status); UResourceBundle *numberElementsRes = ures_getByKeyWithFallback(resource, gNumberElements, NULL, &status); if (U_FAILURE(status)) { if ( useLastResortData ) { status = U_USING_DEFAULT_WARNING; initialize(); } return; } else { // First initialize all the symbols to the fallbacks for anything we can't find initialize(); // // Next get the numbering system for this locale and set zero digit // and the digit string based on the numbering system for the locale // NumberingSystem* ns = NumberingSystem::createInstance(loc,status); if (U_SUCCESS(status) && ns->getRadix() == 10 && !ns->isAlgorithmic()) { nsName = ns->getName(); UnicodeString digitString(ns->getDescription()); setSymbol(kZeroDigitSymbol, digitString.tempSubString(0, 1), FALSE); setSymbol(kOneDigitSymbol, digitString.tempSubString(1, 1), FALSE); setSymbol(kTwoDigitSymbol, digitString.tempSubString(2, 1), FALSE); setSymbol(kThreeDigitSymbol, digitString.tempSubString(3, 1), FALSE); setSymbol(kFourDigitSymbol, digitString.tempSubString(4, 1), FALSE); setSymbol(kFiveDigitSymbol, digitString.tempSubString(5, 1), FALSE); setSymbol(kSixDigitSymbol, digitString.tempSubString(6, 1), FALSE); setSymbol(kSevenDigitSymbol, digitString.tempSubString(7, 1), FALSE); setSymbol(kEightDigitSymbol, digitString.tempSubString(8, 1), FALSE); setSymbol(kNineDigitSymbol, digitString.tempSubString(9, 1), FALSE); } else { nsName = gLatn; } UBool isLatn = !uprv_strcmp(nsName,gLatn); UErrorCode nlStatus = U_ZERO_ERROR; UResourceBundle *nonLatnSymbols = NULL; if ( !isLatn ) { nonLatnSymbols = ures_getByKeyWithFallback(numberElementsRes, nsName, NULL, &nlStatus); nonLatnSymbols = ures_getByKeyWithFallback(nonLatnSymbols, gSymbols, nonLatnSymbols, &nlStatus); } UResourceBundle *latnSymbols = ures_getByKeyWithFallback(numberElementsRes, gLatn, NULL, &status); latnSymbols = ures_getByKeyWithFallback(latnSymbols, gSymbols, latnSymbols, &status); UBool kMonetaryDecimalSet = FALSE; UBool kMonetaryGroupingSet = FALSE; for(int32_t i = 0; i<kFormatSymbolCount; i++) { if ( gNumberElementKeys[i] != NULL ) { UErrorCode localStatus = U_ZERO_ERROR; if ( !isLatn ) { sym = ures_getStringByKeyWithFallback(nonLatnSymbols,gNumberElementKeys[i],&len,&localStatus); // If we can't find the symbol in the numbering system specific resources, // use the "latn" numbering system as the fallback. if ( U_FAILURE(localStatus) ) { localStatus = U_ZERO_ERROR; sym = ures_getStringByKeyWithFallback(latnSymbols,gNumberElementKeys[i],&len,&localStatus); } } else { sym = ures_getStringByKeyWithFallback(latnSymbols,gNumberElementKeys[i],&len,&localStatus); } if ( U_SUCCESS(localStatus) ) { setSymbol((ENumberFormatSymbol)i, UnicodeString(TRUE, sym, len)); if ( i == kMonetarySeparatorSymbol ) { kMonetaryDecimalSet = TRUE; } else if ( i == kMonetaryGroupingSeparatorSymbol ) { kMonetaryGroupingSet = TRUE; } } } } ures_close(latnSymbols); if ( !isLatn ) { ures_close(nonLatnSymbols); } // If monetary decimal or grouping were not explicitly set, then set them to be the // same as their non-monetary counterparts. if ( !kMonetaryDecimalSet ) { setSymbol(kMonetarySeparatorSymbol,fSymbols[kDecimalSeparatorSymbol]); } if ( !kMonetaryGroupingSet ) { setSymbol(kMonetaryGroupingSeparatorSymbol,fSymbols[kGroupingSeparatorSymbol]); } if (ns) { delete ns; } // Obtain currency data from the currency API. This is strictly // for backward compatibility; we don't use DecimalFormatSymbols // for currency data anymore. UErrorCode internalStatus = U_ZERO_ERROR; // don't propagate failures out UChar curriso[4]; UnicodeString tempStr; ucurr_forLocale(locStr, curriso, 4, &internalStatus); // Reuse numberElements[0] as a temporary buffer uprv_getStaticCurrencyName(curriso, locStr, tempStr, internalStatus); if (U_SUCCESS(internalStatus)) { fSymbols[kIntlCurrencySymbol].setTo(curriso, -1); fSymbols[kCurrencySymbol] = tempStr; } /* else use the default values. */ U_LOCALE_BASED(locBased, *this); locBased.setLocaleIDs(ures_getLocaleByType(numberElementsRes, ULOC_VALID_LOCALE, &status), ures_getLocaleByType(numberElementsRes, ULOC_ACTUAL_LOCALE, &status)); //load the currency data UChar ucc[4]={0}; //Currency Codes are always 3 chars long int32_t uccLen = 4; const char* locName = loc.getName(); UErrorCode localStatus = U_ZERO_ERROR; uccLen = ucurr_forLocale(locName, ucc, uccLen, &localStatus); if(U_SUCCESS(localStatus) && uccLen > 0) { char cc[4]={0}; u_UCharsToChars(ucc, cc, uccLen); /* An explicit currency was requested */ UResourceBundle *currencyResource = ures_open(U_ICUDATA_CURR, locStr, &localStatus); UResourceBundle *currency = ures_getByKeyWithFallback(currencyResource, "Currencies", NULL, &localStatus); currency = ures_getByKeyWithFallback(currency, cc, currency, &localStatus); if(U_SUCCESS(localStatus) && ures_getSize(currency)>2) { // the length is 3 if more data is present currency = ures_getByIndex(currency, 2, currency, &localStatus); int32_t currPatternLen = 0; currPattern = ures_getStringByIndex(currency, (int32_t)0, &currPatternLen, &localStatus); UnicodeString decimalSep = ures_getUnicodeStringByIndex(currency, (int32_t)1, &localStatus); UnicodeString groupingSep = ures_getUnicodeStringByIndex(currency, (int32_t)2, &localStatus); if(U_SUCCESS(localStatus)){ fSymbols[kMonetaryGroupingSeparatorSymbol] = groupingSep; fSymbols[kMonetarySeparatorSymbol] = decimalSep; //pattern.setTo(TRUE, currPattern, currPatternLen); status = localStatus; } } ures_close(currency); ures_close(currencyResource); /* else An explicit currency was requested and is unknown or locale data is malformed. */ /* ucurr_* API will get the correct value later on. */ } // else ignore the error if no currency // Currency Spacing. localStatus = U_ZERO_ERROR; UResourceBundle *currencyResource = ures_open(U_ICUDATA_CURR, locStr, &localStatus); UResourceBundle *currencySpcRes = ures_getByKeyWithFallback(currencyResource, gCurrencySpacingTag, NULL, &localStatus); if (localStatus == U_USING_FALLBACK_WARNING || U_SUCCESS(localStatus)) { const char* keywords[UNUM_CURRENCY_SPACING_COUNT] = { gCurrencyMatchTag, gCurrencySudMatchTag, gCurrencyInsertBtnTag }; localStatus = U_ZERO_ERROR; UResourceBundle *dataRes = ures_getByKeyWithFallback(currencySpcRes, gBeforeCurrencyTag, NULL, &localStatus); if (localStatus == U_USING_FALLBACK_WARNING || U_SUCCESS(localStatus)) { localStatus = U_ZERO_ERROR; for (int32_t i = 0; i < UNUM_CURRENCY_SPACING_COUNT; i++) { currencySpcBeforeSym[i] = ures_getUnicodeStringByKey(dataRes, keywords[i], &localStatus); } ures_close(dataRes); } dataRes = ures_getByKeyWithFallback(currencySpcRes, gAfterCurrencyTag, NULL, &localStatus); if (localStatus == U_USING_FALLBACK_WARNING || U_SUCCESS(localStatus)) { localStatus = U_ZERO_ERROR; for (int32_t i = 0; i < UNUM_CURRENCY_SPACING_COUNT; i++) { currencySpcAfterSym[i] = ures_getUnicodeStringByKey(dataRes, keywords[i], &localStatus); } ures_close(dataRes); } ures_close(currencySpcRes); ures_close(currencyResource); } } ures_close(resource); ures_close(numberElementsRes); }
void CurrencyPluralInfo::setupCurrencyPluralPattern(const Locale& loc, UErrorCode& status) { if (U_FAILURE(status)) { return; } if (fPluralCountToCurrencyUnitPattern) { deleteHash(fPluralCountToCurrencyUnitPattern); } fPluralCountToCurrencyUnitPattern = initHash(status); if (U_FAILURE(status)) { return; } UErrorCode ec = U_ZERO_ERROR; UResourceBundle *rb = ures_open(NULL, loc.getName(), &ec); rb = ures_getByKey(rb, gNumberElementsTag, rb, &ec); rb = ures_getByKey(rb, gLatnTag, rb, &ec); rb = ures_getByKey(rb, gPatternsTag, rb, &ec); int32_t ptnLen; const UChar* numberStylePattern = ures_getStringByKeyWithFallback(rb, gDecimalFormatTag, &ptnLen, &ec); int32_t numberStylePatternLen = ptnLen; const UChar* negNumberStylePattern = NULL; int32_t negNumberStylePatternLen = 0; // TODO: Java // parse to check whether there is ";" separator in the numberStylePattern UBool hasSeparator = false; if (U_SUCCESS(ec)) { for (int32_t styleCharIndex = 0; styleCharIndex < ptnLen; ++styleCharIndex) { if (numberStylePattern[styleCharIndex] == gNumberPatternSeparator) { hasSeparator = true; // split the number style pattern into positive and negative negNumberStylePattern = numberStylePattern + styleCharIndex + 1; negNumberStylePatternLen = ptnLen - styleCharIndex - 1; numberStylePatternLen = styleCharIndex; } } } ures_close(rb); if (U_FAILURE(ec)) { return; } UResourceBundle *currRb = ures_open(U_ICUDATA_CURR, loc.getName(), &ec); UResourceBundle *currencyRes = ures_getByKeyWithFallback(currRb, gCurrUnitPtnTag, NULL, &ec); #ifdef CURRENCY_PLURAL_INFO_DEBUG std::cout << "in set up\n"; #endif StringEnumeration* keywords = fPluralRules->getKeywords(ec); if (U_SUCCESS(ec)) { const char* pluralCount; while ((pluralCount = keywords->next(NULL, ec)) != NULL) { if ( U_SUCCESS(ec) ) { int32_t ptnLen; UErrorCode err = U_ZERO_ERROR; const UChar* patternChars = ures_getStringByKeyWithFallback( currencyRes, pluralCount, &ptnLen, &err); if (U_SUCCESS(err) && ptnLen > 0) { UnicodeString* pattern = new UnicodeString(patternChars, ptnLen); #ifdef CURRENCY_PLURAL_INFO_DEBUG char result_1[1000]; pattern->extract(0, pattern->length(), result_1, "UTF-8"); std::cout << "pluralCount: " << pluralCount << "; pattern: " << result_1 << "\n"; #endif pattern->findAndReplace(gPart0, UnicodeString(numberStylePattern, numberStylePatternLen)); pattern->findAndReplace(gPart1, gTripleCurrencySign); if (hasSeparator) { UnicodeString negPattern(patternChars, ptnLen); negPattern.findAndReplace(gPart0, UnicodeString(negNumberStylePattern, negNumberStylePatternLen)); negPattern.findAndReplace(gPart1, gTripleCurrencySign); pattern->append(gNumberPatternSeparator); pattern->append(negPattern); } #ifdef CURRENCY_PLURAL_INFO_DEBUG pattern->extract(0, pattern->length(), result_1, "UTF-8"); std::cout << "pluralCount: " << pluralCount << "; pattern: " << result_1 << "\n"; #endif fPluralCountToCurrencyUnitPattern->put(UnicodeString(pluralCount), pattern, status); } } } } delete keywords; ures_close(currencyRes); ures_close(currRb); }
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; }
void getSupportedKeySizes(Locale& locale, Vector<String>& sizes) { sizes.resize(2); sizes[0] = locale.queryString(blink::WebLocalizedString::KeygenMenuHighGradeKeySize); sizes[1] = locale.queryString(blink::WebLocalizedString::KeygenMenuMediumGradeKeySize); }
std::string L10n::GetLocaleCountry(const std::string& locale) const { Locale loc = Locale::createCanonical(locale.c_str()); return loc.getCountry(); }
void TZGNCore::initialize(const Locale& locale, UErrorCode& status) { if (U_FAILURE(status)) { return; } // TimeZoneNames fTimeZoneNames = TimeZoneNames::createInstance(locale, status); if (U_FAILURE(status)) { return; } // Initialize format patterns UnicodeString rpat(TRUE, gDefRegionPattern, -1); UnicodeString fpat(TRUE, gDefFallbackPattern, -1); UErrorCode tmpsts = U_ZERO_ERROR; // OK with fallback warning.. UResourceBundle *zoneStrings = ures_open(U_ICUDATA_ZONE, locale.getName(), &tmpsts); zoneStrings = ures_getByKeyWithFallback(zoneStrings, gZoneStrings, zoneStrings, &tmpsts); if (U_SUCCESS(tmpsts)) { const UChar *regionPattern = ures_getStringByKeyWithFallback(zoneStrings, gRegionFormatTag, NULL, &tmpsts); if (U_SUCCESS(tmpsts) && u_strlen(regionPattern) > 0) { rpat.setTo(regionPattern, -1); } tmpsts = U_ZERO_ERROR; const UChar *fallbackPattern = ures_getStringByKeyWithFallback(zoneStrings, gFallbackFormatTag, NULL, &tmpsts); if (U_SUCCESS(tmpsts) && u_strlen(fallbackPattern) > 0) { fpat.setTo(fallbackPattern, -1); } } ures_close(zoneStrings); fRegionFormat = new MessageFormat(rpat, status); if (fRegionFormat == NULL) { status = U_MEMORY_ALLOCATION_ERROR; } fFallbackFormat = new MessageFormat(fpat, status); if (fFallbackFormat == NULL) { status = U_MEMORY_ALLOCATION_ERROR; } if (U_FAILURE(status)) { cleanup(); return; } // locale display names fLocaleDisplayNames = LocaleDisplayNames::createInstance(locale); // hash table for names - no key/value deleters fLocationNamesMap = uhash_open(uhash_hashUChars, uhash_compareUChars, NULL, &status); if (U_FAILURE(status)) { cleanup(); return; } fPartialLocationNamesMap = uhash_open(hashPartialLocationKey, comparePartialLocationKey, NULL, &status); if (U_FAILURE(status)) { cleanup(); return; } uhash_setKeyDeleter(fPartialLocationNamesMap, uprv_free); // no value deleter // target region const char* region = fLocale.getCountry(); int32_t regionLen = uprv_strlen(region); if (regionLen == 0) { char loc[ULOC_FULLNAME_CAPACITY]; uloc_addLikelySubtags(fLocale.getName(), loc, sizeof(loc), &status); regionLen = uloc_getCountry(loc, fTargetRegion, sizeof(fTargetRegion), &status); if (U_SUCCESS(status)) { fTargetRegion[regionLen] = 0; } else { cleanup(); return; } } else if (regionLen < (int32_t)sizeof(fTargetRegion)) { uprv_strcpy(fTargetRegion, region); } else { fTargetRegion[0] = 0; } // preload generic names for the default zone TimeZone *tz = TimeZone::createDefault(); const UChar *tzID = ZoneMeta::getCanonicalCLDRID(*tz); if (tzID != NULL) { loadStrings(UnicodeString(tzID)); } delete tz; }
TimeZoneNamesDelegate::TimeZoneNamesDelegate(const Locale& locale, UErrorCode& status) { Mutex lock(&gTimeZoneNamesLock); if (!gTimeZoneNamesCacheInitialized) { // Create empty hashtable if it is not already initialized. gTimeZoneNamesCache = uhash_open(uhash_hashChars, uhash_compareChars, NULL, &status); if (U_SUCCESS(status)) { uhash_setKeyDeleter(gTimeZoneNamesCache, uprv_free); uhash_setValueDeleter(gTimeZoneNamesCache, deleteTimeZoneNamesCacheEntry); gTimeZoneNamesCacheInitialized = TRUE; ucln_i18n_registerCleanup(UCLN_I18N_TIMEZONENAMES, timeZoneNames_cleanup); } } if (U_FAILURE(status)) { return; } // Check the cache, if not available, create new one and cache TimeZoneNamesCacheEntry *cacheEntry = NULL; const char *key = locale.getName(); cacheEntry = (TimeZoneNamesCacheEntry *)uhash_get(gTimeZoneNamesCache, key); if (cacheEntry == NULL) { TimeZoneNames *tznames = NULL; char *newKey = NULL; tznames = new TimeZoneNamesImpl(locale, status); if (tznames == NULL) { status = U_MEMORY_ALLOCATION_ERROR; } if (U_SUCCESS(status)) { newKey = (char *)uprv_malloc(uprv_strlen(key) + 1); if (newKey == NULL) { status = U_MEMORY_ALLOCATION_ERROR; } else { uprv_strcpy(newKey, key); } } if (U_SUCCESS(status)) { cacheEntry = (TimeZoneNamesCacheEntry *)uprv_malloc(sizeof(TimeZoneNamesCacheEntry)); if (cacheEntry == NULL) { status = U_MEMORY_ALLOCATION_ERROR; } else { cacheEntry->names = tznames; cacheEntry->refCount = 1; cacheEntry->lastAccess = (double)uprv_getUTCtime(); uhash_put(gTimeZoneNamesCache, newKey, cacheEntry, &status); } } if (U_FAILURE(status)) { if (tznames != NULL) { delete tznames; } if (newKey != NULL) { uprv_free(newKey); } if (cacheEntry != NULL) { uprv_free(cacheEntry); } cacheEntry = NULL; } } else { // Update the reference count cacheEntry->refCount++; cacheEntry->lastAccess = (double)uprv_getUTCtime(); } gAccessCount++; if (gAccessCount >= SWEEP_INTERVAL) { // sweep sweepCache(); gAccessCount = 0; } fTZnamesCacheEntry = cacheEntry; }
virtual void run() { fTraceInfo = 1; LocalPointer<NumberFormat> percentFormatter; UErrorCode status = U_ZERO_ERROR; #if 0 // debugging code, for (int i=0; i<4000; i++) { status = U_ZERO_ERROR; UDataMemory *data1 = udata_openChoice(0, "res", "en_US", isAcceptable, 0, &status); UDataMemory *data2 = udata_openChoice(0, "res", "fr", isAcceptable, 0, &status); udata_close(data1); udata_close(data2); if (U_FAILURE(status)) { error("udata_openChoice failed.\n"); break; } } return; #endif #if 0 // debugging code, int m; for (m=0; m<4000; m++) { status = U_ZERO_ERROR; UResourceBundle *res = NULL; const char *localeName = NULL; Locale loc = Locale::getEnglish(); localeName = loc.getName(); // localeName = "en"; // ResourceBundle bund = ResourceBundle(0, loc, status); //umtx_lock(&gDebugMutex); res = ures_open(NULL, localeName, &status); //umtx_unlock(&gDebugMutex); //umtx_lock(&gDebugMutex); ures_close(res); //umtx_unlock(&gDebugMutex); if (U_FAILURE(status)) { error("Resource bundle construction failed.\n"); break; } } return; #endif // Keep this data here to avoid static initialization. FormatThreadTestData kNumberFormatTestData[] = { FormatThreadTestData((double)5.0, UnicodeString("5", "")), FormatThreadTestData( 6.0, UnicodeString("6", "")), FormatThreadTestData( 20.0, UnicodeString("20", "")), FormatThreadTestData( 8.0, UnicodeString("8", "")), FormatThreadTestData( 8.3, UnicodeString("8.3", "")), FormatThreadTestData( 12345, UnicodeString("12,345", "")), FormatThreadTestData( 81890.23, UnicodeString("81,890.23", "")), }; int32_t kNumberFormatTestDataLength = UPRV_LENGTHOF(kNumberFormatTestData); // Keep this data here to avoid static initialization. FormatThreadTestData kPercentFormatTestData[] = { FormatThreadTestData((double)5.0, CharsToUnicodeString("500\\u00a0%")), FormatThreadTestData( 1.0, CharsToUnicodeString("100\\u00a0%")), FormatThreadTestData( 0.26, CharsToUnicodeString("26\\u00a0%")), FormatThreadTestData( 16384.99, CharsToUnicodeString("1\\u00a0638\\u00a0499\\u00a0%")), // U+00a0 = NBSP FormatThreadTestData( 81890.23, CharsToUnicodeString("8\\u00a0189\\u00a0023\\u00a0%")), }; int32_t kPercentFormatTestDataLength = UPRV_LENGTHOF(kPercentFormatTestData); int32_t iteration; status = U_ZERO_ERROR; LocalPointer<NumberFormat> formatter(NumberFormat::createInstance(Locale::getEnglish(),status)); if(U_FAILURE(status)) { IntlTest::gTest->dataerrln("%s:%d Error %s on NumberFormat::createInstance().", __FILE__, __LINE__, u_errorName(status)); goto cleanupAndReturn; } percentFormatter.adoptInstead(NumberFormat::createPercentInstance(Locale::getFrench(),status)); if(U_FAILURE(status)) { IntlTest::gTest->errln("%s:%d Error %s on NumberFormat::createPercentInstance().", __FILE__, __LINE__, u_errorName(status)); goto cleanupAndReturn; } for(iteration = 0;!IntlTest::gTest->getErrors() && iteration<kFormatThreadIterations;iteration++) { int32_t whichLine = (iteration + fOffset)%kNumberFormatTestDataLength; UnicodeString output; formatter->format(kNumberFormatTestData[whichLine].number, output); if(0 != output.compare(kNumberFormatTestData[whichLine].string)) { IntlTest::gTest->errln("format().. expected " + kNumberFormatTestData[whichLine].string + " got " + output); goto cleanupAndReturn; } // Now check percent. output.remove(); whichLine = (iteration + fOffset)%kPercentFormatTestDataLength; percentFormatter->format(kPercentFormatTestData[whichLine].number, output); if(0 != output.compare(kPercentFormatTestData[whichLine].string)) { IntlTest::gTest->errln("percent format().. \n" + showDifference(kPercentFormatTestData[whichLine].string,output)); goto cleanupAndReturn; } // Test message error const int kNumberOfMessageTests = 3; UErrorCode statusToCheck; UnicodeString patternToCheck; Locale messageLocale; Locale countryToCheck; double currencyToCheck; UnicodeString expected; // load the cases. switch((iteration+fOffset) % kNumberOfMessageTests) { default: case 0: statusToCheck= U_FILE_ACCESS_ERROR; patternToCheck= "0:Someone from {2} is receiving a #{0}" " error - {1}. Their telephone call is costing " "{3,number,currency}."; // number,currency messageLocale= Locale("en","US"); countryToCheck= Locale("","HR"); currencyToCheck= 8192.77; expected= "0:Someone from Croatia is receiving a #4 error - " "U_FILE_ACCESS_ERROR. Their telephone call is costing $8,192.77."; break; case 1: statusToCheck= U_INDEX_OUTOFBOUNDS_ERROR; patternToCheck= "1:A customer in {2} is receiving a #{0} error - {1}. " "Their telephone call is costing {3,number,currency}."; // number,currency messageLocale= Locale("de","DE@currency=DEM"); countryToCheck= Locale("","BF"); currencyToCheck= 2.32; expected= CharsToUnicodeString( "1:A customer in Burkina Faso is receiving a #8 error - U_INDEX_OUTOFBOUNDS_ERROR. " "Their telephone call is costing 2,32\\u00A0DM."); break; case 2: statusToCheck= U_MEMORY_ALLOCATION_ERROR; patternToCheck= "2:user in {2} is receiving a #{0} error - {1}. " "They insist they just spent {3,number,currency} " "on memory."; // number,currency messageLocale= Locale("de","AT@currency=ATS"); // Austrian German countryToCheck= Locale("","US"); // hmm currencyToCheck= 40193.12; expected= CharsToUnicodeString( "2:user in Vereinigte Staaten is receiving a #7 error" " - U_MEMORY_ALLOCATION_ERROR. They insist they just spent" " \\u00f6S\\u00A040\\u00A0193,12 on memory."); break; } UnicodeString result; UErrorCode status = U_ZERO_ERROR; formatErrorMessage(status,patternToCheck,messageLocale,statusToCheck, countryToCheck,currencyToCheck,result); if(U_FAILURE(status)) { UnicodeString tmp(u_errorName(status)); IntlTest::gTest->errln("Failure on message format, pattern=" + patternToCheck + ", error = " + tmp); goto cleanupAndReturn; } if(result != expected) { IntlTest::gTest->errln("PatternFormat: \n" + showDifference(expected,result)); goto cleanupAndReturn; } // test the Thread Safe Format UnicodeString appendErr; if(!fTSF->doStuff(fNum, appendErr, status)) { IntlTest::gTest->errln(appendErr); goto cleanupAndReturn; } } /* end of for loop */ cleanupAndReturn: fTraceInfo = 2; }
void AlphabeticIndex::getIndexExemplars(UnicodeSet &dest, const Locale &locale, UErrorCode &status) { if (U_FAILURE(status)) { return; } LocalULocaleDataPointer uld(ulocdata_open(locale.getName(), &status)); UnicodeSet exemplars; ulocdata_getExemplarSet(uld.getAlias(), exemplars.toUSet(), 0, ULOCDATA_ES_INDEX, &status); if (U_SUCCESS(status)) { dest.addAll(exemplars); return; } status = U_ZERO_ERROR; // Clear out U_MISSING_RESOURCE_ERROR // 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; } // Upper-case any that aren't already so. // (We only do this for synthesized index characters.) UnicodeSetIterator it(exemplars); UnicodeString upperC; UnicodeSet lowersToRemove; UnicodeSet uppersToAdd; while (it.next()) { const UnicodeString &exemplarC = it.getString(); upperC = exemplarC; upperC.toUpper(locale); if (exemplarC != upperC) { lowersToRemove.add(exemplarC); uppersToAdd.add(upperC); } } exemplars.removeAll(lowersToRemove); exemplars.addAll(uppersToAdd); // get the exemplars, and handle special cases // question: should we add auxiliary exemplars? if (exemplars.containsSome(*CORE_LATIN)) { exemplars.addAll(*CORE_LATIN); } if (exemplars.containsSome(*HANGUL)) { // cut down to small list UnicodeSet BLOCK_HANGUL_SYLLABLES(UNICODE_STRING_SIMPLE("[:block=hangul_syllables:]"), status); exemplars.removeAll(BLOCK_HANGUL_SYLLABLES); exemplars.addAll(*HANGUL); } if (exemplars.containsSome(*ETHIOPIC)) { // cut down to small list // make use of the fact that Ethiopic is allocated in 8's, where // the base is 0 mod 8. UnicodeSetIterator it(*ETHIOPIC); while (it.next() && !it.isString()) { if ((it.getCodepoint() & 0x7) != 0) { exemplars.remove(it.getCodepoint()); } } } dest.addAll(exemplars); }
void NUMBER_Format(sLONG_PTR *pResult, PackagePtr pParams) { C_REAL Param1; C_TEXT Param2; C_LONGINT Param3; C_TEXT Param4; C_TEXT Param5; C_LONGINT returnValue; Param1.fromParamAtIndex(pParams, 1); Param3.fromParamAtIndex(pParams, 3); Param4.fromParamAtIndex(pParams, 4); Param5.fromParamAtIndex(pParams, 5); // --- write the code of NUMBER_Format here... UErrorCode status = U_ZERO_ERROR; UParseError perror; Locale locale; if(Param4.getUTF16Length()){ CUTF8String u; Param4.copyUTF8String(&u); Locale inLocale = Locale((const char *)u.c_str()); if(!inLocale.isBogus()){ locale = Locale(inLocale); }else{ status = U_ILLEGAL_ARGUMENT_ERROR; } } if(status == U_ZERO_ERROR){ int mode = Param3.getIntValue(); if(mode == NUMBER_FORMAT_CUSTOM){ if(Param5.getUTF16Length()){ UnicodeString rules = UnicodeString((const UChar *)Param5.getUTF16StringPtr()); RuleBasedNumberFormat fmt = RuleBasedNumberFormat(rules, locale, perror, status); if(status == U_ZERO_ERROR || status == U_USING_DEFAULT_WARNING || status == U_USING_FALLBACK_WARNING){ UnicodeString numberString; fmt.format(Param1.getDoubleValue(), numberString); DT::setUnicodeString(Param2, numberString); status = U_ZERO_ERROR; } }else{ status = U_ILLEGAL_ARGUMENT_ERROR; } }else{ switch (mode) { case NUMBER_FORMAT_SPELLOUT: case NUMBER_FORMAT_ORDINAL: case NUMBER_FORMAT_DURATION: case NUMBER_FORMAT_NUMBERING_SYSTEM: case NUMBER_FORMAT_COUNT: { RuleBasedNumberFormat fmt = RuleBasedNumberFormat((URBNFRuleSetTag)mode, locale, status); if(status == U_ZERO_ERROR || status == U_USING_DEFAULT_WARNING || status == U_USING_FALLBACK_WARNING){ UnicodeString numberString; fmt.format(Param1.getDoubleValue(), numberString); DT::setUnicodeString(Param2, numberString); status = U_ZERO_ERROR; } } break; default: status = U_ILLEGAL_ARGUMENT_ERROR; break; } } } Param2.toParamAtIndex(pParams, 2); returnValue.setIntValue(status); returnValue.setReturn(pResult); }
std::string L10n::GetDictionaryLocale(const std::string& configLocaleString) const { Locale out; GetDictionaryLocale(configLocaleString, out); return out.getName(); }
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); }
std::string L10n::GetLocaleBaseName(const std::string& locale) const { Locale loc = Locale::createCanonical(locale.c_str()); return loc.getBaseName(); }
int main( int argc, char *argv[] ) { int status; unsigned short i; if ( (argc < 3) || (argc > 4) ) { cerr << "Invalid number of arguments\n" "Usage: " << argv[0] << " <datafile> <outfile> [<gfxdir>]" << endl; exit(-1); } if ( SDL_Init(0) < 0 ) { cerr << "Couldn't init SDL: " << SDL_GetError() << endl; exit(-1); } atexit(SDL_Quit); status = 0; UnitsetHeader info; vector<EdUnitType> units; map<string, Language> names; CFParser parser; SectionHandler *h; UnitsetCallback cb; Locale locale; parser.AddHandler( "unitset", new UnitsetHandler( info ) ); h = new UnitHandler( info, units, names ); h->SetEnabled( false ); parser.AddHandler( "unit", h ); parser.SetCallback( &cb ); status = parser.Parse( argv[1] ); if ( status == 0 ) { // validate what we have parsed if ( info.images.size() == 0 ) { cerr << "Error: No images defined" << endl; status = -1; } else { if ( argc == 4 ) { string gfxdir( argv[3] ); append_path_delim( gfxdir ); info.images.insert( 0, gfxdir ); } if ( !File::Exists( info.images ) ) { cerr << "Error: Could not find file " << info.images << endl; status = -1; } } if ( units.size() == 0 ) { cerr << "Error: No units defined" << endl; status = -1; } for ( map<string, Language>::iterator it = names.begin(); it != names.end(); ++it ) { locale.AddLanguage( it->second ); } if ( !locale.SetDefaultLanguage( CF_LANG_DEFAULT ) ) { cerr << "Error: Could not find info for default language (" << CF_LANG_DEFAULT << ")" << endl; status = -1; } } if ( status == 0 ) { File out( argv[2] ); if ( !out.Open( "wb" ) ) { cerr << "Couldn't open output file " << argv[2] << endl; status = -1; } else { // write data file header out.Write32( FID_UNITSET ); out.Write16( units.size() ); // write sound file names out.Write8( info.sfx.size() ); for ( i = 0; i < info.sfx.size(); ++i ) { out.Write8( info.sfx[i].size() ); out.WriteS( info.sfx[i] ); } // write unit data for ( i = 0; i < units.size(); ++i ) { out.Write16( units[i].Terrain() ); out.Write16( units[i].Image() ); out.Write16( units[i].Flags() ); out.Write8( units[i].Speed() ); out.Write8( units[i].Weight() ); out.Write8( units[i].Armour() ); out.Write8( units[i].Firepower( U_GROUND) ); out.Write8( units[i].Firepower( U_SHIP ) ); out.Write8( units[i].Firepower( U_AIR ) ); out.Write8( units[i].MinFOF( U_GROUND ) ); out.Write8( units[i].MaxFOF( U_GROUND ) ); out.Write8( units[i].MinFOF( U_SHIP ) ); out.Write8( units[i].MaxFOF( U_SHIP ) ); out.Write8( units[i].MinFOF( U_AIR ) ); out.Write8( units[i].MaxFOF( U_AIR) ); out.Write8( units[i].Cost() ); out.Write8( UT_NO_SOUND ); // move sound out.Write8( UT_NO_SOUND ); // fire sound out.Write8( units[i].Slots() ); out.Write8( units[i].MinWeight() ); out.Write8( units[i].MaxWeight() ); out.Write8( i ); out.Write8( units[i].Portrait() ); } locale.Save( out ); // load graphics MkSurface img; status = img.SaveImageData( info.images, out, true ); // load optional unit portraits out.Write8( info.portraits.size() ); for ( i = 0; (i <info.portraits.size()) && (status == 0); ++i ) { if ( argc == 4 ) { string gfxdir( argv[3] ); append_path_delim( gfxdir ); info.portraits[i].insert( 0, gfxdir ); } status = img.SaveImageData( info.portraits[i], out, false ); } out.Close(); } } return status; }
std::string L10n::GetLocaleScript(const std::string& locale) const { Locale loc = Locale::createCanonical(locale.c_str()); return loc.getScript(); }
void UserTaskClaimEmailGenerator::run() { qDebug() << "EmailGenerator - Generating UserTaskClaim"; UserTaskClaim email_message; email_message.ParseFromString(this->protoBody.toStdString()); ConfigParser settings; QString error = ""; QSharedPointer<Email> email = QSharedPointer<Email>(new Email()); QSharedPointer<User> user = QSharedPointer<User>(); QSharedPointer<Task> task = QSharedPointer<Task>(); QSharedPointer<MySQLHandler> db = MySQLHandler::getInstance(); user = UserDao::getUser(db, email_message.user_id()); task = TaskDao::getTask(db, email_message.task_id()); if(user.isNull() || task.isNull()) { error = "Failed to generate UserTaskClaim email: Unable to find relevant "; error += "data in the Database. Searched for User ID "; error += QString::number(email_message.user_id()) + " and Task ID "; error += QString::number(email_message.task_id()) + "."; } if(error.compare("") == 0) { ctemplate::TemplateDictionary dict("user_task_claim"); if(user->display_name() != "") { dict.ShowSection("USER_HAS_NAME"); dict.SetValue("USERNAME", user->display_name()); } else { dict.ShowSection("NO_USER_NAME"); } QString task_url = settings.get("site.url"); task_url += "task/" + QString::number(task->id()) + "/id"; dict.SetValue("TASK_PAGE", task_url.toStdString()); dict.SetValue("SITE_NAME", settings.get("site.name").toStdString()); dict.SetValue("TASK_TITLE", task->title()); QString task_type = "Translation"; switch(task->tasktype()) { case 1: task_type = "Segmentation"; break; case 2: task_type = "Translation"; break; case 3: task_type = "Proofreading"; break; case 4: task_type = "Desegmentation"; break; } dict.SetValue("TASK_TYPE", task_type.toStdString()); Locale taskSourceLocale = task->sourcelocale(); Locale taskTargetLocale = task->targetlocale(); dict.SetValue("SOURCE_LANGUAGE",taskSourceLocale.languagename()); dict.SetValue("TARGET_LANGUAGE",taskTargetLocale.languagename()); bool footer_enabled=(QString::compare("y", settings.get("email-footer.enabled")) == 0); if (footer_enabled) { QString donate_link = settings.get("email-footer.donate_link"); ctemplate::TemplateDictionary* footer_dict = dict.AddIncludeDictionary("FOOTER"); QString footer_location = QString(TEMPLATE_DIRECTORY) + "emails/footer.tpl"; footer_dict -> SetValue("DONATE_LINK",donate_link.toStdString()); footer_dict -> SetFilename(footer_location.toStdString()); } std::string email_body; QString template_location = QString(TEMPLATE_DIRECTORY) + "emails/user-task-claim.tpl"; ctemplate::ExpandTemplate(template_location.toStdString(), ctemplate::DO_NOT_STRIP, &dict, &email_body); email->setSender(settings.get("site.system_email_address"));; email->addRecipient(QString::fromStdString(user->email())); email->setSubject(settings.get("site.name") + ": Task Claim Notification"); email->setBody(QString::fromUtf8(email_body.c_str())); } else { email = this->generateErrorEmail(error); } this->emailQueue->insert(email, currentMessage); }
ResourceBundle::ResourceBundle(const char* path, const Locale& locale, UErrorCode& err) :UObject(), fLocale(NULL) { fResource = ures_open(path, locale.getName(), &err); }
UnicodeString PluralRules::getRuleFromResource(const Locale& locale, UPluralType type, UErrorCode& errCode) { UnicodeString emptyStr; if (U_FAILURE(errCode)) { return emptyStr; } LocalUResourceBundlePointer rb(ures_openDirect(NULL, "plurals", &errCode)); if(U_FAILURE(errCode)) { return emptyStr; } const char *typeKey; switch (type) { case UPLURAL_TYPE_CARDINAL: typeKey = "locales"; break; case UPLURAL_TYPE_ORDINAL: typeKey = "locales_ordinals"; break; default: // Must not occur: The caller should have checked for valid types. errCode = U_ILLEGAL_ARGUMENT_ERROR; return emptyStr; } LocalUResourceBundlePointer locRes(ures_getByKey(rb.getAlias(), typeKey, NULL, &errCode)); if(U_FAILURE(errCode)) { return emptyStr; } int32_t resLen=0; const char *curLocaleName=locale.getName(); const UChar* s = ures_getStringByKey(locRes.getAlias(), curLocaleName, &resLen, &errCode); if (s == NULL) { // Check parent locales. UErrorCode status = U_ZERO_ERROR; char parentLocaleName[ULOC_FULLNAME_CAPACITY]; const char *curLocaleName=locale.getName(); uprv_strcpy(parentLocaleName, curLocaleName); while (uloc_getParent(parentLocaleName, parentLocaleName, ULOC_FULLNAME_CAPACITY, &status) > 0) { resLen=0; s = ures_getStringByKey(locRes.getAlias(), parentLocaleName, &resLen, &status); if (s != NULL) { errCode = U_ZERO_ERROR; break; } status = U_ZERO_ERROR; } } if (s==NULL) { return emptyStr; } char setKey[256]; UChar result[256]; u_UCharsToChars(s, setKey, resLen + 1); // printf("\n PluralRule: %s\n", setKey); LocalUResourceBundlePointer ruleRes(ures_getByKey(rb.getAlias(), "rules", NULL, &errCode)); if(U_FAILURE(errCode)) { return emptyStr; } resLen=0; LocalUResourceBundlePointer setRes(ures_getByKey(ruleRes.getAlias(), setKey, NULL, &errCode)); if (U_FAILURE(errCode)) { return emptyStr; } int32_t numberKeys = ures_getSize(setRes.getAlias()); char *key=NULL; int32_t len=0; for(int32_t i=0; i<numberKeys; ++i) { int32_t keyLen; resLen=0; s=ures_getNextString(setRes.getAlias(), &resLen, (const char**)&key, &errCode); keyLen = (int32_t)uprv_strlen(key); u_charsToUChars(key, result+len, keyLen); len += keyLen; result[len++]=COLON; uprv_memcpy(result+len, s, resLen*sizeof(UChar)); len += resLen; result[len++]=SEMI_COLON; } result[len++]=0; u_UCharsToChars(result, setKey, len); // printf(" Rule: %s\n", setKey); return UnicodeString(result); }
void DecimalFormatSymbols::initialize(const Locale& loc, UErrorCode& status, UBool useLastResortData) { if (U_FAILURE(status)) { return; } *validLocale = *actualLocale = 0; currPattern = NULL; // First initialize all the symbols to the fallbacks for anything we can't find initialize(); // // Next get the numbering system for this locale and set zero digit // and the digit string based on the numbering system for the locale // LocalPointer<NumberingSystem> ns(NumberingSystem::createInstance(loc, status)); const char *nsName; if (U_SUCCESS(status) && ns->getRadix() == 10 && !ns->isAlgorithmic()) { nsName = ns->getName(); UnicodeString digitString(ns->getDescription()); int32_t digitIndex = 0; UChar32 digit = digitString.char32At(0); fSymbols[kZeroDigitSymbol].setTo(digit); for (int32_t i = kOneDigitSymbol; i <= kNineDigitSymbol; ++i) { digitIndex += U16_LENGTH(digit); digit = digitString.char32At(digitIndex); fSymbols[i].setTo(digit); } } else { nsName = gLatn; } // Open resource bundles const char* locStr = loc.getName(); LocalUResourceBundlePointer resource(ures_open(NULL, locStr, &status)); LocalUResourceBundlePointer numberElementsRes( ures_getByKeyWithFallback(resource.getAlias(), gNumberElements, NULL, &status)); if (U_FAILURE(status)) { if ( useLastResortData ) { status = U_USING_DEFAULT_WARNING; initialize(); } return; } // Set locale IDs // TODO: Is there a way to do this without depending on the resource bundle instance? U_LOCALE_BASED(locBased, *this); locBased.setLocaleIDs( ures_getLocaleByType( numberElementsRes.getAlias(), ULOC_VALID_LOCALE, &status), ures_getLocaleByType( numberElementsRes.getAlias(), ULOC_ACTUAL_LOCALE, &status)); // Now load the rest of the data from the data sink. // Start with loading this nsName if it is not Latin. DecFmtSymDataSink sink(*this); if (uprv_strcmp(nsName, gLatn) != 0) { CharString path; path.append(gNumberElements, status) .append('/', status) .append(nsName, status) .append('/', status) .append(gSymbols, status); ures_getAllItemsWithFallback(resource.getAlias(), path.data(), sink, status); // If no symbols exist for the given nsName and resource bundle, silently ignore // and fall back to Latin. if (status == U_MISSING_RESOURCE_ERROR) { status = U_ZERO_ERROR; } else if (U_FAILURE(status)) { return; } } // Continue with Latin if necessary. if (!sink.seenAll()) { ures_getAllItemsWithFallback(resource.getAlias(), gNumberElementsLatnSymbols, sink, status); if (U_FAILURE(status)) { return; } } // Let the monetary number separators equal the default number separators if necessary. sink.resolveMissingMonetarySeparators(fSymbols); // Obtain currency data from the currency API. This is strictly // for backward compatibility; we don't use DecimalFormatSymbols // for currency data anymore. UErrorCode internalStatus = U_ZERO_ERROR; // don't propagate failures out UChar curriso[4]; UnicodeString tempStr; ucurr_forLocale(locStr, curriso, 4, &internalStatus); uprv_getStaticCurrencyName(curriso, locStr, tempStr, internalStatus); if (U_SUCCESS(internalStatus)) { fSymbols[kIntlCurrencySymbol].setTo(curriso, -1); fSymbols[kCurrencySymbol] = tempStr; } /* else use the default values. */ //load the currency data UChar ucc[4]={0}; //Currency Codes are always 3 chars long int32_t uccLen = 4; const char* locName = loc.getName(); UErrorCode localStatus = U_ZERO_ERROR; uccLen = ucurr_forLocale(locName, ucc, uccLen, &localStatus); if(U_SUCCESS(localStatus) && uccLen > 0) { char cc[4]={0}; u_UCharsToChars(ucc, cc, uccLen); /* An explicit currency was requested */ LocalUResourceBundlePointer currencyResource(ures_open(U_ICUDATA_CURR, locStr, &localStatus)); LocalUResourceBundlePointer currency( ures_getByKeyWithFallback(currencyResource.getAlias(), "Currencies", NULL, &localStatus)); ures_getByKeyWithFallback(currency.getAlias(), cc, currency.getAlias(), &localStatus); if(U_SUCCESS(localStatus) && ures_getSize(currency.getAlias())>2) { // the length is 3 if more data is present ures_getByIndex(currency.getAlias(), 2, currency.getAlias(), &localStatus); int32_t currPatternLen = 0; currPattern = ures_getStringByIndex(currency.getAlias(), (int32_t)0, &currPatternLen, &localStatus); UnicodeString decimalSep = ures_getUnicodeStringByIndex(currency.getAlias(), (int32_t)1, &localStatus); UnicodeString groupingSep = ures_getUnicodeStringByIndex(currency.getAlias(), (int32_t)2, &localStatus); if(U_SUCCESS(localStatus)){ fSymbols[kMonetaryGroupingSeparatorSymbol] = groupingSep; fSymbols[kMonetarySeparatorSymbol] = decimalSep; //pattern.setTo(TRUE, currPattern, currPatternLen); status = localStatus; } } /* else An explicit currency was requested and is unknown or locale data is malformed. */ /* ucurr_* API will get the correct value later on. */ } // else ignore the error if no currency // Currency Spacing. LocalUResourceBundlePointer currencyResource(ures_open(U_ICUDATA_CURR, locStr, &status)); CurrencySpacingSink currencySink(*this); ures_getAllItemsWithFallback(currencyResource.getAlias(), gCurrencySpacingTag, currencySink, status); currencySink.resolveMissing(); if (U_FAILURE(status)) { return; } }
void DateFormatRoundTripTest::test(const Locale& loc) { UnicodeString temp; #if !INFINITE logln("Locale: " + loc.getDisplayName(temp)); #endif // Total possibilities = 24 // 4 date // 4 time // 16 date-time UBool TEST_TABLE [24];//= new boolean[24]; int32_t i = 0; for(i = 0; i < 24; ++i) TEST_TABLE[i] = TRUE; // If we have some sparseness, implement it here. Sparseness decreases // test time by eliminating some tests, up to 23. for(i = 0; i < SPARSENESS; ) { int random = (int)(randFraction() * 24); if (random >= 0 && random < 24 && TEST_TABLE[i]) { TEST_TABLE[i] = FALSE; ++i; } } int32_t itable = 0; int32_t style = 0; for(style = DateFormat::FULL; style <= DateFormat::SHORT; ++style) { if(TEST_TABLE[itable++]) { logln("Testing style " + UnicodeString(styleName((DateFormat::EStyle)style))); DateFormat *df = DateFormat::createDateInstance((DateFormat::EStyle)style, loc); if(df == NULL) { errln(UnicodeString("Could not DF::createDateInstance ") + UnicodeString(styleName((DateFormat::EStyle)style)) + " Locale: " + loc.getDisplayName(temp)); } else { test(df, loc); delete df; } } } for(style = DateFormat::FULL; style <= DateFormat::SHORT; ++style) { if (TEST_TABLE[itable++]) { logln("Testing style " + UnicodeString(styleName((DateFormat::EStyle)style))); DateFormat *df = DateFormat::createTimeInstance((DateFormat::EStyle)style, loc); if(df == NULL) { errln(UnicodeString("Could not DF::createTimeInstance ") + UnicodeString(styleName((DateFormat::EStyle)style)) + " Locale: " + loc.getDisplayName(temp)); } else { test(df, loc, TRUE); delete df; } } } for(int32_t dstyle = DateFormat::FULL; dstyle <= DateFormat::SHORT; ++dstyle) { for(int32_t tstyle = DateFormat::FULL; tstyle <= DateFormat::SHORT; ++tstyle) { if(TEST_TABLE[itable++]) { logln("Testing dstyle" + UnicodeString(styleName((DateFormat::EStyle)dstyle)) + ", tstyle" + UnicodeString(styleName((DateFormat::EStyle)tstyle)) ); DateFormat *df = DateFormat::createDateTimeInstance((DateFormat::EStyle)dstyle, (DateFormat::EStyle)tstyle, loc); if(df == NULL) { dataerrln(UnicodeString("Could not DF::createDateTimeInstance ") + UnicodeString(styleName((DateFormat::EStyle)dstyle)) + ", tstyle" + UnicodeString(styleName((DateFormat::EStyle)tstyle)) + "Locale: " + loc.getDisplayName(temp)); } else { test(df, loc); delete df; } } } } }
// ------------------------------------- // Gets the objectLocale display name in the default locale language. UnicodeString & U_EXPORT2 BreakIterator::getDisplayName(const Locale & objectLocale, UnicodeString & name) { return objectLocale.getDisplayName(name); }
void DateFormatRoundTripTest::test(DateFormat *fmt, const Locale &origLocale, UBool timeOnly) { UnicodeString pat; if(fmt->getDynamicClassID() != SimpleDateFormat::getStaticClassID()) { errln("DateFormat wasn't a SimpleDateFormat"); return; } UBool isGregorian = FALSE; UErrorCode minStatus = U_ZERO_ERROR; UDate minDate = CalendarTest::minDateOfCalendar(*fmt->getCalendar(), isGregorian, minStatus); if(U_FAILURE(minStatus)) { errln((UnicodeString)"Failure getting min date for " + origLocale.getName()); return; } //logln(UnicodeString("Min date is ") + fullFormat(minDate) + " for " + origLocale.getName()); pat = ((SimpleDateFormat*)fmt)->toPattern(pat); // NOTE TO MAINTAINER // This indexOf check into the pattern needs to be refined to ignore // quoted characters. Currently, this isn't a problem with the locale // patterns we have, but it may be a problem later. UBool hasEra = (pat.indexOf(UnicodeString("G")) != -1); UBool hasZoneDisplayName = (pat.indexOf(UnicodeString("z")) != -1) || (pat.indexOf(UnicodeString("v")) != -1) || (pat.indexOf(UnicodeString("V")) != -1); // Because patterns contain incomplete data representing the Date, // we must be careful of how we do the roundtrip. We start with // a randomly generated Date because they're easier to generate. // From this we get a string. The string is our real starting point, // because this string should parse the same way all the time. Note // that it will not necessarily parse back to the original date because // of incompleteness in patterns. For example, a time-only pattern won't // parse back to the same date. //try { for(int i = 0; i < TRIALS; ++i) { UDate *d = new UDate [DEPTH]; UnicodeString *s = new UnicodeString[DEPTH]; if(isGregorian == TRUE) { d[0] = generateDate(); } else { d[0] = generateDate(minDate); } UErrorCode status = U_ZERO_ERROR; // We go through this loop until we achieve a match or until // the maximum loop count is reached. We record the points at // which the date and the string starts to match. Once matching // starts, it should continue. int loop; int dmatch = 0; // d[dmatch].getTime() == d[dmatch-1].getTime() int smatch = 0; // s[smatch].equals(s[smatch-1]) for(loop = 0; loop < DEPTH; ++loop) { if (loop > 0) { d[loop] = fmt->parse(s[loop-1], status); failure(status, "fmt->parse", s[loop-1]+" in locale: " + origLocale.getName()); status = U_ZERO_ERROR; /* any error would have been reported */ } s[loop] = fmt->format(d[loop], s[loop]); // For displaying which date is being tested //logln(s[loop] + " = " + fullFormat(d[loop])); if(s[loop].length() == 0) { errln("FAIL: fmt->format gave 0-length string in " + pat + " with number " + d[loop] + " in locale " + origLocale.getName()); } if(loop > 0) { if(smatch == 0) { UBool match = s[loop] == s[loop-1]; if(smatch == 0) { if(match) smatch = loop; } else if( ! match) errln("FAIL: String mismatch after match"); } if(dmatch == 0) { // {sfb} watch out here, this might not work UBool match = d[loop]/*.getTime()*/ == d[loop-1]/*.getTime()*/; if(dmatch == 0) { if(match) dmatch = loop; } else if( ! match) errln("FAIL: Date mismatch after match"); } if(smatch != 0 && dmatch != 0) break; } } // At this point loop == DEPTH if we've failed, otherwise loop is the // max(smatch, dmatch), that is, the index at which we have string and // date matching. // Date usually matches in 2. Exceptions handled below. int maxDmatch = 2; int maxSmatch = 1; if (dmatch > maxDmatch) { // Time-only pattern with zone information and a starting date in PST. if(timeOnly && hasZoneDisplayName && fmt->getTimeZone().inDaylightTime(d[0], status) && ! failure(status, "TimeZone::inDST()")) { maxDmatch = 3; maxSmatch = 2; } } // String usually matches in 1. Exceptions are checked for here. if(smatch > maxSmatch) { // Don't compute unless necessary UBool in0; // Starts in BC, with no era in pattern if( ! hasEra && getField(d[0], UCAL_ERA) == GregorianCalendar::BC) maxSmatch = 2; // Starts in DST, no year in pattern else if((in0=fmt->getTimeZone().inDaylightTime(d[0], status)) && ! failure(status, "gettingDaylightTime") && pat.indexOf(UnicodeString("yyyy")) == -1) maxSmatch = 2; // If we start not in DST, but transition into DST else if (!in0 && fmt->getTimeZone().inDaylightTime(d[1], status) && !failure(status, "gettingDaylightTime")) maxSmatch = 2; // Two digit year with no time zone change, // unless timezone isn't used or we aren't close to the DST changover else if (pat.indexOf(UnicodeString("y")) != -1 && pat.indexOf(UnicodeString("yyyy")) == -1 && getField(d[0], UCAL_YEAR) != getField(d[dmatch], UCAL_YEAR) && !failure(status, "error status [smatch>maxSmatch]") && ((hasZoneDisplayName && (fmt->getTimeZone().inDaylightTime(d[0], status) == fmt->getTimeZone().inDaylightTime(d[dmatch], status) || getField(d[0], UCAL_MONTH) == UCAL_APRIL || getField(d[0], UCAL_MONTH) == UCAL_OCTOBER)) || !hasZoneDisplayName) ) { maxSmatch = 2; } // If zone display name is used, fallback format might be used before 1970 else if (hasZoneDisplayName && d[0] < 0) { maxSmatch = 2; } } if(dmatch > maxDmatch || smatch > maxSmatch) { // Special case for Japanese and Islamic (could have large negative years) const char *type = fmt->getCalendar()->getType(); if(!strcmp(type,"japanese")) { maxSmatch = 4; maxDmatch = 4; } } // Use @v to see verbose results on successful cases UBool fail = (dmatch > maxDmatch || smatch > maxSmatch); if (optionv || fail) { if (fail) { errln(UnicodeString("\nFAIL: Pattern: ") + pat + " in Locale: " + origLocale.getName()); } else { errln(UnicodeString("\nOk: Pattern: ") + pat + " in Locale: " + origLocale.getName()); } logln("Date iters until match=%d (max allowed=%d), string iters until match=%d (max allowed=%d)", dmatch,maxDmatch, smatch, maxSmatch); for(int j = 0; j <= loop && j < DEPTH; ++j) { UnicodeString temp; FieldPosition pos(FieldPosition::DONT_CARE); errln((j>0?" P> ":" ") + fullFormat(d[j]) + " F> " + escape(s[j], temp) + UnicodeString(" d=") + d[j] + (j > 0 && d[j]/*.getTime()*/==d[j-1]/*.getTime()*/?" d==":"") + (j > 0 && s[j] == s[j-1]?" s==":"")); } } delete[] d; delete[] s; } /*} catch (ParseException e) { errln("Exception: " + e.getMessage()); logln(e.toString()); }*/ }
void CollationServiceTest::TestRegister() { #if !UCONFIG_NO_SERVICE // register a singleton const Locale& FR = Locale::getFrance(); const Locale& US = Locale::getUS(); const Locale US_FOO("en", "US", "FOO"); UErrorCode status = U_ZERO_ERROR; Collator* frcol = Collator::createInstance(FR, status); Collator* uscol = Collator::createInstance(US, status); if(U_FAILURE(status)) { errcheckln(status, "Failed to create collators with %s", u_errorName(status)); delete frcol; delete uscol; return; } { // try override en_US collator Collator *clone = frcol->clone(); URegistryKey key = Collator::registerInstance(frcol, US, status); // frcol has been adopted. We must not use it any more, nor rely on its attributes. frcol = NULL; Collator* ncol = Collator::createInstance(US_FOO, status); if (*clone != *ncol) { errln("register of french collator for en_US failed on request for en_US_FOO"); } delete clone; // The requested locale may be the same as the valid locale, // or may not be supported at all. See ticket #10477. Locale loc = ncol->getLocale(ULOC_REQUESTED_LOCALE, status); if (U_SUCCESS(status) && loc != US_FOO && loc != US) { errln(UnicodeString("requested locale for en_US_FOO is not en_US_FOO nor en_US but ") + loc.getName()); } status = U_ZERO_ERROR; loc = ncol->getLocale(ULOC_VALID_LOCALE, status); if (loc != US) { errln(UnicodeString("valid locale for en_US_FOO is not en_US but ") + loc.getName()); } loc = ncol->getLocale(ULOC_ACTUAL_LOCALE, status); if (loc != US) { errln(UnicodeString("actual locale for en_US_FOO is not en_US but ") + loc.getName()); } delete ncol; ncol = NULL; if (!Collator::unregister(key, status)) { errln("failed to unregister french collator"); } ncol = Collator::createInstance(US, status); if (*uscol != *ncol) { errln("collator after unregister does not match original"); } delete ncol; ncol = NULL; } // recreate frcol frcol = Collator::createInstance(FR, status); LocalUCollatorPointer frFR(ucol_open("fr_FR", &status)); { // try create collator for new locale Locale fu_FU_FOO("fu", "FU", "FOO"); Locale fu_FU("fu", "FU", ""); Collator* fucol = Collator::createInstance(fu_FU, status); Collator *clone = frcol->clone(); URegistryKey key = Collator::registerInstance(frcol, fu_FU, status); frcol = NULL; // frcol has been adopted. Collator* ncol = Collator::createInstance(fu_FU_FOO, status); if (*clone != *ncol) { errln("register of fr collator for fu_FU failed"); } delete clone; UnicodeString locName = fu_FU.getName(); StringEnumeration* localeEnum = Collator::getAvailableLocales(); UBool found = FALSE; const UnicodeString* locStr, *ls2; for (locStr = localeEnum->snext(status); !found && locStr != NULL; locStr = localeEnum->snext(status)) { // if (locName == *locStr) { found = TRUE; } } StringEnumeration *le2 = NULL; localeEnum->reset(status); int32_t i, count; count = localeEnum->count(status); for(i = 0; i < count; ++i) { if(i == count / 2) { le2 = localeEnum->clone(); if(le2 == NULL || count != le2->count(status)) { errln("ServiceEnumeration.clone() failed"); break; } } if(i >= count / 2) { locStr = localeEnum->snext(status); ls2 = le2->snext(status); if(*locStr != *ls2) { errln("ServiceEnumeration.clone() failed for item %d", i); } } else { localeEnum->snext(status); } } delete localeEnum; delete le2; if (!found) { errln("new locale fu_FU not reported as supported locale"); } UnicodeString displayName; Collator::getDisplayName(fu_FU, displayName); /* The locale display pattern for the locale ja, ko, and zh are different. */ const UChar zh_fuFU_Array[] = { 0x0066, 0x0075, 0xff08, 0x0046, 0x0055, 0xff09, 0 }; const UnicodeString zh_fuFU(zh_fuFU_Array); const Locale& defaultLocale = Locale::getDefault(); if (displayName != "fu (FU)" && ((defaultLocale == Locale::getKorean() && defaultLocale == Locale::getJapanese()) && displayName == "fu(FU)") && ((defaultLocale == Locale::getChinese()) && displayName != zh_fuFU)) { errln(UnicodeString("found ") + displayName + " for fu_FU"); } Collator::getDisplayName(fu_FU, fu_FU, displayName); if (displayName != "fu (FU)" && ((defaultLocale == Locale::getKorean() && defaultLocale == Locale::getJapanese()) && displayName == "fu(FU)") && ((defaultLocale == Locale::getChinese()) && displayName != zh_fuFU)) { errln(UnicodeString("found ") + displayName + " for fu_FU"); } // test ucol_open LocalUCollatorPointer fufu(ucol_open("fu_FU_FOO", &status)); if (fufu.isNull()) { errln("could not open fu_FU_FOO with ucol_open"); } else { if (*Collator::fromUCollator(fufu.getAlias()) != *Collator::fromUCollator(frFR.getAlias())) { errln("collator fufu != collator frFR"); } } if (!Collator::unregister(key, status)) { errln("failed to unregister french collator"); } // !!! note frcoll invalid again, but we're no longer using it // other collators should still work ok Locale nloc = ncol->getLocale(ULOC_VALID_LOCALE, status); if (nloc != fu_FU) { errln(UnicodeString("asked for nloc valid locale after close and got") + nloc.getName()); } delete ncol; ncol = NULL; if (fufu.isValid()) { const char* nlocstr = ucol_getLocaleByType(fufu.getAlias(), ULOC_VALID_LOCALE, &status); if (uprv_strcmp(nlocstr, "fu_FU") != 0) { errln(UnicodeString("asked for uloc valid locale after close and got ") + nlocstr); } } ncol = Collator::createInstance(fu_FU, status); if (*fucol != *ncol) { errln("collator after unregister does not match original fu_FU"); } delete uscol; uscol = NULL; delete ncol; ncol = NULL; delete fucol; fucol = NULL; } #endif }
void OrgTaskRevokedGenerator::run() { qDebug() << "Email Generator - Generating OrgTaskRevokedEmail"; OrgTaskRevokedEmail emailMessage; emailMessage.ParseFromString(this->protoBody.toStdString()); ConfigParser settings; QSharedPointer<Email> email = QSharedPointer<Email>(new Email()); QSharedPointer<MySQLHandler> db = MySQLHandler::getInstance(); QSharedPointer<User> user = UserDao::getUser(db, emailMessage.user_id()); QSharedPointer<Task> task = TaskDao::getTask(db, emailMessage.task_id()); QSharedPointer<User> claimant = UserDao::getUser(db, emailMessage.claimant_id()); QString error = ""; if (user.isNull() || task.isNull() || claimant.isNull()) { error = "Unable to generate OrgTaskRevokedEmail. Unable to find relevant data in the database. "; error += "Searched for user ids " + QString::number(emailMessage.user_id()) + " and "; error += QString::number(emailMessage.claimant_id()) + " and task id "; error += QString::number(emailMessage.task_id()) + "."; } if (error.compare("") == 0) { ctemplate::TemplateDictionary dict("OrgTaskRevoked"); dict.SetValue("USERNAME", user->display_name()); dict.SetValue("TASK_TITLE", task->title()); QString taskView = settings.get("site.url") + "task/" + QString::number(task->id()) + "/view"; dict.SetValue("TASK_VIEW", taskView.toStdString()); QString userProfile = settings.get("site.url") + QString::number(claimant->id()) + "/profile"; dict.SetValue("USER_PROFILE", userProfile.toStdString()); dict.SetValue("CLAIMANT_NAME", claimant->display_name()); dict.SetValue("SITE_NAME", settings.get("site.name").toStdString()); QString task_type = "Translation"; switch(task->tasktype()) { case 1: task_type = "Segmentation"; break; case 2: task_type = "Translation"; break; case 3: task_type = "Proofreading"; break; case 4: task_type = "Desegmentation"; break; } dict.SetValue("TASK_TYPE", task_type.toStdString()); Locale taskSourceLocale = task->sourcelocale(); Locale taskTargetLocale = task->targetlocale(); dict.SetValue("SOURCE_LANGUAGE",taskSourceLocale.languagename()); dict.SetValue("TARGET_LANGUAGE",taskTargetLocale.languagename()); bool footer_enabled=(QString::compare("y", settings.get("email-footer.enabled")) == 0); if (footer_enabled) { QString donate_link = settings.get("email-footer.donate_link"); ctemplate::TemplateDictionary* footer_dict = dict.AddIncludeDictionary("FOOTER"); QString footer_location = QString(TEMPLATE_DIRECTORY) + "emails/footer.tpl"; footer_dict -> SetValue("DONATE_LINK",donate_link.toStdString()); footer_dict -> SetFilename(footer_location.toStdString()); } std::string email_body; QString template_location = QString(TEMPLATE_DIRECTORY) + "emails/org-task-revoked.tpl"; ctemplate::ExpandTemplate(template_location.toStdString(), ctemplate::DO_NOT_STRIP, &dict, &email_body); email->setSender(settings.get("site.system_email_address")); email->addRecipient(QString::fromStdString(user->email())); email->setSubject(settings.get("site.name") + ": Task Revoked"); email->setBody(QString::fromUtf8(email_body.c_str())); } else { email = this->generateErrorEmail(error); } this->emailQueue->insert(email, currentMessage); }
static jstring ICU_getISO3CountryNative(JNIEnv* env, jclass, jstring locale) { Locale loc = getLocale(env, locale); return env->NewStringUTF(loc.getISO3Country()); }
void LocaleBased::setLocaleIDs(const Locale& validID, const Locale& actualID) { uprv_strcpy(valid, validID.getName()); uprv_strcpy(actual, actualID.getName()); }