xref: /aosp_15_r20/external/cldr/tools/cldr-code/src/main/java/org/unicode/cldr/util/LanguageInfo.java (revision 912701f9769bb47905792267661f0baf2b85bed5)
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