问题
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.
回答1:
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);
}
}
}
回答2:
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.
回答3:
EDIT: I've made a new and better answer. Use that. I had no luck finding anything, so I decided to do my best to make a table myself. After searching a bit, I found this jem. Clicking (almost) any language will give you the ISO 639-1 code (and more), and clicking any script category will give you the 15924 code. I probably could have written something to tease the tables into c++ manually, but I only needed a couple dozen and couldn't justify automating it (on my jobs dime) so here's the table I made by hand:
std::map<std::string /*ISO 639-1*/, std::string /*ISO 15924*/> table = {
{"ar", "Arab"}, //Arabic
{"bn", "Beng"}, //Bengali
{"zh", "Hani"}, //Chinese
{"en", "Latn"}, //English
{"fr", "Latn"}, //French
{"de", "Latn"}, //German
{"hi", "Deva"}, //Hindi
{"it", "Latn"}, //Italian
{"ja", "Hani"}, //Japanese
{"jv", "Latn"}, //Javanese
{"ko", "Hani"}, //Korean
{"ms", "Latn"}, //Malay/Indonesian
{"mr", "Deva"}, //Marathi
{"fa", "Arab"}, //Persian
{"pt", "Latn"}, //Porteugese
{"pa", "Arab"}, //Punjabi
{"ru", "Cyrl"}, //Russian
{"es", "Latn"}, //Spanish
{"ta", "Taml"}, //Tamil
{"te", "Telu"}, //Telugu
{"tr", "Latn"}, //Turkish
{"ur", "Arab"}, //Urdu
{"vi", "Latn"} //Vietnamese
};
回答4:
But en_US
doesn't have a script tag in it, it's just an identifier. What would you suggest to improve the documentation here?
If you want to guess what the script is likely to be, then you can use uloc_addLikelySubtags()
(or ICU4J equivalent) which will map en
to en_Latn_US
, but will leave zh_Hant_CN
as zh_Hant_CN
, using the CLDR likelySubtag data.
回答5:
The C part of ICU4C contains uscript_getCode() call that should do what you are looking for.
来源:https://stackoverflow.com/questions/16447807/get-an-iso-15924-script-code-for-a-given-ietf-language-tag-or-iso-639-iso-3166