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