blob: fcf38afb912148776858693609c54b482470d4bf [file] [log] [blame]
package org.unicode.cldr.util;
import java.util.Collections;
import java.util.EnumMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
import org.unicode.cldr.util.SupplementalDataInfo.OfficialStatus;
import org.unicode.cldr.util.SupplementalDataInfo.PopulationData;
import com.ibm.icu.impl.Relation;
public class LanguageInfo {
static final StandardCodes sc = StandardCodes.make();
static final CLDRConfig config = CLDRConfig.getInstance();
static final SupplementalDataInfo SDI = config.getSupplementalDataInfo();
public enum CldrDir {
base, main, seed
}
private int literatePopulation;
private Relation<OfficialStatus, String> statusToRegions = Relation.of(new EnumMap<OfficialStatus, Set<String>>(OfficialStatus.class), TreeSet.class);
private Level level;
private LanguageInfo.CldrDir cldrDir;
/**
* @return the statusToRegions
*/
public Relation<OfficialStatus, String> getStatusToRegions() {
return statusToRegions;
}
/**
* @return the literatePopulation
*/
public int getLiteratePopulation() {
return literatePopulation;
}
public Level getCldrLevel() {
return level;
}
public LanguageInfo.CldrDir getCldrDir() {
return cldrDir;
}
//private M3<OfficialStatus, String, Boolean> status = ChainedMap.of(new EnumMap<OfficialStatus, Object>(OfficialStatus.class), new TreeMap<String,Object>(), Boolean.class);
public static LanguageInfo get(String languageCode) {
return languageCodeToInfo.get(languageCode);
}
public static Set<String> getAvailable() {
return languageCodeToInfo.keySet();
}
@Override
public String toString() {
return literatePopulation
+ "\t" + CldrUtility.ifNull(cldrDir, "")
+ "\t" + CldrUtility.ifSame(level, Level.UNDETERMINED, "")
+ "\t" + (statusToRegions.isEmpty() ? "" : statusToRegions.toString());
}
static final Map<String, LanguageInfo> languageCodeToInfo;
static {
TreeMap<String, LanguageInfo> temp = new TreeMap<>();
// get population/official status
LanguageTagParser ltp = new LanguageTagParser();
for (String territory : SDI.getTerritoriesWithPopulationData()) {
for (String language0 : SDI.getLanguagesForTerritoryWithPopulationData(territory)) {
PopulationData data = SDI.getLanguageAndTerritoryPopulationData(language0, territory);
String language = ltp.set(language0).getLanguage();
LanguageInfo foo = getRaw(temp, language);
OfficialStatus ostatus = data.getOfficialStatus();
if (ostatus != OfficialStatus.unknown) {
foo.statusToRegions.put(ostatus, territory);
}
foo.literatePopulation += data.getLiteratePopulation(); // TODO: double to int
}
}
// set cldr directory status
final Set<String> languages = config.getCldrFactory().getAvailableLanguages();
final Set<String> full_languages = config.getFullCldrFactory().getAvailableLanguages();
for (String language : full_languages) {
LanguageInfo foo = getRaw(temp, language);
foo.cldrDir = languages.contains(language) ? CldrDir.main
: CldrDir.seed;
}
getRaw(temp, "und").cldrDir = CldrDir.base;
getRaw(temp, "zxx").cldrDir = CldrDir.base;
// finalize and protect
for (Entry<String, LanguageInfo> entry : temp.entrySet()) {
final LanguageInfo value = entry.getValue();
value.statusToRegions.freeze();
value.level = sc.getLocaleCoverageLevel(Organization.cldr, entry.getKey());
}
languageCodeToInfo = Collections.unmodifiableMap(temp);
}
private static LanguageInfo getRaw(TreeMap<String, LanguageInfo> temp, String language) {
LanguageInfo foo = temp.get(language);
if (foo == null) {
temp.put(language, foo = new LanguageInfo());
}
return foo;
}
}