blob: 3f6ec258ebaaa472aae4bb1a7cf040db652692fb [file] [log] [blame]
package org.unicode.cldr.util;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import org.unicode.cldr.util.ChainedMap.M3;
import com.ibm.icu.dev.util.CollectionUtilities;
import com.ibm.icu.util.ULocale;
public enum LanguageGroup {
root("und"),
germanic("gem"), celtic("cel"), romance("roa"), slavic("sla"), baltic("bat"), indic("inc"), other_indo("ine_001"), dravidian("dra"),
uralic("urj"), cjk("und_Hani"), sino_tibetan("sit"), tai("tai"), austronesian("map"), turkic("trk"),
afroasiatic("afa"), austroasiatic("aav"), niger_congo("nic"), east_sudanic("sdv"),
songhay("son"), american("und_019"),
art("art"), other("und_001");
public final String iso;
LanguageGroup(String iso) {
this.iso = iso;
}
static final Map<ULocale, LanguageGroup> LANGUAGE_GROUP;
static final M3<LanguageGroup, ULocale, Integer> GROUP_LANGUAGE = ChainedMap.of(new TreeMap<LanguageGroup, Object>(), new LinkedHashMap<ULocale, Object>(),
Integer.class);
private static void add(Map<ULocale, LanguageGroup> map, LanguageGroup group, String... baseLanguages) {
int count = 0;
for (String s : baseLanguages) {
ULocale loc = new ULocale(s);
if (map.put(loc, group) != null) {
throw new IllegalArgumentException("duplicate: " + s + ", " + group);
}
;
GROUP_LANGUAGE.put(group, loc, count);
++count;
}
}
static {
LinkedHashMap<ULocale, LanguageGroup> temp = new LinkedHashMap<>();
LANGUAGE_GROUP = Collections.unmodifiableMap(temp);
add(temp, root, "root");
add(temp, germanic, "en", "fy", "af", "nl", "de", "gsw", "wae", "ksh", "lb", "fo", "da", "nb", "nn", "sv", "is", "yi");
add(temp, celtic, "gd", "ga", "cy", "gv", "kw", "br");
add(temp, romance, "pt", "gl", "ast", "es", "ca", "it", "rm", "ro", "fr");
add(temp, slavic, "ru", "be", "uk", "bg", "mk", "sr", "hr", "bs", "sl", "cs", "sk", "pl");
add(temp, baltic, "lt", "lv");
add(temp, other_indo, "el", "sq", "hy", "fa", "ps", "os");
add(temp, indic, "ur", "hi", "bn", "as", "gu", "or", "mr", "ne", "pa", "si");
add(temp, dravidian, "ta", "te", "ml", "kn");
add(temp, cjk, "zh", "ja", "ko");
add(temp, turkic, "tr", "az", "kk", "ky", "uz", "ug");
add(temp, uralic, "fi", "et", "se", "smn", "hu");
add(temp, afroasiatic, "ar", "mt", "he", "om", "so", "ha", "am", "tzm", "zgh");
add(temp, tai, "th", "lo");
add(temp, austronesian, "id", "ms", "fil", "haw");
add(temp, austroasiatic, "vi", "km");
add(temp, niger_congo, "sw", "swc", "yo", "ig", "ff", "sn", "zu");
add(temp, other, "ka", "eu", "mn", "naq");
add(temp, sino_tibetan, "my");
add(temp, afroasiatic, "aa", "kab", "shi", "ssy", "ti");
add(temp, american, "chr", "kl", "lkt", "qu");
add(temp, art, "eo", "vo", "ia");
add(temp, austronesian, "mg", "to");
add(temp, east_sudanic, "luo", "mas", "nus", "saq", "teo", "kln");
add(temp, indic, "kok", "ks");
add(temp, niger_congo, "agq", "ak", "asa", "bas", "bem", "bez", "bm", "cgg", "dua", "dyo", "ebu", "ee", "ewo", "guz", "jgo", "kam", "ki", "kkj", "ksb",
"ksf", "lag", "lg", "ln", "lu", "luy", "mua", "nd", "nnh", "nr", "nyn", "rn", "rof", "rw", "sbp", "sg", "ss", "tn", "ts", "vai", "ve", "dav",
"jmc", "kde", "mer", "mgh", "mgo", "nmg", "nso", "rwk", "seh", "vun", "xog", "yav");
add(temp, romance, "fur", "kea", "mfe");
add(temp, sino_tibetan, "bo", "brx", "dz", "ii");
add(temp, slavic, "dsb", "hsb");
add(temp, songhay, "dje", "khq", "ses", "twq");
add(temp, turkic, "sah");
//GROUP_LANGUAGE.freeze();
}
public static LanguageGroup get(ULocale locale) {
return CldrUtility.ifNull(LANGUAGE_GROUP.get(locale), LanguageGroup.other);
}
public static Set<ULocale> getExplicit() {
return Collections.unmodifiableSet(LANGUAGE_GROUP.keySet());
}
public static Set<ULocale> getLocales(LanguageGroup group) {
return Collections.unmodifiableSet(GROUP_LANGUAGE.get(group).keySet());
}
/**
* return position in group, or -1 if in no group
* @param locale
* @return
*/
public static int rankInGroup(ULocale locale) {
LanguageGroup group = LANGUAGE_GROUP.get(locale);
if (group == null) {
return Integer.MAX_VALUE;
}
return GROUP_LANGUAGE.get(group).get(locale);
}
public static Comparator<ULocale> COMPARATOR = new Comparator<ULocale>() {
@Override
public int compare(ULocale o1, ULocale o2) {
LanguageGroup group1 = get(o1);
LanguageGroup group2 = get(o2);
int diff = group1.ordinal() - group2.ordinal();
if (diff != 0) return diff;
int r1 = rankInGroup(o1);
int r2 = rankInGroup(o2);
diff = r1 - r2;
return diff != 0 ? diff : o1.compareTo(o2);
}
};
public static void main(String[] args) {
CLDRFile english = CLDRConfig.getInstance().getEnglish();
System.out.print("<supplementalData>\n"
+ "\t<version number=\"$Revision:$\"/>\n"
+ "\t<languageGroups>\n");
for (LanguageGroup languageGroup : LanguageGroup.values()) {
Set<ULocale> locales = LanguageGroup.getLocales(languageGroup);
String englishName = languageGroup.getName(english);
System.out.print("\t\t<languageGroup id=\"" + languageGroup.iso
+ "\" code=\"" + CollectionUtilities.join(locales, ", ")
+ "\"/>\t<!-- " + englishName + " -->\n");
}
System.out.print("\t</languageGroups>"
+ "\n<supplementalData>\n");
}
public String getName(CLDRFile cldrFile) {
String prefix = "";
LanguageTagParser ltp = new LanguageTagParser().set(iso);
switch (ltp.getRegion()) {
case "001":
if (ltp.getLanguage().equals("und")) {
return "Other";
}
prefix = "Other ";
break;
case "":
break;
default:
return cldrFile.getName(CLDRFile.TERRITORY_NAME, ltp.getRegion());
}
switch (ltp.getScript()) {
case "Hani":
return "CJK";
case "":
break;
default:
throw new IllegalArgumentException("Need to fix code: " + ltp.getScript());
}
return prefix + cldrFile.getName(ltp.getLanguage()).replace(" [Other]", "").replace(" languages", "");
}
@Override
public String toString() {
return getName(CLDRConfig.getInstance().getEnglish());
}
}