/**
* Copyright (c) 2012-2016 André Bargull
* Alle Rechte vorbehalten / All Rights Reserved. Use is subject to license terms.
*
* <https://github.com/anba/es6draft>
*/
package com.github.anba.es6draft.runtime.objects.intl;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.ibm.icu.text.Collator;
import com.ibm.icu.text.DateFormat;
import com.ibm.icu.text.NumberFormat;
import com.ibm.icu.text.PluralRules;
import com.ibm.icu.util.ULocale;
/**
*
*/
final class LanguageData {
private LanguageData() {
}
/**
* Returns the set of available locales supported by the {@link Collator} class.
*
* @return the set of available locales
* @see Collator#getAvailableULocales()
*/
static Set<String> getAvailableCollatorLocales() {
return addDerivedLanguages(toLanguageTags(Collator.getAvailableULocales()));
}
/**
* Returns the set of available locales supported by the {@link DateFormat} class.
*
* @return the set of available locales
* @see DateFormat#getAvailableULocales()
*/
static List<String> getAvailableDateFormatLocales() {
return toLanguageTags(DateFormat.getAvailableULocales());
}
/**
* Returns the set of available locales supported by the {@link NumberFormat} class.
*
* @return the set of available locales
* @see NumberFormat#getAvailableULocales()
*/
static List<String> getAvailableNumberFormatLocales() {
return toLanguageTags(NumberFormat.getAvailableULocales());
}
/**
* Returns the set of available locales supported by the {@link PluralRules} class.
*
* @return the set of available locales
* @see PluralRules#getAvailableULocales()
*/
static Set<String> getAvailablePluralRulesLocales() {
return addDerivedLanguages(toLanguageTags(PluralRules.getAvailableULocales()));
}
/**
* Maps locales to BCP47 language tags.
*
* @param locales
* array of locales
* @return list of BCP47 language tags
*/
private static List<String> toLanguageTags(ULocale[] locales) {
ArrayList<String> list = new ArrayList<>(locales.length);
for (ULocale locale : locales) {
if (!(locale.getVariant().isEmpty() && locale.getUnicodeLocaleKeys().isEmpty())) {
// Ignore locales with variants or unicode extension sequences.
continue;
}
list.add(locale.toLanguageTag());
}
return list;
}
private static Set<String> addDerivedLanguages(List<String> available) {
HashSet<String> availableSet = new HashSet<>(available);
HashSet<String> derivedSet = new HashSet<>(available);
for (ULocale locale : ULocale.getAvailableLocales()) {
String languageTag = locale.toLanguageTag();
if (derivedSet.contains(languageTag)) {
continue;
}
if (!(locale.getVariant().isEmpty() && locale.getUnicodeLocaleKeys().isEmpty())) {
// Ignore locales with variants or unicode extension sequences.
continue;
}
String language = locale.getLanguage();
if (availableSet.contains(language)) {
derivedSet.add(languageTag);
continue;
}
String script = locale.getScript();
if (!script.isEmpty()) {
String languageScript = language + "-" + script;
if (availableSet.contains(languageScript)) {
derivedSet.add(languageTag);
continue;
}
}
String country = locale.getCountry();
if (!country.isEmpty()) {
String languageCountry = language + "-" + country;
if (availableSet.contains(languageCountry)) {
derivedSet.add(languageTag);
continue;
}
}
}
return derivedSet;
}
}