• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // © 2016 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
3 /*
4  *******************************************************************************
5  * Copyright (C) 2009-2013, International Business Machines Corporation and    *
6  * others. All Rights Reserved.                                                *
7  *******************************************************************************
8  */
9 package com.ibm.icu.impl;
10 
11 import java.util.MissingResourceException;
12 
13 
14 /**
15  * Utilities for mapping between old and new language, country, and other
16  * locale ID related names.
17  */
18 public class LocaleIDs {
19 
20     /**
21      * Returns a list of all 2-letter country codes defined in ISO 3166.
22      * Can be used to create Locales.
23      * @stable ICU 3.0
24      */
getISOCountries()25     public static String[] getISOCountries() {
26         return _countries.clone();
27     }
28 
29     /**
30      * Returns a list of all 2-letter language codes defined in ISO 639
31      * plus additional 3-letter codes determined to be useful for locale generation as
32      * defined by Unicode CLDR.
33      * Can be used to create Locales.
34      * [NOTE:  ISO 639 is not a stable standard-- some languages' codes have changed.
35      * The list this function returns includes both the new and the old codes for the
36      * languages whose codes have changed.]
37      * @stable ICU 3.0
38      */
getISOLanguages()39     public static String[] getISOLanguages() {
40         return _languages.clone();
41     }
42 
43     /**
44      * Returns a three-letter abbreviation for the provided country.  If the provided
45      * country is empty, returns the empty string.  Otherwise, returns
46      * an uppercase ISO 3166 3-letter country code.
47      * @exception MissingResourceException Throws MissingResourceException if the
48      * three-letter country abbreviation is not available for this locale.
49      * @stable ICU 3.0
50      */
getISO3Country(String country)51     public static String getISO3Country(String country){
52 
53         int offset = findIndex(_countries, country);
54         if(offset>=0){
55             return _countries3[offset];
56         }else{
57             offset = findIndex(_obsoleteCountries, country);
58             if(offset>=0){
59                 return _obsoleteCountries3[offset];
60             }
61         }
62         return "";
63     }
64     /**
65      * Returns a three-letter abbreviation for the language.  If language is
66      * empty, returns the empty string.  Otherwise, returns
67      * a lowercase ISO 639-2/T language code.
68      * The ISO 639-2 language codes can be found on-line at
69      *   <a href="ftp://dkuug.dk/i18n/iso-639-2.txt"><code>ftp://dkuug.dk/i18n/iso-639-2.txt</code></a>
70      * @exception MissingResourceException Throws MissingResourceException if the
71      * three-letter language abbreviation is not available for this locale.
72      * @stable ICU 3.0
73      */
getISO3Language(String language)74     public static String getISO3Language(String language) {
75 
76         int offset = findIndex(_languages, language);
77         if(offset>=0){
78             return _languages3[offset];
79         } else {
80             offset = findIndex(_obsoleteLanguages, language);
81             if (offset >= 0) {
82                 return _obsoleteLanguages3[offset];
83             }
84         }
85         return "";
86     }
87 
threeToTwoLetterLanguage(String lang)88     public static String threeToTwoLetterLanguage(String lang) {
89 
90         /* convert 3 character code to 2 character code if possible *CWB*/
91         int offset = findIndex(_languages3, lang);
92         if (offset >= 0) {
93             return _languages[offset];
94         }
95 
96         offset = findIndex(_obsoleteLanguages3, lang);
97         if (offset >= 0) {
98             return _obsoleteLanguages[offset];
99         }
100 
101         return null;
102     }
103 
threeToTwoLetterRegion(String region)104     public static String threeToTwoLetterRegion(String region) {
105 
106         /* convert 3 character code to 2 character code if possible *CWB*/
107         int offset = findIndex(_countries3, region);
108         if (offset >= 0) {
109             return _countries[offset];
110         }
111 
112         offset = findIndex(_obsoleteCountries3, region);
113         if (offset >= 0) {
114             return _obsoleteCountries[offset];
115         }
116 
117         return null;
118     }
119 
120     /**
121      * linear search of the string array. the arrays are unfortunately ordered by the
122      * two-letter target code, not the three-letter search code, which seems backwards.
123      */
findIndex(String[] array, String target)124     private static int findIndex(String[] array, String target){
125         for (int i = 0; i < array.length; i++) {
126             if (target.equals(array[i])) {
127                 return i;
128             }
129         }
130         return -1;
131     }
132 
133 
134     /**
135      * Tables used in normalizing portions of the id.
136      */
137     /* tables updated per http://lcweb.loc.gov/standards/iso639-2/
138        to include the revisions up to 2001/7/27 *CWB*/
139     /* The 3 character codes are the terminology codes like RFC 3066.
140        This is compatible with prior ICU codes */
141     /* "in" "iw" "ji" "jw" & "sh" have been withdrawn but are still in
142        the table but now at the end of the table because
143        3 character codes are duplicates.  This avoids bad searches
144        going from 3 to 2 character codes.*/
145     /* The range qaa-qtz is reserved for local use. */
146 
147     /* This list MUST be in sorted order, and MUST contain the two-letter codes
148     if one exists otherwise use the three letter code */
149     private static final String[] _languages = {
150         "aa",  "ab",  "ace", "ach", "ada", "ady", "ae",  "af",
151         "afa", "afh", "agq", "ain", "ak",  "akk", "ale", "alg",
152         "alt", "am",  "an",  "ang", "anp", "apa", "ar",  "arc",
153         "arn", "arp", "ars", "art", "arw", "as",  "asa", "ast",
154         "ath", "aus", "av",  "awa", "ay",  "az",
155         "ba",  "bad", "bai", "bal", "ban", "bas", "bat", "bax",
156         "bbj", "be",  "bej", "bem", "ber", "bez", "bfd", "bg",
157         "bh",  "bho", "bi",  "bik", "bin", "bkm", "bla", "bm",
158         "bn",  "bnt", "bo",  "br",  "bra", "brx", "bs",  "bss",
159         "btk", "bua", "bug", "bum", "byn", "byv",
160         "ca",  "cad", "cai", "car", "cau", "cay", "cch", "ce",
161         "ceb", "cel", "cgg", "ch",  "chb", "chg", "chk", "chm",
162         "chn", "cho", "chp", "chr", "chy", "ckb", "cmc", "co",
163         "cop", "cpe", "cpf", "cpp", "cr",  "crh", "crp", "cs",
164         "csb", "cu",  "cus", "cv",  "cy",
165         "da",  "dak", "dar", "dav", "day", "de",  "del", "den",
166         "dgr", "din", "dje", "doi", "dra", "dsb", "dua", "dum",
167         "dv",  "dyo", "dyu", "dz",  "dzg",
168         "ebu", "ee",  "efi", "egy", "eka", "el",  "elx", "en",
169         "enm", "eo",  "es",  "et",  "eu",  "ewo",
170         "fa",  "fan", "fat", "ff",  "fi",  "fil", "fiu", "fj",
171         "fo",  "fon", "fr",  "frm", "fro", "frr", "frs", "fur",
172         "fy",
173         "ga",  "gaa", "gay", "gba", "gd",  "gem", "gez", "gil",
174         "gl",  "gmh", "gn",  "goh", "gon", "gor", "got", "grb",
175         "grc", "gsw", "gu",  "guz", "gv",  "gwi",
176         "ha",  "hai", "haw", "he",  "hi",  "hil", "him", "hit",
177         "hmn", "ho",  "hr",  "hsb", "ht",  "hu",  "hup", "hy",
178         "hz",
179         "ia",  "iba", "ibb", "id",  "ie",  "ig",  "ii",  "ijo",
180         "ik",  "ilo", "inc", "ine", "inh", "io",  "ira", "iro",
181         "is",  "it",  "iu",
182         "ja",  "jbo", "jgo", "jmc", "jpr", "jrb", "jv",
183         "ka",  "kaa", "kab", "kac", "kaj", "kam", "kar", "kaw",
184         "kbd", "kbl", "kcg", "kde", "kea", "kfo", "kg",  "kha",
185         "khi", "kho", "khq", "ki",  "kj",  "kk",  "kkj", "kl",
186         "kln", "km",  "kmb", "kn",  "ko",  "kok", "kos", "kpe",
187         "kr",  "krc", "krl", "kro", "kru", "ks",  "ksb", "ksf",
188         "ksh", "ku",  "kum", "kut", "kv",  "kw",  "ky",
189         "la",  "lad", "lag", "lah", "lam", "lb",  "lez", "lg",
190         "li",  "lkt", "ln",  "lo",  "lol", "loz", "lt",  "lu",
191         "lua", "lui", "lun", "luo", "lus", "luy", "lv",
192         "mad", "maf", "mag", "mai", "mak", "man", "map", "mas",
193         "mde", "mdf", "mdr", "men", "mer", "mfe", "mg",  "mga",
194         "mgh", "mgo", "mh",  "mi",  "mic", "min", "mis", "mk",
195         "mkh", "ml",  "mn",  "mnc", "mni", "mno", "mo",  "moh",
196         "mos", "mr",  "ms",  "mt",  "mua", "mul", "mun", "mus",
197         "mwl", "mwr", "my",  "mye", "myn", "myv",
198         "na",  "nah", "nai", "nap", "naq", "nb",  "nd",  "nds",
199         "ne",  "new", "ng",  "nia", "nic", "niu", "nl",  "nmg",
200         "nn",  "nnh", "no",  "nog", "non", "nqo", "nr",  "nso",
201         "nub", "nus", "nv",  "nwc", "ny",  "nym", "nyn", "nyo",
202         "nzi",
203         "oc",  "oj",  "om",  "or",  "os",  "osa", "ota", "oto",
204         "pa",  "paa", "pag", "pal", "pam", "pap", "pau", "peo",
205         "phi", "phn", "pi",  "pl",  "pon", "pra", "pro", "ps",
206         "pt",
207         "qu",
208         "raj", "rap", "rar", "rm",  "rn",  "ro",  "roa", "rof",
209         "rom", "ru",  "rup", "rw",  "rwk",
210         "sa",  "sad", "sah", "sai", "sal", "sam", "saq", "sas",
211         "sat", "sba", "sbp", "sc",  "scn", "sco", "sd",  "se",
212         "see", "seh", "sel", "sem", "ses", "sg",  "sga", "sgn",
213         "shi", "shn", "shu", "si",  "sid", "sio", "sit",
214         "sk",  "sl",  "sla", "sm",  "sma", "smi", "smj", "smn",
215         "sms", "sn",  "snk", "so",  "sog", "son", "sq",  "sr",
216         "srn", "srr", "ss",  "ssa", "ssy", "st",  "su",  "suk",
217         "sus", "sux", "sv",  "sw",  "swb", "swc", "syc", "syr",
218         "ta",  "tai", "te",  "tem", "teo", "ter", "tet", "tg",
219         "th",  "ti",  "tig", "tiv", "tk",  "tkl", "tl",  "tlh",
220         "tli", "tmh", "tn",  "to",  "tog", "tpi", "tr",  "trv",
221         "ts",  "tsi", "tt",  "tum", "tup", "tut", "tvl", "tw",
222         "twq", "ty",  "tyv", "tzm",
223         "udm", "ug",  "uga", "uk",  "umb", "und", "ur",  "uz",
224         "vai", "ve",  "vi",  "vo",  "vot", "vun",
225         "wa",  "wae", "wak", "wal", "war", "was", "wen", "wo",
226         "xal", "xh",  "xog",
227         "yao", "yap", "yav", "ybb", "yi",  "yo",  "ypk", "yue",
228         "za",  "zap", "zbl", "zen", "zh",  "znd", "zu",  "zun",
229         "zxx", "zza" };
230 
231     private static final String[] _replacementLanguages = {
232         "id", "he", "yi", "jv", "sr", /* replacement language codes */
233     };
234 
235     private static final String[] _obsoleteLanguages = {
236         "in", "iw", "ji", "jw", "sh", /* obsolete language codes */
237     };
238 
239     /* This list MUST contain a three-letter code for every two-letter code in the
240     list above, and they MUST ne in the same order (i.e., the same language must
241     be in the same place in both lists)! */
242     private static final String[] _languages3 = {
243         "aar", "abk", "ace", "ach", "ada", "ady", "ave", "afr",
244         "afa", "afh", "agq", "ain", "aka", "akk", "ale", "alg",
245         "alt", "amh", "arg", "ang", "anp", "apa", "ara", "arc",
246         "arn", "arp", "ars", "art", "arw", "asm", "asa", "ast",
247         "ath", "aus", "ava", "awa", "aym", "aze",
248         "bak", "bad", "bai", "bal", "ban", "bas", "bat", "bax",
249         "bbj", "bel", "bej", "bem", "ber", "bez", "bfd", "bul",
250         "bih", "bho", "bis", "bik", "bin", "bkm", "bla", "bam",
251         "ben", "bnt", "bod", "bre", "bra", "brx", "bos", "bss",
252         "btk", "bua", "bug", "bum", "byn", "byv",
253         "cat", "cad", "cai", "car", "cau", "cay", "cch", "che",
254         "ceb", "cel", "cgg", "cha", "chb", "chg", "chk", "chm",
255         "chn", "cho", "chp", "chr", "chy", "ckb", "cmc", "cos",
256         "cop", "cpe", "cpf", "cpp", "cre", "crh", "crp", "ces",
257         "csb", "chu", "cus", "chv", "cym",
258         "dan", "dak", "dar", "dav", "day", "deu", "del", "den",
259         "dgr", "din", "dje", "doi", "dra", "dsb", "dua", "dum",
260         "div", "dyo", "dyu", "dzo", "dzg",
261         "ebu", "ewe", "efi", "egy", "eka", "ell", "elx", "eng",
262         "enm", "epo", "spa", "est", "eus", "ewo",
263         "fas", "fan", "fat", "ful", "fin", "fil", "fiu", "fij",
264         "fao", "fon", "fra", "frm", "fro", "frr", "frs", "fur",
265         "fry",
266         "gle", "gaa", "gay", "gba", "gla", "gem", "gez", "gil",
267         "glg", "gmh", "grn", "goh", "gon", "gor", "got", "grb",
268         "grc", "gsw", "guj", "guz", "glv", "gwi",
269         "hau", "hai", "haw", "heb", "hin", "hil", "him", "hit",
270         "hmn", "hmo", "hrv", "hsb", "hat", "hun", "hup", "hye",
271         "her",
272         "ina", "iba", "ibb", "ind", "ile", "ibo", "iii", "ijo",
273         "ipk", "ilo", "inc", "ine", "inh", "ido", "ira", "iro",
274         "isl", "ita", "iku",
275         "jpn", "jbo", "jgo", "jmc", "jpr", "jrb", "jav",
276         "kat", "kaa", "kab", "kac", "kaj", "kam", "kar", "kaw",
277         "kbd", "kbl", "kcg", "kde", "kea", "kfo", "kon", "kha",
278         "khi", "kho", "khq", "kik", "kua", "kaz", "kkj", "kal",
279         "kln", "khm", "kmb", "kan", "kor", "kok", "kos", "kpe",
280         "kau", "krc", "krl", "kro", "kru", "kas", "ksb", "ksf",
281         "ksh", "kur", "kum", "kut", "kom", "cor", "kir",
282         "lat", "lad", "lag", "lah", "lam", "ltz", "lez", "lug",
283         "lim", "lkt", "lin", "lao", "lol", "loz", "lit", "lub",
284         "lua", "lui", "lun", "luo", "lus", "luy", "lav",
285         "mad", "maf", "mag", "mai", "mak", "man", "map", "mas",
286         "mde", "mdf", "mdr", "men", "mer", "mfe", "mlg", "mga",
287         "mgh", "mgo", "mah", "mri", "mic", "min", "mis", "mkd",
288         "mkh", "mal", "mon", "mnc", "mni", "mno", "mol", "moh",
289         "mos", "mar", "msa", "mlt", "mua", "mul", "mun", "mus",
290         "mwl", "mwr", "mya", "mye", "myn", "myv",
291         "nau", "nah", "nai", "nap", "naq", "nob", "nde", "nds",
292         "nep", "new", "ndo", "nia", "nic", "niu", "nld", "nmg",
293         "nno", "nnh", "nor", "nog", "non", "nqo", "nbl", "nso",
294         "nub", "nus", "nav", "nwc", "nya", "nym", "nyn", "nyo",
295         "nzi",
296         "oci", "oji", "orm", "ori", "oss", "osa", "ota", "oto",
297         "pan", "paa", "pag", "pal", "pam", "pap", "pau", "peo",
298         "phi", "phn", "pli", "pol", "pon", "pra", "pro", "pus",
299         "por",
300         "que",
301         "raj", "rap", "rar", "roh", "run", "ron", "roa", "rof",
302         "rom", "rus", "rup", "kin", "rwk",
303         "san", "sad", "sah", "sai", "sal", "sam", "saq", "sas",
304         "sat", "sba", "sbp", "srd", "scn", "sco", "snd", "sme",
305         "see", "seh", "sel", "sem", "ses", "sag", "sga", "sgn",
306         "shi", "shn", "shu", "sin", "sid", "sio", "sit",
307         "slk", "slv", "sla", "smo", "sma", "smi", "smj", "smn",
308         "sms", "sna", "snk", "som", "sog", "son", "sqi", "srp",
309         "srn", "srr", "ssw", "ssa", "ssy", "sot", "sun", "suk",
310         "sus", "sux", "swe", "swa", "swb", "swc", "syc", "syr",
311         "tam", "tai", "tel", "tem", "teo", "ter", "tet", "tgk",
312         "tha", "tir", "tig", "tiv", "tuk", "tkl", "tgl", "tlh",
313         "tli", "tmh", "tsn", "ton", "tog", "tpi", "tur", "trv",
314         "tso", "tsi", "tat", "tum", "tup", "tut", "tvl", "twi",
315         "twq", "tah", "tyv", "tzm",
316         "udm", "uig", "uga", "ukr", "umb", "und", "urd", "uzb",
317         "vai", "ven", "vie", "vol", "vot", "vun",
318         "wln", "wae", "wak", "wal", "war", "was", "wen", "wol",
319         "xal", "xho", "xog",
320         "yao", "yap", "yav", "ybb", "yid", "yor", "ypk", "yue",
321         "zha", "zap", "zbl", "zen", "zho", "znd", "zul", "zun",
322         "zxx", "zza" };
323 
324     private static final String[] _obsoleteLanguages3 = {
325         /* "in",  "iw",  "ji",  "jw",  "sh", */
326         "ind", "heb", "yid", "jaw", "srp",
327     };
328 
329     /* ZR(ZAR) is now CD(COD) and FX(FXX) is PS(PSE) as per
330        http://www.evertype.com/standards/iso3166/iso3166-1-en.html
331        added new codes keeping the old ones for compatibility
332        updated to include 1999/12/03 revisions *CWB*/
333 
334     /* RO(ROM) is now RO(ROU) according to
335        http://www.iso.org/iso/en/prods-services/iso3166ma/03updates-on-iso-3166/nlv3e-rou.html
336     */
337     /* This list MUST be in sorted order, and MUST contain only two-letter codes! */
338     private static final String[] _countries = {
339         "AD",  "AE",  "AF",  "AG",  "AI",  "AL",  "AM",
340         "AO",  "AQ",  "AR",  "AS",  "AT",  "AU",  "AW",  "AX",  "AZ",
341         "BA",  "BB",  "BD",  "BE",  "BF",  "BG",  "BH",  "BI",
342         "BJ",  "BL",  "BM",  "BN",  "BO",  "BQ",  "BR",  "BS",  "BT",  "BV",
343         "BW",  "BY",  "BZ",  "CA",  "CC",  "CD",  "CF",  "CG",
344         "CH",  "CI",  "CK",  "CL",  "CM",  "CN",  "CO",  "CR",
345         "CU",  "CV",  "CW",  "CX",  "CY",  "CZ",  "DE",  "DJ",  "DK",
346         "DM",  "DO",  "DZ",  "EC",  "EE",  "EG",  "EH",  "ER",
347         "ES",  "ET",  "FI",  "FJ",  "FK",  "FM",  "FO",  "FR",
348         "GA",  "GB",  "GD",  "GE",  "GF",  "GG",  "GH",  "GI",  "GL",
349         "GM",  "GN",  "GP",  "GQ",  "GR",  "GS",  "GT",  "GU",
350         "GW",  "GY",  "HK",  "HM",  "HN",  "HR",  "HT",  "HU",
351         "ID",  "IE",  "IL",  "IM",  "IN",  "IO",  "IQ",  "IR",  "IS",
352         "IT",  "JE",  "JM",  "JO",  "JP",  "KE",  "KG",  "KH",  "KI",
353         "KM",  "KN",  "KP",  "KR",  "KW",  "KY",  "KZ",  "LA",
354         "LB",  "LC",  "LI",  "LK",  "LR",  "LS",  "LT",  "LU",
355         "LV",  "LY",  "MA",  "MC",  "MD",  "ME",  "MF",  "MG",  "MH",  "MK",
356         "ML",  "MM",  "MN",  "MO",  "MP",  "MQ",  "MR",  "MS",
357         "MT",  "MU",  "MV",  "MW",  "MX",  "MY",  "MZ",  "NA",
358         "NC",  "NE",  "NF",  "NG",  "NI",  "NL",  "NO",  "NP",
359         "NR",  "NU",  "NZ",  "OM",  "PA",  "PE",  "PF",  "PG",
360         "PH",  "PK",  "PL",  "PM",  "PN",  "PR",  "PS",  "PT",
361         "PW",  "PY",  "QA",  "RE",  "RO",  "RS",  "RU",  "RW",  "SA",
362         "SB",  "SC",  "SD",  "SE",  "SG",  "SH",  "SI",  "SJ",
363         "SK",  "SL",  "SM",  "SN",  "SO",  "SR",  "SS",  "ST",  "SV",
364         "SX",  "SY",  "SZ",  "TC",  "TD",  "TF",  "TG",  "TH",  "TJ",
365         "TK",  "TL",  "TM",  "TN",  "TO",  "TR",  "TT",  "TV",
366         "TW",  "TZ",  "UA",  "UG",  "UM",  "US",  "UY",  "UZ",
367         "VA",  "VC",  "VE",  "VG",  "VI",  "VN",  "VU",  "WF",
368         "WS",  "YE",  "YT",  "ZA",  "ZM",  "ZW" };
369 
370     private static final String[] _deprecatedCountries = {
371         "AN", "BU", "CS", "DD", "DY", "FX", "HV", "NH", "RH", "SU", "TP", "UK", "VD", "YD", "YU", "ZR" /* deprecated country list */
372     };
373 
374     private static final String[] _replacementCountries = {
375     /*  "AN", "BU", "CS", "DD", "DY", "FX", "HV", "NH", "RH", "SU", "TP", "UK", "VD", "YD", "YU", "ZR" */
376         "CW", "MM", "RS", "DE", "BJ", "FR", "BF", "VU", "ZW", "RU", "TL", "GB", "VN", "YE", "RS", "CD"  /* replacement country codes */
377     };
378 
379     /* this table is used for three letter codes */
380     private static final String[] _obsoleteCountries = {
381         "AN",  "BU", "CS", "FX", "RO", "SU", "TP", "YD", "YU", "ZR",   /* obsolete country codes */
382     };
383 
384     /* This list MUST contain a three-letter code for every two-letter code in
385     the above list, and they MUST be listed in the same order! */
386     private static final String[] _countries3 = {
387         /*  "AD",  "AE",  "AF",  "AG",  "AI",  "AL",  "AM",      */
388         "AND", "ARE", "AFG", "ATG", "AIA", "ALB", "ARM",
389     /*  "AO",  "AQ",  "AR",  "AS",  "AT",  "AU",  "AW",  "AX",  "AZ",     */
390         "AGO", "ATA", "ARG", "ASM", "AUT", "AUS", "ABW", "ALA", "AZE",
391     /*  "BA",  "BB",  "BD",  "BE",  "BF",  "BG",  "BH",  "BI",     */
392         "BIH", "BRB", "BGD", "BEL", "BFA", "BGR", "BHR", "BDI",
393     /*  "BJ",  "BL",  "BM",  "BN",  "BO",  "BQ",  "BR",  "BS",  "BT",  "BV",     */
394         "BEN", "BLM", "BMU", "BRN", "BOL", "BES", "BRA", "BHS", "BTN", "BVT",
395     /*  "BW",  "BY",  "BZ",  "CA",  "CC",  "CD",  "CF",  "CG",     */
396         "BWA", "BLR", "BLZ", "CAN", "CCK", "COD", "CAF", "COG",
397     /*  "CH",  "CI",  "CK",  "CL",  "CM",  "CN",  "CO",  "CR",     */
398         "CHE", "CIV", "COK", "CHL", "CMR", "CHN", "COL", "CRI",
399     /*  "CU",  "CV",  "CW",  "CX",  "CY",  "CZ",  "DE",  "DJ",  "DK",     */
400         "CUB", "CPV", "CUW", "CXR", "CYP", "CZE", "DEU", "DJI", "DNK",
401     /*  "DM",  "DO",  "DZ",  "EC",  "EE",  "EG",  "EH",  "ER",     */
402         "DMA", "DOM", "DZA", "ECU", "EST", "EGY", "ESH", "ERI",
403     /*  "ES",  "ET",  "FI",  "FJ",  "FK",  "FM",  "FO",  "FR",     */
404         "ESP", "ETH", "FIN", "FJI", "FLK", "FSM", "FRO", "FRA",
405     /*  "GA",  "GB",  "GD",  "GE",  "GF",  "GG",  "GH",  "GI",  "GL",     */
406         "GAB", "GBR", "GRD", "GEO", "GUF", "GGY", "GHA", "GIB", "GRL",
407     /*  "GM",  "GN",  "GP",  "GQ",  "GR",  "GS",  "GT",  "GU",     */
408         "GMB", "GIN", "GLP", "GNQ", "GRC", "SGS", "GTM", "GUM",
409     /*  "GW",  "GY",  "HK",  "HM",  "HN",  "HR",  "HT",  "HU",     */
410         "GNB", "GUY", "HKG", "HMD", "HND", "HRV", "HTI", "HUN",
411     /*  "ID",  "IE",  "IL",  "IM",  "IN",  "IO",  "IQ",  "IR",  "IS" */
412         "IDN", "IRL", "ISR", "IMN", "IND", "IOT", "IRQ", "IRN", "ISL",
413     /*  "IT",  "JE",  "JM",  "JO",  "JP",  "KE",  "KG",  "KH",  "KI",     */
414         "ITA", "JEY", "JAM", "JOR", "JPN", "KEN", "KGZ", "KHM", "KIR",
415     /*  "KM",  "KN",  "KP",  "KR",  "KW",  "KY",  "KZ",  "LA",     */
416         "COM", "KNA", "PRK", "KOR", "KWT", "CYM", "KAZ", "LAO",
417     /*  "LB",  "LC",  "LI",  "LK",  "LR",  "LS",  "LT",  "LU",     */
418         "LBN", "LCA", "LIE", "LKA", "LBR", "LSO", "LTU", "LUX",
419     /*  "LV",  "LY",  "MA",  "MC",  "MD",  "ME",  "MF",  "MG",  "MH",  "MK",     */
420         "LVA", "LBY", "MAR", "MCO", "MDA", "MNE", "MAF", "MDG", "MHL", "MKD",
421     /*  "ML",  "MM",  "MN",  "MO",  "MP",  "MQ",  "MR",  "MS",     */
422         "MLI", "MMR", "MNG", "MAC", "MNP", "MTQ", "MRT", "MSR",
423     /*  "MT",  "MU",  "MV",  "MW",  "MX",  "MY",  "MZ",  "NA",     */
424         "MLT", "MUS", "MDV", "MWI", "MEX", "MYS", "MOZ", "NAM",
425     /*  "NC",  "NE",  "NF",  "NG",  "NI",  "NL",  "NO",  "NP",     */
426         "NCL", "NER", "NFK", "NGA", "NIC", "NLD", "NOR", "NPL",
427     /*  "NR",  "NU",  "NZ",  "OM",  "PA",  "PE",  "PF",  "PG",     */
428         "NRU", "NIU", "NZL", "OMN", "PAN", "PER", "PYF", "PNG",
429     /*  "PH",  "PK",  "PL",  "PM",  "PN",  "PR",  "PS",  "PT",     */
430         "PHL", "PAK", "POL", "SPM", "PCN", "PRI", "PSE", "PRT",
431     /*  "PW",  "PY",  "QA",  "RE",  "RO",  "RS",  "RU",  "RW",  "SA",     */
432         "PLW", "PRY", "QAT", "REU", "ROU", "SRB", "RUS", "RWA", "SAU",
433     /*  "SB",  "SC",  "SD",  "SE",  "SG",  "SH",  "SI",  "SJ",     */
434         "SLB", "SYC", "SDN", "SWE", "SGP", "SHN", "SVN", "SJM",
435     /*  "SK",  "SL",  "SM",  "SN",  "SO",  "SR",  "SS",  "ST",  "SV",     */
436         "SVK", "SLE", "SMR", "SEN", "SOM", "SUR", "SSD", "STP", "SLV",
437     /*  "SX",  "SY",  "SZ",  "TC",  "TD",  "TF",  "TG",  "TH",  "TJ",     */
438         "SXM", "SYR", "SWZ", "TCA", "TCD", "ATF", "TGO", "THA", "TJK",
439     /*  "TK",  "TL",  "TM",  "TN",  "TO",  "TR",  "TT",  "TV",     */
440         "TKL", "TLS", "TKM", "TUN", "TON", "TUR", "TTO", "TUV",
441     /*  "TW",  "TZ",  "UA",  "UG",  "UM",  "US",  "UY",  "UZ",     */
442         "TWN", "TZA", "UKR", "UGA", "UMI", "USA", "URY", "UZB",
443     /*  "VA",  "VC",  "VE",  "VG",  "VI",  "VN",  "VU",  "WF",     */
444         "VAT", "VCT", "VEN", "VGB", "VIR", "VNM", "VUT", "WLF",
445     /*  "WS",  "YE",  "YT",  "ZA",  "ZM",  "ZW",          */
446         "WSM", "YEM", "MYT", "ZAF", "ZMB", "ZWE" };
447 
448     private static final String[] _obsoleteCountries3 = {
449     /*  "AN",  "BU",  "CS",  "FX",  "RO",  "SU",  "TP",  "YD",  "YU",  "ZR" */
450         "ANT", "BUR", "SCG", "FXX", "ROM", "SUN", "TMP", "YMD", "YUG", "ZAR",
451     };
452 
453 
getCurrentCountryID(String oldID)454     public static String getCurrentCountryID(String oldID){
455         int offset = findIndex(_deprecatedCountries, oldID);
456         if (offset >= 0) {
457             return _replacementCountries[offset];
458         }
459         return oldID;
460     }
461 
getCurrentLanguageID(String oldID)462     public static String getCurrentLanguageID(String oldID){
463         int offset = findIndex(_obsoleteLanguages, oldID);
464         if (offset >= 0) {
465             return _replacementLanguages[offset];
466         }
467         return oldID;
468     }
469 
470 
471 }
472