Home | History | Annotate | Download | only in unittest
      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