StringEnumeration* U_EXPORT2 Collator::getKeywordValuesForLocale(const char* key, const Locale& locale, UBool commonlyUsed, UErrorCode& status) { return UStringEnumeration::fromUEnumeration( ucol_getKeywordValuesForLocale( key, locale.getName(), commonlyUsed, &status), status); }
StringEnumeration* U_EXPORT2 Collator::getKeywordValuesForLocale(const char* key, const Locale& locale, UBool commonlyUsed, UErrorCode& status) { // This is a wrapper over ucol_getKeywordValuesForLocale UEnumeration *uenum = ucol_getKeywordValuesForLocale(key, locale.getName(), commonlyUsed, &status); if (U_FAILURE(status)) { uenum_close(uenum); return NULL; } return new UStringEnumeration(uenum); }
static Vector<String> sortLocaleData(const String& locale, size_t keyIndex) { // 9.1 Internal slots of Service Constructors & 10.2.3 Internal slots (ECMA-402 2.0) Vector<String> keyLocaleData; switch (keyIndex) { case indexOfExtensionKeyCo: { // 10.2.3 "The first element of [[sortLocaleData]][locale].co and [[searchLocaleData]][locale].co must be null for all locale values." keyLocaleData.append({ }); UErrorCode status = U_ZERO_ERROR; UEnumeration* enumeration = ucol_getKeywordValuesForLocale("collation", locale.utf8().data(), false, &status); if (U_SUCCESS(status)) { const char* collation; while ((collation = uenum_next(enumeration, nullptr, &status)) && U_SUCCESS(status)) { // 10.2.3 "The values "standard" and "search" must not be used as elements in any [[sortLocaleData]][locale].co and [[searchLocaleData]][locale].co array." if (!strcmp(collation, "standard") || !strcmp(collation, "search")) continue; // Map keyword values to BCP 47 equivalents. if (!strcmp(collation, "dictionary")) collation = "dict"; else if (!strcmp(collation, "gb2312han")) collation = "gb2312"; else if (!strcmp(collation, "phonebook")) collation = "phonebk"; else if (!strcmp(collation, "traditional")) collation = "trad"; keyLocaleData.append(collation); } uenum_close(enumeration); } break; } case indexOfExtensionKeyKn: keyLocaleData.reserveInitialCapacity(2); keyLocaleData.uncheckedAppend(ASCIILiteral("false")); keyLocaleData.uncheckedAppend(ASCIILiteral("true")); break; default: ASSERT_NOT_REACHED(); } return keyLocaleData; }
static Vector<String> sortLocaleData(const String& locale, const String& key) { // 9.1 Internal slots of Service Constructors & 10.2.3 Internal slots (ECMA-402 2.0) Vector<String> keyLocaleData; if (key == "co") { // 10.2.3 "The first element of [[sortLocaleData]][locale].co and [[searchLocaleData]][locale].co must be null for all locale values." keyLocaleData.append(String()); UErrorCode status = U_ZERO_ERROR; UEnumeration* enumeration = ucol_getKeywordValuesForLocale("collation", locale.utf8().data(), TRUE, &status); if (U_SUCCESS(status)) { const char* keywordValue; while ((keywordValue = uenum_next(enumeration, nullptr, &status)) && U_SUCCESS(status)) { String collation(keywordValue); // 10.2.3 "The values "standard" and "search" must not be used as elements in any [[sortLocaleData]][locale].co and [[searchLocaleData]][locale].co array." if (collation == "standard" || collation == "search") continue; // Map keyword values to BCP 47 equivalents. if (collation == "dictionary") collation = ASCIILiteral("dict"); else if (collation == "gb2312han") collation = ASCIILiteral("gb2312"); else if (collation == "phonebook") collation = ASCIILiteral("phonebk"); else if (collation == "traditional") collation = ASCIILiteral("trad"); keyLocaleData.append(collation); } uenum_close(enumeration); } } else if (key == "kn") { keyLocaleData.append(ASCIILiteral("false")); keyLocaleData.append(ASCIILiteral("true")); } else ASSERT_NOT_REACHED(); return keyLocaleData; }