I'm integrating ICU into some in-house software. I'd like to be able to take a string such as "en_US" and get the script name "Latin" for it. (Though ultimately I actually want an ICU ScriptCode.)
I tried using ICU's Locale class, but this code:
Locale *ul = new Locale("en_US",);
LOG(ul->getScript());
Logs an empty string, despite the documentation indicating that this is the use case. I even tried it using the Locale class' static method Locale::getEnglish
and still got an empty string. I'm new to this internationalization stuff and to ICU. Is there something I'm missing? Seems like this should be a pretty straightforward task.
Edit: After reading the source code for Locale, it seems that the only time it can provide a script code is when it's passed to the constructor (ie. "en_Latn_US"). Cheers for inadequate documentation. My overall question still stands.
Better: http://unicode.org/repos/cldr/trunk/common/supplemental/supplementalData.xml
std::map<std::string /*ISO 639-1*/, std::map<std::string/*ISO ISO3166-1 Alpha 2 or empty*/, std::string /*ISO 15924*/>> table = {
{"aa", {{"", "Latn"}}},
{"ab", {{"", "Cyrl"}}},
{"abq", {{"", "Cyrl"}}},
{"abr", {{"", ""}}},
{"ace", {{"", "Latn"}}},
{"ach", {{"", "Latn"}}},
{"ada", {{"", "Latn"}}},
{"ady", {{"", "Cyrl"}}},
{"ae", {{"", "Avst"}}},
{"af", {{"", "Latn"}}},
{"agq", {{"", "Latn"}}},
{"aii", {{"", "Cyrl"}}},
{"ain", {{"", "Kana"}}},
{"ak", {{"", "Latn"}}},
{"akk", {{"", "Xsux"}}},
{"ale", {{"", "Latn"}}},
{"alt", {{"", "Cyrl"}}},
{"am", {{"", "Ethi"}}},
{"amo", {{"", "Latn"}}},
{"an", {{"", "Latn"}}},
{"anp", {{"", "Deva"}}},
{"aoz", {{"", ""}}},
{"ar", {{"", "Arab"}, {"IR", "Syrc"}}},
{"arc", {{"", "Armi"}}},
{"arn", {{"", "Latn"}}},
{"arp", {{"", "Latn"}}},
{"arw", {{"", "Latn"}}},
{"as", {{"", "Beng"}}},
{"asa", {{"", "Latn"}}},
{"ast", {{"", "Latn"}}},
{"atj", {{"", ""}}},
{"av", {{"", "Cyrl"}}},
{"awa", {{"", "Deva"}}},
{"ay", {{"", "Latn"}}},
{"az", {{"", "Latn"}, {"AZ", "Cyrl"}, {"IR", "Arab"}}},
{"ba", {{"", "Cyrl"}}},
{"bal", {{"", "Arab"}, {"IR", "Latn"}, {"PK", "Latn"}}},
{"ban", {{"", "Latn"}, {"ID", "Bali"}}},
{"bap", {{"", ""}}},
{"bas", {{"", "Latn"}}},
{"bax", {{"", "Bamu"}}},
{"bbc", {{"", "Latn"}, {"ID", "Batk"}}},
{"bbj", {{"", ""}}},
{"bci", {{"", ""}}},
{"be", {{"", "Cyrl"}}},
{"bej", {{"", "Arab"}}},
{"bem", {{"", "Latn"}}},
{"bew", {{"", ""}}},
{"bez", {{"", "Latn"}}},
{"bfd", {{"", ""}}},
{"bfq", {{"", "Taml"}}},
{"bft", {{"", "Arab"}}},
{"bfy", {{"", "Deva"}}},
{"bg", {{"", "Cyrl"}}},
{"bgc", {{"", ""}}},
{"bgx", {{"", ""}}},
{"bh", {{"", "Deva"}}},
{"bhb", {{"", "Deva"}}},
{"bhi", {{"", ""}}},
{"bhk", {{"", ""}}},
{"bho", {{"", "Deva"}}},
{"bi", {{"", "Latn"}}},
{"bik", {{"", "Latn"}}},
{"bin", {{"", "Latn"}}},
{"bjj", {{"", "Deva"}}},
{"bjn", {{"", ""}}},
{"bkm", {{"", ""}}},
{"bku", {{"", "Latn"}}},
{"bla", {{"", "Latn"}}},
{"blt", {{"", "Tavt"}}},
{"bm", {{"", "Latn"}}},
{"bmq", {{"", ""}}},
{"bn", {{"", "Beng"}}},
{"bo", {{"", "Tibt"}}},
{"bqi", {{"", ""}}},
{"bqv", {{"", "Latn"}}},
{"br", {{"", "Latn"}}},
{"bra", {{"", "Deva"}}},
{"brh", {{"", ""}}},
{"brx", {{"", "Deva"}}},
{"bs", {{"", "Latn"}}},
{"bss", {{"", ""}}},
{"bto", {{"", ""}}},
{"btv", {{"", "Deva"}}},
{"bua", {{"", "Cyrl"}}},
{"buc", {{"", "Latn"}}},
{"bug", {{"", "Latn"}, {"ID", "Bugi"}}},
{"bum", {{"", ""}}},
{"bvb", {{"", ""}}},
{"bya", {{"", "Latn"}}},
{"byn", {{"", "Ethi"}}},
{"byv", {{"", ""}}},
{"bze", {{"", ""}}},
{"bzx", {{"", ""}}},
{"ca", {{"", "Latn"}}},
{"cad", {{"", "Latn"}}},
{"car", {{"", "Latn"}}},
{"cay", {{"", "Latn"}}},
{"cch", {{"", "Latn"}}},
{"ccp", {{"", "Beng"}}},
{"ce", {{"", "Cyrl"}}},
{"ceb", {{"", "Latn"}}},
{"cgg", {{"", "Latn"}}},
{"ch", {{"", "Latn"}}},
{"chk", {{"", "Latn"}}},
{"chm", {{"", "Cyrl"}}},
{"chn", {{"", "Latn"}}},
{"cho", {{"", "Latn"}}},
{"chp", {{"", "Latn"}}},
{"chr", {{"", "Cher"}}},
{"chy", {{"", "Latn"}}},
{"cja", {{"", "Arab"}}},
{"cjm", {{"", "Cham"}}},
{"cjs", {{"", "Cyrl"}}},
{"ckb", {{"", "Arab"}}},
{"ckt", {{"", "Cyrl"}}},
{"co", {{"", "Latn"}}},
{"cop", {{"", "Arab"}}},
{"cpe", {{"", "Latn"}}},
{"cr", {{"", "Cans"}}},
{"crh", {{"", "Cyrl"}}},
{"crj", {{"", ""}}},
{"crk", {{"", "Cans"}}},
{"crl", {{"", ""}}},
{"crm", {{"", ""}}},
{"crs", {{"", ""}}},
{"cs", {{"", "Latn"}}},
{"csb", {{"", "Latn"}}},
{"csw", {{"", ""}}},
{"cu", {{"", "Glag"}}},
{"cv", {{"", "Cyrl"}}},
{"cy", {{"", "Latn"}}},
{"da", {{"", "Latn"}}},
{"daf", {{"", ""}}},
{"dak", {{"", "Latn"}}},
{"dar", {{"", "Cyrl"}}},
{"dav", {{"", "Latn"}}},
{"dcc", {{"", ""}}},
{"de", {{"", "Latn"}, {"BR", "Runr"}, {"KZ", "Runr"}, {"US", "Runr"}}},
{"del", {{"", "Latn"}}},
{"den", {{"", "Latn"}}},
{"dgr", {{"", "Latn"}}},
{"din", {{"", "Latn"}}},
{"dje", {{"", "Latn"}}},
{"dng", {{"", "Cyrl"}}},
{"doi", {{"", "Arab"}}},
{"dsb", {{"", "Latn"}}},
{"dtm", {{"", ""}}},
{"dua", {{"", "Latn"}}},
{"dv", {{"", "Thaa"}}},
{"dyo", {{"", "Arab"}}},
{"dyu", {{"", "Latn"}}},
{"dz", {{"", "Tibt"}}},
{"ebu", {{"", "Latn"}}},
{"ee", {{"", "Latn"}}},
{"efi", {{"", "Latn"}}},
{"egy", {{"", "Egyp"}}},
{"eka", {{"", "Latn"}}},
{"eky", {{"", "Kali"}}},
{"el", {{"", "Grek"}}},
{"en", {{"", "Latn"}}},
{"eo", {{"", "Latn"}}},
{"es", {{"", "Latn"}}},
{"et", {{"", "Latn"}}},
{"ett", {{"", "Ital"}}},
{"eu", {{"", "Latn"}}},
{"evn", {{"", "Cyrl"}}},
{"ewo", {{"", "Latn"}}},
{"fa", {{"", "Arab"}}},
{"fan", {{"", "Latn"}}},
{"ff", {{"", "Latn"}}},
{"ffm", {{"", ""}}},
{"fi", {{"", "Latn"}}},
{"fil", {{"", "Latn"}, {"US", "Tglg"}}},
{"fiu", {{"", "Latn"}}},
{"fj", {{"", "Latn"}}},
{"fo", {{"", "Latn"}}},
{"fon", {{"", "Latn"}}},
{"fr", {{"", "Latn"}}},
{"frr", {{"", "Latn"}}},
{"frs", {{"", "Latn"}}},
{"fud", {{"", ""}}},
{"fuq", {{"", ""}}},
{"fur", {{"", "Latn"}}},
{"fuv", {{"", ""}}},
{"fy", {{"", "Latn"}}},
{"ga", {{"", "Latn"}}},
{"gaa", {{"", "Latn"}}},
{"gag", {{"", "Latn"}, {"MD", "Cyrl"}}},
{"gay", {{"", "Latn"}}},
{"gba", {{"", "Arab"}}},
{"gbm", {{"", "Deva"}}},
{"gcr", {{"", "Latn"}}},
{"gd", {{"", "Latn"}}},
{"gez", {{"", "Ethi"}}},
{"ggn", {{"", ""}}},
{"gil", {{"", "Latn"}}},
{"gjk", {{"", ""}}},
{"gju", {{"", ""}}},
{"gl", {{"", "Latn"}}},
{"gld", {{"", "Cyrl"}}},
{"glk", {{"", ""}}},
{"gn", {{"", "Latn"}}},
{"gon", {{"", "Telu"}}},
{"gor", {{"", "Latn"}}},
{"gos", {{"", ""}}},
{"got", {{"", "Goth"}}},
{"grb", {{"", "Latn"}}},
{"grc", {{"", "Cprt"}}},
{"grt", {{"", "Beng"}}},
{"gsw", {{"", "Latn"}}},
{"gu", {{"", "Gujr"}}},
{"gub", {{"", ""}}},
{"guz", {{"", "Latn"}}},
{"gv", {{"", "Latn"}}},
{"gvr", {{"", ""}}},
{"gwi", {{"", "Latn"}}},
{"ha", {{"", "Arab"}, {"NE", "Latn"}, {"GH", "Latn"}}},
{"hai", {{"", "Latn"}}},
{"haw", {{"", "Latn"}}},
{"haz", {{"", ""}}},
{"he", {{"", "Hebr"}}},
{"hi", {{"", "Deva"}}},
{"hil", {{"", "Latn"}}},
{"hit", {{"", "Xsux"}}},
{"hmn", {{"", "Latn"}}},
{"hnd", {{"", ""}}},
{"hne", {{"", "Deva"}}},
{"hnn", {{"", "Latn"}}},
{"hno", {{"", ""}}},
{"ho", {{"", "Latn"}}},
{"hoc", {{"", "Deva"}}},
{"hoj", {{"", "Deva"}}},
{"hop", {{"", "Latn"}}},
{"hr", {{"", "Latn"}}},
{"hsb", {{"", "Latn"}}},
{"ht", {{"", "Latn"}}},
{"hu", {{"", "Latn"}}},
{"hup", {{"", "Latn"}}},
{"hy", {{"", "Armn"}}},
{"hz", {{"", "Latn"}}},
{"ia", {{"", "Latn"}}},
{"iba", {{"", "Latn"}}},
{"ibb", {{"", "Latn"}}},
{"id", {{"", "Latn"}}},
{"ig", {{"", "Latn"}}},
{"ii", {{"", "Yiii"}, {"CN", "Latn"}}},
{"ik", {{"", "Latn"}}},
{"ikt", {{"", ""}}},
{"ilo", {{"", "Latn"}}},
{"inh", {{"", "Cyrl"}}},
{"is", {{"", "Latn"}}},
{"it", {{"", "Latn"}}},
{"iu", {{"", "Cans"}, {"CA", "Latn"}}},
{"ja", {{"", "Jpan"}}},
{"jmc", {{"", "Latn"}}},
{"jml", {{"", ""}}},
{"jpr", {{"", "Hebr"}}},
{"jrb", {{"", "Hebr"}}},
{"jv", {{"", "Latn"}, {"ID", "Java"}}},
{"ka", {{"", "Geor"}}},
{"kaa", {{"", "Cyrl"}}},
{"kab", {{"", "Latn"}}},
{"kac", {{"", "Latn"}}},
{"kaj", {{"", "Latn"}}},
{"kam", {{"", "Latn"}}},
{"kao", {{"", ""}}},
{"kbd", {{"", "Cyrl"}}},
{"kca", {{"", "Cyrl"}}},
{"kcg", {{"", "Latn"}}},
{"kck", {{"", ""}}},
{"kde", {{"", "Latn"}}},
{"kdt", {{"", "Thai"}}},
{"kea", {{"", "Latn"}}},
{"kfo", {{"", "Latn"}}},
{"kfr", {{"", "Deva"}}},
{"kfy", {{"", ""}}},
{"kg", {{"", "Latn"}}},
{"kge", {{"", ""}}},
{"kgp", {{"", ""}}},
{"kha", {{"", "Latn"}, {"IN", "Beng"}}},
{"khb", {{"", "Talu"}}},
{"khn", {{"", ""}}},
{"khq", {{"", "Latn"}}},
{"kht", {{"", "Mymr"}}},
{"khw", {{"", ""}}},
{"ki", {{"", "Latn"}}},
{"kj", {{"", "Latn"}}},
{"kjg", {{"", ""}}},
{"kjh", {{"", "Cyrl"}}},
{"kk", {{"", "Arab"}, {"KZ", "Cyrl"}, {"TR", "Cyrl"}}},
{"kkj", {{"", ""}}},
{"kl", {{"", "Latn"}}},
{"kln", {{"", "Latn"}}},
{"km", {{"", "Khmr"}}},
{"kmb", {{"", "Latn"}}},
{"kn", {{"", "Knda"}}},
{"ko", {{"", "Kore"}}},
{"koi", {{"", "Cyrl"}}},
{"kok", {{"", "Deva"}}},
{"kos", {{"", "Latn"}}},
{"kpe", {{"", "Latn"}}},
{"kpy", {{"", "Cyrl"}}},
{"kr", {{"", "Latn"}}},
{"krc", {{"", "Cyrl"}}},
{"kri", {{"", "Latn"}}},
{"krl", {{"", "Latn"}}},
{"kru", {{"", "Deva"}}},
{"ks", {{"", "Arab"}}},
{"ksb", {{"", "Latn"}}},
{"ksf", {{"", "Latn"}}},
{"ksh", {{"", "Latn"}}},
{"ku", {{"", "Latn"}, {"LB", "Arab"}}},
{"kum", {{"", "Cyrl"}}},
{"kut", {{"", "Latn"}}},
{"kv", {{"", "Cyrl"}}},
{"kvr", {{"", ""}}},
{"kvx", {{"", ""}}},
{"kw", {{"", "Latn"}}},
{"kxm", {{"", ""}}},
{"kxp", {{"", ""}}},
{"ky", {{"", "Cyrl"}, {"CN", "Arab"}, {"TR", "Latn"}}},
{"kyu", {{"", "Kali"}}},
{"la", {{"", "Latn"}}},
{"lad", {{"", "Hebr"}}},
{"lag", {{"", "Latn"}}},
{"lah", {{"", "Arab"}}},
{"laj", {{"", ""}}},
{"lam", {{"", "Latn"}}},
{"lb", {{"", "Latn"}}},
{"lbe", {{"", "Cyrl"}}},
{"lbw", {{"", ""}}},
{"lcp", {{"", "Thai"}}},
{"lep", {{"", "Lepc"}}},
{"lez", {{"", "Cyrl"}}},
{"lg", {{"", "Latn"}}},
{"li", {{"", "Latn"}}},
{"lif", {{"", "Deva"}}},
{"lis", {{"", "Lisu"}}},
{"ljp", {{"", ""}}},
{"lki", {{"", "Arab"}}},
{"lkt", {{"", ""}}},
{"lmn", {{"", "Telu"}}},
{"lmo", {{"", ""}}},
{"ln", {{"", "Latn"}}},
{"lo", {{"", "Laoo"}}},
{"lol", {{"", "Latn"}}},
{"loz", {{"", "Latn"}}},
{"lrc", {{"", ""}}},
{"lt", {{"", "Latn"}}},
{"lu", {{"", "Latn"}}},
{"lua", {{"", "Latn"}}},
{"lui", {{"", "Latn"}}},
{"lun", {{"", "Latn"}}},
{"luo", {{"", "Latn"}}},
{"lus", {{"", "Beng"}}},
{"lut", {{"", "Latn"}}},
{"luy", {{"", "Latn"}}},
{"luz", {{"", ""}}},
{"lv", {{"", "Latn"}}},
{"lwl", {{"", "Thai"}}},
{"mad", {{"", "Latn"}}},
{"maf", {{"", ""}}},
{"mag", {{"", "Deva"}}},
{"mai", {{"", "Deva"}}},
{"mak", {{"", "Latn"}, {"ID", "Bugi"}}},
{"man", {{"", "Latn"}, {"GN", "Nkoo"}}},
{"mas", {{"", "Latn"}}},
{"maz", {{"", ""}}},
{"mdf", {{"", "Cyrl"}}},
{"mdh", {{"", "Latn"}}},
{"mdr", {{"", "Latn"}}},
{"mdt", {{"", ""}}},
{"men", {{"", "Latn"}}},
{"mer", {{"", "Latn"}}},
{"mfa", {{"", ""}}},
{"mfe", {{"", "Latn"}}},
{"mg", {{"", "Latn"}}},
{"mgh", {{"", "Latn"}}},
{"mgp", {{"", ""}}},
{"mgy", {{"", ""}}},
{"mh", {{"", "Latn"}}},
{"mi", {{"", "Latn"}}},
{"mic", {{"", "Latn"}}},
{"min", {{"", "Latn"}}},
{"mk", {{"", "Cyrl"}}},
{"ml", {{"", "Mlym"}}},
{"mn", {{"", "Cyrl"}, {"CN", "Mong"}}},
{"mnc", {{"", "Mong"}}},
{"mni", {{"", "Beng"}, {"IN", "Mtei"}}},
{"mns", {{"", "Cyrl"}}},
{"mnw", {{"", "Mymr"}}},
{"moe", {{"", ""}}},
{"moh", {{"", "Latn"}}},
{"mos", {{"", "Latn"}}},
{"mr", {{"", "Deva"}}},
{"mrd", {{"", ""}}},
{"mrj", {{"", ""}}},
{"ms", {{"", "Arab"}, {"MY", "Latn"}, {"SG", "Latn"}}},
{"mt", {{"", "Latn"}}},
{"mtr", {{"", ""}}},
{"mua", {{"", "Latn"}}},
{"mus", {{"", "Latn"}}},
{"mvy", {{"", ""}}},
{"mwk", {{"", ""}}},
{"mwl", {{"", "Latn"}}},
{"mwr", {{"", "Deva"}}},
{"mxc", {{"", ""}}},
{"my", {{"", "Mymr"}}},
{"myv", {{"", "Cyrl"}}},
{"myx", {{"", ""}}},
{"myz", {{"", "Mand"}}},
{"na", {{"", "Latn"}}},
{"nap", {{"", "Latn"}}},
{"naq", {{"", "Latn"}}},
{"nb", {{"", "Latn"}}},
{"nbf", {{"", ""}}},
{"nch", {{"", ""}}},
{"nd", {{"", "Latn"}}},
{"ndc", {{"", ""}}},
{"nds", {{"", "Latn"}}},
{"ne", {{"", "Deva"}}},
{"new", {{"", "Deva"}}},
{"ng", {{"", "Latn"}}},
{"ngl", {{"", ""}}},
{"nhe", {{"", ""}}},
{"nhw", {{"", ""}}},
{"nia", {{"", "Latn"}}},
{"nij", {{"", ""}}},
{"niu", {{"", "Latn"}}},
{"nl", {{"", "Latn"}}},
{"nmg", {{"", "Latn"}}},
{"nn", {{"", "Latn"}}},
{"nnh", {{"", ""}}},
{"nod", {{"", "Lana"}}},
{"noe", {{"", ""}}},
{"nog", {{"", "Cyrl"}}},
{"nqo", {{"", "Nkoo"}}},
{"nr", {{"", "Latn"}}},
{"nsk", {{"", ""}}},
{"nso", {{"", "Latn"}}},
{"nus", {{"", "Latn"}}},
{"nv", {{"", "Latn"}}},
{"ny", {{"", "Latn"}}},
{"nym", {{"", "Latn"}}},
{"nyn", {{"", "Latn"}}},
{"nyo", {{"", "Latn"}}},
{"nzi", {{"", "Latn"}}},
{"oc", {{"", "Latn"}}},
{"oj", {{"", "Cans"}}},
{"om", {{"", "Latn"}, {"ET", "Ethi"}}},
{"or", {{"", "Orya"}}},
{"os", {{"", "Cyrl"}}},
{"osa", {{"", "Latn"}}},
{"osc", {{"", "Ital"}}},
{"otk", {{"", "Orkh"}}},
{"pa", {{"", "Guru"}, {"PK", "Arab"}}},
{"pag", {{"", "Latn"}}},
{"pal", {{"", "Phli"}}},
{"pam", {{"", "Latn"}}},
{"pap", {{"", "Latn"}}},
{"pau", {{"", "Latn"}}},
{"peo", {{"", "Xpeo"}}},
{"phn", {{"", "Phnx"}}},
{"pi", {{"", "Deva"}}},
{"pko", {{"", ""}}},
{"pl", {{"", "Latn"}}},
{"pon", {{"", "Latn"}}},
{"pra", {{"", "Brah"}}},
{"prd", {{"", "Arab"}}},
{"prg", {{"", "Latn"}}},
{"prs", {{"", "Arab"}}},
{"ps", {{"", "Arab"}}},
{"pt", {{"", "Latn"}}},
{"puu", {{"", ""}}},
{"qu", {{"", "Latn"}}},
{"raj", {{"", "Latn"}}},
{"rap", {{"", "Latn"}}},
{"rar", {{"", "Latn"}}},
{"rcf", {{"", "Latn"}}},
{"rej", {{"", "Latn"}, {"ID", "Rjng"}}},
{"ria", {{"", ""}}},
{"rif", {{"", ""}}},
{"rjs", {{"", "Deva"}}},
{"rkt", {{"", "Beng"}}},
{"rm", {{"", "Latn"}}},
{"rmf", {{"", ""}}},
{"rmo", {{"", ""}}},
{"rmt", {{"", ""}}},
{"rn", {{"", "Latn"}}},
{"rng", {{"", ""}}},
{"ro", {{"", "Latn"}, {"RS", "Cyrl"}}},
{"rob", {{"", ""}}},
{"rof", {{"", "Latn"}}},
{"rom", {{"", "Cyrl"}}},
{"ru", {{"", "Cyrl"}}},
{"rue", {{"", ""}}},
{"rup", {{"", "Latn"}}},
{"rw", {{"", "Latn"}}},
{"rwk", {{"", "Latn"}}},
{"ryu", {{"", ""}}},
{"sa", {{"", "Deva"}}},
{"sad", {{"", "Latn"}}},
{"saf", {{"", "Latn"}}},
{"sah", {{"", "Cyrl"}}},
{"sam", {{"", "Hebr"}}},
{"saq", {{"", "Latn"}}},
{"sas", {{"", "Latn"}}},
{"sat", {{"", "Latn"}}},
{"saz", {{"", "Saur"}}},
{"sbp", {{"", "Latn"}}},
{"sc", {{"", "Latn"}}},
{"sck", {{"", ""}}},
{"scn", {{"", "Latn"}}},
{"sco", {{"", "Latn"}}},
{"scs", {{"", ""}}},
{"sd", {{"", "Arab"}, {"IN", "Deva"}}},
{"sdh", {{"", "Arab"}}},
{"se", {{"", "Latn"}, {"NO", "Cyrl"}}},
{"see", {{"", "Latn"}}},
{"sef", {{"", ""}}},
{"seh", {{"", "Latn"}}},
{"sel", {{"", "Cyrl"}}},
{"ses", {{"", "Latn"}}},
{"sg", {{"", "Latn"}}},
{"sga", {{"", "Latn"}}},
{"shi", {{"", "Tfng"}}},
{"shn", {{"", "Mymr"}}},
{"si", {{"", "Sinh"}}},
{"sid", {{"", "Latn"}}},
{"sk", {{"", "Latn"}}},
{"skr", {{"", ""}}},
{"sl", {{"", "Latn"}}},
{"sm", {{"", "Latn"}}},
{"sma", {{"", "Latn"}}},
{"smi", {{"", "Latn"}}},
{"smj", {{"", "Latn"}}},
{"smn", {{"", "Latn"}}},
{"sms", {{"", "Latn"}}},
{"sn", {{"", "Latn"}}},
{"snk", {{"", "Latn"}}},
{"so", {{"", "Latn"}}},
{"son", {{"", "Latn"}}},
{"sou", {{"", ""}}},
{"sq", {{"", "Latn"}}},
{"sr", {{"", "Latn"}}},
{"srn", {{"", "Latn"}}},
{"srr", {{"", "Latn"}}},
{"srx", {{"", ""}}},
{"ss", {{"", "Latn"}}},
{"ssy", {{"", "Latn"}}},
{"st", {{"", "Latn"}}},
{"su", {{"", "Latn"}}},
{"suk", {{"", "Latn"}}},
{"sus", {{"", "Latn"}, {"GN", "Arab"}}},
{"sv", {{"", "Latn"}}},
{"sw", {{"", "Latn"}}},
{"swb", {{"", "Arab"}, {"YT", "Latn"}}},
{"swc", {{"", "Latn"}}},
{"swv", {{"", ""}}},
{"sxn", {{"", ""}}},
{"syi", {{"", ""}}},
{"syl", {{"", "Beng"}, {"BD", "Sylo"}}},
{"syr", {{"", "Syrc"}}},
{"ta", {{"", "Taml"}}},
{"tab", {{"", "Cyrl"}}},
{"taj", {{"", ""}}},
{"tbw", {{"", "Latn"}}},
{"tcy", {{"", "Knda"}}},
{"tdd", {{"", "Tale"}}},
{"tdg", {{"", ""}}},
{"tdh", {{"", ""}}},
{"te", {{"", "Telu"}}},
{"tem", {{"", "Latn"}}},
{"teo", {{"", "Latn"}}},
{"ter", {{"", "Latn"}}},
{"tet", {{"", "Latn"}}},
{"tg", {{"", "Cyrl"}, {"PK", "Arab"}}},
{"th", {{"", "Thai"}}},
{"thl", {{"", ""}}},
{"thq", {{"", ""}}},
{"thr", {{"", ""}}},
{"ti", {{"", "Ethi"}}},
{"tig", {{"", "Ethi"}}},
{"tiv", {{"", "Latn"}}},
{"tk", {{"", "Latn"}}},
{"tkl", {{"", "Latn"}}},
{"tkt", {{"", ""}}},
{"tli", {{"", "Latn"}}},
{"tmh", {{"", "Latn"}}},
{"tn", {{"", "Latn"}}},
{"to", {{"", "Latn"}}},
{"tog", {{"", "Latn"}}},
{"tpi", {{"", "Latn"}}},
{"tr", {{"", "Latn"}, {"DE", "Arab"}, {"MK", "Arab"}}},
{"tru", {{"", "Latn"}}},
{"trv", {{"", "Latn"}}},
{"ts", {{"", "Latn"}}},
{"tsf", {{"", ""}}},
{"tsg", {{"", "Latn"}}},
{"tsi", {{"", "Latn"}}},
{"tsj", {{"", ""}}},
{"tt", {{"", "Cyrl"}}},
{"ttj", {{"", ""}}},
{"tts", {{"", "Thai"}}},
{"tum", {{"", "Latn"}}},
{"tut", {{"", "Cyrl"}}},
{"tvl", {{"", "Latn"}}},
{"twq", {{"", "Latn"}}},
{"ty", {{"", "Latn"}}},
{"tyv", {{"", "Cyrl"}}},
{"tzm", {{"", "Latn"}}},
{"ude", {{"", "Cyrl"}}},
{"udm", {{"", "Cyrl"}, {"RU", "Latn"}}},
{"ug", {{"", "Arab"}, {"KZ", "Cyrl"}, {"MN", "Cyrl"}}},
{"uga", {{"", "Ugar"}}},
{"uk", {{"", "Cyrl"}}},
{"uli", {{"", "Latn"}}},
{"umb", {{"", "Latn"}}},
{"und", {{"", ""}}},
{"unr", {{"", "Beng"}, {"NP", "Deva"}}},
{"unx", {{"", "Beng"}}},
{"ur", {{"", "Arab"}}},
{"uz", {{"", "Latn"}, {"AF", "Arab"}, {"CN", "Cyrl"}}},
{"vai", {{"", "Vaii"}}},
{"ve", {{"", "Latn"}}},
{"vi", {{"", "Latn"}, {"US", "Hani"}}},
{"vic", {{"", ""}}},
{"vmw", {{"", ""}}},
{"vo", {{"", "Latn"}}},
{"vot", {{"", "Latn"}}},
{"vun", {{"", "Latn"}}},
{"wa", {{"", "Latn"}}},
{"wae", {{"", "Latn"}}},
{"wak", {{"", "Latn"}}},
{"wal", {{"", "Ethi"}}},
{"war", {{"", "Latn"}}},
{"was", {{"", "Latn"}}},
{"wbq", {{"", ""}}},
{"wbr", {{"", ""}}},
{"wls", {{"", ""}}},
{"wo", {{"", "Latn"}}},
{"wtm", {{"", ""}}},
{"xal", {{"", "Cyrl"}}},
{"xav", {{"", ""}}},
{"xcr", {{"", "Cari"}}},
{"xh", {{"", "Latn"}}},
{"xnr", {{"", ""}}},
{"xog", {{"", "Latn"}}},
{"xpr", {{"", "Prti"}}},
{"xsa", {{"", "Sarb"}}},
{"xsr", {{"", "Deva"}}},
{"xum", {{"", "Ital"}}},
{"yao", {{"", "Latn"}}},
{"yap", {{"", "Latn"}}},
{"yav", {{"", "Latn"}}},
{"ybb", {{"", ""}}},
{"yi", {{"", "Hebr"}}},
{"yo", {{"", "Latn"}}},
{"yrk", {{"", "Cyrl"}}},
{"yua", {{"", ""}}},
{"yue", {{"", "Hans"}}},
{"za", {{"", "Latn"}, {"CN", "Hans"}}},
{"zap", {{"", "Latn"}}},
{"zdj", {{"", ""}}},
{"zea", {{"", ""}}},
{"zen", {{"", "Tfng"}}},
{"zh", {{"", "Hant"}, {"CN", "Hans"}, {"HK", "Hans"}, {"MO", "Hans"}, {"SG", "Hans"}, {"MN", "Hans"}}},
{"zmi", {{"", ""}}},
{"zu", {{"", "Latn"}}},
{"zun", {{"", "Latn"}}},
{"zza", {{"", "Arab"}}}
};
C#, usings excluded for character count:
namespace territoryInfoScraper
{
class MainClass
{
static string LanguageEntryToString(KeyValuePair<string, Dictionary<string, List<string>>> entry, Dictionary<string, List<string>> languagePrimaryScripts) {
var language = entry.Key;
var scriptsByTerritory = entry.Value;
var result = new StringBuilder ();
result.Append ("{\"");
result.Append (language);
result.Append ("\", {{\"\", \"");
string defaultScript;
if (languagePrimaryScripts.ContainsKey (language) && languagePrimaryScripts [language].Count == 1) {
defaultScript = languagePrimaryScripts [language] [0];
} else {
IEnumerable<string> listOfScripts = scriptsByTerritory.SelectMany (x => x.Value);
var groupsWithCounts = from s in listOfScripts group s by s into g select new {Item = g.Key, Count = g.Count()};
var groupsSorted = groupsWithCounts.OrderByDescending (g => g.Count);
if (groupsSorted.Count () > 0) {
defaultScript = groupsSorted.First ().Item;
} else {
System.Diagnostics.Debug.WriteLine ("Could not determine a default script");
defaultScript = "";
}
}
result.Append (defaultScript);
result.Append ("\"}");
var specifiedTerritories = scriptsByTerritory.Where (x => x.Key != "" && x.Value.Count == 1 && x.Value[0] != defaultScript).Select (x => "{\"" + x.Key + "\", \"" + x.Value [0] + "\"}").ToArray ();
if (specifiedTerritories.Count () > 0) {
result.Append (", ");
}
result.Append (String.Join (", ", specifiedTerritories));
result.Append ("}}");
return result.ToString ();
}
static void Main (string[] args)
{
var document = XDocument.Load ("/Users/Brent/Downloads/core/common/supplemental/supplementalData.xml");
var scriptIfLanguageHasMultiplePossibilitiesAndRegionHasNoneSpecified = new Dictionary<string, List<string>> ();
string defaultLocale = document.XPathSelectElement ("/supplementalData/parentLocales/parentLocale[@parent='root']").Attribute("locales").Value;
foreach (var entry in defaultLocale.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries)) {
int indexOfUnderscore = entry.IndexOf ('_');
string language = entry.Substring (0, indexOfUnderscore);
string script = entry.Substring (indexOfUnderscore + 1);
if (!scriptIfLanguageHasMultiplePossibilitiesAndRegionHasNoneSpecified.ContainsKey (language)) {
scriptIfLanguageHasMultiplePossibilitiesAndRegionHasNoneSpecified.Add (language, new List<string> ());
}
scriptIfLanguageHasMultiplePossibilitiesAndRegionHasNoneSpecified [language].Add (script);
}
var languageTerritoryScript = new Dictionary<string, Dictionary<string, List<string>>> ();
var languagePrimaryScripts = new Dictionary<string, List<string>> ();
var languageInfo = document.XPathSelectElements ("/supplementalData/languageData/language");
foreach (var languageNode in languageInfo) {
bool isSecondary = languageNode.Attribute ("alt") != null && languageNode.Attribute ("alt").Value == "secondary";
string language = languageNode.Attribute ("type").Value;
if (!languageTerritoryScript.ContainsKey (language)) {
languageTerritoryScript.Add (language, new Dictionary<string, List<string>> ());
}
if (languageNode.Attribute ("territories") != null) {
String[] territories = languageNode.Attribute ("territories").Value.Split (new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
if (languageNode.Attribute ("scripts") != null) {
String[] scripts = languageNode.Attribute ("scripts").Value.Split (new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
foreach (string territory in territories) {
if (!languageTerritoryScript [language].ContainsKey (territory)) {
languageTerritoryScript [language].Add (territory, new List<string> ());
}
foreach (string script in scripts) {
languageTerritoryScript [language] [territory].Add (script);
if (!isSecondary) {
if (!languagePrimaryScripts.ContainsKey (language)) {
languagePrimaryScripts.Add (language, new List<string> ());
}
languagePrimaryScripts [language].Add (script);
}
}
}
} else {
foreach (string territory in territories) {
if (!languageTerritoryScript [language].ContainsKey (territory)) {
languageTerritoryScript [language].Add (territory, new List<string> ());
}
}
}
} else if (languageNode.Attributes ("scripts") != null) {
String[] scripts = languageNode.Attribute ("scripts").Value.Split (new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
if (!languageTerritoryScript [language].ContainsKey ("")) {
languageTerritoryScript [language].Add ("", new List<string> ());
}
foreach (string script in scripts) {
languageTerritoryScript [language] [""].Add (script);
if (!isSecondary) {
if (!languagePrimaryScripts.ContainsKey (language)) {
languagePrimaryScripts.Add (language, new List<string> ());
}
languagePrimaryScripts [language].Add (script);
}
}
}
}
var territoryInfo = document.XPathSelectElements ("/supplementalData/territoryInfo/territory");
foreach (var territoryNode in territoryInfo) {
string territory = territoryNode.Attribute ("type").Value;
foreach (var languagePopulationNode in territoryNode.Elements()) {
string languageAndMaybeScript = languagePopulationNode.Attribute ("type").Value;
int underscoreIndex = languageAndMaybeScript.IndexOf ('_');
if (underscoreIndex != -1) {
string language = languageAndMaybeScript.Substring (0, underscoreIndex);
string script = languageAndMaybeScript.Substring (underscoreIndex + 1);
if (!languageTerritoryScript.ContainsKey (language)) {
languageTerritoryScript.Add (language, new Dictionary<string, List<string>> ());
}
if (!languageTerritoryScript [language].ContainsKey (territory)) {
languageTerritoryScript [language].Add (territory, new List<string> ());
}
languageTerritoryScript [language] [territory].Clear (); //we've gotten a specific script specification for the region and language, so use it, and only it.
languageTerritoryScript [language] [territory].Add (script);
} else {
string language = languageAndMaybeScript;
if (!languageTerritoryScript.ContainsKey (language)) {
languageTerritoryScript.Add (language, new Dictionary<string, List<string>> ());
}
if (!languageTerritoryScript [language].ContainsKey (territory)) {
languageTerritoryScript [language].Add (territory, new List<string> ());
}
}
}
}
StringBuilder result = new StringBuilder ("static std::map<std::string /*ISO 639-1*/, std::map<std::string/*ISO ISO3166-1 Alpha 2 or empty*/, std::string /*ISO 15924*/>> table = {");
result.Append (System.Environment.NewLine);
result.Append (String.Join (", " + System.Environment.NewLine, languageTerritoryScript.Where (x => x.Value.Count > 0).OrderBy(x => x.Key).Select (x => LanguageEntryToString (x, languagePrimaryScripts))));
result.Append (System.Environment.NewLine);
result.Append ("}");
string stringResult = result.ToString ();
System.Diagnostics.Debug.WriteLine (stringResult);
}
}
}
I've created a Java
version that does this, available here. Basically, it takes the table in the above answer (with additional entries) and ports it to a Map<String, Map<String, String>>
containing the useful information, then a simple lookup method is used. To use this class in your project, just call:
String script = LocaleUtilities.getScript(Locale.getDefault());
to get the script for the default locale.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With