1 package org.unicode.cldr.util; 2 3 import com.ibm.icu.impl.Relation; 4 import java.util.Collections; 5 import java.util.EnumMap; 6 import java.util.Map; 7 import java.util.Map.Entry; 8 import java.util.Set; 9 import java.util.TreeMap; 10 import java.util.TreeSet; 11 import org.unicode.cldr.util.SupplementalDataInfo.OfficialStatus; 12 import org.unicode.cldr.util.SupplementalDataInfo.PopulationData; 13 14 public class LanguageInfo { 15 static final StandardCodes sc = StandardCodes.make(); 16 static final CLDRConfig config = CLDRConfig.getInstance(); 17 static final SupplementalDataInfo SDI = config.getSupplementalDataInfo(); 18 19 public enum CldrDir { 20 base, 21 main, 22 seed 23 } 24 25 private int literatePopulation; 26 private Relation<OfficialStatus, String> statusToRegions = 27 Relation.of( 28 new EnumMap<OfficialStatus, Set<String>>(OfficialStatus.class), TreeSet.class); 29 private Level level; 30 private LanguageInfo.CldrDir cldrDir; 31 32 /** 33 * @return the statusToRegions 34 */ getStatusToRegions()35 public Relation<OfficialStatus, String> getStatusToRegions() { 36 return statusToRegions; 37 } 38 39 /** 40 * @return the literatePopulation 41 */ getLiteratePopulation()42 public int getLiteratePopulation() { 43 return literatePopulation; 44 } 45 getCldrLevel()46 public Level getCldrLevel() { 47 return level; 48 } 49 getCldrDir()50 public LanguageInfo.CldrDir getCldrDir() { 51 return cldrDir; 52 } 53 54 // private M3<OfficialStatus, String, Boolean> status = ChainedMap.of(new 55 // EnumMap<OfficialStatus, Object>(OfficialStatus.class), new TreeMap<String,Object>(), 56 // Boolean.class); get(String languageCode)57 public static LanguageInfo get(String languageCode) { 58 return languageCodeToInfo.get(languageCode); 59 } 60 getAvailable()61 public static Set<String> getAvailable() { 62 return languageCodeToInfo.keySet(); 63 } 64 65 @Override toString()66 public String toString() { 67 return literatePopulation 68 + "\t" 69 + CldrUtility.ifNull(cldrDir, "") 70 + "\t" 71 + CldrUtility.ifSame(level, Level.UNDETERMINED, "") 72 + "\t" 73 + (statusToRegions.isEmpty() ? "" : statusToRegions.toString()); 74 } 75 76 static final Map<String, LanguageInfo> languageCodeToInfo; 77 78 static { 79 TreeMap<String, LanguageInfo> temp = new TreeMap<>(); 80 // get population/official status 81 LanguageTagParser ltp = new LanguageTagParser(); 82 for (String territory : SDI.getTerritoriesWithPopulationData()) { 83 for (String language0 : SDI.getLanguagesForTerritoryWithPopulationData(territory)) { 84 PopulationData data = 85 SDI.getLanguageAndTerritoryPopulationData(language0, territory); 86 String language = ltp.set(language0).getLanguage(); 87 LanguageInfo foo = getRaw(temp, language); 88 OfficialStatus ostatus = data.getOfficialStatus(); 89 if (ostatus != OfficialStatus.unknown) { foo.statusToRegions.put(ostatus, territory)90 foo.statusToRegions.put(ostatus, territory); 91 } 92 foo.literatePopulation += data.getLiteratePopulation(); // TODO: double to int 93 } 94 } 95 // set cldr directory status 96 final Set<String> languages = config.getCldrFactory().getAvailableLanguages(); 97 final Set<String> full_languages = config.getFullCldrFactory().getAvailableLanguages(); 98 for (String language : full_languages) { 99 LanguageInfo foo = getRaw(temp, language); 100 foo.cldrDir = languages.contains(language) ? CldrDir.main : CldrDir.seed; 101 } 102 getRaw(temp, LocaleNames.UND).cldrDir = CldrDir.base; 103 getRaw(temp, LocaleNames.ZXX).cldrDir = CldrDir.base; 104 105 // finalize and protect 106 for (Entry<String, LanguageInfo> entry : temp.entrySet()) { 107 final LanguageInfo value = entry.getValue(); value.statusToRegions.freeze()108 value.statusToRegions.freeze(); 109 value.level = sc.getLocaleCoverageLevel(Organization.cldr, entry.getKey()); 110 } 111 languageCodeToInfo = Collections.unmodifiableMap(temp); 112 } 113 getRaw(TreeMap<String, LanguageInfo> temp, String language)114 private static LanguageInfo getRaw(TreeMap<String, LanguageInfo> temp, String language) { 115 LanguageInfo foo = temp.get(language); 116 if (foo == null) { 117 temp.put(language, foo = new LanguageInfo()); 118 } 119 return foo; 120 } 121 } 122