]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_4_2-src/main/classes/core/src/com/ibm/icu/impl/LocaleIDs.java
go
[Dictionary.git] / jars / icu4j-4_4_2-src / main / classes / core / src / com / ibm / icu / impl / LocaleIDs.java
1 /*\r
2  *******************************************************************************\r
3  * Copyright (C) 2009, International Business Machines Corporation and         *\r
4  * others. All Rights Reserved.                                                *\r
5  *******************************************************************************\r
6  */\r
7 package com.ibm.icu.impl;\r
8 \r
9 import java.util.MissingResourceException;\r
10 \r
11 import com.ibm.icu.util.ULocale;\r
12 \r
13 \r
14 /**\r
15  * Utilities for mapping between old and new language, country, and other\r
16  * locale ID related names.\r
17  */\r
18 public class LocaleIDs {\r
19 \r
20     /**\r
21      * Returns a list of all 2-letter country codes defined in ISO 3166.\r
22      * Can be used to create Locales.\r
23      * @stable ICU 3.0\r
24      */\r
25     public static String[] getISOCountries() {\r
26         initCountryTables();\r
27         return _countries.clone();\r
28     }\r
29 \r
30     /**\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
36      * @stable ICU 3.0\r
37      */\r
38     public static String[] getISOLanguages() {\r
39         initLanguageTables();\r
40         return _languages.clone();\r
41     }\r
42 \r
43     /**\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
49      * @stable ICU 3.0\r
50      */\r
51     public static String getISO3Country(String country){\r
52         initCountryTables();\r
53 \r
54         int offset = findIndex(_countries, country);\r
55         if(offset>=0){\r
56             return _countries3[offset];\r
57         }else{\r
58             offset = findIndex(_obsoleteCountries, country);\r
59             if(offset>=0){\r
60                 return _obsoleteCountries3[offset];\r
61             }\r
62         }\r
63         return "";\r
64     }\r
65     /**\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
73      * @stable ICU 3.0\r
74      */\r
75     public static String getISO3Language(String language) {\r
76         initLanguageTables();\r
77 \r
78         int offset = findIndex(_languages, language);\r
79         if(offset>=0){\r
80             return _languages3[offset];\r
81         } else {\r
82             offset = findIndex(_obsoleteLanguages, language);\r
83             if (offset >= 0) {\r
84                 return _obsoleteLanguages3[offset];\r
85             }\r
86         }\r
87         return "";\r
88     }\r
89 \r
90     public static String threeToTwoLetterLanguage(String lang) {\r
91         initLanguageTables();\r
92 \r
93         /* convert 3 character code to 2 character code if possible *CWB*/\r
94         int offset = findIndex(_languages3, lang);\r
95         if (offset >= 0) {\r
96             return _languages[offset];\r
97         }\r
98 \r
99         offset = findIndex(_obsoleteLanguages3, lang);\r
100         if (offset >= 0) {\r
101             return _obsoleteLanguages[offset];\r
102         }\r
103 \r
104         return null;\r
105     }\r
106 \r
107     public static String threeToTwoLetterRegion(String region) {\r
108         initCountryTables();\r
109 \r
110         /* convert 3 character code to 2 character code if possible *CWB*/\r
111         int offset = findIndex(_countries3, region);\r
112         if (offset >= 0) {\r
113             return _countries[offset];\r
114         }\r
115 \r
116         offset = findIndex(_obsoleteCountries3, region);\r
117         if (offset >= 0) {\r
118             return _obsoleteCountries[offset];\r
119         }\r
120 \r
121         return null;\r
122     }\r
123 \r
124     /**\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
127      */\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
131                 return i;\r
132             }\r
133         }\r
134         return -1;\r
135     }\r
136 \r
137 \r
138     /**\r
139      * Tables used in normalizing portions of the id.\r
140      */\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
150 \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
156 \r
157     // Avoid initializing languages tables unless we have to.\r
158     private static void initLanguageTables() {\r
159         if (_languages == null) {\r
160 \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
220                 "zu",  "zun",\r
221             };\r
222 \r
223             String[] tempReplacementLanguages = {\r
224                 "id", "he", "yi", "jv", "sr", "nb",/* replacement language codes */\r
225             };\r
226 \r
227             String[] tempObsoleteLanguages = {\r
228                 "in", "iw", "ji", "jw", "sh", "no",    /* obsolete language codes */\r
229             };\r
230 \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
347                 /*"zu",  "zun",                                              */\r
348                 "zul", "zun",\r
349             };\r
350 \r
351             String[] tempObsoleteLanguages3 = {\r
352                 /* "in",  "iw",  "ji",  "jw",  "sh", */\r
353                 "ind", "heb", "yid", "jaw", "srp",\r
354             };\r
355 \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
363                 }\r
364             }\r
365         }\r
366     }\r
367 \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
374 \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
382 \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
385             */\r
386 \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
419             };\r
420 \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
424             };\r
425 \r
426             String[] tempDeprecatedCountries = {\r
427                "BU", "CS", "DY", "FX", "HV", "NH", "RH", "TP", "YU", "ZR" /* deprecated country list */\r
428             };\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
432             };\r
433 \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
497             };\r
498 \r
499             String[] tempObsoleteCountries3 = {\r
500                 /*"FX",  "CS",  "RO",  "TP",  "YU",  "ZR",   */\r
501                 "FXX", "SCG", "ROM", "TMP", "YUG", "ZAR",\r
502             };\r
503 \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
512                 }\r
513             }\r
514         }\r
515     }\r
516 \r
517     public static String getCurrentCountryID(String oldID){\r
518         initCountryTables();\r
519         int offset = findIndex(_deprecatedCountries, oldID);\r
520         if (offset >= 0) {\r
521             return _replacementCountries[offset];\r
522         }\r
523         return oldID;\r
524     }\r
525 \r
526     public static String getCurrentLanguageID(String oldID){\r
527         initLanguageTables();\r
528         int offset = findIndex(_obsoleteLanguages, oldID);\r
529         if (offset >= 0) {\r
530             return _replacementLanguages[offset];\r
531         }\r
532         return oldID;\r
533     }\r
534 \r
535 \r
536 }\r