Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get an ISO 15924 script code for a given IETF Language tag (or ISO 639-ISO 3166-1 pair)

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.

like image 326
Brent Avatar asked May 08 '13 18:05

Brent


2 Answers

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);
        }
    }
}   
like image 132
Brent Avatar answered Oct 04 '22 19:10

Brent


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.

like image 21
Phil Avatar answered Oct 04 '22 20:10

Phil