1 package org.unicode.cldr.unittest; 2 3 import java.util.HashMap; 4 import java.util.List; 5 import java.util.Locale; 6 import java.util.Map; 7 import java.util.Map.Entry; 8 import java.util.Set; 9 import java.util.TreeSet; 10 11 import org.unicode.cldr.tool.LanguageCodeConverter; 12 import org.unicode.cldr.tool.LikelySubtags; 13 import org.unicode.cldr.util.CLDRConfig; 14 import org.unicode.cldr.util.CLDRFile; 15 import org.unicode.cldr.util.LanguageTagParser; 16 import org.unicode.cldr.util.SupplementalDataInfo; 17 import org.unicode.cldr.util.SupplementalDataInfo.BasicLanguageData; 18 import org.unicode.cldr.util.SupplementalDataInfo.BasicLanguageData.Type; 19 20 import com.ibm.icu.impl.Row; 21 import com.ibm.icu.impl.Row.R2; 22 import com.ibm.icu.impl.Row.R5; 23 24 public class CheckLanguageCodeConverter { 25 public static void main(String[] args) { 26 CLDRFile english = CLDRConfig.getInstance().getEnglish(); 27 System.out 28 .println("Input Name" + "\t" + "Std Code" + "\t" + "Std Name"); 29 Set<LanguageName> names = new TreeSet<LanguageName>(); 30 for (Entry<String, String> codeName : LanguageCodeConverter 31 .getLanguageNameToCode().entrySet()) { 32 String name = codeName.getKey(); 33 String code = codeName.getValue(); 34 if (LanguageCodeConverter.getExceptionCodes().contains(code)) { 35 String cldrName = getName(english, code); 36 names.add(new LanguageName(code, cldrName)); 37 if (!name.equalsIgnoreCase(cldrName)) { 38 names.add(new LanguageName(code, name)); 39 } 40 } 41 } 42 for (LanguageName item : names) { 43 String code = item.get0(); 44 String name = item.get1(); 45 String cldrName = getName(english, code); 46 System.out.println(name.toLowerCase(Locale.ENGLISH) + "\t" + code 47 + "\t" + cldrName); 48 } 49 50 System.out.println(); 51 System.out.println("Input Code" + "\t" + "Bcp47 Code" + "\t" 52 + "CLDR Code" + "\t" + "Google Code" + "\t" + "Std Name"); 53 54 Set<LanguageLine> lines = new TreeSet<LanguageLine>(); 55 SupplementalDataInfo supplementalDataInfo = SupplementalDataInfo 56 .getInstance(); 57 Map<String, R2<List<String>, String>> languageAliases = supplementalDataInfo 58 .getLocaleAliasInfo().get("language"); 59 60 for (Entry<String, R2<List<String>, String>> languageAlias : languageAliases 61 .entrySet()) { 62 String badCode = languageAlias.getKey(); 63 R2<List<String>, String> alias = languageAlias.getValue(); 64 65 String goodCode = alias.get0() == null ? "?" : alias.get0().get(0); 66 67 if (LanguageCodeConverter.getExceptionCodes().contains(goodCode)) { 68 String cldrName = getName(english, goodCode); 69 String googleCode = LanguageCodeConverter 70 .toGoogleLocaleId(goodCode); 71 addLine(lines, badCode, goodCode, googleCode, cldrName); 72 } 73 } 74 for (Entry<String, String> entry : LanguageCodeConverter.GOOGLE_CLDR 75 .entrySet()) { 76 String googleCode = entry.getKey(); 77 String goodCode = LanguageCodeConverter.toHyphenLocale(entry 78 .getValue()); 79 String cldrName = getName(english, goodCode); 80 addLine(lines, googleCode, goodCode, googleCode, cldrName); 81 } 82 for (String goodCode : LanguageCodeConverter.getExceptionCodes()) { 83 String cldrName = getName(english, goodCode); 84 String googleCode = LanguageCodeConverter 85 .toGoogleLocaleId(goodCode); 86 addLine(lines, googleCode, goodCode, googleCode, cldrName); 87 } 88 for (String cldr : LanguageCodeConverter.CLDR_GOOGLE.keySet()) { 89 String goodCode = LanguageCodeConverter.toUnderbarLocale(cldr); 90 String googleCode = LanguageCodeConverter 91 .toGoogleLocaleId(goodCode); 92 String cldrName = getName(english, goodCode); 93 addLine(lines, googleCode, goodCode, googleCode, cldrName); 94 } 95 for (LanguageLine entry : lines) { 96 if (entry.isStandard()) { 97 printLine(entry); 98 } 99 } 100 for (LanguageLine entry : lines) { 101 if (!entry.isStandard()) { 102 printLine(entry); 103 } 104 } 105 106 LikelySubtags likely = new LikelySubtags(supplementalDataInfo); 107 LanguageTagParser ltp = new LanguageTagParser(); 108 // get targets of language aliases for macros 109 Map<String, String> macroToEncompassed = new HashMap<String, String>(); 110 for (Entry<String, R2<List<String>, String>> languageAlias : languageAliases 111 .entrySet()) { 112 String reason = languageAlias.getValue().get1(); 113 if ("macrolanguage".equals(reason)) { 114 macroToEncompassed.put(languageAlias.getValue().get0().get(0), 115 languageAlias.getKey()); 116 } 117 } 118 119 System.out.println(); 120 System.out.println("Bcp47 Code" + "\t" + "Name" + "\t" 121 + "Script\tEncomp.Lang?\tName"); 122 123 for (String code : LanguageCodeConverter.getExceptionCodes()) { 124 String max = likely.maximize(code); 125 126 String script = "?"; 127 if (max != null) { 128 script = ltp.set(max).getScript(); 129 } else { 130 Set<BasicLanguageData> data = supplementalDataInfo 131 .getBasicLanguageData(code); 132 if (data != null) { 133 for (BasicLanguageData item : data) { 134 Set<String> scripts = item.getScripts(); 135 if (scripts == null || scripts.size() == 0) 136 continue; 137 script = scripts.iterator().next(); 138 Type type = item.getType(); 139 if (type == Type.primary) { 140 break; 141 } 142 } 143 } 144 if (script.equals("?")) { 145 script = LanguageCodeConverter.EXTRA_SCRIPTS.get(code); 146 } 147 } 148 149 String encompassed = macroToEncompassed.get(code); 150 if (encompassed == null) { 151 encompassed = ""; 152 } else { 153 encompassed = "\t" + encompassed + "\t" 154 + getName(english, encompassed); 155 } 156 System.out.println(LanguageCodeConverter.toHyphenLocale(code) 157 + "\t" + getName(english, code) + "\t" + script 158 + encompassed); 159 } 160 } 161 162 public static String getName(CLDRFile english, String goodCode) { 163 if (goodCode.startsWith("x_")) { 164 return "Private use: " + goodCode.substring(2); 165 } 166 return english.getName(goodCode); 167 } 168 169 public static void printLine(LanguageLine entry) { 170 System.out.println(entry.get1() // reverse the order: bad 171 + "\t" + entry.get0() // bcp47 172 + "\t" + entry.get2() // cldr 173 + "\t" + entry.get3() // google 174 + "\t" + entry.get4()); 175 } 176 177 private static class LanguageLine extends 178 R5<String, String, String, String, String> { 179 public LanguageLine(String a, String b, String c, String d) { 180 super(LanguageCodeConverter.toHyphenLocale(a), b, 181 LanguageCodeConverter.toUnderbarLocale(a), c, d); 182 } 183 184 boolean isStandard() { 185 return get0().equals(get2()) && get0().equals(get3()); 186 } 187 } 188 189 public static void addLine(Set<LanguageLine> lines, String badCode, 190 String goodCode, String googleCode, String cldrName) { 191 // add the various combinations 192 lines.add(new LanguageLine(goodCode, goodCode, googleCode, cldrName)); 193 lines.add(new LanguageLine(goodCode, badCode, googleCode, cldrName)); 194 lines.add(new LanguageLine(goodCode, googleCode, googleCode, cldrName)); 195 lines.add(new LanguageLine(goodCode, LanguageCodeConverter 196 .toUnderbarLocale(goodCode), googleCode, cldrName)); 197 lines.add(new LanguageLine(goodCode, LanguageCodeConverter 198 .toUnderbarLocale(badCode), googleCode, cldrName)); 199 lines.add(new LanguageLine(goodCode, LanguageCodeConverter 200 .toUnderbarLocale(googleCode), googleCode, cldrName)); 201 lines.add(new LanguageLine(goodCode, LanguageCodeConverter 202 .toHyphenLocale(goodCode), googleCode, cldrName)); 203 lines.add(new LanguageLine(goodCode, LanguageCodeConverter 204 .toHyphenLocale(badCode), googleCode, cldrName)); 205 lines.add(new LanguageLine(goodCode, LanguageCodeConverter 206 .toHyphenLocale(googleCode), googleCode, cldrName)); 207 } 208 209 private static class LanguageName extends Row.R2<String, String> { 210 211 public LanguageName(String a, String b) { 212 super(a, b); 213 // TODO Auto-generated constructor stub 214 } 215 } 216 } 217