blob: 1261e477f784b0201e4639a502716c6613ce9832 [file] [log] [blame]
package org.unicode.cldr.tool;
import java.util.LinkedHashMap;
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.CLDRFile;
import org.unicode.cldr.util.CLDRPaths;
import org.unicode.cldr.util.Counter;
import org.unicode.cldr.util.Factory;
import org.unicode.cldr.util.LanguageTagParser;
import org.unicode.cldr.util.LocaleIDParser;
import org.unicode.cldr.util.PrettyPath;
import com.ibm.icu.dev.util.CollectionUtilities;
import com.ibm.icu.impl.Relation;
public class ShowChildren {
public static void main(String[] args) {
System.out.println("Arguments: " + CollectionUtilities.join(args, " "));
long startTime = System.currentTimeMillis();
Factory cldrFactory = Factory.make(CLDRPaths.MAIN_DIRECTORY, ".*");
Set<String> locales = new TreeSet<String>(cldrFactory.getAvailable());
Relation<String, String> parent2children = Relation.of(new TreeMap<String, Set<String>>(), TreeSet.class);
LanguageTagParser ltp = new LanguageTagParser();
for (String locale : locales) {
String parent = getParentWithoutRegion(ltp, locale);
if (!parent.equals(locale)) {
parent2children.put(parent, locale);
}
}
PrettyPath prettyPath = new PrettyPath();
final CLDRFile english = ToolConfig.getToolInstance().getEnglish();
Counter<String> deviations = new Counter<String>();
for (Entry<String, Set<String>> entry : parent2children.keyValuesSet()) {
Map<String, Relation<String, String>> path2value2locales = new TreeMap<String, Relation<String, String>>();
String parent = entry.getKey();
String parentName = english.getName(parent);
CLDRFile parentFile = (CLDRFile) cldrFactory.make(parent, true);
Set<String> children = entry.getValue();
for (String child : children) {
CLDRFile file = (CLDRFile) cldrFactory.make(child, false);
for (String path : file) {
if (path.startsWith("//ldml/identity")
|| path.endsWith("/alias")
|| path.endsWith("/commonlyUsed")) {
continue;
}
Relation<String, String> value2locales = path2value2locales.get(path);
if (value2locales == null) {
path2value2locales.put(path,
value2locales = Relation.of(new LinkedHashMap<String, Set<String>>(), TreeSet.class));
}
String parentValue = parentFile.getStringValue(path);
if (parentValue == null) {
parentValue = "*MISSING*";
}
String childValue = file.getStringValue(path);
if (parentValue.equals(childValue)) {
continue;
}
value2locales.put(parentValue, parent);
value2locales.put(childValue, child);
}
}
if (path2value2locales.size() == 0) {
continue;
}
for (Entry<String, Relation<String, String>> datum : path2value2locales.entrySet()) {
String path = datum.getKey();
String ppath = prettyPath.getPrettyPath(path, false);
Relation<String, String> value2locales = datum.getValue();
for (Entry<String, Set<String>> valueAndLocales : value2locales.keyValuesSet()) {
System.out.println(parentName + "\t" + parent + "\t〈" + valueAndLocales.getKey() + "〉\t"
+ valueAndLocales.getValue() + "\t" + ppath);
}
System.out.println();
}
deviations.add(parent, path2value2locales.size());
}
for (String locale : deviations.getKeysetSortedByKey()) {
String parentName = english.getName(locale);
System.out.println(parentName + "\t" + locale + "\t" + deviations.get(locale));
}
System.out
.println("Done -- Elapsed time: " + ((System.currentTimeMillis() - startTime) / 60000.0) + " minutes");
}
private static String getParentWithoutRegion(LanguageTagParser ltp, String locale) {
while (true) {
if (ltp.set(locale).getRegion().isEmpty()) {
return locale;
}
locale = LocaleIDParser.getParent(locale);
}
}
}